diff options
Diffstat (limited to 'tools/addon-sdk-1.7/packages/addon-kit/lib/private-browsing.js')
-rw-r--r-- | tools/addon-sdk-1.7/packages/addon-kit/lib/private-browsing.js | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/tools/addon-sdk-1.7/packages/addon-kit/lib/private-browsing.js b/tools/addon-sdk-1.7/packages/addon-kit/lib/private-browsing.js new file mode 100644 index 0000000..ff40c98 --- /dev/null +++ b/tools/addon-sdk-1.7/packages/addon-kit/lib/private-browsing.js @@ -0,0 +1,61 @@ +/* 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/. */ + +"use strict"; + +const { Cc, Ci } = require("chrome"); +const { emit, on, once, off } = require("api-utils/event/core"); +const { defer } = require("api-utils/functional"); +const { when: unload } = require("api-utils/unload"); +const observers = require("api-utils/observer-service"); + +// Model holding a state. +const model = { active: false }; + +let deferredEmit = defer(emit); + +let pbService; +// Currently, only Firefox implements the private browsing service. +if (require("api-utils/xul-app").is("Firefox")) { + pbService = Cc["@mozilla.org/privatebrowsing;1"]. + getService(Ci.nsIPrivateBrowsingService); + + // Update model state. + model.active = pbService.privateBrowsingEnabled; + + // set up an observer for private browsing switches. + observers.add('private-browsing-transition-complete', function onChange() { + // Update model state. + model.active = pbService.privateBrowsingEnabled; + // Emit event with in next turn of event loop. + deferredEmit(exports, model.active ? 'start' : 'stop'); + }); +} + +let setMode = defer(function setMode(value) { + // We toggle private browsing mode asynchronously in order to work around + // bug 659629. Since private browsing transitions are asynchronous + // anyway, this doesn't significantly change the behavior of the API. + pbService.privateBrowsingEnabled = !!value +}); + + +// Make sure listeners are cleaned up. +unload(function() off(exports)); + +Object.defineProperty(exports, "isActive", { get: function() model.active }); +exports.activate = function activate() pbService && setMode(true) +exports.deactivate = function deactivate() pbService && setMode(false) +exports.on = on.bind(null, exports); +exports.once = once.bind(null, exports); +exports.removeListener = function removeListener(type, listener) { + // Note: We can't just bind `off` as we do it for other methods cause skipping + // a listener argument will remove all listeners for the given event type + // causing misbehavior. This way we make sure all arguments are passed. + off(exports, type, listener); +}; + +// This is workaround making sure that exports is wrapped before it's +// frozen, which needs to happen in order to workaround Bug 673468. +off(exports, 'workaround-bug-673468'); |