summaryrefslogtreecommitdiffstats
path: root/browser/base/content
diff options
context:
space:
mode:
authorMoonchild <mcwerewolf@gmail.com>2018-05-31 07:53:04 +0200
committerGitHub <noreply@github.com>2018-05-31 07:53:04 +0200
commitbf1454c8ee3d78751852c6098da92c70c715b814 (patch)
tree205cc50bce12012d69d3d3564a1edc0de57aaf5e /browser/base/content
parente1084c8b24f9edda1d40b95d0089edf589da482d (diff)
parent5f89c3da66862d82fa27092986c4065aba3574ff (diff)
downloadUXP-bf1454c8ee3d78751852c6098da92c70c715b814.tar
UXP-bf1454c8ee3d78751852c6098da92c70c715b814.tar.gz
UXP-bf1454c8ee3d78751852c6098da92c70c715b814.tar.lz
UXP-bf1454c8ee3d78751852c6098da92c70c715b814.tar.xz
UXP-bf1454c8ee3d78751852c6098da92c70c715b814.zip
Merge pull request #416 from Ascrod/Social
Remove the Social API
Diffstat (limited to 'browser/base/content')
-rw-r--r--browser/base/content/aboutProviderDirectory.xhtml60
-rw-r--r--browser/base/content/aboutSocialError.xhtml111
-rw-r--r--browser/base/content/browser-context.inc20
-rw-r--r--browser/base/content/browser-sets.inc3
-rw-r--r--browser/base/content/browser-social.js503
-rw-r--r--browser/base/content/browser.css5
-rwxr-xr-xbrowser/base/content/browser.js10
-rw-r--r--browser/base/content/browser.xul26
-rw-r--r--browser/base/content/content.js31
-rwxr-xr-xbrowser/base/content/global-scripts.inc1
-rw-r--r--browser/base/content/nsContextMenu.js47
-rw-r--r--browser/base/content/social-content.js172
-rw-r--r--browser/base/content/web-panels.xul1
13 files changed, 9 insertions, 981 deletions
diff --git a/browser/base/content/aboutProviderDirectory.xhtml b/browser/base/content/aboutProviderDirectory.xhtml
deleted file mode 100644
index 596ede4b3..000000000
--- a/browser/base/content/aboutProviderDirectory.xhtml
+++ /dev/null
@@ -1,60 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!-- 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/. -->
-
-<!DOCTYPE html [
- <!ENTITY % htmlDTD
- PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "DTD/xhtml1-strict.dtd">
- %htmlDTD;
- <!ENTITY % brandDTD SYSTEM "chrome://branding/locale/brand.dtd" >
- %brandDTD;
- <!ENTITY % browserDTD SYSTEM "chrome://browser/locale/browser.dtd">
- %browserDTD;
-]>
-
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>&social.directory.label;</title>
- <link rel="stylesheet" type="text/css" media="all"
- href="chrome://browser/skin/aboutProviderDirectory.css"/>
- </head>
-
- <body>
- <div id="activation-link" hidden="true">
- <div id="message-box">
- <p>&social.directory.text;</p>
- </div>
- <div id="button-box">
- <button onclick="openDirectory()">&social.directory.button;</button>
- </div>
- </div>
- <div id="activation" hidden="true">
- <p>&social.directory.introText;</p>
- <div><iframe id="activation-frame"/></div>
- <p><a class="link" onclick="openDirectory()">&social.directory.viewmore.text;</a></p>
- </div>
- </body>
-
- <script type="text/javascript;version=1.8"><![CDATA[
- const Cu = Components.utils;
-
- Cu.import("resource://gre/modules/Services.jsm");
-
- function openDirectory() {
- let url = Services.prefs.getCharPref("social.directories").split(',')[0];
- window.open(url);
- window.close();
- }
-
- if (Services.prefs.getBoolPref("social.share.activationPanelEnabled")) {
- let url = Services.prefs.getCharPref("social.shareDirectory");
- document.getElementById("activation-frame").setAttribute("src", url);
- document.getElementById("activation").removeAttribute("hidden");
- } else {
- document.getElementById("activation-link").removeAttribute("hidden");
- }
- ]]></script>
-</html>
diff --git a/browser/base/content/aboutSocialError.xhtml b/browser/base/content/aboutSocialError.xhtml
deleted file mode 100644
index 94a4e3dbd..000000000
--- a/browser/base/content/aboutSocialError.xhtml
+++ /dev/null
@@ -1,111 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<!-- 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/. -->
-
-<!DOCTYPE html [
- <!ENTITY % htmlDTD
- PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "DTD/xhtml1-strict.dtd">
- %htmlDTD;
- <!ENTITY % netErrorDTD SYSTEM "chrome://global/locale/netError.dtd">
- %netErrorDTD;
-]>
-
-<html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>&loadError.label;</title>
- <link rel="stylesheet" href="chrome://browser/skin/aboutNetError.css" type="text/css" media="all" />
- <link rel="stylesheet" type="text/css" media="all" href="chrome://browser/skin/aboutSocialError.css"/>
- <link rel="icon" type="image/png" id="favicon" href="chrome://global/skin/icons/warning-16.png"/>
- </head>
-
- <body>
- <div id="errorPageContainer">
-
- <!-- Error Title -->
- <div id="errorTitle">
- <p id="errorShortDescText" >foo</p>
- </div>
-
- <div id="button-box">
- <button id="btnTryAgain" onclick="tryAgainButton()"/>
- </div>
- </div>
- </body>
-
- <script type="text/javascript;version=1.8"><![CDATA[
- const Cu = Components.utils;
-
- Cu.import("resource://gre/modules/Services.jsm");
- Cu.import("resource:///modules/Social.jsm");
-
- let config = {
- tryAgainCallback: reloadProvider
- }
-
- function parseQueryString() {
- let searchParams = new URLSearchParams(document.documentURI.split("?")[1]);
- let mode = searchParams.get("mode");
- config.origin = searchParams.get("origin");
- let encodedURL = searchParams.get("url");
- let url = decodeURIComponent(encodedURL);
- // directory does not have origin set, in that case use the url origin for
- // the error message.
- if (!config.origin) {
- let URI = Services.io.newURI(url, null, null);
- config.origin =
- Services.scriptSecurityManager.createCodebasePrincipal(URI, {}).origin;
- }
-
- switch (mode) {
- case "compactInfo":
- document.getElementById("btnTryAgain").style.display = 'none';
- break;
- case "tryAgainOnly":
- //intentional fall-through
- case "tryAgain":
- config.tryAgainCallback = loadQueryURL;
- config.queryURL = url;
- break;
- default:
- break;
- }
- }
-
- function setUpStrings() {
- let brandBundle = Services.strings.createBundle("chrome://branding/locale/brand.properties");
- let browserBundle = Services.strings.createBundle("chrome://browser/locale/browser.properties");
-
- let productName = brandBundle.GetStringFromName("brandShortName");
- let provider = Social._getProviderFromOrigin(config.origin);
- let providerName = provider ? provider.name : config.origin;
-
- // Sets up the error message
- let msg = browserBundle.formatStringFromName("social.error.message", [productName, providerName], 2);
- document.getElementById("errorShortDescText").textContent = msg;
-
- // Sets up the buttons' labels and accesskeys
- let btnTryAgain = document.getElementById("btnTryAgain");
- btnTryAgain.textContent = browserBundle.GetStringFromName("social.error.tryAgain.label");
- btnTryAgain.accessKey = browserBundle.GetStringFromName("social.error.tryAgain.accesskey");
- }
-
- function tryAgainButton() {
- config.tryAgainCallback();
- }
-
- function loadQueryURL() {
- window.location.href = config.queryURL;
- }
-
- function reloadProvider() {
- let provider = Social._getProviderFromOrigin(config.origin);
- provider.reload();
- }
-
- parseQueryString();
- setUpStrings();
- ]]></script>
-</html>
diff --git a/browser/base/content/browser-context.inc b/browser/base/content/browser-context.inc
index 3061cccdd..9fa90b11c 100644
--- a/browser/base/content/browser-context.inc
+++ b/browser/base/content/browser-context.inc
@@ -85,10 +85,6 @@
label="&bookmarkThisLinkCmd.label;"
accesskey="&bookmarkThisLinkCmd.accesskey;"
oncommand="gContextMenu.bookmarkLink();"/>
- <menuitem id="context-sharelink"
- label="&shareLink.label;"
- accesskey="&shareLink.accesskey;"
- oncommand="gContextMenu.shareLink();"/>
<menuitem id="context-savelink"
label="&saveLinkCmd.label;"
accesskey="&saveLinkCmd.accesskey;"
@@ -212,10 +208,6 @@
label="&saveImageCmd.label;"
accesskey="&saveImageCmd.accesskey;"
oncommand="gContextMenu.saveMedia();"/>
- <menuitem id="context-shareimage"
- label="&shareImage.label;"
- accesskey="&shareImage.accesskey;"
- oncommand="gContextMenu.shareImage();"/>
<menuitem id="context-sendimage"
label="&emailImageCmd.label;"
accesskey="&emailImageCmd.accesskey;"
@@ -237,10 +229,6 @@
label="&saveVideoCmd.label;"
accesskey="&saveVideoCmd.accesskey;"
oncommand="gContextMenu.saveMedia();"/>
- <menuitem id="context-sharevideo"
- label="&shareVideo.label;"
- accesskey="&shareVideo.accesskey;"
- oncommand="gContextMenu.shareVideo();"/>
<menuitem id="context-saveaudio"
label="&saveAudioCmd.label;"
accesskey="&saveAudioCmd.accesskey;"
@@ -271,10 +259,6 @@
accesskey="&hidePluginCmd.accesskey;"
oncommand="gContextMenu.hidePlugin();"/>
<menuseparator id="context-sep-ctp"/>
- <menuitem id="context-sharepage"
- label="&sharePageCmd.label;"
- accesskey="&sharePageCmd.accesskey;"
- oncommand="SocialShare.sharePage();"/>
<menuitem id="context-savepage"
label="&savePageCmd.label;"
accesskey="&savePageCmd.accesskey2;"
@@ -334,10 +318,6 @@
<menupopup id="context-sendlinktodevice-popup"
onpopupshowing="gFxAccounts.populateSendTabToDevicesMenu(event.target, gContextMenu.linkURL, gContextMenu.linkTextStr);"/>
</menu>
- <menuitem id="context-shareselect"
- label="&shareSelect.label;"
- accesskey="&shareSelect.accesskey;"
- oncommand="gContextMenu.shareSelect();"/>
<menuseparator id="frame-sep"/>
<menu id="frame" label="&thisFrameMenu.label;" accesskey="&thisFrameMenu.accesskey;">
<menupopup>
diff --git a/browser/base/content/browser-sets.inc b/browser/base/content/browser-sets.inc
index d0c3d11cd..6ea057d93 100644
--- a/browser/base/content/browser-sets.inc
+++ b/browser/base/content/browser-sets.inc
@@ -105,8 +105,6 @@
oncommand="OpenBrowserWindow({private: true});" reserved="true"/>
<command id="History:UndoCloseTab" oncommand="undoCloseTab();"/>
<command id="History:UndoCloseWindow" oncommand="undoCloseWindow();"/>
- <command id="Social:SharePage" oncommand="SocialShare.sharePage();"/>
- <command id="Social:Addons" oncommand="BrowserOpenAddonsMgr('addons://list/service');"/>
</commandset>
<commandset id="placesCommands">
@@ -117,7 +115,6 @@
</commandset>
<broadcasterset id="mainBroadcasterSet">
- <broadcaster id="Social:PageShareable" disabled="true"/>
<broadcaster id="viewBookmarksSidebar" autoCheck="false" label="&bookmarksButton.label;"
type="checkbox" group="sidebar" sidebarurl="chrome://browser/content/bookmarks/bookmarksPanel.xul"
oncommand="SidebarUI.toggle('viewBookmarksSidebar');"/>
diff --git a/browser/base/content/browser-social.js b/browser/base/content/browser-social.js
deleted file mode 100644
index b470efd3d..000000000
--- a/browser/base/content/browser-social.js
+++ /dev/null
@@ -1,503 +0,0 @@
-/* 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/. */
-
-// the "exported" symbols
-var SocialUI,
- SocialShare,
- SocialActivationListener;
-
-(function() {
-
-XPCOMUtils.defineLazyGetter(this, "OpenGraphBuilder", function() {
- let tmp = {};
- Cu.import("resource:///modules/Social.jsm", tmp);
- return tmp.OpenGraphBuilder;
-});
-
-XPCOMUtils.defineLazyGetter(this, "DynamicResizeWatcher", function() {
- let tmp = {};
- Cu.import("resource:///modules/Social.jsm", tmp);
- return tmp.DynamicResizeWatcher;
-});
-
-SocialUI = {
- _initialized: false,
-
- // Called on delayed startup to initialize the UI
- init: function SocialUI_init() {
- if (this._initialized) {
- return;
- }
- let mm = window.getGroupMessageManager("social");
- mm.loadFrameScript("chrome://browser/content/content.js", true);
- mm.loadFrameScript("chrome://browser/content/social-content.js", true);
-
- Services.obs.addObserver(this, "social:providers-changed", false);
-
- CustomizableUI.addListener(this);
- SocialActivationListener.init();
-
- Social.init().then((update) => {
- if (update)
- this._providersChanged();
- });
-
- this._initialized = true;
- },
-
- // Called on window unload
- uninit: function SocialUI_uninit() {
- if (!this._initialized) {
- return;
- }
- Services.obs.removeObserver(this, "social:providers-changed");
-
- CustomizableUI.removeListener(this);
- SocialActivationListener.uninit();
-
- this._initialized = false;
- },
-
- observe: function SocialUI_observe(subject, topic, data) {
- switch (topic) {
- case "social:providers-changed":
- this._providersChanged();
- break;
- }
- },
-
- _providersChanged: function() {
- SocialShare.populateProviderMenu();
- },
-
- showLearnMore: function() {
- let url = Services.urlFormatter.formatURLPref("app.support.baseURL") + "social-api";
- openUILinkIn(url, "tab");
- },
-
- closeSocialPanelForLinkTraversal: function (target, linkNode) {
- // No need to close the panel if this traversal was not retargeted
- if (target == "" || target == "_self")
- return;
-
- // Check to see whether this link traversal was in a social panel
- let win = linkNode.ownerGlobal;
- let container = win.QueryInterface(Ci.nsIInterfaceRequestor)
- .getInterface(Ci.nsIWebNavigation)
- .QueryInterface(Ci.nsIDocShell)
- .chromeEventHandler;
- let containerParent = container.parentNode;
- if (containerParent.classList.contains("social-panel") &&
- containerParent instanceof Ci.nsIDOMXULPopupElement) {
- // allow the link traversal to finish before closing the panel
- setTimeout(() => {
- containerParent.hidePopup();
- }, 0);
- }
- },
-
- get _chromeless() {
- // Is this a popup window that doesn't want chrome shown?
- let docElem = document.documentElement;
- // extrachrome is not restored during session restore, so we need
- // to check for the toolbar as well.
- let chromeless = docElem.getAttribute("chromehidden").includes("extrachrome") ||
- docElem.getAttribute('chromehidden').includes("toolbar");
- // This property is "fixed" for a window, so avoid doing the check above
- // multiple times...
- delete this._chromeless;
- this._chromeless = chromeless;
- return chromeless;
- },
-
- get enabled() {
- // Returns whether social is enabled *for this window*.
- if (this._chromeless)
- return false;
- return Social.providers.length > 0;
- },
-
- canSharePage: function(aURI) {
- return (aURI && (aURI.schemeIs('http') || aURI.schemeIs('https')));
- },
-
- onCustomizeEnd: function(aWindow) {
- if (aWindow != window)
- return;
- // customization mode gets buttons out of sync with command updating, fix
- // the disabled state
- let canShare = this.canSharePage(gBrowser.currentURI);
- let shareButton = SocialShare.shareButton;
- if (shareButton) {
- if (canShare) {
- shareButton.removeAttribute("disabled")
- } else {
- shareButton.setAttribute("disabled", "true")
- }
- }
- },
-
- // called on tab/urlbar/location changes and after customization. Update
- // anything that is tab specific.
- updateState: function() {
- goSetCommandEnabled("Social:PageShareable", this.canSharePage(gBrowser.currentURI));
- }
-}
-
-// message manager handlers
-SocialActivationListener = {
- init: function() {
- messageManager.addMessageListener("Social:Activation", this);
- },
- uninit: function() {
- messageManager.removeMessageListener("Social:Activation", this);
- },
- receiveMessage: function(aMessage) {
- let data = aMessage.json;
- let browser = aMessage.target;
- data.window = window;
- // if the source if the message is the share panel, we do a one-click
- // installation. The source of activations is controlled by the
- // social.directories preference
- let options;
- if (browser == SocialShare.iframe && Services.prefs.getBoolPref("social.share.activationPanelEnabled")) {
- options = { bypassContentCheck: true, bypassInstallPanel: true };
- }
-
- Social.installProvider(data, function(manifest) {
- Social.activateFromOrigin(manifest.origin, function(provider) {
- if (provider.shareURL) {
- // Ensure that the share button is somewhere usable.
- // SocialShare.shareButton may return null if it is in the menu-panel
- // and has never been visible, so we check the widget directly. If
- // there is no area for the widget we move it into the toolbar.
- let widget = CustomizableUI.getWidget("social-share-button");
- // If the panel is already open, we can be sure that the provider can
- // already be accessed, possibly anchored to another toolbar button.
- // In that case we don't move the widget.
- if (!widget.areaType && SocialShare.panel.state != "open") {
- CustomizableUI.addWidgetToArea("social-share-button", CustomizableUI.AREA_NAVBAR);
- // Ensure correct state.
- SocialUI.onCustomizeEnd(window);
- }
-
- // make this new provider the selected provider. If the panel hasn't
- // been opened, we need to make the frame first.
- SocialShare._createFrame();
- SocialShare.iframe.setAttribute('src', 'data:text/plain;charset=utf8,');
- SocialShare.iframe.setAttribute('origin', provider.origin);
- // get the right button selected
- SocialShare.populateProviderMenu();
- if (SocialShare.panel.state == "open") {
- SocialShare.sharePage(provider.origin);
- }
- }
- if (provider.postActivationURL) {
- // if activated from an open share panel, we load the landing page in
- // a background tab
- gBrowser.loadOneTab(provider.postActivationURL, {inBackground: SocialShare.panel.state == "open"});
- }
- });
- }, options);
- }
-}
-
-SocialShare = {
- get _dynamicResizer() {
- delete this._dynamicResizer;
- this._dynamicResizer = new DynamicResizeWatcher();
- return this._dynamicResizer;
- },
-
- // Share panel may be attached to the overflow or menu button depending on
- // customization, we need to manage open state of the anchor.
- get anchor() {
- let widget = CustomizableUI.getWidget("social-share-button");
- return widget.forWindow(window).anchor;
- },
- // Holds the anchor node in use whilst the panel is open, because it may vary.
- _currentAnchor: null,
-
- get panel() {
- return document.getElementById("social-share-panel");
- },
-
- get iframe() {
- // panel.firstChild is our toolbar hbox, panel.lastChild is the iframe
- // container hbox used for an interstitial "loading" graphic
- return this.panel.lastChild.firstChild;
- },
-
- uninit: function () {
- if (this.iframe) {
- let mm = this.messageManager;
- mm.removeMessageListener("PageVisibility:Show", this);
- mm.removeMessageListener("PageVisibility:Hide", this);
- mm.removeMessageListener("Social:DOMWindowClose", this);
- this.iframe.removeEventListener("load", this);
- this.iframe.remove();
- }
- },
-
- _createFrame: function() {
- let panel = this.panel;
- if (this.iframe)
- return;
- this.panel.hidden = false;
- // create and initialize the panel for this window
- let iframe = document.createElement("browser");
- iframe.setAttribute("type", "content");
- iframe.setAttribute("class", "social-share-frame");
- iframe.setAttribute("context", "contentAreaContextMenu");
- iframe.setAttribute("tooltip", "aHTMLTooltip");
- iframe.setAttribute("disableglobalhistory", "true");
- iframe.setAttribute("flex", "1");
- iframe.setAttribute("message", "true");
- iframe.setAttribute("messagemanagergroup", "social");
- panel.lastChild.appendChild(iframe);
- let mm = this.messageManager;
- mm.addMessageListener("PageVisibility:Show", this);
- mm.addMessageListener("PageVisibility:Hide", this);
- mm.sendAsyncMessage("Social:SetErrorURL",
- { template: "about:socialerror?mode=compactInfo&origin=%{origin}&url=%{url}" });
- iframe.addEventListener("load", this, true);
- mm.addMessageListener("Social:DOMWindowClose", this);
-
- this.populateProviderMenu();
- },
-
- get messageManager() {
- // The xbl bindings for the iframe may not exist yet, so we can't
- // access iframe.messageManager directly - but can get at it with this dance.
- return this.iframe.QueryInterface(Components.interfaces.nsIFrameLoaderOwner).frameLoader.messageManager;
- },
-
- receiveMessage: function(aMessage) {
- let iframe = this.iframe;
- switch(aMessage.name) {
- case "PageVisibility:Show":
- SocialShare._dynamicResizer.start(iframe.parentNode, iframe);
- break;
- case "PageVisibility:Hide":
- SocialShare._dynamicResizer.stop();
- break;
- case "Social:DOMWindowClose":
- this.panel.hidePopup();
- break;
- }
- },
-
- handleEvent: function(event) {
- switch (event.type) {
- case "load": {
- this.iframe.parentNode.removeAttribute("loading");
- if (this.currentShare)
- SocialShare.messageManager.sendAsyncMessage("Social:OpenGraphData", this.currentShare);
- }
- }
- },
-
- getSelectedProvider: function() {
- let provider;
- let lastProviderOrigin = this.iframe && this.iframe.getAttribute("origin");
- if (lastProviderOrigin) {
- provider = Social._getProviderFromOrigin(lastProviderOrigin);
- }
- return provider;
- },
-
- createTooltip: function(event) {
- let tt = event.target;
- let provider = Social._getProviderFromOrigin(tt.triggerNode.getAttribute("origin"));
- tt.firstChild.setAttribute("value", provider.name);
- tt.lastChild.setAttribute("value", provider.origin);
- },
-
- populateProviderMenu: function() {
- if (!this.iframe)
- return;
- let providers = Social.providers.filter(p => p.shareURL);
- let hbox = document.getElementById("social-share-provider-buttons");
- // remove everything before the add-share-provider button (which should also
- // be lastChild if any share providers were added)
- let addButton = document.getElementById("add-share-provider");
- while (hbox.lastChild != addButton) {
- hbox.removeChild(hbox.lastChild);
- }
- let selectedProvider = this.getSelectedProvider();
- for (let provider of providers) {
- let button = document.createElement("toolbarbutton");
- button.setAttribute("class", "toolbarbutton-1 share-provider-button");
- button.setAttribute("type", "radio");
- button.setAttribute("group", "share-providers");
- button.setAttribute("image", provider.iconURL);
- button.setAttribute("tooltip", "share-button-tooltip");
- button.setAttribute("origin", provider.origin);
- button.setAttribute("label", provider.name);
- button.setAttribute("oncommand", "SocialShare.sharePage(this.getAttribute('origin'));");
- if (provider == selectedProvider) {
- this.defaultButton = button;
- }
- hbox.appendChild(button);
- }
- if (!this.defaultButton) {
- this.defaultButton = addButton;
- }
- this.defaultButton.setAttribute("checked", "true");
- },
-
- get shareButton() {
- // web-panels (bookmark/sidebar) don't include customizableui, so
- // nsContextMenu fails when accessing shareButton, breaking
- // browser_bug409481.js.
- if (!window.CustomizableUI)
- return null;
- let widget = CustomizableUI.getWidget("social-share-button");
- if (!widget || !widget.areaType)
- return null;
- return widget.forWindow(window).node;
- },
-
- _onclick: function() {
- Services.telemetry.getHistogramById("SOCIAL_PANEL_CLICKS").add(0);
- },
-
- onShowing: function() {
- (this._currentAnchor || this.anchor).setAttribute("open", "true");
- this.iframe.addEventListener("click", this._onclick, true);
- },
-
- onHidden: function() {
- (this._currentAnchor || this.anchor).removeAttribute("open");
- this._currentAnchor = null;
- this.iframe.docShellIsActive = false;
- this.iframe.removeEventListener("click", this._onclick, true);
- this.iframe.setAttribute("src", "data:text/plain;charset=utf8,");
- // make sure that the frame is unloaded after it is hidden
- this.messageManager.sendAsyncMessage("Social:ClearFrame");
- this.currentShare = null;
- // share panel use is over, purge any history
- this.iframe.purgeSessionHistory();
- },
-
- sharePage: function(providerOrigin, graphData, target, anchor) {
- // if providerOrigin is undefined, we use the last-used provider, or the
- // current/default provider. The provider selection in the share panel
- // will call sharePage with an origin for us to switch to.
- this._createFrame();
- let iframe = this.iframe;
-
- // graphData is an optional param that either defines the full set of data
- // to be shared, or partial data about the current page. It is set by a call
- // in mozSocial API, or via nsContentMenu calls. If it is present, it MUST
- // define at least url. If it is undefined, we're sharing the current url in
- // the browser tab.
- let pageData = graphData ? graphData : this.currentShare;
- let sharedURI = pageData ? Services.io.newURI(pageData.url, null, null) :
- gBrowser.currentURI;
- if (!SocialUI.canSharePage(sharedURI))
- return;
-
- let browserMM = gBrowser.selectedBrowser.messageManager;
-
- // the point of this action type is that we can use existing share
- // endpoints (e.g. oexchange) that do not support additional
- // socialapi functionality. One tweak is that we shoot an event
- // containing the open graph data.
- let _dataFn;
- if (!pageData || sharedURI == gBrowser.currentURI) {
- browserMM.addMessageListener("PageMetadata:PageDataResult", _dataFn = (msg) => {
- browserMM.removeMessageListener("PageMetadata:PageDataResult", _dataFn);
- let pageData = msg.json;
- if (graphData) {
- // overwrite data retreived from page with data given to us as a param
- for (let p in graphData) {
- pageData[p] = graphData[p];
- }
- }
- this.sharePage(providerOrigin, pageData, target, anchor);
- });
- browserMM.sendAsyncMessage("PageMetadata:GetPageData", null, { target });
- return;
- }
- // if this is a share of a selected item, get any microformats
- if (!pageData.microformats && target) {
- browserMM.addMessageListener("PageMetadata:MicroformatsResult", _dataFn = (msg) => {
- browserMM.removeMessageListener("PageMetadata:MicroformatsResult", _dataFn);
- pageData.microformats = msg.data;
- this.sharePage(providerOrigin, pageData, target, anchor);
- });
- browserMM.sendAsyncMessage("PageMetadata:GetMicroformats", null, { target });
- return;
- }
- this.currentShare = pageData;
-
- let provider;
- if (providerOrigin)
- provider = Social._getProviderFromOrigin(providerOrigin);
- else
- provider = this.getSelectedProvider();
- if (!provider || !provider.shareURL) {
- this.showDirectory(anchor);
- return;
- }
- // check the menu button
- let hbox = document.getElementById("social-share-provider-buttons");
- let btn = hbox.querySelector("[origin='" + provider.origin + "']");
- if (btn)
- btn.checked = true;
-
- let shareEndpoint = OpenGraphBuilder.generateEndpointURL(provider.shareURL, pageData);
-
- this._dynamicResizer.stop();
- let size = provider.getPageSize("share");
- if (size) {
- // let the css on the share panel define width, but height
- // calculations dont work on all sites, so we allow that to be
- // defined.
- delete size.width;
- }
-
- // if we've already loaded this provider/page share endpoint, we don't want
- // to add another load event listener.
- let endpointMatch = shareEndpoint == iframe.getAttribute("src");
- if (endpointMatch) {
- this._dynamicResizer.start(iframe.parentNode, iframe, size);
- iframe.docShellIsActive = true;
- SocialShare.messageManager.sendAsyncMessage("Social:OpenGraphData", this.currentShare);
- } else {
- iframe.parentNode.setAttribute("loading", "true");
- }
- // if the user switched between share providers we do not want that history
- // available.
- iframe.purgeSessionHistory();
-
- // always ensure that origin belongs to the endpoint
- let uri = Services.io.newURI(shareEndpoint, null, null);
- iframe.setAttribute("origin", provider.origin);
- iframe.setAttribute("src", shareEndpoint);
- this._openPanel(anchor);
- },
-
- showDirectory: function(anchor) {
- this._createFrame();
- let iframe = this.iframe;
- if (iframe.getAttribute("src") == "about:providerdirectory")
- return;
- iframe.removeAttribute("origin");
- iframe.parentNode.setAttribute("loading", "true");
-
- iframe.setAttribute("src", "about:providerdirectory");
- this._openPanel(anchor);
- },
-
- _openPanel: function(anchor) {
- this._currentAnchor = anchor || this.anchor;
- anchor = document.getAnonymousElementByAttribute(this._currentAnchor, "class", "toolbarbutton-icon");
- this.panel.openPopup(anchor, "bottomcenter topright", 0, 0, false, false);
- Services.telemetry.getHistogramById("SOCIAL_TOOLBAR_BUTTONS").add(0);
- }
-};
-
-})();
diff --git a/browser/base/content/browser.css b/browser/base/content/browser.css
index f03f21c3f..ac5bf9e9b 100644
--- a/browser/base/content/browser.css
+++ b/browser/base/content/browser.css
@@ -933,11 +933,6 @@ html|*#gcli-output-frame,
transition: none;
}
-panelview > .social-panel-frame {
- width: auto;
- height: auto;
-}
-
/* Translation */
notification[value="translation"] {
-moz-binding: url("chrome://browser/content/translation-infobar.xml#translationbar");
diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
index 8679bca83..4b8ec864b 100755
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -44,7 +44,6 @@ Cu.import("resource://gre/modules/NotificationDB.jsm");
["ShortcutUtils", "resource://gre/modules/ShortcutUtils.jsm"],
["SimpleServiceDiscovery", "resource://gre/modules/SimpleServiceDiscovery.jsm"],
["SitePermissions", "resource:///modules/SitePermissions.jsm"],
- ["Social", "resource:///modules/Social.jsm"],
["TabCrashHandler", "resource:///modules/ContentCrashHandlers.jsm"],
["Task", "resource://gre/modules/Task.jsm"],
["TelemetryStopwatch", "resource://gre/modules/TelemetryStopwatch.jsm"],
@@ -1405,8 +1404,6 @@ var gBrowserInit = {
// Enable the Restore Last Session command if needed
RestoreLastSessionObserver.init();
- SocialUI.init();
-
// Start monitoring slow add-ons
AddonWatcher.init();
@@ -1537,7 +1534,6 @@ var gBrowserInit = {
gPrefService.removeObserver(ctrlTab.prefName, ctrlTab);
ctrlTab.uninit();
- SocialUI.uninit();
gBrowserThumbnails.uninit();
FullZoom.destroy();
@@ -4297,9 +4293,7 @@ var XULBrowserWindow = {
// Called before links are navigated to to allow us to retarget them if needed.
onBeforeLinkTraversal: function(originalTarget, linkURI, linkNode, isAppTab) {
- let target = BrowserUtils.onBeforeLinkTraversal(originalTarget, linkURI, linkNode, isAppTab);
- SocialUI.closeSocialPanelForLinkTraversal(target, linkNode);
- return target;
+ return BrowserUtils.onBeforeLinkTraversal(originalTarget, linkURI, linkNode, isAppTab);
},
// Check whether this URI should load in the current process
@@ -4480,8 +4474,6 @@ var XULBrowserWindow = {
gIdentityHandler.onLocationChange();
- SocialUI.updateState();
-
UITour.onLocationChange(location);
gTabletModePageCounter.inc();
diff --git a/browser/base/content/browser.xul b/browser/base/content/browser.xul
index 485471ee3..4f1b48349 100644
--- a/browser/base/content/browser.xul
+++ b/browser/base/content/browser.xul
@@ -268,27 +268,6 @@
<box id="UITourHighlight"></box>
</panel>
- <panel id="social-share-panel"
- class="social-panel"
- type="arrow"
- orient="vertical"
- onpopupshowing="SocialShare.onShowing()"
- onpopuphidden="SocialShare.onHidden()"
- hidden="true">
- <hbox class="social-share-toolbar">
- <toolbarbutton id="manage-share-providers" class="share-provider-button"
- tooltiptext="&social.addons.label;"
- oncommand="BrowserOpenAddonsMgr('addons://list/service');
- this.parentNode.parentNode.hidePopup();"/>
- <arrowscrollbox id="social-share-provider-buttons" orient="horizontal" flex="1" pack="end">
- <toolbarbutton id="add-share-provider" class="share-provider-button" type="radio"
- group="share-providers" tooltiptext="&findShareServices.label;"
- oncommand="SocialShare.showDirectory()"/>
- </arrowscrollbox>
- </hbox>
- <hbox id="share-container" flex="1"/>
- </panel>
-
<menupopup id="toolbar-context-menu"
onpopupshowing="onViewToolbarsPopupShowing(event, document.getElementById('viewToolbarsMenuSeparator'));">
<menuitem oncommand="gCustomizeMode.addToPanel(document.popupNode)"
@@ -426,11 +405,6 @@
#endif
</tooltip>
- <tooltip id="share-button-tooltip" onpopupshowing="SocialShare.createTooltip(event);">
- <label class="tooltip-label"/>
- <label class="tooltip-label"/>
- </tooltip>
-
#include popup-notifications.inc
#include ../../components/customizableui/content/panelUI.inc.xul
diff --git a/browser/base/content/content.js b/browser/base/content/content.js
index 496e0d111..5758cb023 100644
--- a/browser/base/content/content.js
+++ b/browser/base/content/content.js
@@ -698,37 +698,6 @@ var PageMetadataMessenger = {
}
PageMetadataMessenger.init();
-addEventListener("ActivateSocialFeature", function (aEvent) {
- let document = content.document;
- let dwu = content.QueryInterface(Ci.nsIInterfaceRequestor)
- .getInterface(Ci.nsIDOMWindowUtils);
- if (!dwu.isHandlingUserInput) {
- Cu.reportError("attempt to activate provider without user input from " + document.nodePrincipal.origin);
- return;
- }
-
- let node = aEvent.target;
- let ownerDocument = node.ownerDocument;
- let data = node.getAttribute("data-service");
- if (data) {
- try {
- data = JSON.parse(data);
- } catch (e) {
- Cu.reportError("Social Service manifest parse error: " + e);
- return;
- }
- } else {
- Cu.reportError("Social Service manifest not available");
- return;
- }
-
- sendAsyncMessage("Social:Activation", {
- url: ownerDocument.location.href,
- origin: ownerDocument.nodePrincipal.origin,
- manifest: data
- });
-}, true, true);
-
addMessageListener("ContextMenu:SaveVideoFrameAsImage", (message) => {
let video = message.objects.target;
let canvas = content.document.createElementNS("http://www.w3.org/1999/xhtml", "canvas");
diff --git a/browser/base/content/global-scripts.inc b/browser/base/content/global-scripts.inc
index ca942cec8..eef21e15e 100755
--- a/browser/base/content/global-scripts.inc
+++ b/browser/base/content/global-scripts.inc
@@ -27,7 +27,6 @@
<script type="application/javascript" src="chrome://browser/content/browser-safebrowsing.js"/>
#endif
<script type="application/javascript" src="chrome://browser/content/browser-sidebar.js"/>
-<script type="application/javascript" src="chrome://browser/content/browser-social.js"/>
<script type="application/javascript" src="chrome://browser/content/browser-syncui.js"/>
<script type="application/javascript" src="chrome://browser/content/browser-tabsintitlebar.js"/>
<script type="application/javascript" src="chrome://browser/content/browser-thumbnails.js"/>
diff --git a/browser/base/content/nsContextMenu.js b/browser/base/content/nsContextMenu.js
index 955184f64..097caf367 100644
--- a/browser/base/content/nsContextMenu.js
+++ b/browser/base/content/nsContextMenu.js
@@ -174,15 +174,15 @@ nsContextMenu.prototype = {
initNavigationItems: function CM_initNavigationItems() {
var shouldShow = !(this.isContentSelected || this.onLink || this.onImage ||
this.onCanvas || this.onVideo || this.onAudio ||
- this.onTextInput || this.onSocial);
+ this.onTextInput);
this.showItem("context-navigation", shouldShow);
this.showItem("context-sep-navigation", shouldShow);
let stopped = XULBrowserWindow.stopCommand.getAttribute("disabled") == "true";
let stopReloadItem = "";
- if (shouldShow || this.onSocial) {
- stopReloadItem = (stopped || this.onSocial) ? "reload" : "stop";
+ if (shouldShow) {
+ stopReloadItem = (stopped) ? "reload" : "stop";
}
this.showItem("context-reload", stopReloadItem == "reload");
@@ -249,7 +249,7 @@ nsContextMenu.prototype = {
this.onImage || this.onCanvas ||
this.onVideo || this.onAudio ||
this.onLink || this.onTextInput);
- var showInspect = !this.onSocial && gPrefService.getBoolPref("devtools.inspector.enabled");
+ var showInspect = gPrefService.getBoolPref("devtools.inspector.enabled");
this.showItem("context-viewsource", shouldShow);
this.showItem("context-viewinfo", shouldShow);
this.showItem("inspect-separator", showInspect);
@@ -306,12 +306,11 @@ nsContextMenu.prototype = {
let bookmarkPage = document.getElementById("context-bookmarkpage");
this.showItem(bookmarkPage,
!(this.isContentSelected || this.onTextInput || this.onLink ||
- this.onImage || this.onVideo || this.onAudio || this.onSocial ||
- this.onCanvas));
+ this.onImage || this.onVideo || this.onAudio || this.onCanvas));
bookmarkPage.setAttribute("tooltiptext", bookmarkPage.getAttribute("buttontooltiptext"));
- this.showItem("context-bookmarklink", (this.onLink && !this.onMailtoLink &&
- !this.onSocial) || this.onPlainTextLink);
+ this.showItem("context-bookmarklink", (this.onLink && !this.onMailtoLink) ||
+ this.onPlainTextLink);
this.showItem("context-keywordfield",
this.onTextInput && this.onKeywordField);
this.showItem("frame", this.inFrame);
@@ -349,19 +348,6 @@ nsContextMenu.prototype = {
this.onTextInput && !this.onNumeric && top.gBidiUI);
this.showItem("context-bidi-page-direction-toggle",
!this.onTextInput && top.gBidiUI);
-
- // SocialShare
- let shareButton = SocialShare.shareButton;
- let shareEnabled = shareButton && !shareButton.disabled && !this.onSocial;
- let pageShare = shareEnabled && !(this.isContentSelected ||
- this.onTextInput || this.onLink || this.onImage ||
- this.onVideo || this.onAudio || this.onCanvas);
- this.showItem("context-sharepage", pageShare);
- this.showItem("context-shareselect", shareEnabled && this.isContentSelected);
- this.showItem("context-sharelink", shareEnabled && (this.onLink || this.onPlainTextLink) && !this.onMailtoLink);
- this.showItem("context-shareimage", shareEnabled && this.onImage);
- this.showItem("context-sharevideo", shareEnabled && this.onVideo);
- this.setItemAttr("context-sharevideo", "disabled", !this.mediaURL || this.mediaURL.startsWith("blob:"));
},
initSpellingItems: function() {
@@ -681,7 +667,6 @@ nsContextMenu.prototype = {
.getInterface(Ci.nsIDOMWindowUtils)
.outerWindowID;
}
- this.onSocial = !!this.browser.getAttribute("origin");
// Check if we are in a synthetic document (stand alone image, video, etc.).
this.inSyntheticDoc = ownerDoc.mozSyntheticDocument;
@@ -1726,22 +1711,6 @@ nsContextMenu.prototype = {
mm.sendAsyncMessage("ContextMenu:BookmarkFrame", null, { target: this.target });
},
- shareLink: function CM_shareLink() {
- SocialShare.sharePage(null, { url: this.linkURI.spec }, this.target);
- },
-
- shareImage: function CM_shareImage() {
- SocialShare.sharePage(null, { url: this.imageURL, previews: [ this.mediaURL ] }, this.target);
- },
-
- shareVideo: function CM_shareVideo() {
- SocialShare.sharePage(null, { url: this.mediaURL, source: this.mediaURL }, this.target);
- },
-
- shareSelect: function CM_shareSelect() {
- SocialShare.sharePage(null, { url: this.browser.currentURI.spec, text: this.textSelected }, this.target);
- },
-
savePageAs: function CM_savePageAs() {
saveBrowser(this.browser);
},
@@ -1856,7 +1825,7 @@ nsContextMenu.prototype = {
_getTelemetryPageContextInfo: function() {
let rv = [];
for (let k of ["isContentSelected", "onLink", "onImage", "onCanvas", "onVideo", "onAudio",
- "onTextInput", "onSocial"]) {
+ "onTextInput"]) {
if (this[k]) {
rv.push(k.replace(/^(?:is|on)(.)/, (match, firstLetter) => firstLetter.toLowerCase()));
}
diff --git a/browser/base/content/social-content.js b/browser/base/content/social-content.js
deleted file mode 100644
index b5fa6a5c4..000000000
--- a/browser/base/content/social-content.js
+++ /dev/null
@@ -1,172 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* 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/. */
-
-/* This content script is intended for use by iframes in the share panel. */
-
-var {interfaces: Ci, utils: Cu} = Components;
-
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource://gre/modules/Services.jsm");
-
-// social frames are always treated as app tabs
-docShell.isAppTab = true;
-
-addEventListener("DOMContentLoaded", function(event) {
- if (event.target != content.document)
- return;
- // Some share panels (e.g. twitter and facebook) check content.opener, and if
- // it doesn't exist they act like they are in a browser tab. We want them to
- // act like they are in a dialog (which is the typical case).
- if (content && !content.opener) {
- content.opener = content;
- }
- hookWindowClose();
- disableDialogs();
-});
-
-addMessageListener("Social:OpenGraphData", (message) => {
- let ev = new content.CustomEvent("OpenGraphData", { detail: JSON.stringify(message.data) });
- content.dispatchEvent(ev);
-});
-
-addMessageListener("Social:ClearFrame", () => {
- docShell.createAboutBlankContentViewer(null);
-});
-
-addEventListener("DOMWindowClose", (evt) => {
- // preventDefault stops the default window.close() function being called,
- // which doesn't actually close anything but causes things to get into
- // a bad state (an internal 'closed' flag is set and debug builds start
- // asserting as the window is used.).
- // None of the windows we inject this API into are suitable for this
- // default close behaviour, so even if we took no action above, we avoid
- // the default close from doing anything.
- evt.preventDefault();
-
- // Tells the SocialShare class to close the panel
- sendAsyncMessage("Social:DOMWindowClose");
-});
-
-function hookWindowClose() {
- // Allow scripts to close the "window". Because we are in a panel and not
- // in a full dialog, the DOMWindowClose listener above will only receive the
- // event if we do this.
- let dwu = content.QueryInterface(Ci.nsIInterfaceRequestor)
- .getInterface(Ci.nsIDOMWindowUtils);
- dwu.allowScriptsToClose();
-}
-
-function disableDialogs() {
- let windowUtils = content.QueryInterface(Ci.nsIInterfaceRequestor).
- getInterface(Ci.nsIDOMWindowUtils);
- windowUtils.disableDialogs();
-}
-
-// Error handling class used to listen for network errors in the social frames
-// and replace them with a social-specific error page
-const SocialErrorListener = {
- QueryInterface: XPCOMUtils.generateQI([Ci.nsIDOMEventListener,
- Ci.nsIWebProgressListener,
- Ci.nsISupportsWeakReference,
- Ci.nsISupports]),
-
- defaultTemplate: "about:socialerror?mode=tryAgainOnly&url=%{url}&origin=%{origin}",
- urlTemplate: null,
-
- init() {
- addMessageListener("Social:SetErrorURL", this);
- let webProgress = docShell.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
- .getInterface(Components.interfaces.nsIWebProgress);
- webProgress.addProgressListener(this, Ci.nsIWebProgress.NOTIFY_STATE_REQUEST |
- Ci.nsIWebProgress.NOTIFY_LOCATION);
- },
-
- receiveMessage(message) {
- switch (message.name) {
- case "Social:SetErrorURL":
- // Either a url or null to reset to default template.
- this.urlTemplate = message.data.template;
- break;
- }
- },
-
- setErrorPage() {
- // if this is about:providerdirectory, use the directory iframe
- let frame = docShell.chromeEventHandler;
- let origin = frame.getAttribute("origin");
- let src = frame.getAttribute("src");
- if (src == "about:providerdirectory") {
- frame = content.document.getElementById("activation-frame");
- src = frame.getAttribute("src");
- }
-
- let url = this.urlTemplate || this.defaultTemplate;
- url = url.replace("%{url}", encodeURIComponent(src));
- url = url.replace("%{origin}", encodeURIComponent(origin));
- if (frame != docShell.chromeEventHandler) {
- // Unable to access frame.docShell here. This is our own frame and doesn't
- // provide reload, so we'll just set the src.
- frame.setAttribute("src", url);
- } else {
- let webNav = docShell.QueryInterface(Ci.nsIWebNavigation);
- webNav.loadURI(url, null, null, null, null);
- }
- sendAsyncMessage("Social:ErrorPageNotify", {
- origin: origin,
- url: src
- });
- },
-
- onStateChange(aWebProgress, aRequest, aState, aStatus) {
- let failure = false;
- if ((aState & Ci.nsIWebProgressListener.STATE_IS_REQUEST))
- return;
- if ((aState & Ci.nsIWebProgressListener.STATE_STOP)) {
- if (aRequest instanceof Ci.nsIHttpChannel) {
- try {
- // Change the frame to an error page on 4xx (client errors)
- // and 5xx (server errors). responseStatus throws if it is not set.
- failure = aRequest.responseStatus >= 400 &&
- aRequest.responseStatus < 600;
- } catch (e) {
- failure = aStatus != Components.results.NS_OK;
- }
- }
- }
-
- // Calling cancel() will raise some OnStateChange notifications by itself,
- // so avoid doing that more than once
- if (failure && aStatus != Components.results.NS_BINDING_ABORTED) {
- // if tp is enabled and we get a failure, ignore failures (ie. STATE_STOP)
- // on child resources since they *may* have been blocked. We don't have an
- // easy way to know if a particular url is blocked by TP, only that
- // something was.
- if (docShell.hasTrackingContentBlocked) {
- let frame = docShell.chromeEventHandler;
- let src = frame.getAttribute("src");
- if (aRequest && aRequest.name != src) {
- Cu.reportError("SocialErrorListener ignoring blocked content error for " + aRequest.name);
- return;
- }
- }
-
- aRequest.cancel(Components.results.NS_BINDING_ABORTED);
- this.setErrorPage();
- }
- },
-
- onLocationChange(aWebProgress, aRequest, aLocation, aFlags) {
- if (aRequest && aFlags & Ci.nsIWebProgressListener.LOCATION_CHANGE_ERROR_PAGE) {
- aRequest.cancel(Components.results.NS_BINDING_ABORTED);
- this.setErrorPage();
- }
- },
-
- onProgressChange() {},
- onStatusChange() {},
- onSecurityChange() {},
-};
-
-SocialErrorListener.init();
diff --git a/browser/base/content/web-panels.xul b/browser/base/content/web-panels.xul
index 4693d878b..223b20ed7 100644
--- a/browser/base/content/web-panels.xul
+++ b/browser/base/content/web-panels.xul
@@ -23,7 +23,6 @@
<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/browser-social.js"/>
<script type="application/javascript" src="chrome://browser/content/browser-fxaccounts.js"/>
<script type="application/javascript" src="chrome://browser/content/nsContextMenu.js"/>
<script type="application/javascript" src="chrome://browser/content/web-panels.js"/>