Mercurial > powerbox
annotate extension/modules/content-injector.js @ 3:413435fc6202
We now show a notification box when a page calls window.powerbox.request().
author | Atul Varma <varmaa@toolness.com> |
---|---|
date | Thu, 06 Aug 2009 15:50:24 -0700 |
parents | 889c2fd4c9cf |
children | 1c02976d8809 |
rev | line source |
---|---|
2
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
1 var EXPORTED_SYMBOLS = ["init"]; |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
2 |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
3 const Cc = Components.classes; |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
4 const Ci = Components.interfaces; |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
5 const Cu = Components.utils; |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
6 |
3
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
7 const REQUEST_BOX_NAME = "powerbox_superpower_request"; |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
8 const REQUEST_BOX_TEXT = "This web page wants superpowers."; |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
9 const REQUEST_BOX_BUTTON_TEXT = "Huh?"; |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
10 |
2
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
11 Components.utils.import("resource://gre/modules/XPCOMUtils.jsm"); |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
12 |
3
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
13 function getParentChromeWindow(window) { |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
14 var mainWindow = window.QueryInterface(Ci.nsIInterfaceRequestor) |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
15 .getInterface(Ci.nsIWebNavigation) |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
16 .QueryInterface(Ci.nsIDocShellTreeItem) |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
17 .rootTreeItem |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
18 .QueryInterface(Ci.nsIInterfaceRequestor) |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
19 .getInterface(Ci.nsIDOMWindow); |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
20 return mainWindow.wrappedJSObject; |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
21 } |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
22 |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
23 function showRequestNotificationBox(window, caps, callback) { |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
24 var tabbrowser = getParentChromeWindow(window).getBrowser(); |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
25 var browser = tabbrowser.getBrowserForDocument(window.document); |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
26 |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
27 if (browser) { |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
28 var nBox = tabbrowser.getNotificationBox(browser); |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
29 |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
30 var oldNotification = nBox.getNotificationWithValue(REQUEST_BOX_NAME); |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
31 if (oldNotification) |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
32 nBox.removeNotification(oldNotification); |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
33 |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
34 nBox.appendNotification(REQUEST_BOX_TEXT, |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
35 REQUEST_BOX_NAME, |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
36 null, |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
37 nBox.PRIORITY_INFO_MEDIUM, |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
38 [{accessKey: null, |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
39 // TODO: Implement a real callback. |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
40 callback: function() {}, |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
41 label: REQUEST_BOX_BUTTON_TEXT, |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
42 popup: null}]); |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
43 } |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
44 } |
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
45 |
2
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
46 function buildRequestor(window) { |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
47 return function request(caps, callback) { |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
48 if (!(typeof(caps) == "object" || |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
49 typeof(caps) == "string")) |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
50 throw new Error("Must provide capabilities as first parameter."); |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
51 |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
52 if (typeof(callback) != "function") |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
53 throw new Error("Must provide callback as second parameter"); |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
54 |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
55 if (typeof(caps) == "object") |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
56 caps = new XPCSafeJSObjectWrapper(caps); |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
57 callback = new XPCSafeJSObjectWrapper(callback); |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
58 |
3
413435fc6202
We now show a notification box when a page calls window.powerbox.request().
Atul Varma <varmaa@toolness.com>
parents:
2
diff
changeset
|
59 showRequestNotificationBox(window, caps, callback); |
2
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
60 }; |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
61 } |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
62 |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
63 var listener = { |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
64 QueryInterface : XPCOMUtils.generateQI([Ci.nsIWebProgressListener, |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
65 Ci.nsISupportsWeakReference]), |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
66 |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
67 onStateChange : function (aWebProgress, aRequest, |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
68 aStateFlags, aStatus) { |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
69 // STATE_START is too early, doc is still the old page. |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
70 // STATE_STOP is inconviently late (it's onload) |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
71 if (!(aStateFlags & Ci.nsIWebProgressListener.STATE_TRANSFERRING)) |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
72 return; |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
73 |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
74 var window = aWebProgress.DOMWindow; |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
75 |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
76 if (window.wrappedJSObject) { |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
77 var sandbox = Cu.Sandbox(window); |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
78 sandbox.importFunction(buildRequestor(window)); |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
79 sandbox.window = window.wrappedJSObject; |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
80 |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
81 function setupPowerbox() { |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
82 window.powerbox = {request: request}; |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
83 } |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
84 |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
85 Cu.evalInSandbox("(" + setupPowerbox.toString() + ")();", sandbox); |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
86 } |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
87 }, |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
88 |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
89 // stubs for the nsIWebProgressListener interfaces which we don't use. |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
90 onProgressChange : function() { }, |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
91 onLocationChange : function() { }, |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
92 onStatusChange : function() { }, |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
93 onSecurityChange : function() { } |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
94 }; |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
95 |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
96 function init() { |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
97 // WebProgressListener for getting notification of new doc loads. |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
98 // XXX Ugh. Since we're a chrome overlay, it would be nice to just |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
99 // use gBrowser.addProgressListener(). But that isn't sending |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
100 // STATE_TRANSFERRING, and the earliest we can get at the page is |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
101 // STATE_STOP (which is onload, and is inconviently late). |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
102 // We'll use the docloader service instead, but that means we need to |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
103 // filter out loads for other windows. |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
104 var docsvc = Cc["@mozilla.org/docloaderservice;1"]. |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
105 getService(Ci.nsIWebProgress); |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
106 |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
107 docsvc.addProgressListener(listener, |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
108 Ci.nsIWebProgress.NOTIFY_STATE_DOCUMENT); |
889c2fd4c9cf
window.powerbox.request() is now available on every content window.
Atul Varma <varmaa@toolness.com>
parents:
diff
changeset
|
109 } |