gecko-dev/mobile/android/modules/PageActions.jsm
Jim Chen f6a51590a8 Bug 1333588 - Convert PageActions events to bundle events; r=sebastian
Convert events used in PageActions to bundle events. UI thread events
are used because the listeners require the UI thread. The observer
notifications from Java to Gecko are converted to events as well.
2017-01-25 18:57:31 -05:00

118 lines
3.1 KiB
JavaScript

/* 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)).spec;
} else if (aURI.startsWith("resource://")) {
let handler = Services.io.getProtocolHandler("resource").QueryInterface(Ci.nsIResProtocolHandler);
return handler.resolveURI(Services.io.newURI(aURI));
}
return aURI;
}
var PageActions = {
_items: { },
_inited: false,
_maybeInit: function() {
if (!this._inited && Object.keys(this._items).length > 0) {
this._inited = true;
EventDispatcher.instance.registerListener(this, [
"PageActions:Clicked",
"PageActions:LongClicked",
]);
}
},
_maybeUninit: function() {
if (this._inited && Object.keys(this._items).length == 0) {
this._inited = false;
EventDispatcher.instance.unregisterListener(this, [
"PageActions:Clicked",
"PageActions:LongClicked",
]);
}
},
onEvent: function(event, data, callback) {
let item = this._items[data.id];
if (event == "PageActions:Clicked") {
if (item.clickCallback) {
item.clickCallback();
}
} else if (event == "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()
EventDispatcher.instance.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) {
EventDispatcher.instance.sendRequest({
type: "PageActions:Remove",
id: id
});
delete this._items[id];
this._maybeUninit();
}
}