1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
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();
}
}
|