From 92117a8c9e8f0673291bd952c7fe4cdd0ca6dae9 Mon Sep 17 00:00:00 2001 From: Tomislav Jovanovic Date: Fri, 11 Aug 2017 02:16:33 +0200 Subject: [PATCH] Bug 1377734 - Avoid instantiating a lazy tab from sendMessage, r=mixedpuppy MozReview-Commit-ID: KfYg6hG8KmC --HG-- extra : rebase_source : 89d3417a32d9ca5be4a850336636d3031b3c7e80 --- .../extensions/test/browser/browser-common.ini | 1 + .../test/browser/browser_ext_tabs_lazy.js | 40 ++++++++++++++++++++++ toolkit/components/extensions/ExtensionParent.jsm | 8 ++--- 3 files changed, 45 insertions(+), 4 deletions(-) create mode 100644 browser/components/extensions/test/browser/browser_ext_tabs_lazy.js diff --git a/browser/components/extensions/test/browser/browser-common.ini b/browser/components/extensions/test/browser/browser-common.ini index e3f7700f3939..baaa9de24355 100644 --- a/browser/components/extensions/test/browser/browser-common.ini +++ b/browser/components/extensions/test/browser/browser-common.ini @@ -128,6 +128,7 @@ skip-if = debug || asan # Bug 1354681 [browser_ext_tabs_getCurrent.js] [browser_ext_tabs_insertCSS.js] [browser_ext_tabs_lastAccessed.js] +[browser_ext_tabs_lazy.js] [browser_ext_tabs_removeCSS.js] [browser_ext_tabs_move_array.js] [browser_ext_tabs_move_window.js] diff --git a/browser/components/extensions/test/browser/browser_ext_tabs_lazy.js b/browser/components/extensions/test/browser/browser_ext_tabs_lazy.js new file mode 100644 index 000000000000..96556f284ee2 --- /dev/null +++ b/browser/components/extensions/test/browser/browser_ext_tabs_lazy.js @@ -0,0 +1,40 @@ +"use strict"; + +const SESSION = { + windows: [{ + tabs: [ + {entries: [{url: "about:blank"}]}, + {entries: [{url: "https://example.com/"}]}, + ], + }], +}; + +add_task(async function() { + SessionStore.setBrowserState(JSON.stringify(SESSION)); + const tab = gBrowser.tabs[1]; + + is(tab.getAttribute("pending"), "true", "The tab is pending restore"); + is(tab.linkedBrowser.isConnected, false, "The tab is lazy"); + + async function background() { + const [tab] = await browser.tabs.query({url: "https://example.com/"}); + browser.test.assertRejects( + browser.tabs.sendMessage(tab.id, "void"), + /Could not establish connection. Receiving end does not exist/, + "No recievers in a tab pending restore." + ); + browser.test.notifyPass("lazy"); + } + + const manifest = {permissions: ["tabs"]}; + const extension = ExtensionTestUtils.loadExtension({manifest, background}); + + await extension.startup(); + await extension.awaitFinish("lazy"); + await extension.unload(); + + is(tab.getAttribute("pending"), "true", "The tab is still pending restore"); + is(tab.linkedBrowser.isConnected, false, "The tab is still lazy"); + + await BrowserTestUtils.removeTab(tab); +}); diff --git a/toolkit/components/extensions/ExtensionParent.jsm b/toolkit/components/extensions/ExtensionParent.jsm index a3d033f0be1d..eaca0df84102 100644 --- a/toolkit/components/extensions/ExtensionParent.jsm +++ b/toolkit/components/extensions/ExtensionParent.jsm @@ -270,13 +270,13 @@ ProxyMessenger = { * @returns {object|null} The message manager matching the recipient if found. */ getMessageManagerForRecipient(recipient) { - let {tabId} = recipient; // tabs.sendMessage / tabs.connect - if (tabId) { + if ("tabId" in recipient) { // `tabId` being set implies that the tabs API is supported, so we don't // need to check whether `tabTracker` exists. - let tab = apiManager.global.tabTracker.getTab(tabId, null); - if (!tab) { + let tab = apiManager.global.tabTracker.getTab(recipient.tabId, null); + if (!tab || tab.getAttribute("pending") === "true") { + // No recipients in a tab pending restore. return null; } let browser = tab.linkedBrowser || tab.browser; -- 2.11.4.GIT