diff --git a/src/extension-runners/chromium.js b/src/extension-runners/chromium.js index 4fad5d4c81..2dde68b454 100644 --- a/src/extension-runners/chromium.js +++ b/src/extension-runners/chromium.js @@ -150,8 +150,27 @@ export class ChromiumExtensionRunner { }); }); + const chromeFlags = [...DEFAULT_CHROME_FLAGS]; + let startingUrl; + var specialStartingUrls = []; + if (this.params.startUrl) { + 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) => (item.toLowerCase().startsWith('chrome://'))); + + const strippedStartingUrls = startingUrls.filter( + (item) => !(item.toLowerCase().startsWith('chrome://'))); + + 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].concat( @@ -166,8 +185,6 @@ export class ChromiumExtensionRunner { log.debug(`(chromiumBinary: ${chromiumBinary})`); } - const chromeFlags = [...DEFAULT_CHROME_FLAGS]; - chromeFlags.push(`--load-extension=${extensions}`); if (this.params.args) { @@ -213,14 +230,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, @@ -280,7 +289,8 @@ export class ChromiumExtensionRunner { }); } - async createReloadManagerExtension(): Promise { + async createReloadManagerExtension( + specialStartingUrls: Array): Promise { const tmpDir = new TempDir(); await tmpDir.create(); this.registerCleanup(() => tmpDir.remove()); @@ -334,6 +344,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 b6061833d9..563bf5b2f0 100644 --- a/tests/unit/test-extension-runners/test.chromium.js +++ b/tests/unit/test-extension-runners/test.chromium.js @@ -118,6 +118,41 @@ 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']}, + }); + 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"]'; + 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(); @@ -326,9 +361,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', }); @@ -356,12 +391,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', });