Bug 1469843 WIP refactor extension sidebar support and remove webext-panels
MozReview-Commit-ID: BiMVhtmzI5F
--- a/browser/base/content/browser-sidebar.js
+++ b/browser/base/content/browser-sidebar.js
@@ -1,12 +1,15 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+ChromeUtils.defineModuleGetter(this, "ExtensionParent",
+ "resource://gre/modules/ExtensionParent.jsm");
+
/**
* SidebarUI controls showing and hiding the browser sidebar.
*
* @note
* Some of these methods take a commandID argument - we expect to find a
* xul:broadcaster element with the specified ID.
* The following attributes on that element may be used and/or modified:
* - id (required) the string to match commandID. The convention
@@ -18,19 +21,17 @@
* Note that this attribute is updated when
* the sidebar's visibility is changed.
* - group this attribute must be set to "sidebar".
*/
var SidebarUI = {
// Avoid getting the browser element from init() to avoid triggering the
// <browser> constructor during startup if the sidebar is hidden.
get browser() {
- if (this._browser)
- return this._browser;
- return this._browser = document.getElementById("sidebar");
+ return this._deck.selectedPanel;
},
POSITION_START_PREF: "sidebar.position_start",
DEFAULT_SIDEBAR_ID: "viewBookmarksSidebar",
// lastOpenedId is set in show() but unlike currentID it's not cleared out on hide
// and isn't persisted across windows
lastOpenedId: null,
@@ -51,16 +52,17 @@ var SidebarUI = {
_inited: false,
get initialized() {
return this._inited;
},
init() {
this._box = document.getElementById("sidebar-box");
+ this._deck = document.getElementById("sidebar-deck");
this._splitter = document.getElementById("sidebar-splitter");
this._icon = document.getElementById("sidebar-icon");
this._reversePositionButton = document.getElementById("sidebar-reverse-position");
this._switcherPanel = document.getElementById("sidebarMenu-popup");
this._switcherTarget = document.getElementById("sidebar-switcher-target");
this._switcherArrow = document.getElementById("sidebar-switcher-arrow");
this._switcherTarget.addEventListener("command", () => {
@@ -184,21 +186,16 @@ var SidebarUI = {
appcontent.ordinal = boxOrdinal;
// Indicate we've switched ordering to the box
this._box.setAttribute("positionend", true);
} else {
this._box.removeAttribute("positionend");
}
this.hideSwitcherPanel();
-
- let content = SidebarUI.browser.contentWindow;
- if (content && content.updatePosition) {
- content.updatePosition();
- }
},
/**
* Try and adopt the status of the sidebar from another window.
* @param {Window} sourceWindow - Window to use as a source for sidebar status.
* @return true if we adopted the state, or false if the caller should
* initialize the state itself.
*/
@@ -360,60 +357,130 @@ var SidebarUI = {
if (this.isOpen && commandID == this.currentID) {
this.hide(triggerNode);
return Promise.resolve();
}
return this.show(commandID, triggerNode);
},
- _loadSidebarExtension(sidebarBroadcaster) {
- let extensionId = sidebarBroadcaster.getAttribute("extensionId");
- if (extensionId) {
- let extensionUrl = sidebarBroadcaster.getAttribute("panel");
- let browserStyle = sidebarBroadcaster.getAttribute("browserStyle");
- SidebarUI.browser.contentWindow.loadPanel(extensionId, extensionUrl, browserStyle);
- }
- },
-
/**
* Show the sidebar, using the parameters from the specified broadcaster.
* @see SidebarUI note.
*
* This wraps the internal method, including a ping to telemetry.
*
* @param {string} commandID ID of the xul:broadcaster element to use.
* @param {DOMNode} [triggerNode] Node, usually a button, that triggered the
* showing of the sidebar.
*/
show(commandID, triggerNode) {
return this._show(commandID).then((sidebarBroadcaster) => {
- this._loadSidebarExtension(sidebarBroadcaster);
-
if (triggerNode) {
updateToggleControlLabel(triggerNode);
}
this._fireFocusedEvent();
});
},
/**
* Show the sidebar, without firing the focused event or logging telemetry.
* This is intended to be used when the sidebar is opened automatically
* when a window opens (not triggered by user interaction).
*
* @param {string} commandID ID of the xul:broadcaster element to use.
*/
showInitially(commandID) {
- return this._show(commandID).then((sidebarBroadcaster) => {
- this._loadSidebarExtension(sidebarBroadcaster);
+ return this._show(commandID);
+ },
+
+ _prepareExtensionBrowser(policy, url, sidebarBroadcaster) {
+ if (this._deck.selectedIndex === 0) {
+ return Promise.resolve();
+ }
+
+ // XXX
+ ChromeUtils.import("resource://gre/modules/ExtensionUtils.jsm");
+
+ var {
+ promiseEvent,
+ } = ExtensionUtils;
+
+ let browserStyle = sidebarBroadcaster.getAttribute("browserStyle");
+ let extension = policy.extension;
+ let browser = this.browser;
+ // Ensure that the browser is going to run in the same process of the other
+ // extension pages from the same addon.
+ browser.sameProcessAsFrameLoader = extension.groupFrameLoader;
+
+ let readyPromise;
+ if (extension.remote) {
+ browser.setAttribute("remote", "true");
+ browser.setAttribute("remoteType",
+ E10SUtils.getRemoteTypeForURI(url, true,
+ E10SUtils.EXTENSION_REMOTE_TYPE));
+ readyPromise = promiseEvent(browser, "XULFrameLoaderCreated");
+ } else {
+ readyPromise = Promise.resolve();
+ }
+
+ return readyPromise.then(() => {
+ browser.messageManager.loadFrameScript("chrome://browser/content/content.js", false);
+ ExtensionParent.apiManager.emit("extension-browser-inserted", browser);
+
+ if (browserStyle) {
+ browser.messageManager.loadFrameScript(
+ "chrome://extensions/content/ext-browser-content.js", false);
+
+ browser.messageManager.sendAsyncMessage("Extension:InitBrowser", {
+ stylesheets: ExtensionParent.extensionStylesheets,
+ });
+ }
+ return browser;
});
},
+ _setUrl(aUrl, sidebarBroadcaster) {
+ // If chrome url, set the deck to the first browser
+ let url = new URL(aUrl);
+ let newIndex;
+ if (url.protocol == "chrome:") {
+ newIndex = 0;
+ } else {
+ newIndex = 1;
+ }
+ if (newIndex !== this._deck.selectedIndex) {
+ // clear the current panel then switch
+ this.browser.setAttribute("src", "about:blank");
+ this.browser.docShell.createAboutBlankContentViewer(null);
+ this._deck.selectedIndex = newIndex;
+ }
+ // If we're using a builtin chrome url or extension url,
+ // set the url and bail now.
+ if (newIndex == 0) {
+ this.browser.setAttribute("src", aUrl);
+ return Promise.resolve();
+ }
+ if (url.protocol === "moz-extension:") {
+ let extensionId = sidebarBroadcaster.getAttribute("extensionId");
+ if (extensionId) {
+ let policy = WebExtensionPolicy.getByID(extensionId);
+ let ready = this._prepareExtensionBrowser(policy, aUrl, sidebarBroadcaster);
+ let uri = Services.io.newURI(policy.getURL());
+ let triggeringPrincipal = Services.scriptSecurityManager.createCodebasePrincipal(uri, {});
+ this.browser.loadURI(aUrl, {triggeringPrincipal});
+ return ready;
+ }
+ throw new Error("moz-extension url loading in sidebar without extensionId");
+ }
+ // XXX we have a content url?
+ return Promise.resolve();
+ },
+
/**
* Implementation for show. Also used internally for sidebars that are shown
* when a window is opened and we don't want to ping telemetry.
*
* @param {string} commandID ID of the xul:broadcaster element to use.
*/
_show(commandID) {
return new Promise((resolve, reject) => {
@@ -447,40 +514,37 @@ var SidebarUI = {
// When loading a web page in the sidebar there is no title set on the
// broadcaster, as it is instead set by openWebPanel. Don't clear out
// the title in this case.
if (title) {
this.title = title;
}
let url = sidebarBroadcaster.getAttribute("sidebarurl");
- this.browser.setAttribute("src", url); // kick off async load
-
- if (this.browser.contentDocument.location.href != url) {
- this.browser.addEventListener("load", event => {
- // We're handling the 'load' event before it bubbles up to the usual
- // (non-capturing) event handlers. Let it bubble up before resolving.
- setTimeout(() => {
- resolve(sidebarBroadcaster);
+ // this.browser.setAttribute("src", url); // kick off async load
+ this._setUrl(url, sidebarBroadcaster).then(() => {
+ if (!this.browser.contentDocument ||
+ this.browser.contentDocument.location.href != url) {
+ this.browser.addEventListener("load", event => {
+ // We're handling the 'load' event before it bubbles up to the usual
+ // (non-capturing) event handlers. Let it bubble up before resolving.
+ setTimeout(() => {
+ resolve();
- // Now that the currentId is updated, fire a show event.
- this._fireShowEvent();
- }, 0);
- }, {capture: true, once: true});
- } else {
- resolve(sidebarBroadcaster);
+ // Now that the currentId is updated, fire a show event.
+ this._fireShowEvent();
+ }, 0);
+ }, {capture: true, once: true});
+ } else {
+ resolve();
- // Now that the currentId is updated, fire a show event.
- this._fireShowEvent();
- }
-
- let selBrowser = gBrowser.selectedBrowser;
- selBrowser.messageManager.sendAsyncMessage("Sidebar:VisibilityChange",
- {commandID, isOpen: true}
- );
+ // Now that the currentId is updated, fire a show event.
+ this._fireShowEvent();
+ }
+ });
});
},
/**
* Hide the sidebar.
*
* @param {DOMNode} [triggerNode] Node, usually a button, that triggered the
* hiding of the sidebar.
@@ -508,19 +572,16 @@ var SidebarUI = {
this.browser.docShell.createAboutBlankContentViewer(null);
sidebarBroadcaster.removeAttribute("checked");
this._box.removeAttribute("checked");
this._box.hidden = this._splitter.hidden = true;
let selBrowser = gBrowser.selectedBrowser;
selBrowser.focus();
- selBrowser.messageManager.sendAsyncMessage("Sidebar:VisibilityChange",
- {commandID, isOpen: false}
- );
if (triggerNode) {
updateToggleControlLabel(triggerNode);
}
},
};
// Add getters related to the position here, since we will want them
// available for both startDelayedLoad and init.
--- a/browser/base/content/browser.xul
+++ b/browser/base/content/browser.xul
@@ -1212,18 +1212,31 @@
<image id="sidebar-throbber"/>
# To ensure the button label's intrinsic width doesn't expand the sidebar
# if the label is long, the button needs flex=1.
# To ensure the button doesn't expand unnecessarily for short labels, the
# spacer should significantly out-flex the button.
<spacer flex="1000"/>
<toolbarbutton id="sidebar-close" class="close-icon tabbable" tooltiptext="&sidebarCloseButton.tooltip;" oncommand="SidebarUI.hide();"/>
</sidebarheader>
- <browser id="sidebar" flex="1" autoscroll="false" disablehistory="true" disablefullscreen="true"
- style="min-width: 14em; width: 18em; max-width: 36em;" tooltip="aHTMLTooltip"/>
+ <deck id="sidebar-deck" flex="1" persist="selectedIndex">
+ <browser id="sidebar" flex="1" autoscroll="false" disablehistory="true" disablefullscreen="true"
+ style="min-width: 14em; width: 18em; max-width: 36em;" tooltip="aHTMLTooltip"/>
+ <browser id="sidebar-contentBrowser" type="content" flex="1"
+ message="true" messagemanagergroup="browsers"
+ disablehistory="true" disablefullscreen="true"
+ disableglobalhistory="true"
+ webextension-view-type="sidebar"
+ tooltip="aHTMLTooltip"
+ contextmenu="contentAreaContextMenu"
+ autocompletepopup="PopupAutoComplete"
+ selectmenulist="ContentSelectDropdown"
+ datetimepicker="DateTimePickerPanel"
+ onclick="contentAreaClick(event, true);"/>
+ </deck>
</vbox>
<splitter id="sidebar-splitter" class="chromeclass-extrachrome sidebar-splitter" hidden="true"/>
<vbox id="appcontent" flex="1">
<notificationbox id="high-priority-global-notificationbox" notificationside="top"/>
<tabbox id="tabbrowser-tabbox"
flex="1" eventnode="document" tabcontainer="tabbrowser-tabs">
<tabpanels id="tabbrowser-tabpanels"
--- a/browser/base/content/moz.build
+++ b/browser/base/content/moz.build
@@ -156,13 +156,10 @@ with Files("macWindow.inc.xul"):
BUG_COMPONENT = ("Firefox", "Shell Integration")
with Files("tabbrowser*"):
BUG_COMPONENT = ("Firefox", "Tabbed Browser")
with Files("browser-allTabsMenu.js"):
BUG_COMPONENT = ("Firefox", "Tabbed Browser")
-with Files("webext-panels*"):
- BUG_COMPONENT = ("WebExtensions", "Frontend")
-
with Files("webrtcIndicator*"):
BUG_COMPONENT = ("Firefox", "Device Permissions")
deleted file mode 100644
--- a/browser/base/content/webext-panels.js
+++ /dev/null
@@ -1,128 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-// Via webext-panels.xul
-/* import-globals-from browser.js */
-/* import-globals-from nsContextMenu.js */
-
-ChromeUtils.defineModuleGetter(this, "ExtensionParent",
- "resource://gre/modules/ExtensionParent.jsm");
-
-ChromeUtils.import("resource://gre/modules/Services.jsm");
-ChromeUtils.import("resource://gre/modules/ExtensionUtils.jsm");
-
-var {
- promiseEvent,
-} = ExtensionUtils;
-
-const XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
-
-function getBrowser(sidebar) {
- let browser = document.getElementById("webext-panels-browser");
- if (browser) {
- return Promise.resolve(browser);
- }
-
- let stack = document.createElementNS(XUL_NS, "stack");
- stack.setAttribute("flex", "1");
-
- browser = document.createElementNS(XUL_NS, "browser");
- browser.setAttribute("id", "webext-panels-browser");
- browser.setAttribute("type", "content");
- browser.setAttribute("flex", "1");
- browser.setAttribute("disableglobalhistory", "true");
- browser.setAttribute("webextension-view-type", "sidebar");
- browser.setAttribute("context", "contentAreaContextMenu");
- browser.setAttribute("tooltip", "aHTMLTooltip");
- browser.setAttribute("autocompletepopup", "PopupAutoComplete");
- browser.setAttribute("selectmenulist", "ContentSelectDropdown");
- browser.setAttribute("onclick", "window.parent.contentAreaClick(event, true);");
-
- // Ensure that the browser is going to run in the same process of the other
- // extension pages from the same addon.
- browser.sameProcessAsFrameLoader = sidebar.extension.groupFrameLoader;
-
- let readyPromise;
- if (sidebar.extension.remote) {
- browser.setAttribute("remote", "true");
- browser.setAttribute("remoteType",
- E10SUtils.getRemoteTypeForURI(sidebar.uri, true,
- E10SUtils.EXTENSION_REMOTE_TYPE));
- readyPromise = promiseEvent(browser, "XULFrameLoaderCreated");
-
- window.messageManager.addMessageListener("contextmenu", openContextMenu);
- window.addEventListener("unload", () => {
- window.messageManager.removeMessageListener("contextmenu", openContextMenu);
- }, {once: true});
- } else {
- readyPromise = Promise.resolve();
- }
-
- stack.appendChild(browser);
- document.documentElement.appendChild(stack);
-
- return readyPromise.then(() => {
- browser.messageManager.loadFrameScript("chrome://browser/content/content.js", false);
- ExtensionParent.apiManager.emit("extension-browser-inserted", browser);
-
- if (sidebar.browserStyle) {
- browser.messageManager.loadFrameScript(
- "chrome://extensions/content/ext-browser-content.js", false);
-
- browser.messageManager.sendAsyncMessage("Extension:InitBrowser", {
- stylesheets: ExtensionParent.extensionStylesheets,
- });
- }
- return browser;
- });
-}
-
-// Stub tabbrowser implementation for use by the tab-modal alert code.
-var gBrowser = {
- getTabForBrowser(browser) {
- return null;
- },
-
- getTabModalPromptBox(browser) {
- if (!browser.tabModalPromptBox) {
- browser.tabModalPromptBox = new TabModalPromptBox(browser);
- }
- return browser.tabModalPromptBox;
- },
-};
-
-function updatePosition() {
- // We need both of these to make sure we update the position
- // after any lower level updates have finished.
- requestAnimationFrame(() => setTimeout(() => {
- let browser = document.getElementById("webext-panels-browser");
- if (browser && browser.isRemoteBrowser) {
- browser.frameLoader.requestUpdatePosition();
- }
- }, 0));
-}
-
-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,
- extension: policy.extension,
- browserStyle,
- };
- getBrowser(sidebar).then(browser => {
- let uri = Services.io.newURI(policy.getURL());
- let triggeringPrincipal = Services.scriptSecurityManager.createCodebasePrincipal(uri, {});
- browser.loadURI(extensionUrl, {triggeringPrincipal});
- });
-}
deleted file mode 100644
--- a/browser/base/content/webext-panels.xul
+++ /dev/null
@@ -1,98 +0,0 @@
-<?xml version="1.0"?>
-
-# -*- Mode: Java; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-<?xml-stylesheet href="chrome://browser/skin/" type="text/css"?>
-<?xml-stylesheet href="chrome://browser/content/usercontext/usercontext.css" type="text/css"?>
-
-<!DOCTYPE page [
-<!ENTITY % browserDTD SYSTEM "chrome://browser/locale/browser.dtd">
-%browserDTD;
-<!ENTITY % textcontextDTD SYSTEM "chrome://global/locale/textcontext.dtd">
-%textcontextDTD;
-]>
-
-<page id="webextpanels-window"
- xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
- xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
- <script type="application/javascript" src="chrome://global/content/contentAreaUtils.js"/>
- <script type="application/javascript" src="chrome://browser/content/browser.js"/>
- <script type="application/javascript" src="chrome://browser/content/browser-places.js"/>
- <script type="application/javascript" src="chrome://browser/content/webext-panels.js"/>
- <script type="application/javascript" src="chrome://global/content/globalOverlay.js"/>
- <script type="application/javascript" src="chrome://browser/content/utilityOverlay.js"/>
- <script type="application/javascript"><![CDATA[
- ChromeUtils.defineModuleGetter(window,
- "PlacesUtils", "resource://gre/modules/PlacesUtils.jsm");
- ChromeUtils.defineModuleGetter(window,
- "PlacesUIUtils", "resource:///modules/PlacesUIUtils.jsm");
- ChromeUtils.defineModuleGetter(window,
- "PlacesTransactions", "resource://gre/modules/PlacesTransactions.jsm");
-
- ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
- XPCOMUtils.defineLazyScriptGetter(window, "PlacesTreeView",
- "chrome://browser/content/places/treeView.js");
- XPCOMUtils.defineLazyScriptGetter(window,
- ["PlacesInsertionPoint", "PlacesController", "PlacesControllerDragHelper"],
- "chrome://browser/content/places/controller.js");
- ]]></script>
-
- <broadcasterset id="mainBroadcasterSet">
- <broadcaster id="isFrameImage"/>
- </broadcasterset>
-
- <commandset id="mainCommandset">
- <command id="Browser:Back"
- oncommand="getPanelBrowser().webNavigation.goBack();"
- disabled="true"/>
- <command id="Browser:Forward"
- oncommand="getPanelBrowser().webNavigation.goForward();"
- disabled="true"/>
- <command id="Browser:Stop" oncommand="PanelBrowserStop();"/>
- <command id="Browser:Reload" oncommand="PanelBrowserReload();"/>
- </commandset>
-
- <popupset id="mainPopupSet">
- <tooltip id="aHTMLTooltip" page="true"/>
-
- <panel type="autocomplete-richlistbox"
- id="PopupAutoComplete"
- noautofocus="true"
- hidden="true"
- overflowpadding="4"
- norolluponanchor="true" />
-
- <menupopup id="contentAreaContextMenu" pagemenu="start"
- onpopupshowing="if (event.target != this)
- return true;
- gContextMenu = new nsContextMenu(this, event.shiftKey);
- if (gContextMenu.shouldDisplay)
- document.popupNode = this.triggerNode;
- return gContextMenu.shouldDisplay;"
- onpopuphiding="if (event.target != this)
- return;
- gContextMenu.hiding();
- gContextMenu = null;">
-#include browser-context.inc
- </menupopup>
-
- <!-- for select dropdowns. The menupopup is what shows the list of options,
- and the popuponly menulist makes things like the menuactive attributes
- work correctly on the menupopup. ContentSelectDropdown expects the
- popuponly menulist to be its immediate parent. -->
- <menulist popuponly="true" id="ContentSelectDropdown" hidden="true">
- <menupopup rolluponmousewheel="true"
- activateontab="true" position="after_start"
- level="parent"
-#ifdef XP_WIN
- consumeoutsideclicks="false" ignorekeys="shortcuts"
-#endif
- />
- </menulist>
- </popupset>
-
-#include ../../../toolkit/content/editMenuCommands.inc.xul
-</page>
--- a/browser/base/jar.mn
+++ b/browser/base/jar.mn
@@ -92,18 +92,16 @@ browser.jar:
content/browser/sanitizeDialog.css (content/sanitizeDialog.css)
content/browser/contentSearchUI.js (content/contentSearchUI.js)
content/browser/contentSearchUI.css (content/contentSearchUI.css)
content/browser/tabbrowser.css (content/tabbrowser.css)
content/browser/tabbrowser.js (content/tabbrowser.js)
content/browser/tabbrowser.xml (content/tabbrowser.xml)
* content/browser/urlbarBindings.xml (content/urlbarBindings.xml)
content/browser/utilityOverlay.js (content/utilityOverlay.js)
- content/browser/webext-panels.js (content/webext-panels.js)
-* content/browser/webext-panels.xul (content/webext-panels.xul)
content/browser/nsContextMenu.js (content/nsContextMenu.js)
#ifdef XP_MACOSX
# XXX: We should exclude this one as well (bug 71895)
* content/browser/hiddenWindow.xul (content/hiddenWindow.xul)
#endif
#ifndef XP_MACOSX
* content/browser/webrtcIndicator.xul (content/webrtcIndicator.xul)
content/browser/webrtcIndicator.js (content/webrtcIndicator.js)
--- a/browser/components/extensions/parent/ext-sidebarAction.js
+++ b/browser/components/extensions/parent/ext-sidebarAction.js
@@ -12,18 +12,16 @@ var {
IconDetails,
} = ExtensionParent;
var XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
// WeakMap[Extension -> SidebarAction]
let sidebarActionMap = new WeakMap();
-const sidebarURL = "chrome://browser/content/webext-panels.xul";
-
/**
* Responsible for the sidebar_action section of the manifest as well
* as the associated sidebar browser.
*/
this.sidebarAction = class extends ExtensionAPI {
static for(extension) {
return sidebarActionMap.get(extension);
}
@@ -150,18 +148,17 @@ this.sidebarAction = class extends Exten
// Use of the broadcaster allows browser-sidebar.js to properly manage the
// checkmarks in the menus.
let broadcaster = document.createElementNS(XUL_NS, "broadcaster");
broadcaster.setAttribute("id", this.id);
broadcaster.setAttribute("autoCheck", "false");
broadcaster.setAttribute("type", "checkbox");
broadcaster.setAttribute("group", "sidebar");
broadcaster.setAttribute("label", details.title);
- broadcaster.setAttribute("sidebarurl", sidebarURL);
- broadcaster.setAttribute("panel", details.panel);
+ broadcaster.setAttribute("sidebarurl", details.panel);
if (this.browserStyle) {
broadcaster.setAttribute("browserStyle", "true");
}
broadcaster.setAttribute("extensionId", this.extension.id);
let id = `ext-key-id-${this.id}`;
broadcaster.setAttribute("key", id);
// oncommand gets attached to menuitem, so we use the observes attribute to