From fe3827bbae1eb40d0d794f6115f706025ade6885 Mon Sep 17 00:00:00 2001 From: Ian Gilman Date: Wed, 5 Jan 2011 12:54:34 -0800 Subject: [PATCH] Bug 598795 - Clean up reconnect code once we have instant access to sessionstore r=dietrich, a=blocking --- browser/base/content/tabview/tabitems.js | 159 +++++++++--------- browser/base/content/tabview/ui.js | 2 + .../test/tabview/browser_tabview_bug597248.js | 2 +- .../tabview/browser_tabview_orphaned_tabs.js | 2 +- 4 files changed, 84 insertions(+), 81 deletions(-) diff --git a/browser/base/content/tabview/tabitems.js b/browser/base/content/tabview/tabitems.js index 25e9c99ea86..6bdf5e959b8 100644 --- a/browser/base/content/tabview/tabitems.js +++ b/browser/base/content/tabview/tabitems.js @@ -86,6 +86,8 @@ function TabItem(tab, options) { this._zoomPrep = false; this.sizeExtra = new Point(); this.keepProportional = true; + this._hasBeenDrawn = false; + this._reconnected = false; var self = this; @@ -104,10 +106,6 @@ function TabItem(tab, options) { // ___ superclass setup this._init($div[0]); - // ___ reconnect to data from Storage - this._hasBeenDrawn = false; - let reconnected = TabItems.reconnect(this); - // ___ drag/drop // override dropOptions with custom tabitem methods // This is mostly to support the phantom groupItems. @@ -206,19 +204,15 @@ function TabItem(tab, options) { .addClass('expander') .appendTo($div); + this.setResizable(true, options.immediately); + this.droppable(true); this._updateDebugBounds(); TabItems.register(this); - if (!this.reconnected) - GroupItems.newTab(this, options); - - // tabs which were not reconnected at all or were not immediately added - // to a group get the same treatment. - if (!this.reconnected || (reconnected && !reconnected.addedToGroup) ) { - this.setResizable(true, options.immediately); - this.droppable(true); - } + // ___ reconnect to data from Storage + if (!TabItems.reconnectingPaused()) + this._reconnect(); }; TabItem.prototype = Utils.extend(new Item(), new Subscribable(), { @@ -325,7 +319,7 @@ TabItem.prototype = Utils.extend(new Item(), new Subscribable(), { // saveImageData - true to include thumbnail pixels (and page title as well); default false save: function TabItem_save(saveImageData) { try{ - if (!this.tab || this.tab.parentNode == null || !this.reconnected) // too soon/late to save + if (!this.tab || this.tab.parentNode == null || !this._reconnected) // too soon/late to save return; var data = this.getStorageData(saveImageData); @@ -336,6 +330,48 @@ TabItem.prototype = Utils.extend(new Item(), new Subscribable(), { } }, + // ---------- + // Function: _reconnect + // Load the reciever's persistent data from storage. If there is none, + // treats it as a new tab. + _reconnect: function TabItem__reconnect() { + Utils.assertThrow(!this._reconnected, "shouldn't already be reconnected"); + Utils.assertThrow(this.tab, "should have a xul:tab"); + + let tabData = Storage.getTabData(this.tab); + if (tabData && TabItems.storageSanity(tabData)) { + if (this.parent) + this.parent.remove(this, {immediately: true}); + + this.setBounds(tabData.bounds, true); + + if (Utils.isPoint(tabData.userSize)) + this.userSize = new Point(tabData.userSize); + + if (tabData.groupID) { + var groupItem = GroupItems.groupItem(tabData.groupID); + if (groupItem) { + groupItem.add(this, null, {immediately: true}); + + // if it matches the selected tab or no active tab and the browser + // tab is hidden, the active group item would be set. + if (this.tab == gBrowser.selectedTab || + (!GroupItems.getActiveGroupItem() && !this.tab.hidden)) + GroupItems.setActiveGroupItem(this.parent); + } + } + + if (tabData.imageData) + this.showCachedData(tabData); + } else { + GroupItems.newTab(this, {immediately: true}); + } + + this._reconnected = true; + this.save(); + this._sendToSubscribers("reconnected"); + }, + // ---------- // Function: setBounds // Moves this item to the specified location and size. @@ -752,6 +788,7 @@ let TabItems = { _eventListeners: [], _pauseUpdateForTest: false, tempCanvas: null, + _reconnectingPaused: false, // ---------- // Function: init @@ -902,10 +939,6 @@ let TabItems = { if (tabUrl != tabItem.url) { let oldURL = tabItem.url; tabItem.url = tabUrl; - - if (!tabItem.reconnected) - this.reconnect(tabItem); - tabItem.save(); } @@ -1059,6 +1092,35 @@ let TabItems = { return this.paintingPaused > 0; }, + // ---------- + // Function: pauseReconnecting + // Don't reconnect any new tabs until resume is called. + pauseReconnecting: function TabItems_pauseReconnecting() { + Utils.assertThrow(!this._reconnectingPaused, "shouldn't already be paused"); + + this._reconnectingPaused = true; + }, + + // ---------- + // Function: resumeReconnecting + // Reconnect all of the tabs that were created since we paused. + resumeReconnecting: function TabItems_resumeReconnecting() { + Utils.assertThrow(this._reconnectingPaused, "should already be paused"); + + this._reconnectingPaused = false; + this.items.forEach(function(item) { + if (!item._reconnected) + item._reconnect(); + }); + }, + + // ---------- + // Function: reconnectingPaused + // Returns true if reconnecting is paused. + reconnectingPaused: function TabItems_reconnectingPaused() { + return this._reconnectingPaused; + }, + // ---------- // Function: register // Adds the given to the master list. @@ -1110,67 +1172,6 @@ let TabItems = { } return sane; - }, - - // ---------- - // Function: reconnect - // Given a , attempts to load its persistent data from storage. - reconnect: function TabItems_reconnect(item) { - var found = false; - - try{ - Utils.assert(item, 'item'); - Utils.assert(item.tab, 'item.tab'); - - if (item.reconnected) - return true; - - if (!item.tab) - return false; - - let tabData = Storage.getTabData(item.tab); - if (tabData && this.storageSanity(tabData)) { - if (item.parent) - item.parent.remove(item, {immediately: true}); - - item.setBounds(tabData.bounds, true); - - if (Utils.isPoint(tabData.userSize)) - item.userSize = new Point(tabData.userSize); - - if (tabData.groupID) { - var groupItem = GroupItems.groupItem(tabData.groupID); - if (groupItem) { - groupItem.add(item, null, {immediately: true}); - - // if it matches the selected tab or no active tab and the browser - // tab is hidden, the active group item would be set. - if (item.tab == gBrowser.selectedTab || - (!GroupItems.getActiveGroupItem() && !item.tab.hidden)) - GroupItems.setActiveGroupItem(item.parent); - } - } - - if (tabData.imageData) - item.showCachedData(tabData); - - item.reconnected = true; - found = {addedToGroup: tabData.groupID}; - } else { - // We should never have any orphaned tabs. Therefore, item is not - // connected if it has no parent and GroupItems.newTab() would handle - // the group creation. - item.reconnected = (item.parent != null); - } - item.save(); - - if (item.reconnected) - item._sendToSubscribers("reconnected"); - } catch(e) { - Utils.log(e); - } - - return found; } }; diff --git a/browser/base/content/tabview/ui.js b/browser/base/content/tabview/ui.js index 5d21bc7a038..c453e24356c 100644 --- a/browser/base/content/tabview/ui.js +++ b/browser/base/content/tabview/ui.js @@ -535,6 +535,7 @@ let UI = { self._privateBrowsing.transitionStage = 0; self._privateBrowsing.transitionMode = ""; + TabItems.resumeReconnecting(); } } @@ -569,6 +570,7 @@ let UI = { if (aData == "enter" || aData == "exit") { self._privateBrowsing.transitionStage = 1; self._privateBrowsing.transitionMode = aData; + TabItems.pauseReconnecting(); } } } diff --git a/browser/base/content/test/tabview/browser_tabview_bug597248.js b/browser/base/content/test/tabview/browser_tabview_bug597248.js index 17931db2ab1..b636cbe679c 100644 --- a/browser/base/content/test/tabview/browser_tabview_bug597248.js +++ b/browser/base/content/test/tabview/browser_tabview_bug597248.js @@ -202,7 +202,7 @@ function onTabViewShown() { tabItems.forEach(function(tabItem) { // tabitem might not be connected so use subscriber for those which are not // connected. - if (tabItem.reconnected) { + if (tabItem._reconnected) { ok(tabItem.isShowingCachedData(), "Tab item is showing cached data and is already connected. " + tabItem.tab.linkedBrowser.currentURI.spec); diff --git a/browser/base/content/test/tabview/browser_tabview_orphaned_tabs.js b/browser/base/content/test/tabview/browser_tabview_orphaned_tabs.js index dffc2c72547..0b291f4f304 100644 --- a/browser/base/content/test/tabview/browser_tabview_orphaned_tabs.js +++ b/browser/base/content/test/tabview/browser_tabview_orphaned_tabs.js @@ -92,7 +92,7 @@ function onTabViewWindowLoaded() { }; let tabItem = groupItem.getChild(0); // the item may not be connected so subscriber would be used in that case. - if (tabItem.reconnected) { + if (tabItem._reconnected) { checkAndFinish(); } else { tabItem.addSubscriber(tabItem, "reconnected", function() {