From bd063e0c49fb1ddda586da466918433153d5626e Mon Sep 17 00:00:00 2001 From: Patrick Pircher Date: Wed, 8 Oct 2025 09:43:33 +0200 Subject: [PATCH 1/2] add failing test --- tests/integration/injection-test.js | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/tests/integration/injection-test.js b/tests/integration/injection-test.js index f9bfb6b86f..eef0b0d18c 100644 --- a/tests/integration/injection-test.js +++ b/tests/integration/injection-test.js @@ -171,11 +171,14 @@ module('Integration | Injection', function (hooks) { let contentChromeApi, inspectorChromeApi, backgroundChromeApi; const olddefine = window.define; const olddrequireModule = window.requireModule; + const oldEmber = window.Ember; let injected; + let EmberService = Service; async function inject(owner, assert) { if (injected) return; + const backgroundScript = await (await fetch('/background.js')).text(); { const chrome = backgroundChromeApi; @@ -208,6 +211,14 @@ module('Integration | Injection', function (hooks) { window.chrome = inspectorChromeApi; + owner.register('service:port', class extends EmberService {}); + owner.lookup('service:adapters/web-extension'); + window.requireModule = null; + Object.defineProperty(window, 'Ember', { + value: null, + writable: true, + }); + const emberDebugStarted = new Promise((resolve) => { inspectorChromeApi.runtime.onMessage.addListener((msg) => { if (msg.type === 'general:applicationBooted') { @@ -223,8 +234,22 @@ module('Integration | Injection', function (hooks) { } }); }); - owner.register('service:port', class extends Service {}); - owner.lookup('service:adapters/web-extension'); + + // check that we do not have any errors + await new Promise((resolve, reject) => { + window.addEventListener('error', reject); + // eslint-disable-next-line no-undef + chrome.runtime.onMessage.addListener((message) => { + if (message?.type === 'inject-ember-debug') { + setTimeout(resolve, 200); + } + }); + }); + + window.requireModule = olddrequireModule; + window.Ember = oldEmber; + window.dispatchEvent(new Event('Ember')); + await p; await emberDebugStarted; injected = true; From d81cf0229f1be756b030df4683c2e5fe180f24c2 Mon Sep 17 00:00:00 2001 From: Patrick Pircher Date: Wed, 8 Oct 2025 11:39:59 +0200 Subject: [PATCH 2/2] fix loading race condition --- ember_debug/entrypoints/basic-debug.js | 10 +++++++--- ember_debug/entrypoints/bookmarklet-debug.js | 10 +++++++--- ember_debug/entrypoints/chrome-debug.js | 10 +++++++--- ember_debug/entrypoints/firefox-debug.js | 10 +++++++--- ember_debug/entrypoints/websocket-debug.js | 10 +++++++--- tests/integration/injection-test.js | 3 +-- 6 files changed, 36 insertions(+), 17 deletions(-) diff --git a/ember_debug/entrypoints/basic-debug.js b/ember_debug/entrypoints/basic-debug.js index 9de315586f..babb8cc65e 100644 --- a/ember_debug/entrypoints/basic-debug.js +++ b/ember_debug/entrypoints/basic-debug.js @@ -1,6 +1,10 @@ import loadEmberDebugInWebpage from '../lib/load-ember-debug-in-webpage'; -import { onEmberReady, startInspector } from '../lib/start-inspector'; -import adapter from '../adapters/basic'; +loadEmberDebugInWebpage(async () => { + const { onEmberReady, startInspector } = await import( + '../lib/start-inspector' + ); -loadEmberDebugInWebpage(() => onEmberReady(startInspector(adapter))); + const adapter = (await import('../adapters/basic')).default; + onEmberReady(startInspector(adapter)); +}); diff --git a/ember_debug/entrypoints/bookmarklet-debug.js b/ember_debug/entrypoints/bookmarklet-debug.js index 484d83571c..5153d4e4c3 100644 --- a/ember_debug/entrypoints/bookmarklet-debug.js +++ b/ember_debug/entrypoints/bookmarklet-debug.js @@ -1,6 +1,10 @@ import loadEmberDebugInWebpage from '../lib/load-ember-debug-in-webpage'; -import { onEmberReady, startInspector } from '../lib/start-inspector'; -import adapter from '../adapters/bookmarklet'; +loadEmberDebugInWebpage(async () => { + const { onEmberReady, startInspector } = await import( + '../lib/start-inspector' + ); -loadEmberDebugInWebpage(() => onEmberReady(startInspector(adapter))); + const adapter = (await import('../adapters/bookmarklet.js')).default; + onEmberReady(startInspector(adapter)); +}); diff --git a/ember_debug/entrypoints/chrome-debug.js b/ember_debug/entrypoints/chrome-debug.js index b4e64fede2..bf227bb3fa 100644 --- a/ember_debug/entrypoints/chrome-debug.js +++ b/ember_debug/entrypoints/chrome-debug.js @@ -1,6 +1,10 @@ import loadEmberDebugInWebpage from '../lib/load-ember-debug-in-webpage'; -import { onEmberReady, startInspector } from '../lib/start-inspector'; -import adapter from '../adapters/chrome'; +loadEmberDebugInWebpage(async () => { + const { onEmberReady, startInspector } = await import( + '../lib/start-inspector' + ); -loadEmberDebugInWebpage(() => onEmberReady(startInspector(adapter))); + const adapter = (await import('../adapters/chrome.js')).default; + onEmberReady(startInspector(adapter)); +}); diff --git a/ember_debug/entrypoints/firefox-debug.js b/ember_debug/entrypoints/firefox-debug.js index 42e922d4cd..b810d01907 100644 --- a/ember_debug/entrypoints/firefox-debug.js +++ b/ember_debug/entrypoints/firefox-debug.js @@ -1,6 +1,10 @@ import loadEmberDebugInWebpage from '../lib/load-ember-debug-in-webpage'; -import { onEmberReady, startInspector } from '../lib/start-inspector'; -import adapter from '../adapters/firefox'; +loadEmberDebugInWebpage(async () => { + const { onEmberReady, startInspector } = await import( + '../lib/start-inspector' + ); -loadEmberDebugInWebpage(() => onEmberReady(startInspector(adapter))); + const adapter = (await import('../adapters/firefox.js')).default; + onEmberReady(startInspector(adapter)); +}); diff --git a/ember_debug/entrypoints/websocket-debug.js b/ember_debug/entrypoints/websocket-debug.js index 5ec3f2ea3c..8cf9251bf7 100644 --- a/ember_debug/entrypoints/websocket-debug.js +++ b/ember_debug/entrypoints/websocket-debug.js @@ -1,6 +1,10 @@ import loadEmberDebugInWebpage from '../lib/load-ember-debug-in-webpage'; -import { onEmberReady, startInspector } from '../lib/start-inspector'; -import adapter from '../adapters/websocket'; +loadEmberDebugInWebpage(async () => { + const { onEmberReady, startInspector } = await import( + '../lib/start-inspector' + ); -loadEmberDebugInWebpage(() => onEmberReady(startInspector(adapter))); + const adapter = (await import('../adapters/websocket.js')).default; + onEmberReady(startInspector(adapter)); +}); diff --git a/tests/integration/injection-test.js b/tests/integration/injection-test.js index eef0b0d18c..79a916fde6 100644 --- a/tests/integration/injection-test.js +++ b/tests/integration/injection-test.js @@ -238,8 +238,7 @@ module('Integration | Injection', function (hooks) { // check that we do not have any errors await new Promise((resolve, reject) => { window.addEventListener('error', reject); - // eslint-disable-next-line no-undef - chrome.runtime.onMessage.addListener((message) => { + contentChromeApi.runtime.onMessage.addListener((message) => { if (message?.type === 'inject-ember-debug') { setTimeout(resolve, 200); }