diff --git a/lib/core/engine/index.js b/lib/core/engine/index.js index 64c927b64..cec75ba8c 100644 --- a/lib/core/engine/index.js +++ b/lib/core/engine/index.js @@ -386,12 +386,34 @@ export class Engine { result.info.browser.name = extras.har.log.browser.name; result.info.browser.version = extras.har.log.browser.version; if (options.browser === 'firefox' && options.firefox) { - result.info.browser.args = options.firefox.args; + // Issue #1622 — surface the full set of args/preferences/binary + // that browsertime applied to Firefox, not just what the user + // passed via --firefox.args / --firefox.preference. Captured by + // configureBuilder; see lib/firefox/webdriver/builder.js. + if (options.recordedBrowserSettings) { + const recorded = options.recordedBrowserSettings; + result.info.browser.args = recorded.args; + result.info.browser.preferences = recorded.preferences; + if (recorded.binary) { + result.info.browser.binary = recorded.binary; + } + if (recorded.profile) { + result.info.browser.profile = recorded.profile; + } + if (recorded.androidPackage) { + result.info.browser.androidPackage = recorded.androidPackage; + } + if (recorded.androidActivity) { + result.info.browser.androidActivity = recorded.androidActivity; + } + } else { + result.info.browser.args = options.firefox.args; + result.info.browser.preference = options.firefox.preference; + } if (options.firefox.geckoProfiler === true) { result.info.browser.geckProfilerFeatures = options.firefox.geckoProfilerParams.features; } - result.info.browser.preference = options.firefox.preference; } else if (options.browser === 'chrome') { if (options.chrome) { result.info.browser.args = options.chrome.args; diff --git a/lib/core/engine/iteration.js b/lib/core/engine/iteration.js index c343ca09a..c09f2f15c 100644 --- a/lib/core/engine/iteration.js +++ b/lib/core/engine/iteration.js @@ -224,6 +224,14 @@ export class Iteration { await engineDelegate.beforeBrowserStart(); await browser.start(); + // The runner deep-merges options into a fresh object before passing them + // to the browser-specific builder, so anything the builder records there + // never reaches the engine. Copy it back to the engine's options object + // so result.info.browser can pick it up. Issue #1622. + if (browser.options && browser.options.recordedBrowserSettings) { + this.options.recordedBrowserSettings = + browser.options.recordedBrowserSettings; + } await engineDelegate.afterBrowserStart(browser); } diff --git a/lib/firefox/webdriver/builder.js b/lib/firefox/webdriver/builder.js index 337c7b591..f437f4050 100644 --- a/lib/firefox/webdriver/builder.js +++ b/lib/firefox/webdriver/builder.js @@ -266,4 +266,18 @@ export async function configureBuilder(builder, baseDir, options) { } builder.setFirefoxOptions(ffOptions); + + // Snapshot every argument / preference / capability we just applied so it + // can be surfaced in the result JSON for debugging — issue #1622. The + // runner deep-merges options into a fresh container before this is called, + // so iteration.js threads it back to the engine after browser.start(). + const ffInternals = ffOptions.firefoxOptions_(); + options.recordedBrowserSettings = { + args: [...(ffInternals.args || [])], + preferences: { ...ffInternals.prefs }, + binary: ffInternals.binary, + profile: ffInternals.profile, + androidPackage: ffInternals.androidPackage, + androidActivity: ffInternals.androidActivity + }; }