Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: lib/typoAppIntegration.js

Issue 8559070: Integrated URL Fixer into Adblock Plus (Closed)
Patch Set: Created Oct. 12, 2012, 2:18 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « lib/main.js ('k') | lib/typoCollector.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
3 * You can obtain one at http://mozilla.org/MPL/2.0/. */
4
5 let {hook} = require("hooks");
6 let functionHooks = new WeakMap();
7
8 exports.removeFromWindow = function(window)
9 {
10 if (functionHooks.has(window))
11 {
12 let unhook = functionHooks.get(window);
13 unhook();
14 functionHooks.delete(window);
15 }
16 };
17
18 let {application} = require("info");
19 switch (application)
20 {
21 case "firefox":
22 {
23 // Firefox
24 exports.isKnownWindow = function(window) window.document.documentElement.get Attribute("windowtype") == "navigator:browser";
25
26 exports.getURLBar = function(window) "gURLBar" in window ? window.gURLBar : null;
27
28 exports.getBrowser = function(window) "gBrowser" in window ? window.gBrowser : null;
29
30 exports.applyToWindow = function(window, corrector)
31 {
32 let urlbar = exports.getURLBar(window);
33 if (urlbar && urlbar.handleCommand && !functionHooks.has(window))
34 {
35 // Handle new URLs being entered
36 let unhook = hook(urlbar, "handleCommand", function()
37 {
38 let correction = corrector(window, urlbar.value);
39 if (correction)
40 urlbar.value = correction;
41 });
42 functionHooks.set(window, unhook);
43 }
44 };
45
46 exports.openInfobar = function(window, id, message, buttons, persistence)
47 {
48 let browser = exports.getBrowser(window);
49 let infobar = browser.getNotificationBox();
50 let notification = infobar.getNotificationWithValue(id);
51
52 if (notification)
53 {
54 infobar.removeNotification(notification);
55 }
56
57 notification = infobar.appendNotification(
58 message,
59 id,
60 require("info").addonRoot + "icon64.png",
61 infobar.PRIORITY_INFO_HIGH,
62 buttons
63 );
64 notification.persistence = persistence;
65 };
66
67 exports.loadURI = function(window, uri)
68 {
69 exports.getBrowser(window).loadURI(uri);
70 };
71
72 break;
73 }
74 case "seamonkey":
75 {
76 let eventListeners = new WeakMap();
77
78 // SeaMonkey
79 exports.isKnownWindow = function(window) window.document.documentElement.get Attribute("windowtype") == "navigator:browser";
80
81 exports.getURLBar = function(window) "gURLBar" in window ? window.gURLBar : null;
82
83 exports.getBrowser = function(window) "gBrowser" in window ? window.gBrowser : null;
84
85 exports.applyToWindow = function(window, corrector)
86 {
87 let urlbar = exports.getURLBar(window);
88 let goButton = window.document.getElementById("go-button-container");
89
90 if (urlbar && urlbar._fireEvent && !functionHooks.has(window))
91 {
92 function correctURL()
93 {
94 let correction = corrector(window, urlbar.value);
95 if (correction)
96 urlbar.value = correction;
97 }
98
99 let unhook = hook(urlbar, "_fireEvent", function(eventType)
100 {
101 if (eventType == "textentered")
102 {
103 correctURL();
104 }
105 });
106 functionHooks.set(window, unhook);
107
108 if (goButton)
109 {
110 goButton.addEventListener("command", correctURL, true);
111 eventListeners.set(window, {
112 "listener": correctURL,
113 "element": goButton
114 });
115 }
116 }
117 };
118
119 let basicRemove = exports.removeFromWindow;
120 exports.removeFromWindow = function(window)
121 {
122 basicRemove(window);
123
124 if (eventListeners.has(window))
125 {
126 let eventListener = eventListeners.get(window);
127 eventListener.element.removeEventListener("command", eventListener.liste ner, true);
128 eventListeners.delete(window);
129 }
130 };
131
132 exports.openInfobar = function(window, id, message, buttons, persistence)
133 {
134 let browser = exports.getBrowser(window);
135 let infobar = browser.getNotificationBox();
136 let notification = infobar.getNotificationWithValue(id);
137
138 if (notification)
139 {
140 infobar.removeNotification(notification);
141 }
142
143 notification = infobar.appendNotification(
144 message,
145 id,
146 require("info").addonRoot + "icon64.png",
147 infobar.PRIORITY_INFO_HIGH,
148 buttons
149 );
150 notification.persistence = persistence;
151 };
152
153 exports.loadURI = function(window, uri)
154 {
155 exports.getBrowser(window).loadURI(uri);
156 };
157
158 break;
159 }
160 case "fennec":
161 {
162 // XUL Fennec
163 exports.isKnownWindow = function(window) window.document.documentElement.get Attribute("windowtype") == "navigator:browser";
164
165 exports.getURLBar = function(window) null;
166
167 exports.getBrowser = function(window) null;
168
169 exports.applyToWindow = function(window, corrector)
170 {
171 if ("BrowserUI" in window && window.BrowserUI.goToURI && !functionHooks.ha s(window))
172 {
173 // Handle new URLs being entered
174 let unhook = hook(window.BrowserUI, "goToURI", function(url)
175 {
176 url = url || this._edit.value;
177
178 let correction = corrector(window, url);
179 if (correction)
180 url = correction;
181
182 return [url];
183 });
184 functionHooks.set(window, unhook);
185 }
186 };
187
188 exports.openInfobar = function(window, id, message, buttons, persistence)
189 {
190 if ("getNotificationBox" in window)
191 {
192 let infobar = window.getNotificationBox();
193 let notification = infobar.getNotificationWithValue(id);
194
195 if (notification)
196 {
197 infobar.removeNotification(notification);
198 }
199
200 notification = infobar.appendNotification(
201 message,
202 id,
203 require("info").addonRoot + "icon64.png",
204 infobar.PRIORITY_INFO_HIGH,
205 buttons
206 );
207 notification.persistence = persistence;
208 }
209 };
210
211 exports.loadURI = function(window, uri)
212 {
213 if ("BrowserUI" in window && "goToURI" in window.BrowserUI)
214 {
215 window.BrowserUI.goToURI(uri);
216 }
217 };
218
219 break;
220 }
221 case "fennec2":
222 {
223 // Native Fennec
224 exports.isKnownWindow = function(window) window.document.documentElement.get Attribute("windowtype") == "navigator:browser";
225
226 exports.getURLBar = function(window) null;
227
228 exports.getBrowser = function(window) null;
229
230 exports.applyToWindow = function(window, corrector)
231 {
232 if ("BrowserApp" in window && window.BrowserApp.observe && !functionHooks. has(window))
233 {
234 let innerUnhook = null;
235 function cleanup()
236 {
237 if (innerUnhook)
238 innerUnhook();
239
240 innerUnhook = null;
241 }
242
243 let unhook = hook(window.BrowserApp, "observe", function(subject, topic, data)
244 {
245 // Huge hack: we replace addTab/loadURI when the observer is
246 // triggered. This seems to be the only way to know that the calls
247 // originate from user input.
248 let method = null;
249 if (topic == "Tab:Add")
250 method = "addTab";
251 else if (topic == "Tab:Load")
252 method = "loadURI";
253
254 if (method)
255 {
256 innerUnhook = hook(this, method, function()
257 {
258 let params = Array.prototype.slice.apply(arguments);
259 let correction = corrector(window, params[0]);
260 if (correction)
261 params[0] = correction;
262 return params;
263 });
264 }
265 }, cleanup);
266 functionHooks.set(window, unhook);
267 }
268 };
269
270 exports.openInfobar = function(window, id, message, buttons, persistence)
271 {
272 if ("BrowserApp" in window && "selectedTab" in window.BrowserApp)
273 {
274 window.NativeWindow.doorhanger.show(message, id, buttons, window.Browser App.selectedTab.id,
275 {
276 // No navigation is happening after doorhanger is shown
277 // so persistence needs to be reduced by one
278 persistence: persistence - 1
279 }
280 );
281 }
282 };
283
284 exports.loadURI = function(window, uri)
285 {
286 if ("BrowserApp" in window && "loadURI" in window.BrowserApp)
287 window.BrowserApp.loadURI(uri);
288 };
289
290 break;
291 }
292 default:
293 {
294 exports.isKnownWindow = function(window) false;
295 break;
296 }
297 }
OLDNEW
« no previous file with comments | « lib/main.js ('k') | lib/typoCollector.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld