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-2017 eyeo GmbH | 3 * Copyright (C) 2006-2017 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 |
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 * GNU General Public License for more details. | 12 * GNU General Public License for more details. |
13 * | 13 * |
14 * You should have received a copy of the GNU General Public License | 14 * You should have received a copy of the GNU General Public License |
15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | 15 * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. |
16 */ | 16 */ |
17 | 17 |
18 "use strict"; | 18 "use strict"; |
19 | 19 |
20 (function() | 20 (function() |
21 { | 21 { |
22 let allPageMaps = new Set(); | 22 let nonEmptyPageMaps = new Set(); |
23 | 23 |
24 let PageMap = ext.PageMap = function() | 24 let PageMap = ext.PageMap = function() |
25 { | 25 { |
26 this._map = new Map(); | 26 this._map = new Map(); |
27 | |
28 allPageMaps.add(this); | |
29 }; | 27 }; |
30 PageMap.prototype = { | 28 PageMap.prototype = { |
31 _delete(id) | 29 _delete(id) |
32 { | 30 { |
33 this._map.delete(id); | 31 this._map.delete(id); |
| 32 |
| 33 if (this._map.size == 0) |
| 34 nonEmptyPageMaps.delete(this); |
34 }, | 35 }, |
35 keys() | 36 keys() |
36 { | 37 { |
37 return this._map.keys(); | 38 return this._map.keys(); |
38 }, | 39 }, |
39 get(page) | 40 get(page) |
40 { | 41 { |
41 return this._map.get(page.id); | 42 return this._map.get(page.id); |
42 }, | 43 }, |
43 set(page, value) | 44 set(page, value) |
44 { | 45 { |
45 this._map.set(page.id, value); | 46 this._map.set(page.id, value); |
| 47 nonEmptyPageMaps.add(this); |
46 }, | 48 }, |
47 has(page) | 49 has(page) |
48 { | 50 { |
49 return this._map.has(page.id); | 51 return this._map.has(page.id); |
50 }, | 52 }, |
51 clear() | 53 clear() |
52 { | 54 { |
53 this._map.clear(); | 55 this._map.clear(); |
| 56 nonEmptyPageMaps.delete(this); |
54 }, | 57 }, |
55 delete(page) | 58 delete(page) |
56 { | 59 { |
57 this._delete(page.id); | 60 this._delete(page.id); |
58 } | 61 } |
59 }; | 62 }; |
60 | 63 |
61 ext._removeFromAllPageMaps = pageId => | 64 ext._removeFromAllPageMaps = pageId => |
62 { | 65 { |
63 for (let pageMap of allPageMaps) | 66 for (let pageMap of nonEmptyPageMaps) |
64 pageMap._delete(pageId); | 67 pageMap._delete(pageId); |
65 }; | 68 }; |
66 | 69 |
67 /* Pages */ | 70 /* Pages */ |
68 | 71 |
69 let Page = ext.Page = function(tab) | 72 let Page = ext.Page = function(tab) |
70 { | 73 { |
71 this.id = tab.id; | 74 this.id = tab.id; |
72 this._url = tab.url && new URL(tab.url); | 75 this._url = tab.url && new URL(tab.url); |
73 | 76 |
(...skipping 467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
541 tabs.forEach(tab => | 544 tabs.forEach(tab => |
542 { | 545 { |
543 chrome.webNavigation.getAllFrames({tabId: tab.id}, details => | 546 chrome.webNavigation.getAllFrames({tabId: tab.id}, details => |
544 { | 547 { |
545 if (details && details.length > 0) | 548 if (details && details.length > 0) |
546 { | 549 { |
547 let frames = new Map(); | 550 let frames = new Map(); |
548 framesOfTabs.set(tab.id, frames); | 551 framesOfTabs.set(tab.id, frames); |
549 | 552 |
550 for (let detail of details) | 553 for (let detail of details) |
551 frames.set(detail.frameId, {url: new URL(detail.url)}); | |
552 | |
553 for (let detail of details) | |
554 { | 554 { |
555 let {parentFrameId} = detail; | 555 let frame = {url: new URL(detail.url)}; |
556 | 556 frames.set(detail.frameId, frame); |
557 if (parentFrameId != -1) | 557 |
558 frames.get(detail.frameId).parent = frames.get(parentFrameId); | 558 if (detail.parentFrameId != -1) |
| 559 frame.parent = frames.get(detail.parentFrameId); |
559 } | 560 } |
560 } | 561 } |
561 }); | 562 }); |
562 }); | 563 }); |
563 }); | 564 }); |
564 | 565 |
565 chrome.webRequest.onBeforeRequest.addListener(details => | 566 chrome.webRequest.onBeforeRequest.addListener(details => |
566 { | 567 { |
567 // The high-level code isn't interested in requests that aren't | 568 // The high-level code isn't interested in requests that aren't |
568 // related to a tab or requests loading a top-level document, | 569 // related to a tab or requests loading a top-level document, |
569 // those should never be blocked. | 570 // those should never be blocked. |
570 if (details.tabId == -1 || details.type == "main_frame") | 571 if (details.tabId == -1 || details.type == "main_frame") |
| 572 return; |
| 573 |
| 574 // Filter out requests from non web protocols. Ideally, we'd explicitly |
| 575 // specify the protocols we are interested in (i.e. http://, https://, |
| 576 // ws:// and wss://) with the url patterns, given below, when adding this |
| 577 // listener. But unfortunately, Chrome <=57 doesn't support the WebSocket |
| 578 // protocol and is causing an error if it is given. |
| 579 let url = new URL(details.url); |
| 580 if (url.protocol != "http:" && url.protocol != "https:" && |
| 581 url.protocol != "ws:" && url.protocol != "wss:") |
571 return; | 582 return; |
572 | 583 |
573 // We are looking for the frame that contains the element which | 584 // We are looking for the frame that contains the element which |
574 // has triggered this request. For most requests (e.g. images) we | 585 // has triggered this request. For most requests (e.g. images) we |
575 // can just use the request's frame ID, but for subdocument requests | 586 // can just use the request's frame ID, but for subdocument requests |
576 // (e.g. iframes) we must instead use the request's parent frame ID. | 587 // (e.g. iframes) we must instead use the request's parent frame ID. |
577 let {frameId, type} = details; | 588 let {frameId, type} = details; |
578 if (type == "sub_frame") | 589 if (type == "sub_frame") |
579 { | |
580 frameId = details.parentFrameId; | 590 frameId = details.parentFrameId; |
581 type = "SUBDOCUMENT"; | |
582 } | |
583 | 591 |
584 let frame = ext.getFrame(details.tabId, frameId); | 592 let frame = ext.getFrame(details.tabId, frameId); |
585 if (frame) | 593 if (frame) |
586 { | 594 { |
587 let results = ext.webRequest.onBeforeRequest._dispatch( | 595 let results = ext.webRequest.onBeforeRequest._dispatch( |
588 new URL(details.url), | 596 url, type, new Page({id: details.tabId}), frame |
589 type.toUpperCase(), | |
590 new Page({id: details.tabId}), | |
591 frame | |
592 ); | 597 ); |
593 | 598 |
594 if (results.indexOf(false) != -1) | 599 if (results.indexOf(false) != -1) |
595 return {cancel: true}; | 600 return {cancel: true}; |
596 } | 601 } |
597 }, {urls: ["<all_urls>"]}, ["blocking"]); | 602 }, {urls: ["<all_urls>"]}, ["blocking"]); |
598 | 603 |
599 | 604 |
600 /* Message passing */ | 605 /* Message passing */ |
601 | 606 |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
725 ext.windows = { | 730 ext.windows = { |
726 create(createData, callback) | 731 create(createData, callback) |
727 { | 732 { |
728 chrome.windows.create(createData, createdWindow => | 733 chrome.windows.create(createData, createdWindow => |
729 { | 734 { |
730 afterTabLoaded(callback)(createdWindow.tabs[0]); | 735 afterTabLoaded(callback)(createdWindow.tabs[0]); |
731 }); | 736 }); |
732 } | 737 } |
733 }; | 738 }; |
734 }()); | 739 }()); |
LEFT | RIGHT |