LEFT | RIGHT |
1 /* | 1 /* |
2 * This file is part of Adblock Plus <https://adblockplus.org/>, | 2 * This file is part of Adblock Plus <https://adblockplus.org/>, |
3 * Copyright (C) 2006-2016 Eyeo GmbH | 3 * Copyright (C) 2006-2016 Eyeo GmbH |
4 * | 4 * |
5 * Adblock Plus is free software: you can redistribute it and/or modify | 5 * Adblock Plus is free software: you can redistribute it and/or modify |
6 * it under the terms of the GNU General Public License version 3 as | 6 * it under the terms of the GNU General Public License version 3 as |
7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
8 * | 8 * |
9 * Adblock Plus is distributed in the hope that it will be useful, | 9 * Adblock Plus is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 29 matching lines...) Expand all Loading... |
40 // In that case we get the url from top frame of the tab, recorded by | 40 // In that case we get the url from top frame of the tab, recorded by |
41 // the onBeforeRequest handler. | 41 // the onBeforeRequest handler. |
42 let frames = framesOfTabs[this.id]; | 42 let frames = framesOfTabs[this.id]; |
43 if (frames) | 43 if (frames) |
44 { | 44 { |
45 let frame = frames[0]; | 45 let frame = frames[0]; |
46 if (frame) | 46 if (frame) |
47 return frame.url; | 47 return frame.url; |
48 } | 48 } |
49 }, | 49 }, |
50 sendMessage: function(message, responseCallback) | 50 sendMessage(message, responseCallback) |
51 { | 51 { |
52 chrome.tabs.sendMessage(this.id, message, responseCallback); | 52 chrome.tabs.sendMessage(this.id, message, responseCallback); |
53 } | 53 } |
54 }; | 54 }; |
55 | 55 |
56 ext.getPage = id => new Page({id: parseInt(id, 10)}); | 56 ext.getPage = id => new Page({id: parseInt(id, 10)}); |
57 | 57 |
58 function afterTabLoaded(callback) | 58 function afterTabLoaded(callback) |
59 { | 59 { |
60 return openedTab => | 60 return openedTab => |
61 { | 61 { |
62 let onUpdated = (tabId, changeInfo, tab) => | 62 let onUpdated = (tabId, changeInfo, tab) => |
63 { | 63 { |
64 if (tabId == openedTab.id && changeInfo.status == "complete") | 64 if (tabId == openedTab.id && changeInfo.status == "complete") |
65 { | 65 { |
66 chrome.tabs.onUpdated.removeListener(onUpdated); | 66 chrome.tabs.onUpdated.removeListener(onUpdated); |
67 callback(new Page(openedTab)); | 67 callback(new Page(openedTab)); |
68 } | 68 } |
69 }; | 69 }; |
70 chrome.tabs.onUpdated.addListener(onUpdated); | 70 chrome.tabs.onUpdated.addListener(onUpdated); |
71 }; | 71 }; |
72 } | 72 } |
73 | 73 |
74 ext.pages = { | 74 ext.pages = { |
75 open: (url, callback) => | 75 open(url, callback) |
76 { | 76 { |
77 chrome.tabs.create({url: url}, callback && afterTabLoaded(callback)); | 77 chrome.tabs.create({url: url}, callback && afterTabLoaded(callback)); |
78 }, | 78 }, |
79 query: (info, callback) => | 79 query(info, callback) |
80 { | 80 { |
81 let rawInfo = {}; | 81 let rawInfo = {}; |
82 for (let property in info) | 82 for (let property in info) |
83 { | 83 { |
84 switch (property) | 84 switch (property) |
85 { | 85 { |
86 case "active": | 86 case "active": |
87 case "lastFocusedWindow": | 87 case "lastFocusedWindow": |
88 rawInfo[property] = info[property]; | 88 rawInfo[property] = info[property]; |
89 } | 89 } |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
190 | 190 |
191 | 191 |
192 /* Browser actions */ | 192 /* Browser actions */ |
193 | 193 |
194 let BrowserAction = function(tabId) | 194 let BrowserAction = function(tabId) |
195 { | 195 { |
196 this._tabId = tabId; | 196 this._tabId = tabId; |
197 this._changes = null; | 197 this._changes = null; |
198 }; | 198 }; |
199 BrowserAction.prototype = { | 199 BrowserAction.prototype = { |
200 _applyChanges: function() | 200 _applyChanges() |
201 { | 201 { |
202 if ("iconPath" in this._changes) | 202 if ("iconPath" in this._changes) |
203 { | 203 { |
204 chrome.browserAction.setIcon({ | 204 chrome.browserAction.setIcon({ |
205 tabId: this._tabId, | 205 tabId: this._tabId, |
206 path: { | 206 path: { |
207 16: this._changes.iconPath.replace("$size", "16"), | 207 16: this._changes.iconPath.replace("$size", "16"), |
208 19: this._changes.iconPath.replace("$size", "19"), | 208 19: this._changes.iconPath.replace("$size", "19"), |
209 20: this._changes.iconPath.replace("$size", "20"), | 209 20: this._changes.iconPath.replace("$size", "20"), |
210 32: this._changes.iconPath.replace("$size", "32"), | 210 32: this._changes.iconPath.replace("$size", "32"), |
(...skipping 14 matching lines...) Expand all Loading... |
225 if ("badgeColor" in this._changes) | 225 if ("badgeColor" in this._changes) |
226 { | 226 { |
227 chrome.browserAction.setBadgeBackgroundColor({ | 227 chrome.browserAction.setBadgeBackgroundColor({ |
228 tabId: this._tabId, | 228 tabId: this._tabId, |
229 color: this._changes.badgeColor | 229 color: this._changes.badgeColor |
230 }); | 230 }); |
231 } | 231 } |
232 | 232 |
233 this._changes = null; | 233 this._changes = null; |
234 }, | 234 }, |
235 _queueChanges: function() | 235 _queueChanges() |
236 { | 236 { |
237 chrome.tabs.get(this._tabId, function() | 237 chrome.tabs.get(this._tabId, function() |
238 { | 238 { |
239 // If the tab is prerendered, chrome.tabs.get() sets | 239 // If the tab is prerendered, chrome.tabs.get() sets |
240 // chrome.runtime.lastError and we have to delay our changes | 240 // chrome.runtime.lastError and we have to delay our changes |
241 // until the currently visible tab is replaced with the | 241 // until the currently visible tab is replaced with the |
242 // prerendered tab. Otherwise chrome.browserAction.set* fails. | 242 // prerendered tab. Otherwise chrome.browserAction.set* fails. |
243 if (chrome.runtime.lastError) | 243 if (chrome.runtime.lastError) |
244 { | 244 { |
245 let onReplaced = (addedTabId, removedTabId) => | 245 let onReplaced = (addedTabId, removedTabId) => |
246 { | 246 { |
247 if (addedTabId == this._tabId) | 247 if (addedTabId == this._tabId) |
248 { | 248 { |
249 chrome.tabs.onReplaced.removeListener(onReplaced); | 249 chrome.tabs.onReplaced.removeListener(onReplaced); |
250 this._applyChanges(); | 250 this._applyChanges(); |
251 } | 251 } |
252 }; | 252 }; |
253 chrome.tabs.onReplaced.addListener(onReplaced); | 253 chrome.tabs.onReplaced.addListener(onReplaced); |
254 } | 254 } |
255 else | 255 else |
256 { | 256 { |
257 this._applyChanges(); | 257 this._applyChanges(); |
258 } | 258 } |
259 }.bind(this)); | 259 }.bind(this)); |
260 }, | 260 }, |
261 _addChange: function(name, value) | 261 _addChange(name, value) |
262 { | 262 { |
263 if (!this._changes) | 263 if (!this._changes) |
264 { | 264 { |
265 this._changes = {}; | 265 this._changes = {}; |
266 this._queueChanges(); | 266 this._queueChanges(); |
267 } | 267 } |
268 | 268 |
269 this._changes[name] = value; | 269 this._changes[name] = value; |
270 }, | 270 }, |
271 setIcon: function(path) | 271 setIcon(path) |
272 { | 272 { |
273 this._addChange("iconPath", path); | 273 this._addChange("iconPath", path); |
274 }, | 274 }, |
275 setBadge: function(badge) | 275 setBadge(badge) |
276 { | 276 { |
277 if (!badge) | 277 if (!badge) |
278 { | 278 { |
279 this._addChange("badgeText", ""); | 279 this._addChange("badgeText", ""); |
280 } | 280 } |
281 else | 281 else |
282 { | 282 { |
283 if ("number" in badge) | 283 if ("number" in badge) |
284 this._addChange("badgeText", badge.number.toString()); | 284 this._addChange("badgeText", badge.number.toString()); |
285 | 285 |
(...skipping 28 matching lines...) Expand all Loading... |
314 let items = contextMenuItems.get({id: tabs[0].id}); | 314 let items = contextMenuItems.get({id: tabs[0].id}); |
315 | 315 |
316 if (!items) | 316 if (!items) |
317 return; | 317 return; |
318 | 318 |
319 items.forEach(item => | 319 items.forEach(item => |
320 { | 320 { |
321 chrome.contextMenus.create({ | 321 chrome.contextMenus.create({ |
322 title: item.title, | 322 title: item.title, |
323 contexts: item.contexts, | 323 contexts: item.contexts, |
324 onclick: (info, tab) => | 324 onclick(info, tab) |
325 { | 325 { |
326 item.onclick(new Page(tab)); | 326 item.onclick(new Page(tab)); |
327 } | 327 } |
328 }); | 328 }); |
329 }); | 329 }); |
330 }); | 330 }); |
331 }); | 331 }); |
332 }; | 332 }; |
333 | 333 |
334 let ContextMenus = function(page) | 334 let ContextMenus = function(page) |
335 { | 335 { |
336 this._page = page; | 336 this._page = page; |
337 }; | 337 }; |
338 ContextMenus.prototype = { | 338 ContextMenus.prototype = { |
339 create: function(item) | 339 create(item) |
340 { | 340 { |
341 let items = contextMenuItems.get(this._page); | 341 let items = contextMenuItems.get(this._page); |
342 if (!items) | 342 if (!items) |
343 contextMenuItems.set(this._page, items = []); | 343 contextMenuItems.set(this._page, items = []); |
344 | 344 |
345 items.push(item); | 345 items.push(item); |
346 updateContextMenu(); | 346 updateContextMenu(); |
347 }, | 347 }, |
348 remove: function(item) | 348 remove(item) |
349 { | 349 { |
350 let items = contextMenuItems.get(this._page); | 350 let items = contextMenuItems.get(this._page); |
351 if (items) | 351 if (items) |
352 { | 352 { |
353 let index = items.indexOf(item); | 353 let index = items.indexOf(item); |
354 if (index != -1) | 354 if (index != -1) |
355 { | 355 { |
356 items.splice(index, 1); | 356 items.splice(index, 1); |
357 updateContextMenu(); | 357 updateContextMenu(); |
358 } | 358 } |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
390 chrome.webNavigation.onBeforeNavigate.removeListener(propagateHandlerBehav
iorChange); | 390 chrome.webNavigation.onBeforeNavigate.removeListener(propagateHandlerBehav
iorChange); |
391 chrome.webRequest.handlerBehaviorChanged(); | 391 chrome.webRequest.handlerBehaviorChanged(); |
392 | 392 |
393 handlerBehaviorChangedQuota--; | 393 handlerBehaviorChangedQuota--; |
394 setTimeout(() => { handlerBehaviorChangedQuota++; }, 600000); | 394 setTimeout(() => { handlerBehaviorChangedQuota++; }, 600000); |
395 } | 395 } |
396 } | 396 } |
397 | 397 |
398 ext.webRequest = { | 398 ext.webRequest = { |
399 onBeforeRequest: new ext._EventTarget(), | 399 onBeforeRequest: new ext._EventTarget(), |
400 handlerBehaviorChanged: () => | 400 handlerBehaviorChanged() |
401 { | 401 { |
402 // Defer handlerBehaviorChanged() until navigation occurs. | 402 // Defer handlerBehaviorChanged() until navigation occurs. |
403 // There wouldn't be any visible effect when calling it earlier, | 403 // There wouldn't be any visible effect when calling it earlier, |
404 // but it's an expensive operation and that way we avoid to call | 404 // but it's an expensive operation and that way we avoid to call |
405 // it multiple times, if multiple filters are added/removed. | 405 // it multiple times, if multiple filters are added/removed. |
406 let onBeforeNavigate = chrome.webNavigation.onBeforeNavigate; | 406 let onBeforeNavigate = chrome.webNavigation.onBeforeNavigate; |
407 if (!onBeforeNavigate.hasListener(propagateHandlerBehaviorChange)) | 407 if (!onBeforeNavigate.hasListener(propagateHandlerBehaviorChange)) |
408 onBeforeNavigate.addListener(propagateHandlerBehaviorChange); | 408 onBeforeNavigate.addListener(propagateHandlerBehaviorChange); |
409 } | 409 } |
410 }; | 410 }; |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
504 }; | 504 }; |
505 } | 505 } |
506 | 506 |
507 return ext.onMessage._dispatch(message, sender, sendResponse).indexOf(true)
!= -1; | 507 return ext.onMessage._dispatch(message, sender, sendResponse).indexOf(true)
!= -1; |
508 }); | 508 }); |
509 | 509 |
510 | 510 |
511 /* Storage */ | 511 /* Storage */ |
512 | 512 |
513 ext.storage = { | 513 ext.storage = { |
514 get: (keys, callback) => | 514 get(keys, callback) |
515 { | 515 { |
516 chrome.storage.local.get(keys, callback); | 516 chrome.storage.local.get(keys, callback); |
517 }, | 517 }, |
518 set: (key, value, callback) => | 518 set(key, value, callback) |
519 { | 519 { |
520 let items = {}; | 520 let items = {}; |
521 items[key] = value; | 521 items[key] = value; |
522 chrome.storage.local.set(items, callback); | 522 chrome.storage.local.set(items, callback); |
523 }, | 523 }, |
524 remove: (key, callback) => | 524 remove(key, callback) |
525 { | 525 { |
526 chrome.storage.local.remove(key, callback); | 526 chrome.storage.local.remove(key, callback); |
527 }, | 527 }, |
528 onChanged: chrome.storage.onChanged | 528 onChanged: chrome.storage.onChanged |
529 }; | 529 }; |
530 | 530 |
531 /* Options */ | 531 /* Options */ |
532 | 532 |
533 if ("openOptionsPage" in chrome.runtime) | 533 if ("openOptionsPage" in chrome.runtime) |
534 { | 534 { |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
592 { | 592 { |
593 ext.pages.open(optionsUrl, callback); | 593 ext.pages.open(optionsUrl, callback); |
594 } | 594 } |
595 }); | 595 }); |
596 }); | 596 }); |
597 }; | 597 }; |
598 } | 598 } |
599 | 599 |
600 /* Windows */ | 600 /* Windows */ |
601 ext.windows = { | 601 ext.windows = { |
602 create: (createData, callback) => | 602 create(createData, callback) |
603 { | 603 { |
604 chrome.windows.create(createData, createdWindow => | 604 chrome.windows.create(createData, createdWindow => |
605 { | 605 { |
606 afterTabLoaded(callback)(createdWindow.tabs[0]); | 606 afterTabLoaded(callback)(createdWindow.tabs[0]); |
607 }); | 607 }); |
608 } | 608 } |
609 }; | 609 }; |
610 } | 610 } |
LEFT | RIGHT |