better handling for tab tooltip (without eval())

This commit is contained in:
Piro / SHIMODA Hiroshi 2010-12-07 01:53:20 +09:00
parent 0371c6cf1b
commit 2820a2556e
2 changed files with 65 additions and 61 deletions

View File

@ -1119,54 +1119,6 @@ var TreeStyleTabService = {
},
showHideSubTreeMenuItem : function() { return this.showHideSubtreeMenuItem.apply(this, arguments); }, // obsolete, for backward compatibility
handleTooltip : function TSTService_handleTooltip(aEvent, aTab)
{
var label;
var collapsed = this.isSubtreeCollapsed(aTab);
var base = parseInt(aTab.getAttribute(this.kNEST) || 0);
var descendant = this.getDescendantTabs(aTab);
var indentPart = ' ';
var tree = (this.getTreePref('tooltip.includeChildren') && descendant.length) ?
[aTab].concat(descendant)
.map(function(aTab) {
let label = aTab.getAttribute('label');
let indent = '';
let nest = parseInt(aTab.getAttribute(this.kNEST) || 0) - base;
for (let i = 0; i < nest; i++)
{
indent += indentPart;
}
return this.treeBundle.getFormattedString('tooltip.item.label', [label, indent]);
}, this)
.join('\n') :
null ;
if ('mOverCloseButton' in aTab && aTab.mOverCloseButton) {
if (descendant.length &&
(collapsed || this.getTreePref('closeParentBehavior') == this.CLOSE_PARENT_BEHAVIOR_CLOSE)) {
label = this.treeBundle.getString('tooltip.closeTree');
}
}
else if (aTab.getAttribute(this.kTWISTY_HOVER) == 'true') {
let key = collapsed ?
'tooltip.expandSubtree' :
'tooltip.collapseSubtree' ;
label = tree || aTab.getAttribute('label');
label = label ?
this.treeBundle.getFormattedString(key+'.labeled', [label]) :
this.treeBundle.getString(key) ;
}
else if (collapsed) {
label = tree;
}
if (label)
aEvent.target.setAttribute('label', label);
return label;
},
updateAeroPeekPreviews : function TSTService_updateAeroPeekPreviews()
{
if (

View File

@ -85,6 +85,12 @@ TreeStyleTabBrowser.prototype = {
return (this._tabStripPlaceHolder = value);
},
get tabTooltip()
{
return document.getElementById('tabbrowser-tab-tooltip') || // Firefox 4.0-
this.evaluateXPath('descendant::xul:tooltip', b.mStrip, XPathResult.FIRST_ORDERED_NODE_TYPE).singleNodeValue; // -Firefox 3.6
},
get tabbarDNDObserver()
{
if (!this._tabbarDNDObserver) {
@ -357,6 +363,8 @@ TreeStyleTabBrowser.prototype = {
this.scrollBox.addEventListener('overflow', this, true);
this.scrollBox.addEventListener('underflow', this, true);
this.tabTooltip.addEventListener('popupshowing', this, true);
window.addEventListener('resize', this, true);
window.addEventListener(this.kEVENT_TYPE_PRINT_PREVIEW_ENTERED, this, false);
window.addEventListener(this.kEVENT_TYPE_PRINT_PREVIEW_EXITED, this, false);
@ -530,18 +538,6 @@ TreeStyleTabBrowser.prototype = {
)
);
eval('b.createTooltip = '+
b.createTooltip.toSource().replace(
'if ("mOverCloseButton" in tn && tn.mOverCloseButton) {',
<![CDATA[
if (TreeStyleTabService.getTabBrowserFromChild(tn) &&
TreeStyleTabService.getTabBrowserFromChild(tn).treeStyleTab.handleTooltip(event, tn)) {
return true;
}
else $&]]>
)
);
if ('_beginRemoveTab' in b) {
eval('b._beginRemoveTab = '+
b._beginRemoveTab.toSource().replace(
@ -1530,6 +1526,8 @@ TreeStyleTabBrowser.prototype = {
this.scrollBox.removeEventListener('overflow', this, true);
this.scrollBox.removeEventListener('underflow', this, true);
this.tabTooltip.removeEventListener('popupshowing', this, true);
var tabContextMenu = b.tabContextMenu ||
document.getAnonymousElementByAttribute(b, 'anonid', 'tabContextMenu');
tabContextMenu.removeEventListener('popupshowing', this, false);
@ -3067,10 +3065,64 @@ TreeStyleTabBrowser.prototype = {
onPopupShowing : function TSTBrowser_onPopupShowing(aEvent)
{
if (aEvent.target == aEvent.currentTarget)
if (aEvent.target.localName == 'tooltip')
this.handleTooltip(aEvent);
else if (aEvent.target == aEvent.currentTarget)
this.initTabContextMenu(aEvent);
},
handleTooltip : function TSTBrowser_handleTooltip(aEvent)
{
var tab = document.tooltipNode;
if (tab.localName != 'tab')
return;
var label;
var collapsed = this.isSubtreeCollapsed(tab);
var base = parseInt(tab.getAttribute(this.kNEST) || 0);
var descendant = this.getDescendantTabs(tab);
var indentPart = ' ';
var tree = (this.getTreePref('tooltip.includeChildren') && descendant.length) ?
[tab].concat(descendant)
.map(function(aTab) {
let label = aTab.getAttribute('label');
let indent = '';
let nest = parseInt(aTab.getAttribute(this.kNEST) || 0) - base;
for (let i = 0; i < nest; i++)
{
indent += indentPart;
}
return this.treeBundle.getFormattedString('tooltip.item.label', [label, indent]);
}, this)
.join('\n') :
null ;
if ('mOverCloseButton' in tab && tab.mOverCloseButton) {
if (descendant.length &&
(collapsed || this.getTreePref('closeParentBehavior') == this.CLOSE_PARENT_BEHAVIOR_CLOSE)) {
label = this.treeBundle.getString('tooltip.closeTree');
}
}
else if (tab.getAttribute(this.kTWISTY_HOVER) == 'true') {
let key = collapsed ?
'tooltip.expandSubtree' :
'tooltip.collapseSubtree' ;
label = tree || tab.getAttribute('label');
label = label ?
this.treeBundle.getFormattedString(key+'.labeled', [label]) :
this.treeBundle.getString(key) ;
}
else if (collapsed) {
label = tree;
}
if (label) {
aEvent.target.setAttribute('label', label);
aEvent.stopPropagation();
}
},
initTabContextMenu : function TSTBrowser_initTabContextMenu(aEvent)
{
var b = this.mTabBrowser;