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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }