summaryrefslogtreecommitdiffstats
path: root/browser/base/content/social-content.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/base/content/social-content.js')
-rw-r--r--browser/base/content/social-content.js172
1 files changed, 0 insertions, 172 deletions
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();