From a163a3cb8ac6c73b53d2c67a6dbc7581e5173951 Mon Sep 17 00:00:00 2001 From: Sina Kh Date: Wed, 22 Sep 2021 08:19:28 +0200 Subject: [PATCH 1/5] bug-1979 partial fix --- src/extension-runners/chromium.js | 41 ++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/src/extension-runners/chromium.js b/src/extension-runners/chromium.js index 4fad5d4c81..400e014c8f 100644 --- a/src/extension-runners/chromium.js +++ b/src/extension-runners/chromium.js @@ -217,9 +217,18 @@ export class ChromiumExtensionRunner { if (this.params.startUrl) { const startingUrls = Array.isArray(this.params.startUrl) ? this.params.startUrl : [this.params.startUrl]; + + var isStartUrlExtensions = false; + for (let i = 0; i < startingUrls.length; i++) { + if (startingUrls[i].toLowerCase() === 'chrome://extensions') { + isStartUrlExtensions = true; + startingUrls.splice(i, 1) + } + } + startingUrl = startingUrls.shift(); chromeFlags.push(...startingUrls); - } + } this.chromiumInstance = await this.chromiumLaunch({ enableExtensions: true, @@ -231,6 +240,10 @@ export class ChromiumExtensionRunner { ignoreDefaultFlags: true, }); + if (isStartUrlExtensions) { + await this.openTabWithExtensionsUrl() + } + this.chromiumInstance.process.once('close', () => { this.chromiumInstance = null; @@ -341,6 +354,14 @@ export class ChromiumExtensionRunner { await Promise.all(devExtensions.map(ext => reloadExtension(ext.id))); ws.send(JSON.stringify({ type: 'webExtReloadExtensionComplete' })); } + if (msg.type === 'webExtOpenTabWithExtensionsUrl') { + chrome.tabs.create({ + url: 'chrome://extensions' + }); + + ws.send(JSON.stringify({ type: 'webExtReloadExtensionForURLComplete' })); + } + }; })()`; @@ -366,6 +387,24 @@ export class ChromiumExtensionRunner { return [{runnerName}]; } + /** + * Opens a new tab in chrome with url chrome://extensions by communicating with bg extension + */ + async openTabWithExtensionsUrl(): Promise> { + + const runnerName = this.getName(); + + await this.wssBroadcast({ + type: 'webExtOpenTabWithExtensionsUrl', + }); + + process.stdout.write( + `\rExtension opened with tab for chrome://extension URL: ${(new Date()).toTimeString()}`); + log.debug('\n'); + + return [{runnerName}]; + } + /** * Reloads a single extension, collect any reload error and resolves to * an array composed by a single ExtensionRunnerReloadResult object. From 2f86d4a552c54bcaab5a7d990594c34635ecb14a Mon Sep 17 00:00:00 2001 From: Sina Kh Date: Tue, 28 Sep 2021 19:52:11 +0200 Subject: [PATCH 2/5] fix: Fixed Chrome Not Opening Extensions Pages provided in URL --- src/extension-runners/chromium.js | 77 ++++++++++++++----------------- 1 file changed, 35 insertions(+), 42 deletions(-) diff --git a/src/extension-runners/chromium.js b/src/extension-runners/chromium.js index 400e014c8f..d1f46eba6c 100644 --- a/src/extension-runners/chromium.js +++ b/src/extension-runners/chromium.js @@ -150,8 +150,28 @@ 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]; + + // Remove URLs starting with chrome:// from startingUrls and let bg.js open them instead + for (let i = 0; i < startingUrls.length; i++) { + if (startingUrls[i].toLowerCase().startsWith('chrome://')) { + specialStartingUrls += startingUrls[i] + " " + startingUrls.splice(i, 1) + } + } + + startingUrl = startingUrls.shift(); + + chromeFlags.push(...startingUrls); + } + // 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 +186,6 @@ export class ChromiumExtensionRunner { log.debug(`(chromiumBinary: ${chromiumBinary})`); } - const chromeFlags = [...DEFAULT_CHROME_FLAGS]; - chromeFlags.push(`--load-extension=${extensions}`); if (this.params.args) { @@ -213,22 +231,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]; - - var isStartUrlExtensions = false; - for (let i = 0; i < startingUrls.length; i++) { - if (startingUrls[i].toLowerCase() === 'chrome://extensions') { - isStartUrlExtensions = true; - startingUrls.splice(i, 1) - } - } - - startingUrl = startingUrls.shift(); - chromeFlags.push(...startingUrls); - } this.chromiumInstance = await this.chromiumLaunch({ enableExtensions: true, @@ -240,10 +242,6 @@ export class ChromiumExtensionRunner { ignoreDefaultFlags: true, }); - if (isStartUrlExtensions) { - await this.openTabWithExtensionsUrl() - } - this.chromiumInstance.process.once('close', () => { this.chromiumInstance = null; @@ -293,7 +291,7 @@ export class ChromiumExtensionRunner { }); } - async createReloadManagerExtension(): Promise { + async createReloadManagerExtension(specialStartingUrls: string): Promise { const tmpDir = new TempDir(); await tmpDir.create(); this.registerCleanup(() => tmpDir.remove()); @@ -347,6 +345,19 @@ export class ChromiumExtensionRunner { const ws = new window.WebSocket( "ws://${wssInfo.address}:${wssInfo.port}"); + + if (${specialStartingUrls.length} > 0) + { + const chromeTabList = "${specialStartingUrls}".trim().split(" ") + 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') { @@ -387,24 +398,6 @@ export class ChromiumExtensionRunner { return [{runnerName}]; } - /** - * Opens a new tab in chrome with url chrome://extensions by communicating with bg extension - */ - async openTabWithExtensionsUrl(): Promise> { - - const runnerName = this.getName(); - - await this.wssBroadcast({ - type: 'webExtOpenTabWithExtensionsUrl', - }); - - process.stdout.write( - `\rExtension opened with tab for chrome://extension URL: ${(new Date()).toTimeString()}`); - log.debug('\n'); - - return [{runnerName}]; - } - /** * Reloads a single extension, collect any reload error and resolves to * an array composed by a single ExtensionRunnerReloadResult object. From d485a71d1978935381fbfb4a0df10605bad4ae44 Mon Sep 17 00:00:00 2001 From: Sina Kh Date: Tue, 28 Sep 2021 20:05:29 +0200 Subject: [PATCH 3/5] Remove unused ws message handling from bg.js --- src/extension-runners/chromium.js | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/extension-runners/chromium.js b/src/extension-runners/chromium.js index d1f46eba6c..decd688cfc 100644 --- a/src/extension-runners/chromium.js +++ b/src/extension-runners/chromium.js @@ -365,14 +365,6 @@ export class ChromiumExtensionRunner { await Promise.all(devExtensions.map(ext => reloadExtension(ext.id))); ws.send(JSON.stringify({ type: 'webExtReloadExtensionComplete' })); } - if (msg.type === 'webExtOpenTabWithExtensionsUrl') { - chrome.tabs.create({ - url: 'chrome://extensions' - }); - - ws.send(JSON.stringify({ type: 'webExtReloadExtensionForURLComplete' })); - } - }; })()`; From 8ca4550fcc1b71ce52575dd13220b369c812f670 Mon Sep 17 00:00:00 2001 From: Sina Kh Date: Sun, 3 Oct 2021 11:54:28 +0200 Subject: [PATCH 4/5] Fixed PR issues and added unit test for special urls --- src/extension-runners/chromium.js | 42 +++++++++++-------- .../test-extension-runners/test.chromium.js | 35 ++++++++++++++++ 2 files changed, 59 insertions(+), 18 deletions(-) diff --git a/src/extension-runners/chromium.js b/src/extension-runners/chromium.js index decd688cfc..fb115d1a2e 100644 --- a/src/extension-runners/chromium.js +++ b/src/extension-runners/chromium.js @@ -152,26 +152,22 @@ export class ChromiumExtensionRunner { const chromeFlags = [...DEFAULT_CHROME_FLAGS]; let startingUrl; - var specialStartingUrls = ''; + var specialStartingUrls = []; if (this.params.startUrl) { const startingUrls = Array.isArray(this.params.startUrl) ? this.params.startUrl : [this.params.startUrl]; - // Remove URLs starting with chrome:// from startingUrls and let bg.js open them instead - for (let i = 0; i < startingUrls.length; i++) { - if (startingUrls[i].toLowerCase().startsWith('chrome://')) { - specialStartingUrls += startingUrls[i] + " " - startingUrls.splice(i, 1) + // Extract URLs starting with chrome:// from startingUrls and let bg.js open them instead + startingUrls.forEach((element) => { + if (element.toLowerCase().startsWith('chrome://')) { + specialStartingUrls.push(element); } - } - - startingUrl = startingUrls.shift(); - - chromeFlags.push(...startingUrls); + }); } // Create the extension that will manage the addon reloads - this.reloadManagerExtension = await this.createReloadManagerExtension(specialStartingUrls); + this.reloadManagerExtension = + await this.createReloadManagerExtension(specialStartingUrls); // Start chrome pointing it to a given profile dir const extensions = [this.reloadManagerExtension].concat( @@ -231,6 +227,16 @@ export class ChromiumExtensionRunner { chromeFlags.push(`--profile-directory=${profileDirName}`); } + if (this.params.startUrl) { + const startingUrls = Array.isArray(this.params.startUrl) ? + this.params.startUrl : [this.params.startUrl]; + + const strippedStartingUrls = startingUrls.filter( + (item) => !(item.toLowerCase().startsWith('chrome://'))); + + startingUrl = strippedStartingUrls.shift(); + chromeFlags.push(...strippedStartingUrls); + } this.chromiumInstance = await this.chromiumLaunch({ enableExtensions: true, @@ -291,7 +297,8 @@ export class ChromiumExtensionRunner { }); } - async createReloadManagerExtension(specialStartingUrls: string): Promise { + async createReloadManagerExtension( + specialStartingUrls: Array): Promise { const tmpDir = new TempDir(); await tmpDir.create(); this.registerCleanup(() => tmpDir.remove()); @@ -345,16 +352,15 @@ export class ChromiumExtensionRunner { const ws = new window.WebSocket( "ws://${wssInfo.address}:${wssInfo.port}"); - - if (${specialStartingUrls.length} > 0) - { - const chromeTabList = "${specialStartingUrls}".trim().split(" ") + + 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 }); }); - } + } }); } diff --git a/tests/unit/test-extension-runners/test.chromium.js b/tests/unit/test-extension-runners/test.chromium.js index b6061833d9..a749295660 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, + `--load-extension=${reloadManagerExtension},/fake/sourceDir`, + 'url2', + ], + startingUrl: 'url1', + }); + + await runnerInstance.exit(); + }); it('controls the "reload manager" from a websocket server', async () => { const {params} = prepareExtensionRunnerParams(); From 7b56d1028c2c62732ed882b52883c8ad0c3a38ff Mon Sep 17 00:00:00 2001 From: Sina Kh Date: Sat, 9 Oct 2021 16:55:47 +0200 Subject: [PATCH 5/5] Remove Code duplication issue and fix unit tests --- src/extension-runners/chromium.js | 24 +++++++------------ .../test-extension-runners/test.chromium.js | 8 +++---- 2 files changed, 12 insertions(+), 20 deletions(-) diff --git a/src/extension-runners/chromium.js b/src/extension-runners/chromium.js index fb115d1a2e..2dde68b454 100644 --- a/src/extension-runners/chromium.js +++ b/src/extension-runners/chromium.js @@ -158,11 +158,14 @@ export class ChromiumExtensionRunner { this.params.startUrl : [this.params.startUrl]; // Extract URLs starting with chrome:// from startingUrls and let bg.js open them instead - startingUrls.forEach((element) => { - if (element.toLowerCase().startsWith('chrome://')) { - specialStartingUrls.push(element); - } - }); + 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 @@ -227,17 +230,6 @@ export class ChromiumExtensionRunner { chromeFlags.push(`--profile-directory=${profileDirName}`); } - if (this.params.startUrl) { - const startingUrls = Array.isArray(this.params.startUrl) ? - this.params.startUrl : [this.params.startUrl]; - - const strippedStartingUrls = startingUrls.filter( - (item) => !(item.toLowerCase().startsWith('chrome://'))); - - startingUrl = strippedStartingUrls.shift(); - chromeFlags.push(...strippedStartingUrls); - } - this.chromiumInstance = await this.chromiumLaunch({ enableExtensions: true, chromePath: chromiumBinary, diff --git a/tests/unit/test-extension-runners/test.chromium.js b/tests/unit/test-extension-runners/test.chromium.js index a749295660..563bf5b2f0 100644 --- a/tests/unit/test-extension-runners/test.chromium.js +++ b/tests/unit/test-extension-runners/test.chromium.js @@ -145,8 +145,8 @@ describe('util/extension-runners/chromium', async () => { chromePath: undefined, chromeFlags: [ ...DEFAULT_CHROME_FLAGS, - `--load-extension=${reloadManagerExtension},/fake/sourceDir`, 'url2', + `--load-extension=${reloadManagerExtension},/fake/sourceDir`, ], startingUrl: 'url1', }); @@ -361,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', }); @@ -391,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', });