| OLD | NEW |
| 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-present eyeo GmbH | 3 * Copyright (C) 2006-present 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 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 125 onActivated: new ext._EventTarget(), | 125 onActivated: new ext._EventTarget(), |
| 126 onRemoved: new ext._EventTarget() | 126 onRemoved: new ext._EventTarget() |
| 127 }; | 127 }; |
| 128 | 128 |
| 129 browser.tabs.onUpdated.addListener((tabId, changeInfo, tab) => | 129 browser.tabs.onUpdated.addListener((tabId, changeInfo, tab) => |
| 130 { | 130 { |
| 131 if (changeInfo.status == "loading") | 131 if (changeInfo.status == "loading") |
| 132 ext.pages.onLoading._dispatch(new Page(tab)); | 132 ext.pages.onLoading._dispatch(new Page(tab)); |
| 133 }); | 133 }); |
| 134 | 134 |
| 135 function createFrame(tabId, frameId) | 135 function createFrame(tabId, frameId, url) |
| 136 { | 136 { |
| 137 let frames = framesOfTabs.get(tabId); | 137 let frames = framesOfTabs.get(tabId); |
| 138 if (!frames) | 138 if (!frames) |
| 139 { | 139 { |
| 140 frames = new Map(); | 140 frames = new Map(); |
| 141 framesOfTabs.set(tabId, frames); | 141 framesOfTabs.set(tabId, frames); |
| 142 } | 142 } |
| 143 | 143 |
| 144 let frame = frames.get(frameId); | 144 let frame = frames.get(frameId); |
| 145 if (!frame) | 145 if (!frame) |
| 146 { | 146 { |
| 147 frame = {}; | 147 frame = new Frame(tabId, frameId, url); |
| 148 frames.set(frameId, frame); | 148 frames.set(frameId, frame); |
| 149 } | 149 } |
| 150 | 150 |
| 151 return frame; | 151 return frame; |
| 152 } | 152 } |
| 153 | 153 |
| 154 function updatePageFrameStructure(frameId, tabId, url, parentFrameId) | 154 function updatePageFrameStructure(frameId, tabId, url, parentFrameId) |
| 155 { | 155 { |
| 156 if (frameId == 0) | 156 if (frameId == 0) |
| 157 { | 157 { |
| 158 let page = new Page({id: tabId, url}); | 158 let page = new Page({id: tabId, url}); |
| 159 | 159 |
| 160 removeFromAllPageMaps(tabId); | 160 removeFromAllPageMaps(tabId); |
| 161 | 161 |
| 162 browser.tabs.get(tabId, () => | 162 browser.tabs.get(tabId, () => |
| 163 { | 163 { |
| 164 // If the tab is prerendered, browser.tabs.get() sets | 164 // If the tab is prerendered, browser.tabs.get() sets |
| 165 // browser.runtime.lastError and we have to dispatch the onLoading | 165 // browser.runtime.lastError and we have to dispatch the onLoading |
| 166 // event, since the onUpdated event isn't dispatched for prerendered | 166 // event, since the onUpdated event isn't dispatched for prerendered |
| 167 // tabs. However, we have to keep relying on the onUpdated event for | 167 // tabs. However, we have to keep relying on the onUpdated event for |
| 168 // tabs that are already visible. Otherwise browser action changes get | 168 // tabs that are already visible. Otherwise browser action changes get |
| 169 // overridden when Chrome automatically resets them on navigation. | 169 // overridden when Chrome automatically resets them on navigation. |
| 170 if (browser.runtime.lastError) | 170 if (browser.runtime.lastError) |
| 171 ext.pages.onLoading._dispatch(page); | 171 ext.pages.onLoading._dispatch(page); |
| 172 }); | 172 }); |
| 173 } | 173 } |
| 174 | 174 |
| 175 // Update frame URL and parent in frame structure | 175 // Update frame URL and parent in frame structure |
| 176 let frame = createFrame(tabId, frameId); | 176 let frame = createFrame(tabId, frameId, url); |
| 177 frame.url = new URL(url); | |
| 178 | 177 |
| 179 let parentFrame = framesOfTabs.get(tabId).get(parentFrameId); | 178 let parentFrame = framesOfTabs.get(tabId).get(parentFrameId); |
| 180 if (parentFrame) | 179 if (parentFrame) |
| 181 frame.parent = parentFrame; | 180 frame._setParent(parentFrame); |
| 182 } | 181 } |
| 183 | 182 |
| 184 browser.webRequest.onHeadersReceived.addListener(details => | 183 browser.webRequest.onHeadersReceived.addListener(details => |
| 185 { | 184 { |
| 186 // We have to update the frame structure when switching to a new | 185 // We have to update the frame structure when switching to a new |
| 187 // document, so that we process any further requests made by that | 186 // document, so that we process any further requests made by that |
| 188 // document in the right context. Unfortunately, we cannot rely | 187 // document in the right context. Unfortunately, we cannot rely |
| 189 // on webNavigation.onCommitted since it isn't guaranteed to fire | 188 // on webNavigation.onCommitted since it isn't guaranteed to fire |
| 190 // before any subresources start downloading[1]. As an | 189 // before any subresources start downloading[1]. As an |
| 191 // alternative we use webRequest.onHeadersReceived for HTTP(S) | 190 // alternative we use webRequest.onHeadersReceived for HTTP(S) |
| (...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 503 browser.windows.onFocusChanged.addListener(windowId => | 502 browser.windows.onFocusChanged.addListener(windowId => |
| 504 { | 503 { |
| 505 if (windowId != browser.windows.WINDOW_ID_NONE) | 504 if (windowId != browser.windows.WINDOW_ID_NONE) |
| 506 updateContextMenu(); | 505 updateContextMenu(); |
| 507 }); | 506 }); |
| 508 } | 507 } |
| 509 | 508 |
| 510 | 509 |
| 511 /* Web requests */ | 510 /* Web requests */ |
| 512 | 511 |
| 512 let Frame = ext.Frame = function(tabId, frameId, url) |
| 513 { |
| 514 this.id = frameId; |
| 515 |
| 516 // In Edge requests from internal extension pages |
| 517 // (protocol ms-browser-extension://) do no have a sender URL. |
| 518 this.url = url ? new URL(url) : null; |
| 519 this._tabId = tabId; |
| 520 }; |
| 521 Frame.prototype = { |
| 522 get parent() |
| 523 { |
| 524 if (typeof this._parent != "undefined") |
| 525 return this._parent; |
| 526 |
| 527 let frame = ext.getFrame(this._tabId, this.id); |
| 528 if (frame) |
| 529 return frame.parent; |
| 530 |
| 531 return ext.getFrame(this._tabId, 0) || null; |
| 532 }, |
| 533 _setParent(value) |
| 534 { |
| 535 this._parent = value; |
| 536 } |
| 537 }; |
| 538 |
| 513 let framesOfTabs = new Map(); | 539 let framesOfTabs = new Map(); |
| 514 | 540 |
| 515 ext.getFrame = (tabId, frameId) => | 541 ext.getFrame = (tabId, frameId) => |
| 516 { | 542 { |
| 517 let frames = framesOfTabs.get(tabId); | 543 let frames = framesOfTabs.get(tabId); |
| 518 return frames && frames.get(frameId); | 544 return frames && frames.get(frameId); |
| 519 }; | 545 }; |
| 520 | 546 |
| 521 let handlerBehaviorChangedQuota = | 547 let handlerBehaviorChangedQuota = |
| 522 browser.webRequest.MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES; | 548 browser.webRequest.MAX_HANDLER_BEHAVIOR_CHANGED_CALLS_PER_10_MINUTES; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 558 { | 584 { |
| 559 browser.webNavigation.getAllFrames({tabId: tab.id}, details => | 585 browser.webNavigation.getAllFrames({tabId: tab.id}, details => |
| 560 { | 586 { |
| 561 if (details && details.length > 0) | 587 if (details && details.length > 0) |
| 562 { | 588 { |
| 563 let frames = new Map(); | 589 let frames = new Map(); |
| 564 framesOfTabs.set(tab.id, frames); | 590 framesOfTabs.set(tab.id, frames); |
| 565 | 591 |
| 566 for (let detail of details) | 592 for (let detail of details) |
| 567 { | 593 { |
| 568 let frame = {url: new URL(detail.url)}; | 594 let frame = new Frame(tab.id, detail.frameId, detail.url); |
| 569 frames.set(detail.frameId, frame); | 595 frames.set(detail.frameId, frame); |
| 570 | 596 |
| 571 if (detail.parentFrameId != -1) | 597 if (detail.parentFrameId != -1) |
| 572 frame.parent = frames.get(detail.parentFrameId); | 598 frame._setParent(frames.get(detail.parentFrameId)); |
| 573 } | 599 } |
| 574 } | 600 } |
| 575 }); | 601 }); |
| 576 }); | 602 }); |
| 577 }); | 603 }); |
| 578 | 604 |
| 579 browser.webRequest.onBeforeRequest.addListener(details => | 605 browser.webRequest.onBeforeRequest.addListener(details => |
| 580 { | 606 { |
| 581 // The high-level code isn't interested in requests that aren't | 607 // The high-level code isn't interested in requests that aren't |
| 582 // related to a tab or requests loading a top-level document, | 608 // related to a tab or requests loading a top-level document, |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 623 frame = ext.getFrame(details.tabId, frameId); | 649 frame = ext.getFrame(details.tabId, frameId); |
| 624 page = new Page({id: details.tabId}); | 650 page = new Page({id: details.tabId}); |
| 625 } | 651 } |
| 626 | 652 |
| 627 if (ext.webRequest.onBeforeRequest._dispatch( | 653 if (ext.webRequest.onBeforeRequest._dispatch( |
| 628 url, type, page, frame).includes(false)) | 654 url, type, page, frame).includes(false)) |
| 629 return {cancel: true}; | 655 return {cancel: true}; |
| 630 }, {urls: ["<all_urls>"]}, ["blocking"]); | 656 }, {urls: ["<all_urls>"]}, ["blocking"]); |
| 631 | 657 |
| 632 | 658 |
| 633 /* Message passing */ | |
| 634 | |
| 635 browser.runtime.onMessage.addListener((message, rawSender, sendResponse) => | |
| 636 { | |
| 637 let sender = {}; | |
| 638 | |
| 639 // Add "page" and "frame" if the message was sent by a content script. | |
| 640 // If sent by popup or the background page itself, there is no "tab". | |
| 641 if ("tab" in rawSender) | |
| 642 { | |
| 643 sender.page = new Page(rawSender.tab); | |
| 644 sender.frame = { | |
| 645 id: rawSender.frameId, | |
| 646 // In Edge requests from internal extension pages | |
| 647 // (protocol ms-browser-extension://) do no have a sender URL. | |
| 648 url: rawSender.url ? new URL(rawSender.url) : null, | |
| 649 get parent() | |
| 650 { | |
| 651 let frames = framesOfTabs.get(rawSender.tab.id); | |
| 652 | |
| 653 if (!frames) | |
| 654 return null; | |
| 655 | |
| 656 let frame = frames.get(rawSender.frameId); | |
| 657 if (frame) | |
| 658 return frame.parent || null; | |
| 659 | |
| 660 return frames.get(0) || null; | |
| 661 } | |
| 662 }; | |
| 663 } | |
| 664 | |
| 665 return ext.onMessage._dispatch( | |
| 666 message, sender, sendResponse | |
| 667 ).includes(true); | |
| 668 }); | |
| 669 | |
| 670 | |
| 671 /* Storage */ | 659 /* Storage */ |
| 672 | 660 |
| 673 ext.storage = { | 661 ext.storage = { |
| 674 get(keys, callback) | 662 get(keys, callback) |
| 675 { | 663 { |
| 676 browser.storage.local.get(keys, callback); | 664 browser.storage.local.get(keys, callback); |
| 677 }, | 665 }, |
| 678 set(key, value, callback) | 666 set(key, value, callback) |
| 679 { | 667 { |
| 680 let items = {}; | 668 let items = {}; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 692 ext.windows = { | 680 ext.windows = { |
| 693 create(createData, callback) | 681 create(createData, callback) |
| 694 { | 682 { |
| 695 browser.windows.create(createData, createdWindow => | 683 browser.windows.create(createData, createdWindow => |
| 696 { | 684 { |
| 697 afterTabLoaded(callback)(createdWindow.tabs[0]); | 685 afterTabLoaded(callback)(createdWindow.tabs[0]); |
| 698 }); | 686 }); |
| 699 } | 687 } |
| 700 }; | 688 }; |
| 701 } | 689 } |
| OLD | NEW |