summaryrefslogtreecommitdiffstats
path: root/mobile/android/modules/PageActions.jsm
diff options
context:
space:
mode:
authorMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
committerMatt A. Tobin <mattatobin@localhost.localdomain>2018-02-02 04:16:08 -0500
commit5f8de423f190bbb79a62f804151bc24824fa32d8 (patch)
tree10027f336435511475e392454359edea8e25895d /mobile/android/modules/PageActions.jsm
parent49ee0794b5d912db1f95dce6eb52d781dc210db5 (diff)
downloadUXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.gz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.lz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.tar.xz
UXP-5f8de423f190bbb79a62f804151bc24824fa32d8.zip
Add m-esr52 at 52.6.0
Diffstat (limited to 'mobile/android/modules/PageActions.jsm')
-rw-r--r--mobile/android/modules/PageActions.jsm113
1 files changed, 113 insertions, 0 deletions
diff --git a/mobile/android/modules/PageActions.jsm b/mobile/android/modules/PageActions.jsm
new file mode 100644
index 000000000..a66268f82
--- /dev/null
+++ b/mobile/android/modules/PageActions.jsm
@@ -0,0 +1,113 @@
+/* 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/XPCOMUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/Messaging.jsm");
+
+XPCOMUtils.defineLazyServiceGetter(this, "uuidgen",
+ "@mozilla.org/uuid-generator;1",
+ "nsIUUIDGenerator");
+
+this.EXPORTED_SYMBOLS = ["PageActions"];
+
+// Copied from browser.js
+// TODO: We should move this method to a common importable location
+function resolveGeckoURI(aURI) {
+ if (!aURI)
+ throw "Can't resolve an empty uri";
+
+ if (aURI.startsWith("chrome://")) {
+ let registry = Cc['@mozilla.org/chrome/chrome-registry;1'].getService(Ci["nsIChromeRegistry"]);
+ return registry.convertChromeURL(Services.io.newURI(aURI, null, null)).spec;
+ } else if (aURI.startsWith("resource://")) {
+ let handler = Services.io.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler);
+ return handler.resolveURI(Services.io.newURI(aURI, null, null));
+ }
+ return aURI;
+}
+
+var PageActions = {
+ _items: { },
+
+ _inited: false,
+
+ _maybeInit: function() {
+ if (!this._inited && Object.keys(this._items).length > 0) {
+ this._inited = true;
+ Services.obs.addObserver(this, "PageActions:Clicked", false);
+ Services.obs.addObserver(this, "PageActions:LongClicked", false);
+ }
+ },
+
+ _maybeUninit: function() {
+ if (this._inited && Object.keys(this._items).length == 0) {
+ this._inited = false;
+ Services.obs.removeObserver(this, "PageActions:Clicked");
+ Services.obs.removeObserver(this, "PageActions:LongClicked");
+ }
+ },
+
+ observe: function(aSubject, aTopic, aData) {
+ let item = this._items[aData];
+ if (aTopic == "PageActions:Clicked") {
+ if (item.clickCallback) {
+ item.clickCallback();
+ }
+ } else if (aTopic == "PageActions:LongClicked") {
+ if (item.longClickCallback) {
+ item.longClickCallback();
+ }
+ }
+ },
+
+ isShown: function(id) {
+ return !!this._items[id];
+ },
+
+ synthesizeClick: function(id) {
+ let item = this._items[id];
+ if (item && item.clickCallback) {
+ item.clickCallback();
+ }
+ },
+
+ add: function(aOptions) {
+ let id = aOptions.id || uuidgen.generateUUID().toString()
+
+ Messaging.sendRequest({
+ type: "PageActions:Add",
+ id: id,
+ title: aOptions.title,
+ icon: resolveGeckoURI(aOptions.icon),
+ important: "important" in aOptions ? aOptions.important : false
+ });
+
+ this._items[id] = {};
+
+ if (aOptions.clickCallback) {
+ this._items[id].clickCallback = aOptions.clickCallback;
+ }
+
+ if (aOptions.longClickCallback) {
+ this._items[id].longClickCallback = aOptions.longClickCallback;
+ }
+
+ this._maybeInit();
+ return id;
+ },
+
+ remove: function(id) {
+ Messaging.sendRequest({
+ type: "PageActions:Remove",
+ id: id
+ });
+
+ delete this._items[id];
+ this._maybeUninit();
+ }
+}