Skip to content

Commit

Permalink
use internal messaging to setup inframes
Browse files Browse the repository at this point in the history
  • Loading branch information
patricklx committed Oct 17, 2022
1 parent b84af58 commit 15f190f
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 50 deletions.
4 changes: 2 additions & 2 deletions app/services/adapters/basic.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,9 +93,9 @@ export default class Basic extends Service {
this._messageCallbacks.push(callback);
}

_messageReceived(message) {
_messageReceived(...args) {
this._messageCallbacks.forEach((callback) => {
callback(message);
callback(...args);
});
}

Expand Down
55 changes: 27 additions & 28 deletions app/services/adapters/web-extension.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ export default class WebExtension extends BasicAdapter {
init() {
this._connect();
this._handleReload();
this._injectDebugger();
this._setThemeColors();
this._sendEmberDebug();

return super.init(...arguments);
}
Expand All @@ -30,6 +30,30 @@ export default class WebExtension extends BasicAdapter {
this._chromePort.postMessage(options);
}

_sendEmberDebug() {
loadEmberDebug().then((emberDebug) => {
// first send to all frames in current tab
this.sendMessage({
from: 'devtools',
tabId: chrome.devtools.inspectedWindow.tabId,
type: 'inject-ember-debug',
value: emberDebug,
});
this.onMessageReceived((message, sender) => {
if (message === 'ember-content-script-ready') {
this.sendMessage({
from: 'devtools',
to: 'tabs',
type: 'inject-ember-debug',
value: emberDebug,
tabId: chrome.devtools.inspectedWindow.tabId,
frameId: sender.frameId,
});
}
});
});
}

@computed
get _chromePort() {
return chrome.runtime.connect();
Expand All @@ -39,8 +63,8 @@ export default class WebExtension extends BasicAdapter {
let chromePort = this._chromePort;
chromePort.postMessage({ appId: chrome.devtools.inspectedWindow.tabId });

chromePort.onMessage.addListener((message) => {
this._messageReceived(message);
chromePort.onMessage.addListener((...args) => {
this._messageReceived(...args);
});
}

Expand Down Expand Up @@ -137,31 +161,6 @@ function loadEmberDebug() {
window.addEventListener('Ember', resolve, { once: true });
});
waitForEmberLoad.then(() => 'replace-with-ember-debug');
const emberInspectorDebug =
'(' + loadEmberDebugInWebpage.toString() + ')()';
const injectIntoIframe = (iframe) => {
const frames = iframe ? [iframe] : window.frames;
for (let i = 0; i < frames.length; i++) {
frames[i].postMessage(
JSON.stringify({
type: 'inject-ember-debug',
value: emberInspectorDebug,
}),
'*'
);
}
};
injectIntoIframe();
window.addEventListener(
'message',
(event) => {
if (event.data === '"ember-inspector-iframe-ready"') {
injectIntoIframe(event.source);
event.stopImmediatePropagation();
}
},
{ capture: true }
);
}
return new Promise((resolve) => {
if (!emberDebug) {
Expand Down
2 changes: 1 addition & 1 deletion skeletons/web-extension/background-script.js
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@
} else if (message.from === 'devtools') {
// all other messages from EmberInspector are forwarded to the content-script
// https://developer.chrome.com/extensions/tabs#method-sendMessage
chrome.tabs.sendMessage(appId, message);
chrome.tabs.sendMessage(message.tabId || appId, message, { frameId: message.frameId });
}
});
});
Expand Down
28 changes: 9 additions & 19 deletions skeletons/web-extension/content-script.js
Original file line number Diff line number Diff line change
Expand Up @@ -85,26 +85,16 @@

let injected = false;

window.addEventListener('message', (event) => {
try {
const data = JSON.parse(event.data);
if (data?.type === 'inject-ember-debug') {
if (!injected) {
// cannot use eval here, as the context is limited to the content script-
const elem = document.createElement('script') ;
elem.textContent = data.value;
document.head.appendChild(elem) ;
injected = true;
}
event.stopImmediatePropagation();
chrome.runtime.onMessage.addListener((message) => {
if (message?.type === 'inject-ember-debug') {
if (!injected) {
// cannot use eval here, as the context is limited to the content script-
const elem = document.createElement('script') ;
elem.textContent = message.value;
document.head.appendChild(elem) ;
injected = true;
}
} catch {
// noop
}
}, {
capture: true
});
if (window.top !== window) {
window.parent.postMessage('"ember-inspector-iframe-ready"', '*');
}
chrome.runtime.sendMessage('ember-content-script-ready');
})();

0 comments on commit 15f190f

Please sign in to comment.