summaryrefslogtreecommitdiffstats
path: root/toolkit/modules/PrivateBrowsingUtils.jsm
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/modules/PrivateBrowsingUtils.jsm')
-rw-r--r--toolkit/modules/PrivateBrowsingUtils.jsm103
1 files changed, 103 insertions, 0 deletions
diff --git a/toolkit/modules/PrivateBrowsingUtils.jsm b/toolkit/modules/PrivateBrowsingUtils.jsm
new file mode 100644
index 000000000..6a84eef93
--- /dev/null
+++ b/toolkit/modules/PrivateBrowsingUtils.jsm
@@ -0,0 +1,103 @@
+/* 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.EXPORTED_SYMBOLS = ["PrivateBrowsingUtils"];
+
+Components.utils.import("resource://gre/modules/Services.jsm");
+
+const kAutoStartPref = "browser.privatebrowsing.autostart";
+
+// This will be set to true when the PB mode is autostarted from the command
+// line for the current session.
+var gTemporaryAutoStartMode = false;
+
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+
+this.PrivateBrowsingUtils = {
+ // Rather than passing content windows to this function, please use
+ // isBrowserPrivate since it works with e10s.
+ isWindowPrivate: function pbu_isWindowPrivate(aWindow) {
+ if (!(aWindow instanceof Components.interfaces.nsIDOMChromeWindow)) {
+ dump("WARNING: content window passed to PrivateBrowsingUtils.isWindowPrivate. " +
+ "Use isContentWindowPrivate instead (but only for frame scripts).\n"
+ + new Error().stack);
+ }
+
+ return this.privacyContextFromWindow(aWindow).usePrivateBrowsing;
+ },
+
+ // This should be used only in frame scripts.
+ isContentWindowPrivate: function pbu_isWindowPrivate(aWindow) {
+ return this.privacyContextFromWindow(aWindow).usePrivateBrowsing;
+ },
+
+ isBrowserPrivate: function(aBrowser) {
+ let chromeWin = aBrowser.ownerDocument.defaultView;
+ if (chromeWin.gMultiProcessBrowser) {
+ // In e10s we have to look at the chrome window's private
+ // browsing status since the only alternative is to check the
+ // content window, which is in another process.
+ return this.isWindowPrivate(chromeWin);
+ }
+ return this.privacyContextFromWindow(aBrowser.contentWindow).usePrivateBrowsing;
+ },
+
+ privacyContextFromWindow: function pbu_privacyContextFromWindow(aWindow) {
+ return aWindow.QueryInterface(Ci.nsIInterfaceRequestor)
+ .getInterface(Ci.nsIWebNavigation)
+ .QueryInterface(Ci.nsILoadContext);
+ },
+
+ addToTrackingAllowlist(aURI) {
+ let pbmtpWhitelist = Cc["@mozilla.org/pbm-tp-whitelist;1"]
+ .getService(Ci.nsIPrivateBrowsingTrackingProtectionWhitelist);
+ pbmtpWhitelist.addToAllowList(aURI);
+ },
+
+ removeFromTrackingAllowlist(aURI) {
+ let pbmtpWhitelist = Cc["@mozilla.org/pbm-tp-whitelist;1"]
+ .getService(Ci.nsIPrivateBrowsingTrackingProtectionWhitelist);
+ pbmtpWhitelist.removeFromAllowList(aURI);
+ },
+
+ get permanentPrivateBrowsing() {
+ try {
+ return gTemporaryAutoStartMode ||
+ Services.prefs.getBoolPref(kAutoStartPref);
+ } catch (e) {
+ // The pref does not exist
+ return false;
+ }
+ },
+
+ // These should only be used from internal code
+ enterTemporaryAutoStartMode: function pbu_enterTemporaryAutoStartMode() {
+ gTemporaryAutoStartMode = true;
+ },
+ get isInTemporaryAutoStartMode() {
+ return gTemporaryAutoStartMode;
+ },
+
+ whenHiddenPrivateWindowReady: function pbu_whenHiddenPrivateWindowReady(cb) {
+ Components.utils.import("resource://gre/modules/Timer.jsm");
+
+ let win = Services.appShell.hiddenPrivateDOMWindow;
+ function isNotLoaded() {
+ return ["complete", "interactive"].indexOf(win.document.readyState) == -1;
+ }
+ if (isNotLoaded()) {
+ setTimeout(function poll() {
+ if (isNotLoaded()) {
+ setTimeout(poll, 100);
+ return;
+ }
+ cb(Services.appShell.hiddenPrivateDOMWindow);
+ }, 4);
+ } else {
+ cb(Services.appShell.hiddenPrivateDOMWindow);
+ }
+ }
+};
+