diff --git a/src/extension-runners/chromium.js b/src/extension-runners/chromium.js index c0322baa59..5409784095 100644 --- a/src/extension-runners/chromium.js +++ b/src/extension-runners/chromium.js @@ -127,8 +127,37 @@ export class ChromiumExtensionRunner { }); }); + const chromeFlags = [...DEFAULT_CHROME_FLAGS]; + let startingUrl; + let specialStartingUrls = []; + if (this.params.startUrl) { + const specialUrlFormats = ['chrome://', 'chrome-extension://']; + const startingUrls = Array.isArray(this.params.startUrl) + ? this.params.startUrl + : [this.params.startUrl]; + + // Extract URLs starting with chrome:// from startingUrls and let bg.js open them instead + specialStartingUrls = startingUrls.filter((item) => + specialUrlFormats.some((format) => + item.toLowerCase().startsWith(format) + ) + ); + + const strippedStartingUrls = startingUrls.filter( + (item) => + !specialUrlFormats.some((format) => + item.toLowerCase().startsWith(format) + ) + ); + + startingUrl = strippedStartingUrls.shift(); + chromeFlags.push(...strippedStartingUrls); + } + // Create the extension that will manage the addon reloads - this.reloadManagerExtension = await this.createReloadManagerExtension(); + this.reloadManagerExtension = await this.createReloadManagerExtension( + specialStartingUrls + ); // Start chrome pointing it to a given profile dir const extensions = [this.reloadManagerExtension] @@ -143,8 +172,6 @@ export class ChromiumExtensionRunner { log.debug(`(chromiumBinary: ${chromiumBinary})`); } - const chromeFlags = [...DEFAULT_CHROME_FLAGS]; - chromeFlags.push(`--load-extension=${extensions}`); if (this.params.args) { @@ -193,15 +220,6 @@ export class ChromiumExtensionRunner { chromeFlags.push(`--profile-directory=${profileDirName}`); } - let startingUrl; - if (this.params.startUrl) { - const startingUrls = Array.isArray(this.params.startUrl) - ? this.params.startUrl - : [this.params.startUrl]; - startingUrl = startingUrls.shift(); - chromeFlags.push(...startingUrls); - } - this.chromiumInstance = await this.chromiumLaunch({ enableExtensions: true, chromePath: chromiumBinary, @@ -261,7 +279,7 @@ export class ChromiumExtensionRunner { }); } - async createReloadManagerExtension() { + async createReloadManagerExtension(specialStartingUrls) { const tmpDir = new TempDir(); await tmpDir.create(); this.registerCleanup(() => tmpDir.remove()); @@ -315,6 +333,18 @@ export class ChromiumExtensionRunner { const ws = new window.WebSocket( "ws://${wssInfo.address}:${wssInfo.port}"); + + const chromeTabList = ${JSON.stringify(specialStartingUrls)} + if (chromeTabList.length > 0) { + chrome.runtime.onInstalled.addListener(details => { + if (details.reason === chrome.runtime.OnInstalledReason.INSTALL ) { + chromeTabList.forEach(url => { + chrome.tabs.create({ url }); + }); + } + }); + } + ws.onmessage = async (evt) => { const msg = JSON.parse(evt.data); if (msg.type === 'webExtReloadAllExtensions') { diff --git a/tests/unit/test-extension-runners/test.chromium.js b/tests/unit/test-extension-runners/test.chromium.js index ec8d02235c..3fc442144c 100644 --- a/tests/unit/test-extension-runners/test.chromium.js +++ b/tests/unit/test-extension-runners/test.chromium.js @@ -112,6 +112,55 @@ describe('util/extension-runners/chromium', async () => { await runnerInstance.exit(); }); + it( + 'does insert special urls in companion extension ' + + '& excludes them from args', + async () => { + const { params } = prepareExtensionRunnerParams({ + params: { + startUrl: [ + 'url1', + 'chrome://version', + 'url2', + 'chrome://extensions', + 'chrome-extension://id/page.html', + ], + }, + }); + const runnerInstance = new ChromiumExtensionRunner(params); + await runnerInstance.run(); + + const { reloadManagerExtension } = runnerInstance; + + assert.equal(await fs.exists(reloadManagerExtension), true); + + const bgScript = path.join(reloadManagerExtension, 'bg.js'); + const expectedStr = + 'const chromeTabList = ["chrome://version","chrome://extensions","chrome-extension://id/page.html"]'; + assert.include( + await fs.readFile(bgScript, 'utf8'), + expectedStr, + 'bg.js does not contain special urls' + ); + + sinon.assert.calledOnce(params.chromiumLaunch); + //assert special urls are not present + sinon.assert.calledWithMatch(params.chromiumLaunch, { + ignoreDefaultFlags: true, + enableExtensions: true, + chromePath: undefined, + chromeFlags: [ + ...DEFAULT_CHROME_FLAGS, + 'url2', + `--load-extension=${reloadManagerExtension},/fake/sourceDir`, + ], + startingUrl: 'url1', + }); + + await runnerInstance.exit(); + } + ); + it('controls the "reload manager" from a websocket server', async () => { const { params } = prepareExtensionRunnerParams(); const runnerInstance = new ChromiumExtensionRunner(params); @@ -325,9 +374,9 @@ describe('util/extension-runners/chromium', async () => { chromePath: undefined, chromeFlags: [ ...DEFAULT_CHROME_FLAGS, - `--load-extension=${reloadManagerExtension},/fake/sourceDir`, 'url2', 'url3', + `--load-extension=${reloadManagerExtension},/fake/sourceDir`, ], startingUrl: 'url1', }); @@ -355,12 +404,12 @@ describe('util/extension-runners/chromium', async () => { chromePath: undefined, chromeFlags: [ ...DEFAULT_CHROME_FLAGS, + 'url2', + 'url3', `--load-extension=${reloadManagerExtension},/fake/sourceDir`, '--arg1', 'arg2', '--arg3', - 'url2', - 'url3', ], startingUrl: 'url1', });