diff options
Diffstat (limited to 'mobile/android/extensions')
-rw-r--r-- | mobile/android/extensions/flyweb/bootstrap.js | 154 | ||||
-rw-r--r-- | mobile/android/extensions/flyweb/content/aboutFlyWeb.css | 29 | ||||
-rw-r--r-- | mobile/android/extensions/flyweb/content/aboutFlyWeb.js | 73 | ||||
-rw-r--r-- | mobile/android/extensions/flyweb/content/aboutFlyWeb.xhtml | 47 | ||||
-rw-r--r-- | mobile/android/extensions/flyweb/content/icon-64.png | bin | 0 -> 1311 bytes | |||
-rw-r--r-- | mobile/android/extensions/flyweb/install.rdf.in | 31 | ||||
-rw-r--r-- | mobile/android/extensions/flyweb/jar.mn | 10 | ||||
-rw-r--r-- | mobile/android/extensions/flyweb/locale/en-US/aboutFlyWeb.dtd | 7 | ||||
-rw-r--r-- | mobile/android/extensions/flyweb/locale/en-US/flyweb.properties | 5 | ||||
-rw-r--r-- | mobile/android/extensions/flyweb/moz.build | 15 | ||||
-rw-r--r-- | mobile/android/extensions/moz.build | 11 |
11 files changed, 382 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(); + } +} diff --git a/mobile/android/extensions/flyweb/content/aboutFlyWeb.css b/mobile/android/extensions/flyweb/content/aboutFlyWeb.css new file mode 100644 index 000000000..0c751b53f --- /dev/null +++ b/mobile/android/extensions/flyweb/content/aboutFlyWeb.css @@ -0,0 +1,29 @@ +/* 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/. */ + +include "defines.css" + +.list-item > a { + color: inherit; + text-decoration: none; +} + +.details { + -moz-margin-start: calc(var(--icon-size) + var(--icon-margin) * 2 - 1em); + padding: 1em; +} + +#flyweb-item-template { + display: none; +} + +#flyweb-list-empty { + display: none; +} + +#flyweb-list:empty + #flyweb-list-empty { + display: block; + text-align: center; + padding-top: 3.9em; +} diff --git a/mobile/android/extensions/flyweb/content/aboutFlyWeb.js b/mobile/android/extensions/flyweb/content/aboutFlyWeb.js new file mode 100644 index 000000000..48b7ea4b7 --- /dev/null +++ b/mobile/android/extensions/flyweb/content/aboutFlyWeb.js @@ -0,0 +1,73 @@ +/* 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 {classes: Cc, interfaces: Ci, utils: Cu} = Components; + +Cu.import("resource://gre/modules/Console.jsm"); +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); + +XPCOMUtils.defineLazyModuleGetter(this, "Services", "resource://gre/modules/Services.jsm"); + +XPCOMUtils.defineLazyGetter(this, "gFlyWebBundle", function() { + return Services.strings.createBundle("chrome://flyweb/locale/flyweb.properties"); +}); + +let discoveryManager = new FlyWebDiscoveryManager(); + +let discoveryCallback = { + onDiscoveredServicesChanged(services) { + if (!this.id) { + return; + } + + let list = document.getElementById("flyweb-list"); + while (list.firstChild) { + list.firstChild.remove(); + } + + let template = document.getElementById("flyweb-item-template"); + + for (let service of services) { + let item = template.cloneNode(true); + item.removeAttribute("id"); + + item.setAttribute("data-service-id", service.serviceId); + item.querySelector(".title").setAttribute("value", service.displayName); + item.querySelector(".icon").src = "chrome://flyweb/content/icon-64.png"; + + list.appendChild(item); + } + }, + start() { + this.id = discoveryManager.startDiscovery(this); + }, + stop() { + discoveryManager.stopDiscovery(this.id); + this.id = undefined; + } +}; + +window.addEventListener("DOMContentLoaded", () => { + let list = document.getElementById("flyweb-list"); + list.addEventListener("click", (evt) => { + let serviceId = evt.target.closest("[data-service-id]").getAttribute("data-service-id"); + + discoveryManager.pairWithService(serviceId, { + pairingSucceeded(service) { + window.open(service.uiUrl, "FlyWebWindow_" + serviceId); + }, + + pairingFailed(error) { + console.error("FlyWeb failed to connect to service " + serviceId, error); + } + }); + }); + + discoveryCallback.start(); +}); + +window.addEventListener("unload", () => { + discoveryCallback.stop(); +}); diff --git a/mobile/android/extensions/flyweb/content/aboutFlyWeb.xhtml b/mobile/android/extensions/flyweb/content/aboutFlyWeb.xhtml new file mode 100644 index 000000000..85e92ddf8 --- /dev/null +++ b/mobile/android/extensions/flyweb/content/aboutFlyWeb.xhtml @@ -0,0 +1,47 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" + "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" [ +<!ENTITY % brandDTD SYSTEM "chrome://branding/locale/brand.dtd" > +%brandDTD; +<!ENTITY % globalDTD SYSTEM "chrome://global/locale/global.dtd" > +%globalDTD; +<!ENTITY % flywebDTD SYSTEM "chrome://flyweb/locale/aboutFlyWeb.dtd" > +%flywebDTD; +]> + +<!-- 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/. --> + +<html xmlns="http://www.w3.org/1999/xhtml" + xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"> +<head> + <title>&aboutFlyWeb.title;</title> + <meta name="viewport" content="width=device-width; user-scalable=0" /> + <link rel="icon" type="image/png" sizes="64x64" href="chrome://branding/content/favicon64.png" /> + <link rel="stylesheet" href="chrome://browser/skin/aboutBase.css" type="text/css"/> + <link rel="stylesheet" href="chrome://flyweb/content/aboutFlyWeb.css" type="text/css"/> +</head> + +<body dir="&locale.dir;"> + <!--template id="flyweb-item-template"--> + <li id="flyweb-item-template" class="list-item" role="button"> + <img class="icon" src=""/> + <div class="details"> + <div class="row"> + <!-- This is a hack so that we can crop this label in its center --> + <xul:label class="title" crop="center" value=""/> + </div> + </div> + </li> + <!--/template--> + + <div class="header"> + <div>&aboutFlyWeb.header;</div> + </div> + <ul id="flyweb-list" class="list"></ul> + <span id="flyweb-list-empty">&aboutFlyWeb.empty;</span> + <script type="application/javascript;version=1.8" src="chrome://flyweb/content/aboutFlyWeb.js"/> +</body> +</html> diff --git a/mobile/android/extensions/flyweb/content/icon-64.png b/mobile/android/extensions/flyweb/content/icon-64.png Binary files differnew file mode 100644 index 000000000..be8ece467 --- /dev/null +++ b/mobile/android/extensions/flyweb/content/icon-64.png diff --git a/mobile/android/extensions/flyweb/install.rdf.in b/mobile/android/extensions/flyweb/install.rdf.in new file mode 100644 index 000000000..76430412c --- /dev/null +++ b/mobile/android/extensions/flyweb/install.rdf.in @@ -0,0 +1,31 @@ +<?xml version="1.0"?> +<!-- 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/. --> + +#filter substitution + +<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:em="http://www.mozilla.org/2004/em-rdf#"> + + <Description about="urn:mozilla:install-manifest"> + <em:id>flyweb@mozilla.org</em:id> + <em:version>1.0.0</em:version> + <em:type>2</em:type> + <em:bootstrap>true</em:bootstrap> + + <!-- Target Application this theme can install into, + with minimum and maximum supported versions. --> + <em:targetApplication> + <Description> + <em:id>{aa3c5121-dab2-40e2-81ca-7ea25febc110}</em:id> + <em:minVersion>@FIREFOX_VERSION@</em:minVersion> + <em:maxVersion>@FIREFOX_VERSION@</em:maxVersion> + </Description> + </em:targetApplication> + + <!-- Front End MetaData --> + <em:name>FlyWeb</em:name> + <em:description>Discover nearby services in the browser</em:description> + </Description> +</RDF> diff --git a/mobile/android/extensions/flyweb/jar.mn b/mobile/android/extensions/flyweb/jar.mn new file mode 100644 index 000000000..c0aba080b --- /dev/null +++ b/mobile/android/extensions/flyweb/jar.mn @@ -0,0 +1,10 @@ +#filter substitution +# 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/. + +[features/flyweb@mozilla.org] chrome.jar: +% content flyweb %content/ contentaccessible=yes + content/ (content/*) +% locale flyweb en-US %locale/en-US/ + locale/ (locale/*)
\ No newline at end of file diff --git a/mobile/android/extensions/flyweb/locale/en-US/aboutFlyWeb.dtd b/mobile/android/extensions/flyweb/locale/en-US/aboutFlyWeb.dtd new file mode 100644 index 000000000..9366ea19c --- /dev/null +++ b/mobile/android/extensions/flyweb/locale/en-US/aboutFlyWeb.dtd @@ -0,0 +1,7 @@ +<!-- 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/. --> + +<!ENTITY aboutFlyWeb.title "FlyWeb"> +<!ENTITY aboutFlyWeb.header "Nearby FlyWeb Services"> +<!ENTITY aboutFlyWeb.empty "No FlyWeb Services Found"> diff --git a/mobile/android/extensions/flyweb/locale/en-US/flyweb.properties b/mobile/android/extensions/flyweb/locale/en-US/flyweb.properties new file mode 100644 index 000000000..556e646d3 --- /dev/null +++ b/mobile/android/extensions/flyweb/locale/en-US/flyweb.properties @@ -0,0 +1,5 @@ +# 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/. + +flyweb-menu.name = FlyWeb diff --git a/mobile/android/extensions/flyweb/moz.build b/mobile/android/extensions/flyweb/moz.build new file mode 100644 index 000000000..f453297e5 --- /dev/null +++ b/mobile/android/extensions/flyweb/moz.build @@ -0,0 +1,15 @@ +# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- +# vim: set filetype=python: +# 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/. + +FINAL_TARGET_FILES.features['flyweb@mozilla.org'] += [ + 'bootstrap.js' +] + +FINAL_TARGET_PP_FILES.features['flyweb@mozilla.org'] += [ + 'install.rdf.in' +] + +JAR_MANIFESTS += ['jar.mn'] diff --git a/mobile/android/extensions/moz.build b/mobile/android/extensions/moz.build new file mode 100644 index 000000000..24b6ca936 --- /dev/null +++ b/mobile/android/extensions/moz.build @@ -0,0 +1,11 @@ +# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*- +# vim: set filetype=python: +# 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/. + +# Only include the following system add-ons if building Aurora or Nightly +if 'a' in CONFIG['GRE_MILESTONE']: + DIRS += [ + 'flyweb', + ] |