show iframe popups in root frame

This commit is contained in:
siikamiika 2020-03-19 00:00:42 +02:00
parent 3684a479c5
commit 6806e7055f
4 changed files with 43 additions and 2 deletions

View File

@ -20,6 +20,7 @@
* Frontend * Frontend
* PopupProxy * PopupProxy
* PopupProxyHost * PopupProxyHost
* apiForward
*/ */
async function main() { async function main() {
@ -29,7 +30,25 @@ async function main() {
const {id, depth=0, parentFrameId, url, proxy=false} = data; const {id, depth=0, parentFrameId, url, proxy=false} = data;
let popup; let popup;
if (proxy) { if (!proxy && (window !== window.parent)) {
let rootPopupInformationResolve;
const rootPopupInformationPromise = new Promise((resolve) => (rootPopupInformationResolve = resolve));
const runtimeMessageCallback = ({action, params}, sender, callback) => {
if (action === 'rootPopupInformation') {
chrome.runtime.onMessage.removeListener(runtimeMessageCallback);
callback();
rootPopupInformationResolve(params);
return false;
}
};
chrome.runtime.onMessage.addListener(runtimeMessageCallback);
apiForward('rootPopupInformationGet');
const {popupId, frameId} = await rootPopupInformationPromise;
popup = new PopupProxy(popupId, 0, null, frameId, url);
} else if (proxy) {
popup = new PopupProxy(null, depth + 1, id, parentFrameId, url); popup = new PopupProxy(null, depth + 1, id, parentFrameId, url);
} else { } else {
const popupHost = new PopupProxyHost(); const popupHost = new PopupProxyHost();

View File

@ -52,7 +52,8 @@ class Frontend extends TextScanner {
]); ]);
this._runtimeMessageHandlers = new Map([ this._runtimeMessageHandlers = new Map([
['popupSetVisibleOverride', ({visible}) => { this.popup.setVisibleOverride(visible); }] ['popupSetVisibleOverride', ({visible}) => { this.popup.setVisibleOverride(visible); }],
['rootPopupInformationGet', () => { this.popup.broadcastRootPopupInformation(); }]
]); ]);
} }

View File

@ -17,6 +17,7 @@
*/ */
/* global /* global
* apiForward
* apiGetMessageToken * apiGetMessageToken
* apiInjectStylesheet * apiInjectStylesheet
*/ */
@ -79,6 +80,20 @@ class Popup {
return false; return false;
} }
async broadcastRootPopupInformation() {
if (this._depth === 0) {
try {
const {frameId} = await this._frameIdPromise;
if (typeof frameId === 'number') {
this._frameId = frameId;
}
} catch (e) {
// NOP
}
apiForward('rootPopupInformation', {popupId: this._id, frameId: this._frameId});
}
}
async setOptions(options) { async setOptions(options) {
this._options = options; this._options = options;
this.updateTheme(); this.updateTheme();
@ -202,6 +217,10 @@ class Popup {
// NOP // NOP
} }
if (this._depth === 0) {
apiForward('rootPopupInformation', {popupId: this._id, frameId: this._frameId});
}
if (this._messageToken === null) { if (this._messageToken === null) {
this._messageToken = await apiGetMessageToken(); this._messageToken = await apiGetMessageToken();
} }

View File

@ -23,9 +23,11 @@
"mixed/js/api.js", "mixed/js/api.js",
"mixed/js/text-scanner.js", "mixed/js/text-scanner.js",
"fg/js/document.js", "fg/js/document.js",
"fg/js/frontend-api-sender.js",
"fg/js/frontend-api-receiver.js", "fg/js/frontend-api-receiver.js",
"fg/js/popup.js", "fg/js/popup.js",
"fg/js/source.js", "fg/js/source.js",
"fg/js/popup-proxy.js",
"fg/js/popup-proxy-host.js", "fg/js/popup-proxy-host.js",
"fg/js/frontend.js", "fg/js/frontend.js",
"fg/js/frontend-initialize.js" "fg/js/frontend-initialize.js"