From 2cb66e5c17213a937528ac8dcd4f2bf120e46c7f Mon Sep 17 00:00:00 2001 From: Camillo Bruni Date: Tue, 30 Jun 2026 11:20:46 +0200 Subject: [PATCH 1/5] better-url-parsing --- resources/suite-runner.mjs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/resources/suite-runner.mjs b/resources/suite-runner.mjs index bb37318b0..ee4d7894f 100644 --- a/resources/suite-runner.mjs +++ b/resources/suite-runner.mjs @@ -106,7 +106,9 @@ export class SuiteRunner { frame.onload = () => resolve(); frame.onerror = () => reject(); const splitUrl = this.#suite.url.split("?"); - frame.src = `${splitUrl[0]}?${splitUrl[1] ?? ""}&${this.#params.toSearchParams()}`; + const queryPart = splitUrl[1] ?? ""; + const searchParams = this.#params.toSearchParams(); + frame.src = `${splitUrl[0]}?${queryPart}${queryPart && searchParams ? "&" : ""}${searchParams}`; }); } From 6a01f2fd9edf0abf2a9674f7d4559beba8dc7d66 Mon Sep 17 00:00:00 2001 From: Camillo Bruni Date: Tue, 30 Jun 2026 11:36:20 +0200 Subject: [PATCH 2/5] use-URL-parsing --- resources/suite-runner.mjs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/suite-runner.mjs b/resources/suite-runner.mjs index ee4d7894f..55b8f8a43 100644 --- a/resources/suite-runner.mjs +++ b/resources/suite-runner.mjs @@ -105,10 +105,10 @@ export class SuiteRunner { const frame = this.#frame; frame.onload = () => resolve(); frame.onerror = () => reject(); - const splitUrl = this.#suite.url.split("?"); - const queryPart = splitUrl[1] ?? ""; - const searchParams = this.#params.toSearchParams(); - frame.src = `${splitUrl[0]}?${queryPart}${queryPart && searchParams ? "&" : ""}${searchParams}`; + const url = new URL(this.#suite.url, document.baseURI); + for (const [key, value] of this.#params.toSearchParamsObject()) + url.searchParams.append(key, value); + frame.src = url.href; }); } From 91c2a5823714a62ecf8d1c6e5b8982cfe7609d4e Mon Sep 17 00:00:00 2001 From: Camillo Bruni Date: Tue, 30 Jun 2026 12:16:24 +0200 Subject: [PATCH 3/5] pre-format --- resources/shared/params.mjs | 19 ++++++++++++------- tests/unittests/params.mjs | 19 +++++++++++++++++++ 2 files changed, 31 insertions(+), 7 deletions(-) diff --git a/resources/shared/params.mjs b/resources/shared/params.mjs index 520679d24..dbabf6dda 100644 --- a/resources/shared/params.mjs +++ b/resources/shared/params.mjs @@ -36,9 +36,9 @@ export class Params { // External config url to override internal tests. config = ""; - constructor(searchParams = undefined) { + constructor(searchParams = undefined, warnUnused = false) { if (searchParams) - this._copyFromSearchParams(searchParams); + this._copyFromSearchParams(searchParams, warnUnused); if (!this.developerMode) { Object.freeze(this.viewport); Object.freeze(this); @@ -52,7 +52,7 @@ export class Params { return parseInt(number); } - _copyFromSearchParams(searchParams) { + _copyFromSearchParams(searchParams, warnUnused) { this.viewport = this._parseViewport(searchParams); this.startAutomatically = this._parseBooleanParam(searchParams, "startAutomatically"); this.iterationCount = this._parseIntParam(searchParams, "iterationCount", 1); @@ -69,9 +69,12 @@ export class Params { this.measurePrepare = this._parseBooleanParam(searchParams, "measurePrepare"); this.config = this._parseConfig(searchParams); - const unused = Array.from(searchParams.keys()); - if (unused.length > 0) - console.error("Got unused search params", unused); + if (warnUnused) { + const unused = Array.from(searchParams.keys()); + if (unused.length > 0) { + console.error(`Got unused search params: ${unused.join(", ")}`); + } + } } _parseBooleanParam(searchParams, paramKey) { @@ -219,12 +222,14 @@ function isValidJsonUrl(url) { export const defaultParams = new Params(); +export let paramsError = null; let maybeCustomParams = defaultParams; if (globalThis?.location?.search) { const searchParams = new URLSearchParams(globalThis.location.search); try { - maybeCustomParams = new Params(searchParams); + maybeCustomParams = new Params(searchParams, true); } catch (e) { + paramsError = e; console.error("Invalid URL Param", e, "\nUsing defaults as fallback:", maybeCustomParams); } } diff --git a/tests/unittests/params.mjs b/tests/unittests/params.mjs index e3efe45dc..4cffeb43f 100644 --- a/tests/unittests/params.mjs +++ b/tests/unittests/params.mjs @@ -109,5 +109,24 @@ describe("Params", () => { ); expect(params.suites).to.eql(["SuiteB", "Suite1", "SuiteA"]); }); + it("should warn on unused params when warnUnused is true", () => { + const consoleErrorStub = sinon.stub(console, "error"); + try { + new Params(new URLSearchParams({ unknownParam: "value" }), true); + expect(consoleErrorStub.calledOnce).to.be(true); + expect(consoleErrorStub.calledWith("Got unused search params: unknownParam")).to.be(true); + } finally { + consoleErrorStub.restore(); + } + }); + it("should not warn on unused params when warnUnused is false", () => { + const consoleErrorStub = sinon.stub(console, "error"); + try { + new Params(new URLSearchParams({ unknownParam: "value" }), false); + expect(consoleErrorStub.called).to.be(false); + } finally { + consoleErrorStub.restore(); + } + }); }); }); From 59d3b2bd1c86b7e9f371ab7d72e426204fd0e64d Mon Sep 17 00:00:00 2001 From: Camillo Bruni Date: Tue, 30 Jun 2026 12:22:25 +0200 Subject: [PATCH 4/5] format --- resources/shared/params.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/shared/params.mjs b/resources/shared/params.mjs index dbabf6dda..d305de65f 100644 --- a/resources/shared/params.mjs +++ b/resources/shared/params.mjs @@ -71,9 +71,9 @@ export class Params { if (warnUnused) { const unused = Array.from(searchParams.keys()); - if (unused.length > 0) { + if (unused.length > 0) console.error(`Got unused search params: ${unused.join(", ")}`); - } + } } From d413b4ecd612cd075a49999eb0f2b59c584f5407 Mon Sep 17 00:00:00 2001 From: Camillo Bruni Date: Tue, 30 Jun 2026 12:28:36 +0200 Subject: [PATCH 5/5] format-agaon --- resources/shared/params.mjs | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/shared/params.mjs b/resources/shared/params.mjs index d305de65f..d8830b0d6 100644 --- a/resources/shared/params.mjs +++ b/resources/shared/params.mjs @@ -73,7 +73,6 @@ export class Params { const unused = Array.from(searchParams.keys()); if (unused.length > 0) console.error(`Got unused search params: ${unused.join(", ")}`); - } }