Index: ext/background.js |
=================================================================== |
--- a/ext/background.js |
+++ b/ext/background.js |
@@ -127,29 +127,29 @@ |
}; |
browser.tabs.onUpdated.addListener((tabId, changeInfo, tab) => |
{ |
if (changeInfo.status == "loading") |
ext.pages.onLoading._dispatch(new Page(tab)); |
}); |
- function createFrame(tabId, frameId) |
+ function createFrame(tabId, frameId, url) |
{ |
let frames = framesOfTabs.get(tabId); |
if (!frames) |
{ |
frames = new Map(); |
framesOfTabs.set(tabId, frames); |
} |
let frame = frames.get(frameId); |
if (!frame) |
{ |
- frame = {}; |
+ frame = new Frame(tabId, frameId, url); |
frames.set(frameId, frame); |
} |
return frame; |
} |
function updatePageFrameStructure(frameId, tabId, url, parentFrameId) |
{ |
@@ -168,22 +168,21 @@ |
// tabs that are already visible. Otherwise browser action changes get |
// overridden when Chrome automatically resets them on navigation. |
if (browser.runtime.lastError) |
ext.pages.onLoading._dispatch(page); |
}); |
} |
// Update frame URL and parent in frame structure |
- let frame = createFrame(tabId, frameId); |
- frame.url = new URL(url); |
+ let frame = createFrame(tabId, frameId, url); |
let parentFrame = framesOfTabs.get(tabId).get(parentFrameId); |
if (parentFrame) |
- frame.parent = parentFrame; |
+ frame._setParent(parentFrame); |
} |
browser.webRequest.onHeadersReceived.addListener(details => |
{ |
// We have to update the frame structure when switching to a new |
// document, so that we process any further requests made by that |
// document in the right context. Unfortunately, we cannot rely |
// on webNavigation.onCommitted since it isn't guaranteed to fire |
@@ -505,16 +504,43 @@ |
if (windowId != browser.windows.WINDOW_ID_NONE) |
updateContextMenu(); |
}); |
} |
/* Web requests */ |
+ let Frame = ext.Frame = function(tabId, frameId, url) |
Manish Jethani
2018/03/22 19:56:55
So there's a Frame object now and it's used consis
|
+ { |
+ this.id = frameId; |
+ |
+ // In Edge requests from internal extension pages |
+ // (protocol ms-browser-extension://) do no have a sender URL. |
+ this.url = url ? new URL(url) : null; |
+ this._tabId = tabId; |
+ }; |
+ Frame.prototype = { |
+ get parent() |
+ { |
+ if (typeof this._parent != "undefined") |
+ return this._parent; |
+ |
+ let frame = ext.getFrame(this._tabId, this.id); |
+ if (frame) |
+ return frame.parent; |
+ |
+ return ext.getFrame(this._tabId, 0) || null; |
+ }, |
+ _setParent(value) |
+ { |
+ this._parent = value; |
+ } |
+ }; |
+ |
let framesOfTabs = new Map(); |
ext.getFrame = (tabId, frameId) => |
{ |
let frames = framesOfTabs.get(tabId); |
return frames && frames.get(frameId); |
}; |
@@ -560,21 +586,21 @@ |
{ |
if (details && details.length > 0) |
{ |
let frames = new Map(); |
framesOfTabs.set(tab.id, frames); |
for (let detail of details) |
{ |
- let frame = {url: new URL(detail.url)}; |
+ let frame = new Frame(tab.id, detail.frameId, detail.url); |
frames.set(detail.frameId, frame); |
if (detail.parentFrameId != -1) |
- frame.parent = frames.get(detail.parentFrameId); |
+ frame._setParent(frames.get(detail.parentFrameId)); |
} |
} |
}); |
}); |
}); |
browser.webRequest.onBeforeRequest.addListener(details => |
{ |
@@ -625,54 +651,16 @@ |
} |
if (ext.webRequest.onBeforeRequest._dispatch( |
url, type, page, frame).includes(false)) |
return {cancel: true}; |
}, {urls: ["<all_urls>"]}, ["blocking"]); |
- /* Message passing */ |
- |
- browser.runtime.onMessage.addListener((message, rawSender, sendResponse) => |
- { |
- let sender = {}; |
- |
- // Add "page" and "frame" if the message was sent by a content script. |
- // If sent by popup or the background page itself, there is no "tab". |
- if ("tab" in rawSender) |
- { |
- sender.page = new Page(rawSender.tab); |
- sender.frame = { |
- id: rawSender.frameId, |
- // In Edge requests from internal extension pages |
- // (protocol ms-browser-extension://) do no have a sender URL. |
- url: rawSender.url ? new URL(rawSender.url) : null, |
- get parent() |
- { |
- let frames = framesOfTabs.get(rawSender.tab.id); |
- |
- if (!frames) |
- return null; |
- |
- let frame = frames.get(rawSender.frameId); |
- if (frame) |
- return frame.parent || null; |
- |
- return frames.get(0) || null; |
- } |
- }; |
- } |
- |
- return ext.onMessage._dispatch( |
- message, sender, sendResponse |
- ).includes(true); |
- }); |
- |
- |
/* Storage */ |
ext.storage = { |
get(keys, callback) |
{ |
browser.storage.local.get(keys, callback); |
}, |
set(key, value, callback) |