Skip to content

Commit a6d7f0a

Browse files
authored
Use full URL parsing and search params for frame.src (WebKit#552)
The string-based concateation was rather brittle and can cause subtle bugs. - Fix issue where hash and url params were not merged properly - Add warnUnused argument to Params to only warn at top-level
1 parent f866d2b commit a6d7f0a

3 files changed

Lines changed: 34 additions & 9 deletions

File tree

resources/shared/params.mjs

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,9 @@ export class Params {
3636
// External config url to override internal tests.
3737
config = "";
3838

39-
constructor(searchParams = undefined) {
39+
constructor(searchParams = undefined, warnUnused = false) {
4040
if (searchParams)
41-
this._copyFromSearchParams(searchParams);
41+
this._copyFromSearchParams(searchParams, warnUnused);
4242
if (!this.developerMode) {
4343
Object.freeze(this.viewport);
4444
Object.freeze(this);
@@ -52,7 +52,7 @@ export class Params {
5252
return parseInt(number);
5353
}
5454

55-
_copyFromSearchParams(searchParams) {
55+
_copyFromSearchParams(searchParams, warnUnused) {
5656
this.viewport = this._parseViewport(searchParams);
5757
this.startAutomatically = this._parseBooleanParam(searchParams, "startAutomatically");
5858
this.iterationCount = this._parseIntParam(searchParams, "iterationCount", 1);
@@ -69,9 +69,11 @@ export class Params {
6969
this.measurePrepare = this._parseBooleanParam(searchParams, "measurePrepare");
7070
this.config = this._parseConfig(searchParams);
7171

72-
const unused = Array.from(searchParams.keys());
73-
if (unused.length > 0)
74-
console.error("Got unused search params", unused);
72+
if (warnUnused) {
73+
const unused = Array.from(searchParams.keys());
74+
if (unused.length > 0)
75+
console.error(`Got unused search params: ${unused.join(", ")}`);
76+
}
7577
}
7678

7779
_parseBooleanParam(searchParams, paramKey) {
@@ -219,12 +221,14 @@ function isValidJsonUrl(url) {
219221

220222
export const defaultParams = new Params();
221223

224+
export let paramsError = null;
222225
let maybeCustomParams = defaultParams;
223226
if (globalThis?.location?.search) {
224227
const searchParams = new URLSearchParams(globalThis.location.search);
225228
try {
226-
maybeCustomParams = new Params(searchParams);
229+
maybeCustomParams = new Params(searchParams, true);
227230
} catch (e) {
231+
paramsError = e;
228232
console.error("Invalid URL Param", e, "\nUsing defaults as fallback:", maybeCustomParams);
229233
}
230234
}

resources/suite-runner.mjs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,10 @@ export class SuiteRunner {
105105
const frame = this.#frame;
106106
frame.onload = () => resolve();
107107
frame.onerror = () => reject();
108-
const splitUrl = this.#suite.url.split("?");
109-
frame.src = `${splitUrl[0]}?${splitUrl[1] ?? ""}&${this.#params.toSearchParams()}`;
108+
const url = new URL(this.#suite.url, document.baseURI);
109+
for (const [key, value] of this.#params.toSearchParamsObject())
110+
url.searchParams.append(key, value);
111+
frame.src = url.href;
110112
});
111113
}
112114

tests/unittests/params.mjs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,5 +109,24 @@ describe("Params", () => {
109109
);
110110
expect(params.suites).to.eql(["SuiteB", "Suite1", "SuiteA"]);
111111
});
112+
it("should warn on unused params when warnUnused is true", () => {
113+
const consoleErrorStub = sinon.stub(console, "error");
114+
try {
115+
new Params(new URLSearchParams({ unknownParam: "value" }), true);
116+
expect(consoleErrorStub.calledOnce).to.be(true);
117+
expect(consoleErrorStub.calledWith("Got unused search params: unknownParam")).to.be(true);
118+
} finally {
119+
consoleErrorStub.restore();
120+
}
121+
});
122+
it("should not warn on unused params when warnUnused is false", () => {
123+
const consoleErrorStub = sinon.stub(console, "error");
124+
try {
125+
new Params(new URLSearchParams({ unknownParam: "value" }), false);
126+
expect(consoleErrorStub.called).to.be(false);
127+
} finally {
128+
consoleErrorStub.restore();
129+
}
130+
});
112131
});
113132
});

0 commit comments

Comments
 (0)