diff options
Diffstat (limited to 'modules/openLocationLastURL.jsm')
-rw-r--r-- | modules/openLocationLastURL.jsm | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/modules/openLocationLastURL.jsm b/modules/openLocationLastURL.jsm new file mode 100644 index 0000000..3f58db8 --- /dev/null +++ b/modules/openLocationLastURL.jsm @@ -0,0 +1,85 @@ +/* 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/. */ + +const LAST_URL_PREF = "general.open_location.last_url"; +const nsISupportsString = Components.interfaces.nsISupportsString; +const Ci = Components.interfaces; + +Components.utils.import("resource://gre/modules/PrivateBrowsingUtils.jsm"); + +this.EXPORTED_SYMBOLS = [ "OpenLocationLastURL" ]; + +var prefSvc = Components.classes["@mozilla.org/preferences-service;1"] + .getService(Components.interfaces.nsIPrefBranch); +var gOpenLocationLastURLData = ""; + +var observer = { + QueryInterface: function (aIID) { + if (aIID.equals(Components.interfaces.nsIObserver) || + aIID.equals(Components.interfaces.nsISupports) || + aIID.equals(Components.interfaces.nsISupportsWeakReference)) + return this; + throw Components.results.NS_NOINTERFACE; + }, + observe: function (aSubject, aTopic, aData) { + switch (aTopic) { + case "last-pb-context-exited": + gOpenLocationLastURLData = ""; + break; + case "browser:purge-session-history": + prefSvc.clearUserPref(LAST_URL_PREF); + gOpenLocationLastURLData = ""; + break; + } + } +}; + +var os = Components.classes["@mozilla.org/observer-service;1"] + .getService(Components.interfaces.nsIObserverService); +os.addObserver(observer, "last-pb-context-exited", true); +os.addObserver(observer, "browser:purge-session-history", true); + + +this.OpenLocationLastURL = function OpenLocationLastURL(aWindow) { + this.window = aWindow; +} + +OpenLocationLastURL.prototype = { + isPrivate: function OpenLocationLastURL_isPrivate() { + // Assume not in private browsing mode, unless the browser window is + // in private mode. + if (!this.window) + return false; + + return PrivateBrowsingUtils.isWindowPrivate(this.window); + }, + get value() { + if (this.isPrivate()) + return gOpenLocationLastURLData; + else { + try { + return prefSvc.getComplexValue(LAST_URL_PREF, nsISupportsString).data; + } + catch (e) { + return ""; + } + } + }, + set value(val) { + if (typeof val != "string") + val = ""; + if (this.isPrivate()) + gOpenLocationLastURLData = val; + else { + let str = Components.classes["@mozilla.org/supports-string;1"] + .createInstance(Components.interfaces.nsISupportsString); + str.data = val; + prefSvc.setComplexValue(LAST_URL_PREF, nsISupportsString, str); + } + }, + reset: function() { + prefSvc.clearUserPref(LAST_URL_PREF); + gOpenLocationLastURLData = ""; + } +}; |