From a7fa6eb9b7f3cd2fe3f3228ae447527ed13e284e Mon Sep 17 00:00:00 2001 From: Kevin Jones Date: Thu, 20 Apr 2017 11:01:09 +0200 Subject: [PATCH] Bug 1345090 - Modify SessionStore to restore tabs with lazy browsers. r=mikedeboer,dao MozReview-Commit-ID: 5J5UqlWMxKX --- browser/app/profile/firefox.js | 3 + browser/base/content/tabbrowser.xml | 58 ++++++++-- .../components/sessionstore/SessionStore.jsm | 101 +++++++++++++----- .../sessionstore/test/browser_522545.js | 59 +++++++--- .../sessionstore/test/browser_599909.js | 9 +- .../sessionstore/test/browser_607016.js | 4 + .../browser_615394-SSWindowState_events.js | 47 ++++---- .../test/browser_scrollPositions.js | 1 - .../test/browser_scrollPositionsReaderMode.js | 1 - browser/components/sessionstore/test/head.js | 16 ++- browser/modules/NetworkPrioritizer.jsm | 10 ++ devtools/server/actors/webbrowser.js | 3 +- .../BrowserTestUtils/BrowserTestUtils.jsm | 5 + toolkit/modules/PrivateBrowsingUtils.jsm | 5 +- 14 files changed, 245 insertions(+), 77 deletions(-) diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js index caabda2bc77b..150d06eb6cb6 100644 --- a/browser/app/profile/firefox.js +++ b/browser/app/profile/firefox.js @@ -1613,6 +1613,9 @@ pref("browser.formautofill.experimental", false); pref("browser.formautofill.enabled", false); pref("browser.formautofill.loglevel", "Warn"); +// Whether or not to restore a session with lazy-browser tabs. +pref("browser.sessionstore.restore_tabs_lazily", true); + // Enable safebrowsing v4 tables (suffixed by "-proto") update. #ifdef NIGHTLY_BUILD pref("urlclassifier.malwareTable", "goog-malware-shavar,goog-unwanted-shavar,goog-malware-proto,goog-unwanted-proto,test-malware-simple,test-unwanted-simple"); diff --git a/browser/base/content/tabbrowser.xml b/browser/base/content/tabbrowser.xml index fbf06ebe416d..698477750755 100644 --- a/browser/base/content/tabbrowser.xml +++ b/browser/base/content/tabbrowser.xml @@ -2034,7 +2034,8 @@ "addProgressListener", "removeProgressListener", "audioPlaybackStarted", "audioPlaybackStopped", "adjustPriority", "pauseMedia", "stopMedia", "blockMedia", "resumeMedia", "mute", "unmute", "blockedPopups", "lastURI", - "purgeSessionHistory", "stopScroll", "startScroll" + "purgeSessionHistory", "stopScroll", "startScroll", + "userTypedValue", "userTypedClear" ] @@ -2052,11 +2053,51 @@ switch (name) { case "permitUnload": getter = () => { - return function() { + return () => { return { permitUnload: true, timedOut: false }; }; }; break; + case "reload": + case "reloadWithFlags": + getter = () => { + return (params) => { + // Wait for load handler to be instantiated before + // initializing the reload. + aTab.addEventListener("SSTabRestoring", () => { + browser[name](params); + }, { once: true }); + gBrowser._insertBrowser(aTab); + }; + }; + break; + case "isRemoteBrowser": + getter = () => { + return browser.getAttribute("remote") == "true"; + }; + break; + case "audioMuted": + getter = () => { + return false; + }; + break; + case "currentURI": + getter = () => { + let url = SessionStore.getLazyTabValue(aTab, "url"); + return Services.io.newURI(url); + }; + break; + case "contentTitle": + getter = () => { + return SessionStore.getLazyTabValue(aTab, "title"); + }; + break; + case "userTypedValue": + case "userTypedClear": + getter = () => { + return SessionStore.getLazyTabValue(aTab, name); + }; + break; default: getter = () => { this._insertBrowser(aTab); @@ -2084,9 +2125,8 @@ 1) { + if (tab.linkedBrowser.frameLoader && + Services.appinfo.maxWebProcessCount > 1) { label += " (" + tab.linkedBrowser.frameLoader.tabParent.osPid + ")"; } } @@ -7245,6 +7286,11 @@ { let browserSet = new Set(win.gBrowser.browsers); + // Ensure all browsers have been inserted or we won't get + // messages back from them. + browserSet.forEach((browser) => { + win.gBrowser._insertBrowser(win.gBrowser.getTabForBrowser(browser)); + }) let mm = win.getGroupMessageManager("browsers"); mm.addMessageListener("SessionStore:update", function onMessage(msg) { diff --git a/toolkit/modules/PrivateBrowsingUtils.jsm b/toolkit/modules/PrivateBrowsingUtils.jsm index 5e7594057805..dae82058b3be 100644 --- a/toolkit/modules/PrivateBrowsingUtils.jsm +++ b/toolkit/modules/PrivateBrowsingUtils.jsm @@ -35,10 +35,11 @@ this.PrivateBrowsingUtils = { isBrowserPrivate(aBrowser) { let chromeWin = aBrowser.ownerGlobal; - if (chromeWin.gMultiProcessBrowser) { + if (chromeWin.gMultiProcessBrowser || !aBrowser.isConnected) { // In e10s we have to look at the chrome window's private // browsing status since the only alternative is to check the - // content window, which is in another process. + // content window, which is in another process. If the browser + // is lazy then the content window doesn't exist. return this.isWindowPrivate(chromeWin); } return this.privacyContextFromWindow(aBrowser.contentWindow).usePrivateBrowsing;