diff options
Diffstat (limited to 'mobile/android/extensions/flyweb/bootstrap.js')
-rw-r--r-- | mobile/android/extensions/flyweb/bootstrap.js | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/mobile/android/extensions/flyweb/bootstrap.js b/mobile/android/extensions/flyweb/bootstrap.js new file mode 100644 index 000000000..017cb4763 --- /dev/null +++ b/mobile/android/extensions/flyweb/bootstrap.js @@ -0,0 +1,154 @@ +/* -*- 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/. */ + +const {classes: Cc, interfaces: Ci, manager: Cm, results: Cr, utils: Cu, Constructor: CC} = Components; + +Cm.QueryInterface(Ci.nsIComponentRegistrar); + +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); + +XPCOMUtils.defineLazyModuleGetter(this, "Console", + "resource://gre/modules/Console.jsm"); +XPCOMUtils.defineLazyModuleGetter(this, "Services", + "resource://gre/modules/Services.jsm"); + +XPCOMUtils.defineLazyGetter(this, "gFlyWebBundle", function() { + return Services.strings.createBundle("chrome://flyweb/locale/flyweb.properties"); +}); + +const FLYWEB_ENABLED_PREF = "dom.flyweb.enabled"; + +let factory, menuID; + +function AboutFlyWeb() {} + +AboutFlyWeb.prototype = Object.freeze({ + classDescription: "About page for displaying nearby FlyWeb services", + contractID: "@mozilla.org/network/protocol/about;1?what=flyweb", + classID: Components.ID("{baa04ff0-08b5-11e6-a837-0800200c9a66}"), + QueryInterface: XPCOMUtils.generateQI([Ci.nsIAboutModule]), + + getURIFlags: function(aURI) { + return Ci.nsIAboutModule.ALLOW_SCRIPT; + }, + + newChannel: function(aURI, aLoadInfo) { + let uri = Services.io.newURI("chrome://flyweb/content/aboutFlyWeb.xhtml", null, null); + let channel = Services.io.newChannelFromURIWithLoadInfo(uri, aLoadInfo); + channel.originalURI = aURI; + return channel; + } +}); + +function Factory(component) { + this.createInstance = function(outer, iid) { + if (outer) { + throw Cr.NS_ERROR_NO_AGGREGATION; + } + return new component(); + }; + this.register = function() { + Cm.registerFactory(component.prototype.classID, component.prototype.classDescription, component.prototype.contractID, this); + }; + this.unregister = function() { + Cm.unregisterFactory(component.prototype.classID, this); + } + Object.freeze(this); + this.register(); +} + +let windowListener = { + onOpenWindow: function(aWindow) { + // Wait for the window to finish loading + let domWindow = aWindow.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowInternal || Ci.nsIDOMWindow); + domWindow.addEventListener("UIReady", function onLoad() { + domWindow.removeEventListener("UIReady", onLoad, false); + loadIntoWindow(domWindow); + }, false); + }, + + onCloseWindow: function(aWindow) {}, + onWindowTitleChange: function(aWindow, aTitle) {} +}; + +let FlyWebUI = { + init() { + factory = new Factory(AboutFlyWeb); + + // Load into any existing windows + let windows = Services.wm.getEnumerator("navigator:browser"); + while (windows.hasMoreElements()) { + let domWindow = windows.getNext().QueryInterface(Ci.nsIDOMWindow); + loadIntoWindow(domWindow); + } + + // Load into any new windows + Services.wm.addListener(windowListener); + }, + + uninit() { + factory.unregister(); + + // Stop listening for new windows + Services.wm.removeListener(windowListener); + + // Unload from any existing windows + let windows = Services.wm.getEnumerator("navigator:browser"); + while (windows.hasMoreElements()) { + let domWindow = windows.getNext().QueryInterface(Ci.nsIDOMWindow); + unloadFromWindow(domWindow); + } + } +}; + +function loadIntoWindow(aWindow) { + menuID = aWindow.NativeWindow.menu.add({ + name: gFlyWebBundle.GetStringFromName("flyweb-menu.name"), + callback() { + aWindow.BrowserApp.addTab("about:flyweb"); + } + }); +} + +function unloadFromWindow(aWindow) { + if (!aWindow) { + return; + } + + aWindow.NativeWindow.menu.remove(menuID); +} + +function prefObserver(aSubject, aTopic, aData) { + let enabled = Services.prefs.getBoolPref(FLYWEB_ENABLED_PREF); + if (enabled) { + FlyWebUI.init(); + } else { + FlyWebUI.uninit(); + } +} + +function install(aData, aReason) {} + +function uninstall(aData, aReason) {} + +function startup(aData, aReason) { + // Observe pref changes and enable/disable as necessary. + Services.prefs.addObserver(FLYWEB_ENABLED_PREF, prefObserver, false); + + // Only initialize if pref is enabled. + let enabled = Services.prefs.getBoolPref(FLYWEB_ENABLED_PREF); + if (enabled) { + FlyWebUI.init(); + } +} + +function shutdown(aData, aReason) { + Services.prefs.removeObserver(FLYWEB_ENABLED_PREF, prefObserver); + + let enabled = Services.prefs.getBoolPref(FLYWEB_ENABLED_PREF); + if (enabled) { + FlyWebUI.uninit(); + } +} |