Bug 1443749 only reload sidebar when the url has changed draft
authorShane Caraveo <scaraveo@mozilla.com>
Fri, 09 Mar 2018 16:30:49 -0600
changeset 765621 ff37d1ac5cb3f37729671faa0bb6b511e47ac5b0
parent 764458 a859a4b2257e6c61f7c2aab456cf551df856bd95
push id102122
push usermixedpuppy@gmail.com
push dateFri, 09 Mar 2018 22:31:20 +0000
bugs1443749, 1398713
milestone60.0a1
Bug 1443749 only reload sidebar when the url has changed Regression from bug 1398713. Before that, we reloaded the entire webext-panel.xul if the sidebar changed. This verifies we don't reload unecessarily as well as discards the browser to force a runtime disconnect for the extension if it does change. MozReview-Commit-ID: LuYxmj9mSb7
browser/base/content/webext-panels.js
browser/components/extensions/test/browser/browser-common.ini
browser/components/extensions/test/browser/browser_ext_sidebarAction_runtime.js
--- a/browser/base/content/webext-panels.js
+++ b/browser/base/content/webext-panels.js
@@ -84,17 +84,26 @@ var gBrowser = {
   getTabModalPromptBox(browser) {
     if (!browser.tabModalPromptBox) {
       browser.tabModalPromptBox = new TabModalPromptBox(browser);
     }
     return browser.tabModalPromptBox;
   },
 };
 
-async function loadPanel(extensionId, extensionUrl, browserStyle) {
+function loadPanel(extensionId, extensionUrl, browserStyle) {
+  let browserEl = document.getElementById("webext-panels-browser");
+  if (browserEl) {
+    if (browserEl.currentURI.spec === extensionUrl) {
+      return;
+    }
+    // Forces runtime disconnect.  Remove the stack (parent).
+    browserEl.parentNode.remove();
+  }
+
   let policy = WebExtensionPolicy.getByID(extensionId);
   let sidebar = {
     uri: extensionUrl,
     remote: policy.extension.remote,
     browserStyle,
   };
   getBrowser(sidebar).then(browser => {
     let uri = Services.io.newURI(policy.getURL());
--- a/browser/components/extensions/test/browser/browser-common.ini
+++ b/browser/components/extensions/test/browser/browser-common.ini
@@ -134,16 +134,17 @@ disabled = bug 1438663
 [browser_ext_sessions_restore.js]
 [browser_ext_sessions_window_tab_value.js]
 [browser_ext_settings_overrides_default_search.js]
 [browser_ext_settings_overrides_search.js]
 [browser_ext_sidebarAction.js]
 [browser_ext_sidebarAction_browser_style.js]
 [browser_ext_sidebarAction_context.js]
 [browser_ext_sidebarAction_contextMenu.js]
+[browser_ext_sidebarAction_runtime.js]
 [browser_ext_sidebarAction_tabs.js]
 [browser_ext_sidebarAction_windows.js]
 [browser_ext_simple.js]
 [browser_ext_slow_script.js]
 skip-if = !e10s || debug || asan
 [browser_ext_tab_runtimeConnect.js]
 [browser_ext_tabs_audio.js]
 [browser_ext_tabs_captureTab.js]
new file mode 100644
--- /dev/null
+++ b/browser/components/extensions/test/browser/browser_ext_sidebarAction_runtime.js
@@ -0,0 +1,65 @@
+"use strict";
+
+function background() {
+  browser.runtime.onConnect.addListener(port => {
+    browser.test.assertEq(port.name, "ernie", "port name correct");
+    port.onDisconnect.addListener(() => {
+      browser.test.assertEq(null, port.error, "The port is implicitly closed without errors when the other context unloads");
+      port.disconnect();
+      browser.test.sendMessage("disconnected");
+    });
+    browser.test.sendMessage("connected");
+  });
+}
+
+let extensionData = {
+  background,
+  manifest: {
+    sidebar_action: {
+      default_panel: "sidebar.html",
+    },
+  },
+  useAddonManager: "temporary",
+
+  files: {
+    "sidebar.html": `
+      <!DOCTYPE html>
+      <html>
+      <head><meta charset="utf-8"/>
+      <script src="sidebar.js"></script>
+      </head>
+      <body>
+      A Test Sidebar
+      </body></html>
+    `,
+
+    "sidebar.js": function() {
+      window.onload = () => {
+        browser.runtime.connect({name: "ernie"});
+      };
+    },
+  },
+};
+
+add_task(async function test_sidebar_disconnect() {
+  let extension = ExtensionTestUtils.loadExtension(extensionData);
+  let connected = extension.awaitMessage("connected");
+  await extension.startup();
+  await connected;
+
+  // switching sidebar to another extension
+  let extension2 = ExtensionTestUtils.loadExtension(extensionData);
+  let switched = Promise.all([
+    extension.awaitMessage("disconnected"),
+    extension2.awaitMessage("connected")]);
+  await extension2.startup();
+  await switched;
+
+  // switching sidebar to built-in sidebar
+  let disconnected = extension2.awaitMessage("disconnected");
+  window.SidebarUI.show("viewBookmarksSidebar");
+  await disconnected;
+
+  await extension.unload();
+  await extension2.unload();
+});