Bug 1417043 - Use webext-panels.xul for the WebExtensions devtools panels. draft
authorLuca Greco <lgreco@mozilla.com>
Sat, 24 Feb 2018 23:12:42 +0100
changeset 762506 e1640eb67f304bf666824c49426941a575e72747
parent 762469 b2a9a4bb5c94de179ae7a3f52fde58c0e2897498
push id101182
push userluca.greco@alcacoop.it
push dateFri, 02 Mar 2018 14:22:35 +0000
bugs1417043
milestone60.0a1
Bug 1417043 - Use webext-panels.xul for the WebExtensions devtools panels. MozReview-Commit-ID: ERV4siC2l1j
browser/components/extensions/ext-devtools-panels.js
--- a/browser/components/extensions/ext-devtools-panels.js
+++ b/browser/components/extensions/ext-devtools-panels.js
@@ -79,17 +79,17 @@ class ParentDevToolsPanel {
   }
 
   addPanel() {
     const {icon, title} = this.panelOptions;
     const extensionName = this.context.extension.name;
 
     this.toolbox.addAdditionalTool({
       id: this.id,
-      url: "about:blank",
+      url: "chrome://browser/content/webext-panels.xul",
       icon: icon,
       label: title,
       tooltip: `DevTools Panel added by "${extensionName}" add-on.`,
       visibilityswitch:  `devtools.webext-${this.id}.enabled`,
       isTargetSupported: target => target.isLocalTab,
       build: (window, toolbox) => {
         if (toolbox !== this.toolbox) {
           throw new Error("Unexpected toolbox received on addAdditionalTool build property");
@@ -211,24 +211,39 @@ class ParentDevToolsPanel {
   }
 
   createBrowserElement(window) {
     const {toolbox} = this;
     const {extension} = this.context;
     const {url} = this.panelOptions;
     const {document} = window;
 
+    // TODO Bug 1442601: Refactor ext-devtools-panels.js to reuse the helpers
+    // functions defined in webext-panels.xul (e.g. create the browser element
+    // using an helper function defined in webext-panels.js and shared with the
+    // extension sidebar pages).
+    let stack = document.getElementById("webext-panels-stack");
+    if (!stack) {
+      stack = document.createElementNS(XUL_NS, "stack");
+      stack.setAttribute("flex", "1");
+      stack.setAttribute("id", "webext-panels-stack");
+      document.documentElement.appendChild(stack);
+    }
+
     const browser = document.createElementNS(XUL_NS, "browser");
+    browser.setAttribute("id", "webext-panels-browser");
     browser.setAttribute("type", "content");
     browser.setAttribute("disableglobalhistory", "true");
-    browser.setAttribute("style", "width: 100%; height: 100%;");
-    browser.setAttribute("transparent", "true");
+    browser.setAttribute("flex", "1");
     browser.setAttribute("class", "webextension-devtoolsPanel-browser");
     browser.setAttribute("webextension-view-type", "devtools_panel");
-    browser.setAttribute("flex", "1");
+    // TODO Bug 1442604: Add additional tests for the select and autocompletion
+    // popups used in an extension devtools panels (in oop and non-oop mode).
+    browser.setAttribute("selectmenulist", "ContentSelectDropdown");
+    browser.setAttribute("autocompletepopup", "PopupAutoComplete");
 
     // Ensure that the devtools panel browser is going to run in the same
     // process of the other extension pages from the same addon.
     browser.sameProcessAsFrameLoader = extension.groupFrameLoader;
 
     this.browser = browser;
 
     let awaitFrameLoader = Promise.resolve();
@@ -249,18 +264,17 @@ class ParentDevToolsPanel {
       if (!hasTopLevelContext) {
         hasTopLevelContext = true;
 
         // Resolve the promise when the root devtools_panel context has been created.
         awaitFrameLoader.then(() => this._resolveTopLevelContext(context));
       }
     });
 
-    document.body.setAttribute("style", "margin: 0; padding: 0;");
-    document.body.appendChild(browser);
+    stack.appendChild(browser);
 
     extensions.emit("extension-browser-inserted", browser, {
       devtoolsToolboxInfo: {
         toolboxPanelId: this.id,
         inspectedWindowTabId: getTargetTabIdForToolbox(toolbox),
       },
     });