Skip to content

Commit 9181ccd

Browse files
authored
feat: Allow passing custom chromium preferences (#1)
1 parent 149df83 commit 9181ccd

File tree

5 files changed

+141
-25
lines changed

5 files changed

+141
-25
lines changed

package-lock.json

Lines changed: 58 additions & 22 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@
5252
"@babel/runtime": "7.23.9",
5353
"@devicefarmer/adbkit": "3.2.6",
5454
"bunyan": "1.8.15",
55-
"chrome-launcher": "0.15.1",
55+
"chrome-launcher": "1.1.0",
5656
"debounce": "1.2.1",
5757
"es6-error": "4.1.1",
5858
"firefox-profile": "4.5.0",
@@ -64,6 +64,7 @@
6464
"node-notifier": "10.0.1",
6565
"parse-json": "7.1.1",
6666
"promise-toolbox": "0.21.0",
67+
"set-value": "4.1.0",
6768
"source-map-support": "0.5.21",
6869
"strip-bom": "5.0.0",
6970
"strip-json-comments": "5.0.1",

src/cmd/run.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ export default async function run(
4949
firefoxApkComponent,
5050
// Chromium CLI options.
5151
chromiumBinary,
52+
chromiumPref,
5253
chromiumProfile,
5354
},
5455
{
@@ -86,6 +87,10 @@ export default async function run(
8687
customPrefs['extensions.manifestV3.enabled'] = true;
8788
}
8889

90+
// Create an alias for --chromium-pref since it has been transformed into an
91+
// object containing one or more preferences.
92+
const customChromiumPrefs = { ...chromiumPref };
93+
8994
const manifestData = await getValidatedManifest(sourceDir);
9095

9196
const profileDir = firefoxProfile || chromiumProfile;
@@ -193,6 +198,7 @@ export default async function run(
193198
...commonRunnerParams,
194199
chromiumBinary,
195200
chromiumProfile,
201+
customChromiumPrefs,
196202
};
197203

198204
const chromiumRunner = await createExtensionRunner({

src/extension-runners/chromium.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
launch as defaultChromiumLaunch,
1313
} from 'chrome-launcher';
1414
import WebSocket, { WebSocketServer } from 'ws';
15+
import set from 'set-value';
1516

1617
import { createLogger } from '../util/logger.js';
1718
import { TempDir } from '../util/temp-dir.js';
@@ -26,6 +27,10 @@ export const DEFAULT_CHROME_FLAGS = ChromeLauncher.defaultFlags().filter(
2627
(flag) => !EXCLUDED_CHROME_FLAGS.includes(flag),
2728
);
2829

30+
const DEFAULT_PREFS = {
31+
'extensions.ui.developer_mode': true,
32+
};
33+
2934
/**
3035
* Implements an IExtensionRunner which manages a Chromium instance.
3136
*/
@@ -210,6 +215,7 @@ export class ChromiumExtensionRunner {
210215
userDataDir,
211216
// Ignore default flags to keep the extension enabled.
212217
ignoreDefaultFlags: true,
218+
prefs: this.getPrefs(),
213219
});
214220

215221
this.chromiumInstance.process.once('close', () => {
@@ -414,4 +420,18 @@ export class ChromiumExtensionRunner {
414420
}
415421
}
416422
}
423+
424+
/**
425+
* Returns a deep preferences object based on a set of flat preferences, like
426+
* "extensions.ui.developer_mode".
427+
*/
428+
getPrefs() {
429+
return Object.entries({
430+
...DEFAULT_PREFS,
431+
...(this.params.customChromiumPrefs || {}),
432+
}).reduce((prefs, [key, value]) => {
433+
set(prefs, key, value);
434+
return prefs;
435+
}, {});
436+
}
417437
}

tests/unit/test-extension-runners/test.chromium.js

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,9 @@ function prepareExtensionRunnerParams({ params } = {}) {
4747

4848
describe('util/extension-runners/chromium', async () => {
4949
it('uses the expected chrome flags', () => {
50-
// Flags from chrome-launcher v0.14.0
50+
// Flags from chrome-launcher v1.1.0
5151
const expectedFlags = [
52-
'--disable-features=Translate',
52+
'--disable-features=Translate,OptimizationHints,MediaRouter,DialMediaRouteProvider,CalculateNativeWinOcclusion,InterestFeedContentSuggestions,CertificateTransparencyComponentUpdater,AutofillServerCommunication',
5353
'--disable-component-extensions-with-background-pages',
5454
'--disable-background-networking',
5555
'--disable-component-update',
@@ -66,6 +66,9 @@ describe('util/extension-runners/chromium', async () => {
6666
'--password-store=basic',
6767
'--use-mock-keychain',
6868
'--force-fieldtrials=*BackgroundTracing/default/',
69+
'--disable-hang-monitor',
70+
'--disable-prompt-on-repost',
71+
'--disable-domain-reliability',
6972
];
7073

7174
assert.deepEqual(DEFAULT_CHROME_FLAGS, expectedFlags);
@@ -615,6 +618,56 @@ describe('util/extension-runners/chromium', async () => {
615618
}),
616619
);
617620

621+
it('does pass default prefs to chrome', async () => {
622+
const { params } = prepareExtensionRunnerParams();
623+
624+
const runnerInstance = new ChromiumExtensionRunner(params);
625+
await runnerInstance.run();
626+
627+
sinon.assert.calledOnce(params.chromiumLaunch);
628+
sinon.assert.calledWithMatch(params.chromiumLaunch, {
629+
prefs: {
630+
extensions: {
631+
ui: {
632+
developer_mode: true,
633+
},
634+
},
635+
},
636+
});
637+
638+
await runnerInstance.exit();
639+
});
640+
641+
it('does pass custom prefs to chrome', async () => {
642+
const { params } = prepareExtensionRunnerParams({
643+
params: {
644+
customChromiumPrefs: {
645+
'download.default_directory': '/some/directory',
646+
'extensions.ui.developer_mode': false,
647+
},
648+
},
649+
});
650+
651+
const runnerInstance = new ChromiumExtensionRunner(params);
652+
await runnerInstance.run();
653+
654+
sinon.assert.calledOnce(params.chromiumLaunch);
655+
sinon.assert.calledWithMatch(params.chromiumLaunch, {
656+
prefs: {
657+
download: {
658+
default_directory: '/some/directory',
659+
},
660+
extensions: {
661+
ui: {
662+
developer_mode: false,
663+
},
664+
},
665+
},
666+
});
667+
668+
await runnerInstance.exit();
669+
});
670+
618671
describe('reloadAllExtensions', () => {
619672
let runnerInstance;
620673
let wsClient;

0 commit comments

Comments
 (0)