From 59444c68a64a009158a094023df131bf8b817112 Mon Sep 17 00:00:00 2001 From: Piro / SHIMODA Hiroshi Date: Sun, 5 Feb 2012 03:15:38 +0900 Subject: [PATCH] use Iterator instead of forEach (for performance optimization) --- content/treestyletab/bookmarksOverlay.js | 56 +- .../treestyletab/bookmarksOverlayEditable.js | 17 +- content/treestyletab/config.js | 30 +- content/treestyletab/windowHelper.js | 122 ++-- content/treestyletab/windowHelperHacks.js | 109 ++-- modules/browser.js | 539 +++++++++--------- modules/fullTooltip.js | 13 +- modules/pseudoTreeBuilder.js | 7 +- modules/tabbarDNDObserver.js | 35 +- modules/themeManager.js | 23 +- modules/utils.js | 213 ++++--- modules/window.js | 174 +++--- 12 files changed, 710 insertions(+), 628 deletions(-) diff --git a/content/treestyletab/bookmarksOverlay.js b/content/treestyletab/bookmarksOverlay.js index d8ee1acd..561c4ea7 100644 --- a/content/treestyletab/bookmarksOverlay.js +++ b/content/treestyletab/bookmarksOverlay.js @@ -52,41 +52,43 @@ var TreeStyleTabBookmarksService = { return; } - aBookarmks.forEach(function(aItem) { - aItem.position = this.BookmarksService.getItemIndex(aItem.id); - },this); + for (let [, item] in Iterator(aBookarmks)) + { + item.position = this.BookmarksService.getItemIndex(item.id); + } aBookarmks.sort(function(aA, aB) { return aA.position - aB.position; }); - aBookarmks.forEach(function(aItem, aIndex) { - if (this.BookmarksService.getItemType(aItem.id) != this.BookmarksService.TYPE_BOOKMARK) - return; + for (let [i, item] in Iterator(aBookarmks)) + { + if (this.BookmarksService.getItemType(item.id) != this.BookmarksService.TYPE_BOOKMARK) + continue; - let uri = this.BookmarksService.getBookmarkURI(aItem.id); + let uri = this.BookmarksService.getBookmarkURI(item.id); if (/^about:treestyletab-group\b/.test(uri.spec)) { - let title = this.BookmarksService.getItemTitle(aItem.id); - let folderId = this.BookmarksService.createFolder(aItem.parent, title, aItem.position); - this.BookmarksService.removeItem(aItem.id); - aItem.id = folderId; - aItem.isFolder = true; + let title = this.BookmarksService.getItemTitle(item.id); + let folderId = this.BookmarksService.createFolder(item.parent, title, item.position); + this.BookmarksService.removeItem(item.id); + item.id = folderId; + item.isFolder = true; } - let index = aTreeStructure[aIndex]; + let index = aTreeStructure[i]; let parent = index > -1 ? aBookarmks[index] : null ; if (parent && (parent.folder || parent).isFolder) { let folder = parent.folder || parent; - this.BookmarksService.moveItem(aItem.id, folder.id, -1); - aItem.folder = folder; + this.BookmarksService.moveItem(item.id, folder.id, -1); + item.folder = folder; } if (parent && !parent.isFolder) { - PlacesUtils.setAnnotationsForItem(aItem.id, [{ + PlacesUtils.setAnnotationsForItem(item.id, [{ name : this.kPARENT, value : parent ? parent.id : -1, expires : PlacesUtils.annotations.EXPIRE_NEVER }]); } - }, this); + } }, bookmarkTabSubtree : function TSTBMService_bookmarkTabSubtree(aTabOrTabs) @@ -102,10 +104,11 @@ var TreeStyleTabBookmarksService = { var b = this.getTabBrowserFromChild(tabs[0]); var bookmarkedTabs = []; - tabs.forEach(function(aTab, aIndex) { - if (!this.isGroupTab(aTab, aIndex == 0)) bookmarkedTabs.push(aTab); - bookmarkedTabs = bookmarkedTabs.concat(b.treeStyleTab.getDescendantTabs(aTab)); - }, this); + for (let [i, tab] in Iterator(tabs)) + { + if (!this.isGroupTab(tab, i == 0)) bookmarkedTabs.push(tab); + bookmarkedTabs = bookmarkedTabs.concat(b.treeStyleTab.getDescendantTabs(tab)); + } this.beginAddBookmarksFromTabs(bookmarkedTabs); try { @@ -357,12 +360,13 @@ var TreeStyleTabBookmarksService = { TreeStyleTabBookmarksService.beginAddBookmarksFromTabs((function() { var tabs = []; var seen = {}; - Array.forEach(getBrowser().mTabContainer.childNodes, function(aTab) { - let uri = aTab.linkedBrowser.currentURI.spec; - if (uri in seen) return; + for (let [, tab] in Iterator(getBrowser().mTabContainer.childNodes)) + { + let uri = tab.linkedBrowser.currentURI.spec; + if (uri in seen) continue; seen[uri] = true; - tabs.push(aTab); - }); + tabs.push(tab); + } return tabs; })()); try { diff --git a/content/treestyletab/bookmarksOverlayEditable.js b/content/treestyletab/bookmarksOverlayEditable.js index f0168ca2..2e73643e 100644 --- a/content/treestyletab/bookmarksOverlayEditable.js +++ b/content/treestyletab/bookmarksOverlayEditable.js @@ -155,12 +155,13 @@ var TreeStyleTabBookmarksServiceEditable = { } var fragment = document.createDocumentFragment(); - items.forEach(function(aId, aIndex) { - let label = PlacesUtils.bookmarks.getItemTitle(aId); + for (let [i, id] in Iterator(items)) + { + let label = PlacesUtils.bookmarks.getItemTitle(id); let item = document.createElement('menuitem'); - item.setAttribute('value', aId); + item.setAttribute('value', id); - let parent = aIndex; + let parent = i; let nest = 0; let disabled = false; while ((parent = treeStructure[parent]) != -1) @@ -170,17 +171,17 @@ var TreeStyleTabBookmarksServiceEditable = { } if (nest) item.setAttribute('style', 'padding-left:'+nest+'em'); - if (disabled || aId == aCurrentItem) { + if (disabled || id == aCurrentItem) { item.setAttribute('disabled', true); - if (aId == aCurrentItem) + if (id == aCurrentItem) label = this.treeBundle.getFormattedString('bookmarkProperty.parent.current.label', [label]); } - if (aId == selected) item.setAttribute('selected', true); + if (id == selected) item.setAttribute('selected', true); item.setAttribute('label', label); fragment.appendChild(item); - }, this); + } return fragment; }, _getItemsInFolder : function TSTBMEditable__getItemsInFolder(aId) diff --git a/content/treestyletab/config.js b/content/treestyletab/config.js index 4fe5faae..d2d6794a 100644 --- a/content/treestyletab/config.js +++ b/content/treestyletab/config.js @@ -89,15 +89,14 @@ function initAppearancePane() document.getElementById('extensions.treestyletab.tabbar.style-arrowscrollbox'), document.getElementById('extensions.treestyletab.twisty.style-arrowscrollbox') ]; - Array.slice(boxes[0].childNodes).concat(Array.slice(boxes[1].childNodes)) - .forEach(function(aItem) { - var start = 0; - var delta = 200; - var radian = 90 * Math.PI / 180; + Array.slice(boxes[0].childNodes).concat(Array.slice(boxes[1].childNodes)).forEach(function(aItem) { + let start = 0; + let delta = 200; + let radian = 90 * Math.PI / 180; aItem.style.overflow = 'hidden'; aItem.width = 0; aItem.style.maxWidth = 0; - var task = function(aTime, aBeginning, aChange, aDuration) { + let task = function(aTime, aBeginning, aChange, aDuration) { var width; if (aTime >= aDuration) { width = start + delta; @@ -186,17 +185,18 @@ function onSyncGroupBookmarkUIToPref() if (gGroupBookmarkUnderParent.checked) behavior |= 256; if (gGroupBookmarkType.value == 'true') behavior |= 512; - [ - gGroupBookmarkUnderParent, - gGroupBookmarkType, - gGroupBookmarkType.previousSibling, - gGroupBookmarkType.nextSibling - ].forEach(function(aNode) { + for (let [, node] in Iterator([ + gGroupBookmarkUnderParent, + gGroupBookmarkType, + gGroupBookmarkType.previousSibling, + gGroupBookmarkType.nextSibling + ])) + { if (behavior & 1) - aNode.removeAttribute('disabled'); + node.removeAttribute('disabled'); else - aNode.setAttribute('disabled', true); - }); + node.setAttribute('disabled', true); + } return behavior; } diff --git a/content/treestyletab/windowHelper.js b/content/treestyletab/windowHelper.js index 202c76d1..fcefb8f6 100644 --- a/content/treestyletab/windowHelper.js +++ b/content/treestyletab/windowHelper.js @@ -201,24 +201,24 @@ var TreeStyleTabWindowHelper = { ); } - this._splitFunctionNames().some(function(aFunc) { - let source = this._getFunctionSource(aFunc); + for (let [, func] in Iterator(this._splitFunctionNames())) + { + let source = this._getFunctionSource(func); if (!source || !/^\(?function handleLinkClick/.test(source)) - return false; - eval(aFunc+' = '+source.replace( + continue; + eval(func+' = '+source.replace( /(charset\s*:\s*doc\.characterSet\s*)/, '$1, event : event, linkNode : linkNode' )); - source = null; - return true; - }, this); + break; + } if ('openLinkIn' in window) { eval('window.openLinkIn = '+ @@ -233,16 +233,17 @@ var TreeStyleTabWindowHelper = { ); } - this._splitFunctionNames().forEach(function(aFunc) { - let source = this._getFunctionSource(aFunc); + for (let [, func] in Iterator(this._splitFunctionNames())) + { + let source = this._getFunctionSource(func); if (!source || !/^\(?function contentAreaClick/.test(source)) - return; - eval(aFunc+' = '+source.replace( + continue; + eval(func+' = '+source.replace( // for Tab Utilities, etc. Some addons insert openNewTabWith() to the function. // (calls for the function is not included by Firefox default.) /(openNewTabWith\()/g, @@ -250,67 +251,66 @@ var TreeStyleTabWindowHelper = { if (!TreeStyleTabService.checkToOpenChildTab(event.target.ownerDocument.defaultView)) TreeStyleTabService.readyToOpenChildTab(event.target.ownerDocument.defaultView); $1]]> )); - source = null; - }, this); + } - this._splitFunctionNames().forEach(function(aFunc) { - let source = this._getFunctionSource(aFunc); + for (let [, func] in Iterator(this._splitFunctionNames())) + { + let source = this._getFunctionSource(func); if (!source || !/^\(?function (gotoHistoryIndex|BrowserForward|BrowserBack)/.test(source)) - return; - eval(aFunc+' = '+source.replace( + continue; + eval(func+' = '+source.replace( /((?:openUILinkIn|duplicateTabIn)\()/g, )); - source = null; - }, this); + } - this._splitFunctionNames().forEach(function(aFunc) { - let source = this._getFunctionSource(aFunc); + for (let [, func] in Iterator(this._splitFunctionNames())) + { + let source = this._getFunctionSource(func); if (!source || !/^\(?function (BrowserReloadOrDuplicate)/.test(source)) - return; - eval(aFunc+' = '+source.replace( + continue; + eval(func+' = '+source.replace( /((?:openUILinkIn|duplicateTabIn)\()/g, )); - source = null; - }, this); + } - this._splitFunctionNames().forEach(function(aFunc) { - let source = this._getFunctionSource(aFunc); + for (let [, func] in Iterator(this._splitFunctionNames())) + { + let source = this._getFunctionSource(func); if (!source || !/^\(?function (BrowserHomeClick|BrowserGoHome)/.test(source)) - return; - eval(aFunc+' = '+source.replace( + continue; + eval(func+' = '+source.replace( 'gBrowser.loadTabs(', )); - source = null; - }, this); + } eval('FeedHandler.loadFeed = '+ FeedHandler.loadFeed.toSource().replace( diff --git a/content/treestyletab/windowHelperHacks.js b/content/treestyletab/windowHelperHacks.js index 66bedfb1..4e5a4716 100644 --- a/content/treestyletab/windowHelperHacks.js +++ b/content/treestyletab/windowHelperHacks.js @@ -86,16 +86,17 @@ TreeStyleTabWindowHelper.overrideExtensionsPreInit = function TSTWH_overrideExte (function() { var tabsInfo = {}; var TST = TreeStyleTabService; - Array.slice(getBrowser().mTabContainer.childNodes) - .forEach(function(aTab) { - var index = this.getPermaTabLocalIndex(aTab); - if (index < 0) return; - var info = {}; - TST.extraProperties.forEach(function(aProperty) { - info[aProperty] = TST.getTabValue(aTab, aProperty); - }); - tabsInfo[this.permaTabs[index].id] = info; - }, this); + for (let [, tab] in Iterator(getBrowser().mTabContainer.childNodes)) + { + let index = this.getPermaTabLocalIndex(tab); + if (index < 0) continue; + let info = {}; + for (let [, property] in Iterator(TST.extraProperties)) + { + info[property] = TST.getTabValue(tab, property); + } + tabsInfo[this.permaTabs[index].id] = info; + } TST.setTreePref('permaTabsInfo', tabsInfo.toSource()); }).call(this); ]]> @@ -124,9 +125,10 @@ TreeStyleTabWindowHelper.overrideExtensionsPreInit = function TSTWH_overrideExte sessionData.getTabProperties.toSource().replace( 'return tabProperties;', ) ); @@ -136,13 +138,14 @@ TreeStyleTabWindowHelper.overrideExtensionsPreInit = function TSTWH_overrideExte ) ); @@ -197,12 +200,10 @@ TreeStyleTabWindowHelper.overrideExtensionsPreInit = function TSTWH_overrideExte 'var tabcount = ', )); @@ -213,13 +214,14 @@ TreeStyleTabWindowHelper.overrideExtensionsPreInit = function TSTWH_overrideExte // https://addons.mozilla.org/firefox/addon/4650 if ('FS_onFullerScreen' in window && sv.getTreePref('compatibility.FullerScreen')) { - 'CheckIfFullScreen,FS_onFullerScreen,FS_onMouseMove'.split(',').forEach(function(aFunc) { - if (!(aFunc in window)) return; - eval('window.'+aFunc+' = '+window[aFunc].toSource().replace( + for (let [, func] in Iterator('CheckIfFullScreen,FS_onFullerScreen,FS_onMouseMove'.split(','))) + { + if (!(func in window)) continue; + eval('window.'+func+' = '+window[func].toSource().replace( /FS_data.mTabs.(removeAttribute\("moz-collapsed"\)|setAttribute\("moz-collapsed", "true"\));/g, 'if (gBrowser.treeStyleTab.currentTabbarPosition == "top") { $& }' )); - }, this); + } } // TooManyTabs @@ -815,19 +817,19 @@ TreeStyleTabWindowHelper.overrideExtensionsAfterBrowserInit = function TSTWH_ove if ('LinkyContext' in window && 'prototype' in LinkyContext && sv.getTreePref('compatibility.Linky')) { - 'doSelected,doSelectedText,doImages,doAll,doAllPics,doValidateAll,doValidateSelected' - .split(',').forEach(function(aMethod) { - if (!(aMethod in LinkyContext.prototype)) return; - eval('LinkyContext.prototype.'+aMethod+' = '+ - LinkyContext.prototype[aMethod].toSource().replace( - '{', - '{ TreeStyleTabService.readyToOpenChildTab(null, true);' - ).replace( - /(\}\)?)$/, - 'TreeStyleTabService.stopToOpenChildTab(); $1' - ) - ); - }); + for (let [, method] in Iterator('doSelected,doSelectedText,doImages,doAll,doAllPics,doValidateAll,doValidateSelected'.split(','))) + { + if (!(method in LinkyContext.prototype)) continue; + eval('LinkyContext.prototype.'+method+' = '+ + LinkyContext.prototype[method].toSource().replace( + '{', + '{ TreeStyleTabService.readyToOpenChildTab(null, true);' + ).replace( + /(\}\)?)$/, + 'TreeStyleTabService.stopToOpenChildTab(); $1' + ) + ); + } } // QuickDrag @@ -1322,16 +1324,18 @@ TreeStyleTabWindowHelper.overrideExtensionsDelayed = function TSTWH_overrideExte break; case sv.kEVENT_TYPE_BEFORE_TOOLBAR_CUSTOMIZATION: - tabbarToolboxes.forEach(function(aToolbox) { - aToolbox.removeAttribute('collapsed'); - }); + for (let [, toolbox] in Iterator(tabbarToolboxes)) + { + toolbox.removeAttribute('collapsed'); + } break; case sv.kEVENT_TYPE_AFTER_TOOLBAR_CUSTOMIZATION: - tabbarToolboxes.forEach(function(aToolbox) { - if (!aToolbox.firstChild.hasChildNodes()) - aToolbox.setAttribute('collapsed', true); - }); + for (let [, toolbox] in Iterator(tabbarToolboxes)) + { + if (!toolbox.firstChild.hasChildNodes()) + toolbox.setAttribute('collapsed', true); + } break; case 'unload': @@ -1348,10 +1352,11 @@ TreeStyleTabWindowHelper.overrideExtensionsDelayed = function TSTWH_overrideExte document.addEventListener(sv.kEVENT_TYPE_BEFORE_TOOLBAR_CUSTOMIZATION, listener, false); document.addEventListener(sv.kEVENT_TYPE_AFTER_TOOLBAR_CUSTOMIZATION, listener, false); document.addEventListener('unload', listener, false); - tabbarToolboxes.forEach(function(aToolbox) { - if (!aToolbox.firstChild.hasChildNodes()) - aToolbox.setAttribute('collapsed', true); - }); + for (let [, toolbox] in Iterator(tabbarToolboxes)) + { + if (!toolbox.firstChild.hasChildNodes()) + toolbox.setAttribute('collapsed', true); + } } } diff --git a/modules/browser.js b/modules/browser.js index ad55151a..b94968ce 100644 --- a/modules/browser.js +++ b/modules/browser.js @@ -523,15 +523,13 @@ TreeStyleTabBrowser.prototype = { { var tabs = this.getTabsArray(this.mTabBrowser); var count = tabs.length; - tabs.forEach( - aStacked ? - function(aTab, aIndex) { - aTab.style.zIndex = count * 1000 - aIndex; - } : - function(aTab, aIndex) { - aTab.style.zIndex = ''; - } - ); + for (let [i, tab] in Iterator(tabs)) + { + if (aStacked) + tab.style.zIndex = count * 1000 - index; + else + tab.style.zIndex = ''; + } }, fixTooNarrowTabbar : function TSTBrowser_fixTooNarrowTabbar() @@ -723,21 +721,22 @@ TreeStyleTabBrowser.prototype = { if (!('MultipleTabService' in w)) { w.setTimeout(function(aSelf, aTabBrowser, aPopup) { let suffix = '-tabbrowser-'+(aTabBrowser.id || 'instance-'+parseInt(Math.random() * 65000)); - [ - aSelf.kMENUITEM_RELOADSUBTREE, - aSelf.kMENUITEM_RELOADCHILDREN, - aSelf.kMENUITEM_REMOVESUBTREE, - aSelf.kMENUITEM_REMOVECHILDREN, - aSelf.kMENUITEM_REMOVEALLTABSBUT, - aSelf.kMENUITEM_COLLAPSEEXPAND_SEPARATOR, - aSelf.kMENUITEM_COLLAPSE, - aSelf.kMENUITEM_EXPAND, - aSelf.kMENUITEM_AUTOHIDE_SEPARATOR, - aSelf.kMENUITEM_AUTOHIDE, - aSelf.kMENUITEM_FIXED, - aSelf.kMENUITEM_BOOKMARKSUBTREE - ].forEach(function(aID) { - let item = d.getElementById(aID).cloneNode(true); + for (let [, id] in Iterator([ + aSelf.kMENUITEM_RELOADSUBTREE, + aSelf.kMENUITEM_RELOADCHILDREN, + aSelf.kMENUITEM_REMOVESUBTREE, + aSelf.kMENUITEM_REMOVECHILDREN, + aSelf.kMENUITEM_REMOVEALLTABSBUT, + aSelf.kMENUITEM_COLLAPSEEXPAND_SEPARATOR, + aSelf.kMENUITEM_COLLAPSE, + aSelf.kMENUITEM_EXPAND, + aSelf.kMENUITEM_AUTOHIDE_SEPARATOR, + aSelf.kMENUITEM_AUTOHIDE, + aSelf.kMENUITEM_FIXED, + aSelf.kMENUITEM_BOOKMARKSUBTREE + ])) + { + let item = d.getElementById(id).cloneNode(true); item.setAttribute('id', item.getAttribute('id')+suffix); let refNode = void(0); @@ -758,7 +757,7 @@ TreeStyleTabBrowser.prototype = { } } aPopup.insertBefore(item, refNode || null); - }); + } tabContextMenu = null; }, 0, this, b, tabContextMenu); } @@ -974,16 +973,15 @@ TreeStyleTabBrowser.prototype = { namedNodes.counterAnchor = namedNodes.label; var foundContainers = []; - var containers = [ + for (let [, container] in Iterator([ namedNodes.twistyAnchor.parentNode, namedNodes.label.parentNode, namedNodes.counter.parentNode, namedNodes.closeAnchor.parentNode - ]; - for (let [, container] in Iterator(containers)) + ])) { if (foundContainers.indexOf(container) > -1) - return; + continue; this.initTabContentsOrderInternal(container, namedNodes, aForce); foundContainers.push(container); } @@ -1070,9 +1068,10 @@ TreeStyleTabBrowser.prototype = { (typeof aTarget == 'object' && 'length' in aTarget) ? Array.slice(aTarget) : self.getAllTabsArray(b); - tabs.forEach(function(aTab) { - this.initTabContentsOrder(aTab); - }, self); + for (let [, tab] in Iterator(tabs)) + { + this.initTabContentsOrder(tab); + } }); }, @@ -1186,13 +1185,14 @@ TreeStyleTabBrowser.prototype = { b.mPanelContainer.removeAttribute('height'); if (strip.localName == 'toolbar') { - Array.forEach(strip.childNodes, function(aNode) { - if (aNode.localName == 'tabs') - return; - if (aNode.hasAttribute('flex')) - aNode.setAttribute('treestyletab-backup-flex', aNode.getAttribute('flex')); - aNode.removeAttribute('flex'); - }, this); + for (let [, node] in Iterator(strip.childNodes)) + { + if (node.localName == 'tabs') + continue; + if (node.hasAttribute('flex')) + node.setAttribute('treestyletab-backup-flex', node.getAttribute('flex')); + node.removeAttribute('flex'); + } } if (pos == this.kTABBAR_RIGHT) { @@ -1265,15 +1265,16 @@ TreeStyleTabBrowser.prototype = { this.removeTabbrowserAttribute(this.kTAB_INVERTED); if (strip.localName == 'toolbar') { - Array.forEach(strip.childNodes, function(aNode) { - if (aNode.localName == 'tabs') - return; - var flex = aNode.hasAttribute('treestyletab-backup-flex'); + for (let [, node] in Iterator(strip.childNodes)) + { + if (node.localName == 'tabs') + continue; + let flex = node.hasAttribute('treestyletab-backup-flex'); if (!flex) - return; - aNode.setAttribute('flex', flex); - aNode.removeAttribute('treestyletab-backup-flex'); - }, this); + continue; + node.setAttribute('flex', flex); + node.removeAttribute('treestyletab-backup-flex'); + } } if (pos == this.kTABBAR_BOTTOM) { @@ -1299,18 +1300,20 @@ TreeStyleTabBrowser.prototype = { } var tabs = this.getAllTabsArray(b); - tabs.forEach(function(aTab) { - aTab.style.removeProperty(this.indentCSSProp); - aTab.style.removeProperty(this.collapseCSSProp); - }, this); + for (let [, tab] in Iterator(tabs)) + { + tab.style.removeProperty(this.indentCSSProp); + tab.style.removeProperty(this.collapseCSSProp); + } this.indentProp = this.getTreePref('indent.property'); this.indentCSSProp = this.indentProp+'-'+this.indentTarget; this.collapseCSSProp = 'margin-'+this.collapseTarget; - tabs.forEach(function(aTab) { - this.updateTabCollapsed(aTab, aTab.getAttribute(this.kCOLLAPSED) == 'true', true); - }, this); + for (let [i, tab] in Iterator(tabs)) + { + this.updateTabCollapsed(tab, tab.getAttribute(this.kCOLLAPSED) == 'true', true); + } // for updateTabbarOverflow(), we should reset the "overflow" now. b.mTabContainer.removeAttribute('overflow'); @@ -1800,13 +1803,13 @@ TreeStyleTabBrowser.prototype = { reinitAllTabs : function TSTBrowser_reinitAllTabs(aSouldUpdateCount) { - var tabs = this.getAllTabsArray(this.mTabBrowser); - tabs.forEach(function(aTab) { - this.initTabAttributes(aTab); - this.initTabContents(aTab); + for (let [, tab] in Iterator(this.getAllTabsArray(this.mTabBrowser))) + { + this.initTabAttributes(tab); + this.initTabContents(tab); if (aSouldUpdateCount) - this.updateTabsCount(aTab); - }, this); + this.updateTabsCount(tab); + } }, destroy : function TSTBrowser_destroy() @@ -1832,11 +1835,12 @@ TreeStyleTabBrowser.prototype = { var b = this.mTabBrowser; delete b.tabContainer.treeStyleTab; - this.getAllTabsArray(b).forEach(function(aTab) { - this.stopTabIndentAnimation(aTab); - this.stopTabCollapseAnimation(aTab); - this.destroyTab(aTab); - }, this); + for (let [, tab] in Iterator(this.getAllTabsArray(b))) + { + this.stopTabIndentAnimation(tab); + this.stopTabCollapseAnimation(tab); + this.destroyTab(tab); + } this._endListenTabbarEvents(); @@ -2002,9 +2006,7 @@ TreeStyleTabBrowser.prototype = { this.ownerToolbar.classList.add(this.kTABBAR_TOOLBAR); this.ownerToolbar.classList.remove(this.kTABBAR_TOOLBAR_READY); Array.slice(this.document.querySelectorAll('.'+this.kTABBAR_TOOLBAR_READY_POPUP)) - .forEach(function(aPanel) { - this.safeRemovePopup(aPanel); - }, this); + .forEach(this.safeRemovePopup, this); var position = this._lastTabbarPositionBeforeDestroyed || this.position; delete this._lastTabbarPositionBeforeDestroyed; @@ -2146,22 +2148,25 @@ TreeStyleTabBrowser.prototype = { case 'extensions.treestyletab.tabbar.multirow': this.initTabbar(); this.updateAllTabsIndent(); - tabs.forEach(function(aTab) { - this.initTabContents(aTab); - }, this); + for (let [, tab] in Iterator(tabs)) + { + this.initTabContents(tab); + } return; case 'extensions.treestyletab.tabbar.invertTabContents': this.setTabbrowserAttribute(this.kTAB_CONTENTS_INVERTED, value); - tabs.forEach(function(aTab) { - this.initTabContents(aTab); - }, this); + for (let [, tab] in Iterator(tabs)) + { + this.initTabContents(tab); + } return; case 'extensions.treestyletab.tabbar.invertClosebox': this.setTabbrowserAttribute(this.kCLOSEBOX_INVERTED, value); - tabs.forEach(function(aTab) { - this.initTabContents(aTab); - }, this); + for (let [, tab] in Iterator(tabs)) + { + this.initTabContents(tab); + } return; case 'extensions.treestyletab.tabbar.style': @@ -2707,9 +2712,10 @@ TreeStyleTabBrowser.prototype = { this.markAsClosedSet([tab].concat(tabs)); - tabs.reverse().forEach(function(aTab) { - b.removeTab(aTab, { animate : true }); - }, this); + for (let [, tab] in Iterator(tabs.reverse())) + { + b.removeTab(tab, { animate : true }); + } this.fireTabSubtreeClosedEvent(b, tab, tabs); @@ -2862,9 +2868,7 @@ TreeStyleTabBrowser.prototype = { var parent = this.getParentTab(aTab); var siblings = this.getSiblingTabs(aTab); - var groupTabs = siblings.filter(function(aTab) { - return this.isGroupTab(aTab); - }, this); + var groupTabs = siblings.filter(this.isGroupTab, this); var groupTab = ( groupTabs.length == 1 && siblings.length == 1 && @@ -2893,15 +2897,14 @@ TreeStyleTabBrowser.prototype = { }, this)) return false; - trees.forEach(function(aTabs) { - this.markAsClosedSet(aTabs); - }, this); + trees.forEach(this.markAsClosedSet, this); var self = this; this.Deferred.next(function() { - trees.forEach(function(aTabs) { - self.fireTabSubtreeClosedEvent(b, aTabs[0], aTabs); - }); + for (let [, tabs] in Iterator(trees)) + { + self.fireTabSubtreeClosedEvent(b, tabs[0], tabs); + } }); return true; @@ -3113,7 +3116,7 @@ TreeStyleTabBrowser.prototype = { return; // restore tree from bottom safely - tabs.filter(function(aChanged) { + var restoreTabs = tabs.filter(function(aChanged) { return aChanged.type == 'TabShow' && aChanged.tab.__treestyletab__restoreState == aSelf.RESTORE_STATE_READY_TO_RESTORE; }) @@ -3123,11 +3126,12 @@ TreeStyleTabBrowser.prototype = { .sort(function(aA, aB) { return aB._tPos - aA._tPos; }) - .filter(aSelf.restoreOneTab, aSelf) - .forEach(function(aTab) { - aSelf.updateInsertionPositionInfo(aTab); - delete aTab.__treestyletab__restoreState; - }, aSelf); + .filter(aSelf.restoreOneTab, aSelf); + for (let [, tab] in Iterator(restoreTabs)) + { + aSelf.updateInsertionPositionInfo(tab); + delete tab.__treestyletab__restoreState; + } var currentGroupId = aSelf.getTabViewGroupId(); if (aSelf.lastTabViewGroup && currentGroupId != aSelf.lastTabViewGroup) { @@ -3183,7 +3187,7 @@ TreeStyleTabBrowser.prototype = { var lastIndex = allTabs.length - 1; var lastMovedTab; normalTabs = normalTabs.slice(0).reverse(); - for each (let tab in normalTabs) + for (let [, tab] in Iterator(normalTabs)) { let parent = this.getParentTab(tab); let attached = false; @@ -3251,10 +3255,11 @@ TreeStyleTabBrowser.prototype = { this.detachTab(aParent); b.moveTabTo(aParent, lastCount); var descendantTabs = this.getDescendantTabs(aParent); - descendantTabs.forEach(function(aTab) { - w.TabView.moveTabTo(aTab, id); - b.moveTabTo(aTab, lastCount); - }); + for (let [, tab] in Iterator(descendantTabs)) + { + w.TabView.moveTabTo(tab, id); + b.moveTabTo(tab, lastCount); + } this.internallyTabMovingCount--; this.tabViewTreeIsMoving = false; }, @@ -3446,14 +3451,15 @@ TreeStyleTabBrowser.prototype = { * For failsafe, we must override actual attributes by stored * values. */ - [ - this.kINSERT_BEFORE, - this.kINSERT_AFTER - ].forEach(function(aKey) { - var tab = this.getTabValue(aTab, aKey); + for (let [, key] in Iterator([ + this.kINSERT_BEFORE, + this.kINSERT_AFTER + ])) + { + let tab = this.getTabValue(aTab, key); if (this.getTabById(tab)) this.setTabValue(aTab, aKey, tab); - }, this); + } let parentId = this.getTabValue(aTab, this.kPARENT); let parentTab = this.getTabById(parentId); @@ -3508,15 +3514,16 @@ TreeStyleTabBrowser.prototype = { return this.redirectId(aChild); }, this); - aChildrenList.forEach(function(aChildTab) { - if (aChildTab && (aChildTab = this.getTabById(aChildTab))) { + for (let [, childTab] in Iterator(aChildrenList)) + { + if (childTab && (childTab = this.getTabById(childTab))) { let options = aOptions; if (options && typeof options == 'function') - options = options(aChildTab); - this.attachTabTo(aChildTab, aTab, options); - childTabs.push(aChildTab); + options = options(childTab); + this.attachTabTo(childTab, aTab, options); + childTabs.push(childTab); } - }, this); + } aChildrenList = aChildrenList.join('|'); if (aTab.getAttribute(this.kCHILDREN) == aChildrenList) aTab.removeAttribute(this.kCHILDREN_RESTORING); @@ -3639,23 +3646,24 @@ TreeStyleTabBrowser.prototype = { var children = aTab.getAttribute(this.kCHILDREN); if (restoringChildren != children) { var restoringChildrenIDs = restoringChildren.split('|'); - restoringChildrenIDs.reverse().forEach(function(aChild, aIndex) { - aChild = this.getTabById(aChild); - if (!aChild) return; + for (let [i, child] in Iterator(restoringChildrenIDs.reverse())) + { + child = this.getTabById(child); + if (!child) continue; - let nextTab = aIndex > 0 ? - this.getTabById(restoringChildrenIDs[aIndex-1]) : + let nextTab = i > 0 ? + this.getTabById(restoringChildrenIDs[i-1]) : this.getNextSiblingTab(aTab) ; - if (nextTab == this.getNextSiblingTab(aChild)) return; + if (nextTab == this.getNextSiblingTab(child)) continue; let newPos = -1; if (nextTab) { newPos = nextTab._tPos; - if (newPos > aChild._tPos) newPos--; + if (newPos > child._tPos) newPos--; } if (newPos > -1) - this.moveTabSubtreeTo(aChild, newPos); - }, this); + this.moveTabSubtreeTo(child, newPos); + } children = aTab.getAttribute(this.kCHILDREN); } @@ -3697,14 +3705,14 @@ TreeStyleTabBrowser.prototype = { ) return; - var items = this.evalInSandbox('('+this.SessionStore.getClosedTabData(this.window)+')'); var indexes = []; - items.forEach(function(aItem, aIndex) { - if (aItem.state.extData && - aItem.state.extData[this.kCLOSED_SET_ID] && - aItem.state.extData[this.kCLOSED_SET_ID] == aId) - indexes.push(aIndex); - }, this); + for (let [i, item] in Iterator(this.evalInSandbox('('+this.SessionStore.getClosedTabData(this.window)+')'))) + { + if (item.state.extData && + item.state.extData[this.kCLOSED_SET_ID] && + item.state.extData[this.kCLOSED_SET_ID] == aId) + indexes.push(i); + } var count = parseInt(aId.split('::')[1]); @@ -3744,9 +3752,10 @@ TreeStyleTabBrowser.prototype = { this.windowService.restoringTree = true; var offset = 0; - aIndexes.forEach(function(aIndex) { - this.window.undoCloseTab(aIndex - (offset++)); - }, this); + for (let [, index] in Iterator(aIndexes)) + { + this.window.undoCloseTab(index - (offset++)); + } this.window.setTimeout(function(aSelf, aNextFocused) { aSelf.windowService.restoringTree = false; @@ -3780,10 +3789,11 @@ TreeStyleTabBrowser.prototype = { */ let b = this.browser; this.internallyTabMovingCount++; - this.getDescendantTabs(aTab).reverse().forEach(function(aChildTab) { - if (aChildTab.__treestyletab__previousPosition > aChildTab._tPos) - b.moveTabTo(aChildTab, aChildTab.__treestyletab__previousPosition); - }, this); + for (let [, childTab] in Iterator(this.getDescendantTabs(aTab).reverse())) + { + if (childTab.__treestyletab__previousPosition > childTab._tPos) + b.moveTabTo(childTab, childTab.__treestyletab__previousPosition); + } this.internallyTabMovingCount--; } else { @@ -3794,10 +3804,11 @@ TreeStyleTabBrowser.prototype = { */ let b = this.browser; this.internallyTabMovingCount++; - this.getChildTabs(aTab).reverse().forEach(function(aChildTab) { - if (aChildTab._tPos < parentTab._tPos) - b.moveTabTo(aChildTab, parentTab._tPos); - }, this); + for (let [, childTab] in Iterator(this.getChildTabs(aTab).reverse())) + { + if (childTab._tPos < parentTab._tPos) + b.moveTabTo(childTab, parentTab._tPos); + } this.internallyTabMovingCount--; } @@ -4182,30 +4193,31 @@ TreeStyleTabBrowser.prototype = { var b = this.mTabBrowser; var sep, items = {}; - [ - this.kMENUITEM_RELOADSUBTREE, - this.kMENUITEM_RELOADCHILDREN, - this.kMENUITEM_REMOVESUBTREE, - this.kMENUITEM_REMOVECHILDREN, - this.kMENUITEM_REMOVEALLTABSBUT, - this.kMENUITEM_COLLAPSE, - this.kMENUITEM_EXPAND, - this.kMENUITEM_AUTOHIDE, - this.kMENUITEM_FIXED, - this.kMENUITEM_BOOKMARKSUBTREE - ].forEach(function(aID) { + for (let [, id] in Iterator([ + this.kMENUITEM_RELOADSUBTREE, + this.kMENUITEM_RELOADCHILDREN, + this.kMENUITEM_REMOVESUBTREE, + this.kMENUITEM_REMOVECHILDREN, + this.kMENUITEM_REMOVEALLTABSBUT, + this.kMENUITEM_COLLAPSE, + this.kMENUITEM_EXPAND, + this.kMENUITEM_AUTOHIDE, + this.kMENUITEM_FIXED, + this.kMENUITEM_BOOKMARKSUBTREE + ])) + { let item = this.evaluateXPath( - 'descendant::xul:*[starts-with(@id, "'+aID+'")]', + 'descendant::xul:*[starts-with(@id, "'+id+'")]', aEvent.currentTarget, Ci.nsIDOMXPathResult.FIRST_ORDERED_NODE_TYPE ).singleNodeValue; - if (!item) return; - items[aID] = item; - if (this.getTreePref('show.'+aID)) + if (!item) continue; + items[id] = item; + if (this.getTreePref('show.'+id)) item.removeAttribute('hidden'); else item.setAttribute('hidden', true); - switch (aID) + switch (id) { case this.kMENUITEM_RELOADSUBTREE: case this.kMENUITEM_RELOADCHILDREN: @@ -4216,11 +4228,11 @@ TreeStyleTabBrowser.prototype = { case this.kMENUITEM_EXPAND: case this.kMENUITEM_BOOKMARKSUBTREE: this.showHideSubtreeMenuItem(item, [b.mContextTab]); - break; + continue; default: - break; + continue; } - }, this); + } // collapse/expand all sep = this.evaluateXPath( @@ -4391,9 +4403,10 @@ TreeStyleTabBrowser.prototype = { resetAllTabs : function TSTBrowser_resetAllTabs(aDetachAllChildren) { - this.getAllTabsArray(this.mTabBrowser).forEach(function(aTab) { - this.resetTab(aTab, aDetachAllChildren); - }, this); + for (let [, tab] in Iterator(this.getAllTabsArray(this.mTabBrowser))) + { + this.resetTab(tab, aDetachAllChildren); + } }, resetTabbarSize : function TSTBrowser_resetTabbarSize() @@ -4427,24 +4440,26 @@ TreeStyleTabBrowser.prototype = { this.allowSubtreeCollapseExpand = true; delete this._lastAllowSubtreeCollapseExpand; - this.getAllTabsArray(this.browser).forEach(function(aTab) { - if (aTab._TSTLastSubtreeCollapsed) - this.collapseExpandSubtree(aTab, true, true); - if (aTab._TSTLastSubtreeExpandedManually) - this.setTabValue(aTab, this.kSUBTREE_EXPANDED_MANUALLY, true); - delete aTab._TSTLastSubtreeCollapsed; - delete aTab._TSTLastSubtreeExpandedManually; - this.updateTabIndent(aTab, 0, true); - }, this); + for (let [, tab] in Iterator(this.getAllTabsArray(this.browser))) + { + if (tab._TSTLastSubtreeCollapsed) + this.collapseExpandSubtree(tab, true, true); + if (tab._TSTLastSubtreeExpandedManually) + this.setTabValue(tab, this.kSUBTREE_EXPANDED_MANUALLY, true); + delete tab._TSTLastSubtreeCollapsed; + delete tab._TSTLastSubtreeExpandedManually; + this.updateTabIndent(tab, 0, true); + } this.updateTabsIndent(this.rootTabs, undefined, true); } else { - this.getAllTabsArray(this.browser).forEach(function(aTab) { - this.updateTabIndent(aTab, 0, true); - aTab._TSTLastSubtreeCollapsed = this.isSubtreeCollapsed(aTab); - aTab._TSTLastSubtreeExpandedManually = this.getTabValue(aTab, this.kSUBTREE_EXPANDED_MANUALLY) == 'true'; - this.collapseExpandSubtree(aTab, false, true); - }, this); + for (let [, tab] in Iterator(this.getAllTabsArray(this.browser))) + { + this.updateTabIndent(tab, 0, true); + tab._TSTLastSubtreeCollapsed = this.isSubtreeCollapsed(tab); + tab._TSTLastSubtreeExpandedManually = this.getTabValue(tab, this.kSUBTREE_EXPANDED_MANUALLY) == 'true'; + this.collapseExpandSubtree(tab, false, true); + } this._lastAllowSubtreeCollapseExpand = this.allowSubtreeCollapseExpand; this.allowSubtreeCollapseExpand = false; @@ -4700,47 +4715,44 @@ TreeStyleTabBrowser.prototype = { !this.getTreePref('closeParentBehavior.moveDetachedTabsToBottom')) { insertBefore = this.getNextSiblingTab(this.getRootTab(aTab)); } - children.forEach(( - aInfo.behavior == this.kCLOSE_PARENT_BEHAVIOR_DETACH_ALL_CHILDREN ? - function(aTab) { - this.detachTab(aTab, aInfo); - this.moveTabSubtreeTo(aTab, insertBefore ? insertBefore._tPos - 1 : this.getLastTab(b)._tPos ); - } : - aInfo.behavior == this.kCLOSE_PARENT_BEHAVIOR_PROMOTE_FIRST_CHILD ? - function(aTab, aIndex) { - this.detachTab(aTab, aInfo); - if (aIndex == 0) { - if (parentTab) { - this.attachTabTo(aTab, parentTab, { - __proto__ : aInfo, - dontExpand : true, - dontMove : true - }); - } - this.collapseExpandSubtree(aTab, false); - this.deleteTabValue(aTab, this.kSUBTREE_COLLAPSED); - } - else { - this.attachTabTo(aTab, children[0], { + for (let [i, tab] in Iterator(children)) + { + if (aInfo.behavior == this.kCLOSE_PARENT_BEHAVIOR_DETACH_ALL_CHILDREN) { + this.detachTab(tab, aInfo); + this.moveTabSubtreeTo(tab, insertBefore ? insertBefore._tPos - 1 : this.getLastTab(b)._tPos ); + } + else if (aInfo.behavior == this.kCLOSE_PARENT_BEHAVIOR_PROMOTE_FIRST_CHILD) { + this.detachTab(tab, aInfo); + if (i == 0) { + if (parentTab) { + this.attachTabTo(tab, parentTab, { __proto__ : aInfo, dontExpand : true, dontMove : true }); } - } : - aInfo.behavior == this.kCLOSE_PARENT_BEHAVIOR_PROMOTE_ALL_CHILDREN && parentTab ? - function(aTab) { - this.attachTabTo(aTab, parentTab, { + this.collapseExpandSubtree(tab, false); + this.deleteTabValue(tab, this.kSUBTREE_COLLAPSED); + } + else { + this.attachTabTo(tab, children[0], { __proto__ : aInfo, dontExpand : true, dontMove : true }); - } : - // aInfo.behavior == this.kCLOSE_PARENT_BEHAVIOR_SIMPLY_DETACH_ALL_CHILDREN ? - function(aTab) { - this.detachTab(aTab, aInfo); } - ), this); + } + else if (aInfo.behavior == this.kCLOSE_PARENT_BEHAVIOR_PROMOTE_ALL_CHILDREN && parentTab) { + this.attachTabTo(tab, parentTab, { + __proto__ : aInfo, + dontExpand : true, + dontMove : true + }); + } + else { // aInfo.behavior == this.kCLOSE_PARENT_BEHAVIOR_SIMPLY_DETACH_ALL_CHILDREN + this.detachTab(tab, aInfo); + } + } }, partAllChildren : function TSTBrowser_partAllChildren(aTab, aInfo) /* for backward compatibility */ { @@ -4749,8 +4761,7 @@ TreeStyleTabBrowser.prototype = { detachTabs : function TSTBrowser_detachTabs(aTabs) { - var aTabs = Array.slice(aTabs); - for each (let tab in aTabs) + for (let [, tab] in Iterator(aTabs)) { if (aTabs.indexOf(this.getParentTab(tab)) > -1) continue; @@ -4803,13 +4814,14 @@ TreeStyleTabBrowser.prototype = { indent = Math.min(aLevel * 3, maxIndent); } - Array.slice(aTabs).forEach(function(aTab) { - if (!aTab.parentNode) return; // ignore removed tabs - this.updateTabIndent(aTab, indent, aJustNow); - aTab.setAttribute(this.kNEST, aLevel); - this.updateCanCollapseSubtree(aTab, aLevel); - this.updateTabsIndent(this.getChildTabs(aTab), aLevel+1, aJustNow); - }, this); + for (let [, tab] in Iterator(aTabs)) + { + if (!tab.parentNode) continue; // ignore removed tabs + this.updateTabIndent(tab, indent, aJustNow); + tab.setAttribute(this.kNEST, aLevel); + this.updateCanCollapseSubtree(tab, aLevel); + this.updateTabsIndent(this.getChildTabs(tab), aLevel+1, aJustNow); + } }, updateTabsIndentWithDelay : function TSTBrowser_updateTabsIndentWithDelay(aTabs) { @@ -4819,9 +4831,10 @@ TreeStyleTabBrowser.prototype = { this.updateTabsIndentWithDelayTabs = this.updateTabsIndentWithDelayTabs.concat(aTabs); this.updateTabsIndentWithDelayTimer = this.window.setTimeout(function(aSelf) { var tabs = []; - aSelf.updateTabsIndentWithDelayTabs.forEach(function(aTab) { - if (tabs.indexOf(aTab) < 0 && aTab.parentNode) tabs.push(aTab); - }); + for (let [, tab] in Iterator(aSelf.updateTabsIndentWithDelayTabs)) + { + if (tabs.indexOf(tab) < 0 && tab.parentNode) tabs.push(tab); + } aSelf.updateTabsIndentWithDelayTabs = []; aSelf.updateTabsIndent(tabs); aSelf.window.clearTimeout(aSelf.updateTabsIndentWithDelayTimer); @@ -4851,15 +4864,16 @@ TreeStyleTabBrowser.prototype = { retVal.push('ThreeDShadow'); return retVal.length == 1 ? 'none' : retVal.join(' ') ; })()+' !important;'; - Array.slice(this.document.getAnonymousNodes(aTab)).forEach(function(aBox) { - if (aBox.nodeType != Node.ELEMENT_NODE) return; - aBox.setAttribute( + for (let [, box] in Iterator(this.document.getAnonymousNodes(aTab))) + { + if (box.nodeType != Node.ELEMENT_NODE) continue; + box.setAttribute( 'style', - aBox.getAttribute('style').replace(/(-moz-)?border-(top|bottom)(-[^:]*)?.*:[^;]+;?/g, '') + + box.getAttribute('style') + .replace(/(-moz-)?border-(top|bottom)(-[^:]*)?.*:[^;]+;?/g, '') + '; border-'+this.indentTarget+': solid transparent '+aIndent+'px !important;'+colors ); - }, this); - + } return; } @@ -5035,9 +5049,10 @@ TreeStyleTabBrowser.prototype = { updateAllTabsCount : function TSTBrowser_updateAllTabsCount() { - this.rootTabs.forEach(function(aTab) { - this.updateTabsCount(aTab, this); - }, this); + for (let [, tab] in Iterator(this.rootTabs)) + { + this.updateTabsCount(tab, this); + } }, promoteTooDeepLevelTabs : function TSTBrowser_promoteTooDeepLevelTabs(aParent) @@ -5045,25 +5060,25 @@ TreeStyleTabBrowser.prototype = { if (this.maxTreeLevel < 0 || !this.maxTreeLevelPhisical) return; - var tabs = aParent ? this.getDescendantTabs(aParent) : this.getAllTabsArray(this.mTabBrowser) ; - tabs.forEach(function(aTab) { - var level = parseInt(aTab.getAttribute(this.kNEST) || 0); + for (let [, tab] in Iterator(aParent ? this.getDescendantTabs(aParent) : this.getAllTabsArray(this.mTabBrowser) )) + { + let level = parseInt(tab.getAttribute(this.kNEST) || 0); if (level <= this.maxTreeLevel) - return; + continue; - var parent = this.getParentTab(aTab); - var newParent = this.getParentTab(parent); + let parent = this.getParentTab(tab); + let newParent = this.getParentTab(parent); if (this.maxTreeLevel == 0 || !newParent) { this.detachTab(aTab); } else { - let nextSibling = this.getNextTab(aTab); - this.attachTabTo(aTab, newParent, { + let nextSibling = this.getNextTab(tab); + this.attachTabTo(tab, newParent, { dontMove : true, insertBefore : nextSibling }); } - }, this); + } }, /* move */ @@ -5081,9 +5096,10 @@ TreeStyleTabBrowser.prototype = { this.subTreeChildrenMovingCount++; this.internallyTabMovingCount++; - this.getDescendantTabs(aTab).forEach(function(aDescendantTab, aIndex) { - b.moveTabTo(aDescendantTab, aTab._tPos + aIndex + (aTab._tPos < aDescendantTab._tPos ? 1 : 0 )); - }, this); + for (let [i, descendantTab] in Iterator(this.getDescendantTabs(aTab))) + { + b.moveTabTo(descendantTab, aTab._tPos + i + (aTab._tPos < descendantTab._tPos ? 1 : 0 )); + } this.internallyTabMovingCount--; this.subTreeChildrenMovingCount--; @@ -5294,16 +5310,17 @@ TreeStyleTabBrowser.prototype = { var expandedTabs = this.getChildTabs(aTab); var lastExpandedTabIndex = expandedTabs.length - 1; - expandedTabs.forEach(function(aChildTab, aIndex) { - if (!aCollapse && !aJustNow && aIndex == lastExpandedTabIndex) { + for (let [i, childTab] in Iterator(expandedTabs)) + { + if (!aCollapse && !aJustNow && i == lastExpandedTabIndex) { let self = this; - this.collapseExpandTab(aChildTab, aCollapse, aJustNow, function() { + this.collapseExpandTab(childTab, aCollapse, aJustNow, function() { self.scrollToTabSubtree(aTab); }); } else - this.collapseExpandTab(aChildTab, aCollapse, aJustNow); - }, this); + this.collapseExpandTab(childTab, aCollapse, aJustNow); + } if (aCollapse) this.deleteTabValue(aTab, this.kSUBTREE_EXPANDED_MANUALLY); @@ -5347,9 +5364,10 @@ TreeStyleTabBrowser.prototype = { } if (!this.isSubtreeCollapsed(aTab)) { - this.getChildTabs(aTab).forEach(function(aTab) { - this.collapseExpandTab(aTab, aCollapse, aJustNow); - }, this); + for (let [, tab] in Iterator(this.getChildTabs(aTab))) + { + this.collapseExpandTab(tab, aCollapse, aJustNow); + } } }, updateTabCollapsed : function TSTBrowser_updateTabCollapsed(aTab, aCollapsed, aJustNow, aCallbackToRunOnStartAnimation) @@ -5861,22 +5879,23 @@ TreeStyleTabBrowser.prototype = { if (tabs.length <= 1) return; - tabs.forEach(function(aTab) { - var currentId = aTab.getAttribute(this.kID); - if (this.tabsHash[currentId] == aTab) + for (let [, tab] in Iterator(tabs)) + { + let currentId = tab.getAttribute(this.kID); + if (this.tabsHash[currentId] == tab) delete this.tabsHash[currentId]; - this.resetTabState(aTab); + this.resetTabState(tab); - aTab.setAttribute(this.kID, currentId); // to fallback to it - var [id, duplicated] = this._restoreTabId(aTab); + tab.setAttribute(this.kID, currentId); // to fallback to it + let [id, duplicated] = this._restoreTabId(tab); - this.setTabValue(aTab, this.kID, id); - this.tabsHash[id] = aTab; + this.setTabValue(tab, this.kID, id); + this.tabsHash[id] = tab; - aTab.__treestyletab__restoreState = this.RESTORE_STATE_READY_TO_RESTORE; - aTab.__treestyletab__duplicated = duplicated; - }, this); + tab.__treestyletab__restoreState = this.RESTORE_STATE_READY_TO_RESTORE; + tab.__treestyletab__duplicated = duplicated; + } this.updateAllTabsIndent(true); diff --git a/modules/fullTooltip.js b/modules/fullTooltip.js index dc952810..83b1d1ac 100644 --- a/modules/fullTooltip.js +++ b/modules/fullTooltip.js @@ -413,13 +413,14 @@ FullTooltipManager.prototype = { if (aExtraLabels) { if (typeof aExtraLabels == 'string') aExtraLabels = [aExtraLabels]; - aExtraLabels.forEach(function(aLabel) { - aLabel = aLabel.replace(/^\s+|\s+$/g, ''); - if (!aLabel) - return; + for (let [, label] in Iterator(aExtraLabels)) + { + label = label.replace(/^\s+|\s+$/g, ''); + if (!label) + continue; root.appendChild(this.document.createElement('description')) - .appendChild(this.document.createTextNode(aLabel)); - }, this); + .appendChild(this.document.createTextNode(label)); + } } root.insertBefore(tree, root.firstChild && root.firstChild.nextSibling); diff --git a/modules/pseudoTreeBuilder.js b/modules/pseudoTreeBuilder.js index 44fe245f..8499d5d3 100644 --- a/modules/pseudoTreeBuilder.js +++ b/modules/pseudoTreeBuilder.js @@ -127,9 +127,10 @@ var PseudoTreeBuilder = { return null; var container = doc.createElement('vbox'); - children.forEach(function(aChild) { - container.appendChild(this.createTabItem(aChild)); - }, this); + for (let [, child] in Iterator(children)) + { + container.appendChild(this.createTabItem(child)); + } container.setAttribute('class', this.kTREECHILDREN); return container; } diff --git a/modules/tabbarDNDObserver.js b/modules/tabbarDNDObserver.js index 844aafab..9b1ca336 100644 --- a/modules/tabbarDNDObserver.js +++ b/modules/tabbarDNDObserver.js @@ -414,10 +414,10 @@ catch(e) { var tabs = sv.getTabsArray(targetBrowser); var draggedWholeTree = [].concat(draggedRoots); - for each (let root in draggedRoots) + for (let [, root] in Iterator(draggedRoots)) { let tabs = sourceService.getDescendantTabs(root); - for each (let tab in tabs) + for (let [, tab] in Iterator(tabs)) { if (draggedWholeTree.indexOf(tab) < 0) draggedWholeTree.push(tab); @@ -515,14 +515,15 @@ catch(e) { var sv = b.treeStyleTab; b.movingSelectedTabs = true; // Multiple Tab Handler - aTabs.forEach(function(aTab) { - if (!aTab.parentNode) return; // ignore removed tabs + for (let [, tab] in Iterator(aTabs)) + { + if (!tab.parentNode) continue; // ignore removed tabs if (aParent) - sv.attachTabTo(aTab, aParent); + sv.attachTabTo(tab, aParent); else - sv.detachTab(aTab); - sv.collapseExpandTab(aTab, false); - }, sv); + sv.detachTab(tab); + sv.collapseExpandTab(tab, false); + } b.movingSelectedTabs = false; // Multiple Tab Handler }, @@ -532,11 +533,12 @@ catch(e) { var sv = b.treeStyleTab; b.movingSelectedTabs = true; // Multiple Tab Handler - aTabs.forEach(function(aTab) { - if (!aTab.parentNode) return; // ignore removed tabs - sv.detachTab(aTab); - sv.collapseExpandTab(aTab, false); - }, sv); + for (let [, tab] in Iterator(aTabs)) + { + if (!tab.parentNode) continue; // ignore removed tabs + sv.detachTab(tab); + sv.collapseExpandTab(tab, false); + } b.movingSelectedTabs = false; // Multiple Tab Handler }, @@ -861,9 +863,10 @@ catch(e) { var sv = this.treeStyleTab; if (this.mAutoExpandedTabs.length) { if (sv.getTreePref('autoExpand.collapseFinally')) { - this.mAutoExpandedTabs.forEach(function(aTarget) { - this.collapseExpandSubtree(this.getTabById(aTarget), true, true); - }, sv); + for (let [, target] in Iterator(this.mAutoExpandedTabs)) + { + sv.collapseExpandSubtree(sv.getTabById(target), true, true); + } } this.mAutoExpandedTabs = []; } diff --git a/modules/themeManager.js b/modules/themeManager.js index 238ea102..44655720 100644 --- a/modules/themeManager.js +++ b/modules/themeManager.js @@ -53,10 +53,12 @@ TreeStyleTabThemeManager.prototype = { set : function(aStyle, aPosition) { - if (this._lastStyles) - this._lastStyles.forEach(function(aStyle) { - aStyle.parentNode.removeChild(aStyle); - }); + if (this._lastStyles) { + for (let [, style] in Iterator(this._lastStyles)) + { + style.parentNode.removeChild(style); + } + } this._lastStyles = null; var styles = []; @@ -128,13 +130,14 @@ TreeStyleTabThemeManager.prototype = { null ; if (!images) return; - images.forEach(function(aImage) { - if (this._preLoadImagesForStyleDoneImages.indexOf(aImage) > -1) - return; + for (let [, image] in Iterator(images)) + { + if (this._preLoadImagesForStyleDoneImages.indexOf(image) > -1) + continue; - (new this.window.Image()).src = aImage; - this._preLoadImagesForStyleDoneImages.push(aImage); - }, this); + (new this.window.Image()).src = image; + this._preLoadImagesForStyleDoneImages.push(image); + } }, _preLoadImages : { diff --git a/modules/utils.js b/modules/utils.js index 5f604366..90480306 100644 --- a/modules/utils.js +++ b/modules/utils.js @@ -394,16 +394,18 @@ var TreeStyleTabUtils = { { var OS = this.XULAppInfo.OS; var processed = {}; - this.getDescendant('extensions.treestyletab.platform.'+OS).forEach(function(aKey) { - var key = aKey.replace('platform.'+OS+'.', ''); - this.setDefaultPref(key, this.getPref(aKey)); + for (let [, originalKey] in Iterator(this.getDescendant('extensions.treestyletab.platform.'+OS))) + { + let key = originalKey.replace('platform.'+OS+'.', ''); + this.setDefaultPref(key, this.getPref(originalKey)); processed[key] = true; - }, this); - this.getDescendant('extensions.treestyletab.platform.default').forEach(function(aKey) { - var key = aKey.replace('platform.default.', ''); + } + for (let [, originalKey] in Iterator(this.getDescendant('extensions.treestyletab.platform.default'))) + { + let key = originalKey.replace('platform.default.', ''); if (!(key in processed)) - this.setDefaultPref(key, this.getPref(aKey)); - }, this); + this.setDefaultPref(key, this.getPref(originalKey)); + } }, updateAeroPeek : function TSTUtils_updateAeroPeek() @@ -711,26 +713,27 @@ var TreeStyleTabUtils = { doAndWaitDOMEvent : function TSTUtils_doAndWaitDOMEvent() { var type, target, delay, task; - Array.slice(arguments).forEach(function(aArg) { - switch(typeof aArg) + for (let [, arg] in Iterator(arguments)) + { + switch(typeof arg) { case 'string': - type = aArg; - break; + type = arg; + continue; case 'number': - delay = aArg; - break; + delay = arg; + continue; case 'function': - task = aArg; - break; + task = arg; + continue; default: - target = aArg; - break; + target = arg; + continue; } - }); + } if (!target || !type) { if (task) task(); @@ -862,61 +865,86 @@ var TreeStyleTabUtils = { return false; var box = twisty.boxObject; - var minX = box.screenX; - var minY = box.screenY; - var maxX = minX + box.width; - var maxY = minY + box.height; - - var icon = tab.ownerDocument.getAnonymousElementByAttribute(tab, 'class', 'tab-icon-image'); - var iconBox = icon.boxObject; - var throbber = tab.ownerDocument.getAnonymousElementByAttribute(tab, 'class', 'tab-throbber'); - var throbberBox = throbber.boxObject; - var extraMinX = Math.min(throbberBox.screenX, iconBox.screenX); - var extraMinY = Math.min(throbberBox.screenY, iconBox.screenY); - var extraMaxX = Math.max(throbberBox.screenX + throbberBox.width, iconBox.screenX + iconBox.width); - var extraMaxY = Math.max(throbberBox.screenY + throbberBox.height, iconBox.screenY + iconBox.height); - + var left = box.screenX; + var top = box.screenY; + var right = left + box.width; + var bottom = top + box.height; + var favicon = this.getFaviconRect(tab); if (!box.width || !box.height) { - minX = extraMinX; - minY = extraMinY; - maxX = extraMaxX; - maxY = extraMaxY; + left = favicon.left; + top = favicon.top; + right = favicon.right; + bottom = favicon.bottom; } else if ( this.shouldExpandTwistyArea && !this._expandTwistyAreaBlockers.length ) { - minX = Math.min(minX, extraMinX); - minY = Math.min(minY, extraMinY); - maxX = Math.max(maxX, extraMaxX); - maxY = Math.max(maxY, extraMaxY); + left = Math.min(left, favicon.left); + top = Math.min(top, favicon.top); + right = Math.max(right, favicon.right); + bottom = Math.max(bottom, favicon.bottom); } var x = aEvent.screenX; var y = aEvent.screenY; - return (x >= minX && x <= maxX && y >= minY && y <= maxY); + return (x >= left && x <= right && y >= top && y <= bottom); + }, + getFaviconRect : function TSTUtils_getFaviconRect(aTab) + { + var icon = aTab.ownerDocument.getAnonymousElementByAttribute(aTab, 'class', 'tab-icon-image'); + var iconBox = icon.boxObject; + var iconRect = { + left : iconBox.screenX, + top : iconBox.screenY, + right : iconBox.screenX + iconBox.width, + bottom : iconBox.screenY + iconBox.height + }; + + var throbber = aTab.ownerDocument.getAnonymousElementByAttribute(aTab, 'class', 'tab-throbber'); + var throbberBox = throbber.boxObject; + var throbberRect = { + left : throbberBox.screenX, + top : throbberBox.screenY, + right : throbberBox.screenX + throbberBox.width, + bottom : throbberBox.screenY + throbberBox.height + }; + + if (!iconBox.width && !iconBox.height) + return throbberRect; + + if (!throbberBox.width && !throbberBox.height) + return iconRect; + + return { + left : Math.min(throbberRect.left, iconRect.left), + right : Math.max(throbberRect.right, iconRect.right), + top : Math.min(throbberRect.top, iconRect.top), + bottom : Math.max(throbberRect.bottom, iconRect.bottom) + }; }, // called with target(nsIDOMEventTarget), document(nsIDOMDocument), type(string) and data(object) - fireDataContainerEvent : function() + fireDataContainerEvent : function TSTUtils_fireDataContainerEvent() { var target, document, type, data, canBubble, cancellable; - Array.slice(arguments).forEach(function(aArg) { - if (typeof aArg == 'boolean') { + for (let [, arg] in Iterator(arguments)) + { + if (typeof arg == 'boolean') { if (canBubble === void(0)) - canBubble = aArg; + canBubble = arg; else - cancellable = aArg; + cancellable = arg; } - else if (typeof aArg == 'string') - type = aArg; - else if (aArg instanceof Ci.nsIDOMDocument) - document = aArg; - else if (aArg instanceof Ci.nsIDOMEventTarget) - target = aArg; + else if (typeof arg == 'string') + type = arg; + else if (arg instanceof Ci.nsIDOMDocument) + document = arg; + else if (arg instanceof Ci.nsIDOMEventTarget) + target = arg; else - data = aArg; - }); + data = arg; + } if (!target) target = document; if (!document) @@ -924,7 +952,7 @@ var TreeStyleTabUtils = { var event = document.createEvent('DataContainerEvent'); event.initEvent(type, canBubble, cancellable); - for (var i in data) + for (let i in data) { if (!data.hasOwnProperty(i)) continue; @@ -1105,17 +1133,19 @@ var TreeStyleTabUtils = { { if (!aTabs || aTabs.length <= 1) return; var id = this.makeNewClosedSetId() + '::' + aTabs.length; - aTabs.forEach(function(aTab) { - this.setTabValue(aTab, this.kCLOSED_SET_ID, id); - }, this); + for (let [, tab] in Iterator(aTabs)) + { + this.setTabValue(tab, this.kCLOSED_SET_ID, id); + } }, unmarkAsClosedSet : function TSTUtils_unmarkAsClosedSet(aTabs) /* PUBLIC API */ { if (!aTabs || !aTabs.length) return; - aTabs.forEach(function(aTab) { - this.deleteTabValue(aTab, this.kCLOSED_SET_ID); - }, this); + for (let [, tab] in Iterator(aTabs)) + { + this.deleteTabValue(tab, this.kCLOSED_SET_ID); + } }, useTMPSessionAPI : false, @@ -1253,7 +1283,7 @@ var TreeStyleTabUtils = { var b = aTabBrowser || this.browser; var top = aFrame.top; var tabs = this.getAllTabsArray(b); - for each (var tab in tabs) + for (let [, tab] in Iterator(tabs)) { if (tab.linkedBrowser.contentWindow == top) return tab; @@ -1293,10 +1323,11 @@ var TreeStyleTabUtils = { cleanUpTabsArray : function TSTUtils_cleanUpTabsArray(aTabs) { var newTabs = []; - aTabs.forEach(function(aTab) { - if (!aTab || !aTab.parentNode) return; // ignore removed tabs - if (newTabs.indexOf(aTab) < 0) newTabs.push(aTab); - }); + for (let [, tab] in Iterator(aTabs)) + { + if (!tab || !tab.parentNode) continue; // ignore removed tabs + if (newTabs.indexOf(tab) < 0) newTabs.push(tab); + } newTabs.sort(this.sortTabsByOrder); return newTabs; }, @@ -1328,17 +1359,17 @@ var TreeStyleTabUtils = { var groups = []; var group = []; - this.cleanUpTabsArray(aTabs) - .forEach(function(aTab) { - var parent = this.getParentTab(aTab); - if (!parent || group.indexOf(parent) < 0) { - if (group.length) groups.push(group); - group = [aTab]; - } - else { - group.push(aTab); - } - }, this); + for (let [, tab] in Iterator(this.cleanUpTabsArray(aTabs))) + { + let parent = this.getParentTab(tab); + if (!parent || group.indexOf(parent) < 0) { + if (group.length) groups.push(group); + group = [tab]; + } + else { + group.push(tab); + } + } if (group.length) groups.push(group); return groups; }, @@ -2295,10 +2326,11 @@ var TreeStyleTabUtils = { var collapsedStates = aTabs.map(function(aTab) { return this.getTabValue(aTab, this.kSUBTREE_COLLAPSED) == 'true'; }, this); - aTabs.forEach(function(aTab) { - this.collapseExpandSubtree(aTab, false, true); - this.collapseExpandTab(aTab, false, true); - }, this); + for (let [, tab] in Iterator(aTabs)) + { + this.collapseExpandSubtree(tab, false, true); + this.collapseExpandTab(tab, false, true); + } return collapsedStates; }, @@ -2362,26 +2394,27 @@ var TreeStyleTabUtils = { while (aExpandStates.length < aTabs.length) aExpandStates.push(-1); var parentTab = null; - aTabs.forEach(function(aTab, aIndex) { - if (sv.isCollapsed(aTab)) sv.collapseExpandTab(aTab, false, true); - sv.detachTab(aTab); + for (let [i, tab] in Iterator(aTabs)) + { + if (sv.isCollapsed(tab)) sv.collapseExpandTab(tab, false, true); + sv.detachTab(tab); - var parentIndexInTree = aTreeStructure[aIndex]; + let parentIndexInTree = aTreeStructure[i]; if (parentIndexInTree < 0) // there is no parent, so this is a new parent! - parentTab = aTab.getAttribute(sv.kID); + parentTab = tab.getAttribute(sv.kID); - var parent = sv.getTabById(parentTab); + let parent = sv.getTabById(parentTab); if (parent) { let tabs = [parent].concat(sv.getDescendantTabs(parent)); parent = parentIndexInTree < tabs.length ? tabs[parentIndexInTree] : parent ; } if (parent) { - sv.attachTabTo(aTab, parent, { + sv.attachTabTo(tab, parent, { forceExpand : true, dontMove : true }); } - }); + } for (let i = aTabs.length-1; i > -1; i--) { diff --git a/modules/window.js b/modules/window.js index 69107963..534c84ac 100644 --- a/modules/window.js +++ b/modules/window.js @@ -375,25 +375,26 @@ TreeStyleTabWindow.prototype = { this.setPref('browser.tabs.loadFolderAndReplace', !!(behavior & this.kGROUP_BOOKMARK_REPLACE)); } case 4: - [ - 'extensions.treestyletab.autoCollapseExpandSubTreeOnSelect', - 'extensions.treestyletab.autoCollapseExpandSubTreeOnSelect.onCurrentTabRemove', - 'extensions.treestyletab.autoCollapseExpandSubTreeOnSelect.whileFocusMovingByShortcut', - 'extensions.treestyletab.autoExpandSubTreeOnAppendChild', - 'extensions.treestyletab.autoExpandSubTreeOnCollapsedChildFocused', - 'extensions.treestyletab.collapseExpandSubTree.dblclick', - 'extensions.treestyletab.createSubTree.underParent', - 'extensions.treestyletab.show.context-item-reloadTabSubTree', - 'extensions.treestyletab.show.context-item-removeTabSubTree', - 'extensions.treestyletab.show.context-item-bookmarkTabSubTree', - 'extensions.multipletab.show.multipletab-selection-item-removeTabSubTree', - 'extensions.multipletab.show.multipletab-selection-item-createSubTree' - ].forEach(function(aPref) { - var value = this.getPref(aPref); - if (value === null) return; - this.setPref(aPref.replace('SubTree', 'Subtree'), value); - this.clearPref(aPref); - }, this); + for (let [, pref] in Iterator([ + 'extensions.treestyletab.autoCollapseExpandSubTreeOnSelect', + 'extensions.treestyletab.autoCollapseExpandSubTreeOnSelect.onCurrentTabRemove', + 'extensions.treestyletab.autoCollapseExpandSubTreeOnSelect.whileFocusMovingByShortcut', + 'extensions.treestyletab.autoExpandSubTreeOnAppendChild', + 'extensions.treestyletab.autoExpandSubTreeOnCollapsedChildFocused', + 'extensions.treestyletab.collapseExpandSubTree.dblclick', + 'extensions.treestyletab.createSubTree.underParent', + 'extensions.treestyletab.show.context-item-reloadTabSubTree', + 'extensions.treestyletab.show.context-item-removeTabSubTree', + 'extensions.treestyletab.show.context-item-bookmarkTabSubTree', + 'extensions.multipletab.show.multipletab-selection-item-removeTabSubTree', + 'extensions.multipletab.show.multipletab-selection-item-createSubTree' + ])) + { + let value = this.getPref(pref); + if (value === null) continue; + this.setPref(pref.replace('SubTree', 'Subtree'), value); + this.clearPref(pref); + } case 5: let (behavior = this.getTreePref('openGroupBookmark.behavior')) { behavior = behavior | 2048; @@ -410,13 +411,14 @@ TreeStyleTabWindow.prototype = { this.setTreePref('autoAttach.searchResult', search); } default: - orientalPrefs.forEach(function(aPref) { - let value = this.getPref(aPref); - if (value === null) return; - this.setPref(aPref+'.horizontal', value); - this.setPref(aPref+'.vertical', value); - this.clearPref(aPref); - }, this); + for (let [, pref] in Iterator(orientalPrefs)) + { + let value = this.getPref(pref); + if (value === null) continue; + this.setPref(pref+'.horizontal', value); + this.setPref(pref+'.vertical', value); + this.clearPref(pref); + } break; } this.setTreePref('prefsVersion', this.kPREF_VERSION); @@ -499,16 +501,17 @@ TreeStyleTabWindow.prototype = { } if (!prefs) return; - [ - 'browser.tabs.loadFolderAndReplace', - 'browser.tabs.insertRelatedAfterCurrent', - 'extensions.stm.tabBarMultiRows' // Super Tab Mode - ].forEach(function(aPref) { - var backup = prefs.getPref(aPref+'.backup'); - if (backup === null) return; - prefs.setPref(aPref+'.override', backup); // we have to set to ".override" pref, to avoid unexpectedly reset by the preference listener. - prefs.clearPref(aPref+'.backup'); - }); + for (let [, pref] in Iterator([ + 'browser.tabs.loadFolderAndReplace', + 'browser.tabs.insertRelatedAfterCurrent', + 'extensions.stm.tabBarMultiRows' // Super Tab Mode + ])) + { + let backup = prefs.getPref(pref+'.backup'); + if (backup === null) continue; + prefs.setPref(pref+'.override', backup); // we have to set to ".override" pref, to avoid unexpectedly reset by the preference listener. + prefs.clearPref(pref+'.backup'); + } }; new this.window['piro.sakura.ne.jp'].UninstallationListener({ id : 'treestyletab@piro.sakura.ne.jp', @@ -549,21 +552,23 @@ TreeStyleTabWindow.prototype = { var items = Array.slice(aEvent.originalTarget.childNodes); var firstItemIndex = 0; // ignore menu items inserted by Weave (Firefox Sync), Tab Utilities, and others. - items.forEach(function(aItem, aIndex) { + for (let [i, item] in Iterator(items)) + { if ( - aItem.getAttribute('anonid') || - aItem.id || - aItem.hidden || - aItem.localName != 'menuitem' + item.getAttribute('anonid') || + item.id || + item.hidden || + item.localName != 'menuitem' ) - firstItemIndex = aIndex + 1; - }); + firstItemIndex = i + 1; + } items = items.slice(firstItemIndex); var b = this.getTabBrowserFromChild(aEvent.originalTarget) || this.browser; - this.getTabsArray(b).forEach(function(aTab, aIndex) { - items[aIndex].style.marginLeft = aTab.getAttribute(this.kNEST)+'em'; - }, this); + for (let [i, tab] in Iterator(this.getTabsArray(b))) + { + items[i].style.marginLeft = tab.getAttribute(this.kNEST)+'em'; + } }, destroy : function TSTWindow_destroy() @@ -594,9 +599,10 @@ TreeStyleTabWindow.prototype = { d.removeEventListener(this.kEVENT_TYPE_TABBAR_STATE_CHANGED, this, false); d.removeEventListener(this.kEVENT_TYPE_FOCUS_NEXT_TAB, this, false); - this._tabFocusAllowance.forEach(function(aListener) { - w.removeEventListener(this.kEVENT_TYPE_FOCUS_NEXT_TAB, aListener, false); - }, this); + for (let [, listener] in Iterator(this._tabFocusAllowance)) + { + w.removeEventListener(this.kEVENT_TYPE_FOCUS_NEXT_TAB, listener, false); + } var appcontent = d.getElementById('appcontent'); appcontent.removeEventListener('SubBrowserAdded', this, false); @@ -1054,11 +1060,12 @@ TreeStyleTabWindow.prototype = { this.AeroPeek.windows.some(function(aTabWindow) { if (aTabWindow.win == this.window) { - aTabWindow.previews.forEach(function(aPreview) { - if (!aPreview) return; - var tab = aPreview.controller.wrappedJSObject.tab; - aPreview.visible = !this.isCollapsed(tab); - }, this); + for (let [, preview] in Iterator(aTabWindow.previews)) + { + if (!preview) continue; + let tab = preview.controller.wrappedJSObject.tab; + preview.visible = !this.isCollapsed(tab); + } this.AeroPeek.checkPreviewCount(); return true; } @@ -1204,14 +1211,15 @@ TreeStyleTabWindow.prototype = { processRestoredTabs : function TSTWindow_processRestoredTabs() { - this._restoringTabs.forEach(function(aTab) { + for (let [, tab] in Iterator(this._restoringTabs)) + { try { - var b = this.getTabBrowserFromChild(aTab); + let b = this.getTabBrowserFromChild(aTab); if (b) b.treeStyleTab.handleRestoredTab(aTab); } catch(e) { } - }, this); + } this._restoringTabs = []; }, @@ -1272,23 +1280,24 @@ TreeStyleTabWindow.prototype = { if (aOnlyChildren) tabs = this.gatherSubtreeMemberTabs(aTabOrTabs); - this.splitTabsToSubtrees(tabs).forEach(function(aTabs) { - if (!this.fireTabSubtreeClosingEvent(aTabs[0], aTabs)) - return; - var b = this.getTabBrowserFromChild(aTabs[0]); + for (let [, subtreeTabs] in Iterator(this.splitTabsToSubtrees(tabs))) + { + if (!this.fireTabSubtreeClosingEvent(subtreeTabs[0], subtreeTabs)) + continue; + let b = this.getTabBrowserFromChild(subtreeTabs[0]); if (aOnlyChildren) - aTabs = aTabs.slice(1); - if (!aTabs.length) - return; + subtreeTabs = subtreeTabs.slice(1); + if (!subtreeTabs.length) + continue; this.stopRendering(); - this.markAsClosedSet(aTabs); - for (let i = aTabs.length-1; i > -1; i--) + this.markAsClosedSet(subtreeTabs); + for (let i = subtreeTabs.length-1; i > -1; i--) { - b.removeTab(aTabs[i], { animate : true }); + b.removeTab(subtreeTabs[i], { animate : true }); } this.startRendering(); - this.fireTabSubtreeClosedEvent(b, aTabs[0], aTabs) - }, this); + this.fireTabSubtreeClosedEvent(b, subtreeTabs[0], subtreeTabs) + } }, removeTabSubTree : function() { return this.removeTabSubtree.apply(this, arguments); }, // obsolete, for backward compatibility @@ -1388,10 +1397,11 @@ TreeStyleTabWindow.prototype = { aTabs.shift() ; var self = this; this.Deferred.next(function(self) { - aTabs.forEach(function(aTab) { - b.treeStyleTab.attachTabTo(aTab, root); - b.treeStyleTab.collapseExpandTab(aTab, false); - }, self); + for (let [, tab] in Iterator(aTabs)) + { + b.treeStyleTab.attachTabTo(tab, root); + b.treeStyleTab.collapseExpandTab(tab, false); + } if (parent) { b.treeStyleTab.attachTabTo(root, parent, { insertBefore : next @@ -1425,11 +1435,12 @@ TreeStyleTabWindow.prototype = { var roots = []; if (!aTabs || !aTabs.length) return roots; aTabs = this.cleanUpTabsArray(aTabs); - aTabs.forEach(function(aTab) { - var parent = this.getParentTab(aTab); - if (parent && aTabs.indexOf(parent) > -1) return; - roots.push(aTab); - }, this); + for (let [, tab] in Iterator(aTabs)) + { + let parent = this.getParentTab(tab); + if (parent && aTabs.indexOf(parent) > -1) continue; + roots.push(tab); + } return roots; }, @@ -1507,9 +1518,10 @@ TreeStyleTabWindow.prototype = { this.stopRendering(); this.markAsClosedSet(closeTabs); - closeTabs.reverse().forEach(function(aTab) { - b.removeTab(aTab); - }); + for (let [, tab] in Iterator(closeTabs.reverse())) + { + b.removeTab(tab); + } this.startRendering(); },