From 728aeab8321014558709738c29f305ebc644c864 Mon Sep 17 00:00:00 2001 From: Brian Grinstead Date: Thu, 21 Nov 2024 13:31:09 -0800 Subject: [PATCH] share params --- resources/params.mjs | 7 +- .../{index-Dev1YoUL.js => index-DZh9gsEf.js} | 225 ++++++++++++++---- .../dist/assets/index-DZh9gsEf.js.map | 1 + .../dist/assets/index-Dev1YoUL.js.map | 1 - resources/remote-helloworld/dist/index.html | 2 +- resources/suite-runner.mjs | 2 +- resources/workload-testing-utils.mjs | 58 +---- 7 files changed, 186 insertions(+), 110 deletions(-) rename resources/remote-helloworld/dist/assets/{index-Dev1YoUL.js => index-DZh9gsEf.js} (52%) create mode 100644 resources/remote-helloworld/dist/assets/index-DZh9gsEf.js.map delete mode 100644 resources/remote-helloworld/dist/assets/index-Dev1YoUL.js.map diff --git a/resources/params.mjs b/resources/params.mjs index fa3f8c3bf..f406c63f6 100644 --- a/resources/params.mjs +++ b/resources/params.mjs @@ -146,9 +146,14 @@ class Params { return shuffleSeed; } - toSearchParams() { + toSearchParams(forRemote = false) { const rawParams = { ...this }; rawParams["viewport"] = `${this.viewport.width}x${this.viewport.height}`; + + if (forRemote) { + delete rawParams["suites"]; + delete rawParams["tags"]; + } return new URLSearchParams(rawParams).toString(); } } diff --git a/resources/remote-helloworld/dist/assets/index-Dev1YoUL.js b/resources/remote-helloworld/dist/assets/index-DZh9gsEf.js similarity index 52% rename from resources/remote-helloworld/dist/assets/index-Dev1YoUL.js rename to resources/remote-helloworld/dist/assets/index-DZh9gsEf.js index e3445ab08..afd7134d7 100644 --- a/resources/remote-helloworld/dist/assets/index-Dev1YoUL.js +++ b/resources/remote-helloworld/dist/assets/index-DZh9gsEf.js @@ -1,6 +1,9 @@ +var __defProp = Object.defineProperty; var __typeError = (msg) => { throw TypeError(msg); }; +var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value; +var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value); var __accessCheck = (obj, member, msg) => member.has(obj) || __typeError("Cannot " + msg); var __privateGet = (obj, member, getter) => (__accessCheck(obj, member, "read from private field"), getter ? getter.call(obj) : member.get(obj)); var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot add the same private member more than once") : member instanceof WeakSet ? member.add(obj) : member.set(obj, value); @@ -16,11 +19,11 @@ function setupCounter(element) { setCounter(0); } class TestInvoker { - constructor(syncCallback, asyncCallback, reportCallback, params) { + constructor(syncCallback, asyncCallback, reportCallback, params2) { this._syncCallback = syncCallback; this._asyncCallback = asyncCallback; this._reportCallback = reportCallback; - this._params = params; + this._params = params2; } } class TimerTestInvoker extends TestInvoker { @@ -42,8 +45,10 @@ class TimerTestInvoker extends TestInvoker { class RAFTestInvoker extends TestInvoker { start() { return new Promise((resolve) => { - if (this._params.waitBeforeSync) setTimeout(() => this._scheduleCallbacks(resolve), this._params.waitBeforeSync); - else this._scheduleCallbacks(resolve); + if (this._params.waitBeforeSync) + setTimeout(() => this._scheduleCallbacks(resolve), this._params.waitBeforeSync); + else + this._scheduleCallbacks(resolve); }); } _scheduleCallbacks(resolve) { @@ -65,7 +70,7 @@ const TEST_INVOKER_LOOKUP = { raf: RAFTestInvoker }; class TestRunner { - constructor(frame, page, params, suite, test, callback) { + constructor(frame, page, params2, suite, test, callback) { __privateAdd(this, _frame); __privateAdd(this, _page); __privateAdd(this, _params); @@ -74,7 +79,7 @@ class TestRunner { __privateAdd(this, _callback); __privateSet(this, _suite, suite); __privateSet(this, _test, test); - __privateSet(this, _params, params); + __privateSet(this, _params, params2); __privateSet(this, _callback, callback); __privateSet(this, _page, page); __privateSet(this, _frame, frame); @@ -93,7 +98,8 @@ class TestRunner { if (__privateGet(this, _params).warmupBeforeSync) { performance.mark("warmup-start"); const startTime = performance.now(); - while (performance.now() - startTime < __privateGet(this, _params).warmupBeforeSync) continue; + while (performance.now() - startTime < __privateGet(this, _params).warmupBeforeSync) + continue; performance.mark("warmup-end"); } performance.mark(syncStartLabel); @@ -113,7 +119,8 @@ class TestRunner { const asyncEndTime = performance.now(); performance.mark(asyncEndLabel); asyncTime = asyncEndTime - asyncStartTime; - if (__privateGet(this, _params).warmupBeforeSync) performance.measure("warmup", "warmup-start", "warmup-end"); + if (__privateGet(this, _params).warmupBeforeSync) + performance.measure("warmup", "warmup-start", "warmup-end"); performance.measure(`${suiteName}.${testName}-sync`, syncStartLabel, syncEndLabel); performance.measure(`${suiteName}.${testName}-async`, asyncStartLabel, asyncEndLabel); }; @@ -129,13 +136,169 @@ _params = new WeakMap(); _suite = new WeakMap(); _test = new WeakMap(); _callback = new WeakMap(); +class Params { + constructor(searchParams2 = void 0) { + __publicField(this, "viewport", { + width: 800, + height: 600 + }); + // Enable a detailed developer menu to change the current Params. + __publicField(this, "developerMode", false); + __publicField(this, "startAutomatically", false); + __publicField(this, "iterationCount", 10); + __publicField(this, "suites", []); + // A list of tags to filter suites + __publicField(this, "tags", []); + // Toggle running a dummy suite once before the normal test suites. + __publicField(this, "useWarmupSuite", false); + // Change how a test measurement is triggered and async time is measured: + // "timer": The classic (as in Speedometer 2.x) way using setTimeout + // "raf": Using rAF callbacks, both for triggering the sync part and for measuring async time. + __publicField(this, "measurementMethod", "raf"); + // or "timer" + // Wait time before the sync step in ms. + __publicField(this, "waitBeforeSync", 0); + // Warmup time before the sync step in ms. + __publicField(this, "warmupBeforeSync", 0); + // Seed for shuffling the execution order of suites. + // "off": do not shuffle + // "generate": generate a random seed + // : use the provided integer as a seed + __publicField(this, "shuffleSeed", "off"); + if (searchParams2) + this._copyFromSearchParams(searchParams2); + if (!this.developerMode) { + Object.freeze(this.viewport); + Object.freeze(this); + } + } + _parseInt(value, errorMessage) { + const number = Number(value); + if (!Number.isInteger(number) && errorMessage) + throw new Error(`Invalid ${errorMessage} param: '${value}', expected int.`); + return parseInt(number); + } + _copyFromSearchParams(searchParams2) { + this.viewport = this._parseViewport(searchParams2); + this.startAutomatically = this._parseBooleanParam(searchParams2, "startAutomatically"); + this.iterationCount = this._parseIntParam(searchParams2, "iterationCount", 1); + this.suites = this._parseSuites(searchParams2); + this.tags = this._parseTags(searchParams2); + this.developerMode = this._parseBooleanParam(searchParams2, "developerMode"); + this.useWarmupSuite = this._parseBooleanParam(searchParams2, "useWarmupSuite"); + this.waitBeforeSync = this._parseIntParam(searchParams2, "waitBeforeSync", 0); + this.warmupBeforeSync = this._parseIntParam(searchParams2, "warmupBeforeSync", 0); + this.measurementMethod = this._parseMeasurementMethod(searchParams2); + this.shuffleSeed = this._parseShuffleSeed(searchParams2); + const unused = Array.from(searchParams2.keys()); + if (unused.length > 0) + console.error("Got unused search params", unused); + } + _parseBooleanParam(searchParams2, paramKey) { + if (!searchParams2.has(paramKey)) + return false; + searchParams2.delete(paramKey); + return true; + } + _parseIntParam(searchParams2, paramKey, minValue) { + if (!searchParams2.has(paramKey)) + return defaultParams[paramKey]; + const parsedValue = this._parseInt(searchParams2.get(paramKey), "waitBeforeSync"); + if (parsedValue < minValue) + throw new Error(`Invalid ${paramKey} param: '${parsedValue}', value must be >= ${minValue}.`); + searchParams2.delete(paramKey); + return parsedValue; + } + _parseViewport(searchParams2) { + if (!searchParams2.has("viewport")) + return defaultParams.viewport; + const viewportParam = searchParams2.get("viewport"); + const [width, height] = viewportParam.split("x"); + const viewport = { + width: this._parseInt(width, "viewport.width"), + height: this._parseInt(height, "viewport.height") + }; + if (this.viewport.width < 800 || this.viewport.height < 600) + throw new Error(`Invalid viewport param: ${viewportParam}`); + searchParams2.delete("viewport"); + return viewport; + } + _parseSuites(searchParams2) { + if (searchParams2.has("suite") || searchParams2.has("suites")) { + if (searchParams2.has("suite") && searchParams2.has("suites")) + throw new Error("Params 'suite' and 'suites' can not be used together."); + const value = searchParams2.get("suite") || searchParams2.get("suites"); + const suites = value.split(","); + if (suites.length === 0) + throw new Error("No suites selected"); + searchParams2.delete("suite"); + searchParams2.delete("suites"); + return suites; + } + return defaultParams.suites; + } + _parseTags() { + if (!searchParams.has("tags")) + return defaultParams.tags; + if (this.suites.length) + throw new Error("'suites' and 'tags' cannot be used together."); + const tags = searchParams.get("tags").split(","); + searchParams.delete("tags"); + return tags; + } + _parseMeasurementMethod(searchParams2) { + if (!searchParams2.has("measurementMethod")) + return defaultParams.measurementMethod; + const measurementMethod = searchParams2.get("measurementMethod"); + if (measurementMethod !== "timer" && measurementMethod !== "raf") + throw new Error(`Invalid measurement method: '${measurementMethod}', must be either 'raf' or 'timer'.`); + searchParams2.delete("measurementMethod"); + return measurementMethod; + } + _parseShuffleSeed(searchParams2) { + if (!searchParams2.has("shuffleSeed")) + return defaultParams.shuffleSeed; + let shuffleSeed = searchParams2.get("shuffleSeed"); + if (shuffleSeed !== "off") { + if (shuffleSeed === "generate") { + shuffleSeed = Math.floor(Math.random() * 1 << 16); + console.log(`Generated a random suite order seed: ${shuffleSeed}`); + } else { + shuffleSeed = parseInt(shuffleSeed); + } + if (!Number.isInteger(shuffleSeed)) + throw new Error(`Invalid shuffle seed: '${shuffleSeed}', must be either 'off', 'generate' or an integer.`); + } + searchParams2.delete("shuffleSeed"); + return shuffleSeed; + } + toSearchParams(forRemote = false) { + const rawParams = { ...this }; + rawParams["viewport"] = `${this.viewport.width}x${this.viewport.height}`; + if (forRemote) { + delete rawParams["suites"]; + delete rawParams["tags"]; + } + return new URLSearchParams(rawParams).toString(); + } +} +const defaultParams = new Params(); +const searchParams = new URLSearchParams(window.location.search); +let maybeCustomParams = new Params(); +try { + maybeCustomParams = new Params(searchParams); +} catch (e) { + console.error("Invalid URL Param", e, "\nUsing defaults as fallback:", maybeCustomParams); + alert(`Invalid URL Param: ${e}`); +} +const params = maybeCustomParams; class BenchmarkTestStep { constructor(name, run) { this.name = name; this.run = run; } - async runAndRecord(params, suite, test, callback) { - const testRunner = new TestRunner(null, null, params, suite, test, callback); + async runAndRecord(params2, suite, test, callback) { + const testRunner = new TestRunner(null, null, params2, suite, test, callback); const result = await testRunner.runTest(); return result; } @@ -153,7 +316,7 @@ class BenchmarkTestSuite { }; return results; } - async runAndRecord(params, onProgress) { + async runAndRecord(params2, onProgress) { const measuredValues = { tests: {}, total: 0 @@ -162,7 +325,7 @@ class BenchmarkTestSuite { const suiteEndLabel = `suite-${this.name}-end`; performance.mark(suiteStartLabel); for (const test of this.tests) { - const result = await test.runAndRecord(params, this, test, this.record); + const result = await test.runAndRecord(params2, this, test, this.record); measuredValues.tests[test.name] = result; measuredValues.total += result.total; onProgress == null ? void 0 : onProgress(test.name); @@ -186,41 +349,6 @@ class BenchmarkSuitesManager { return this.suites.find((suite) => suite.name === name); } } -function isBoolean(value) { - if (value === "true" || value === "false") - return true; - return false; -} -function isNumber(value) { - const number = Number(value); - return Number.isInteger(number); -} -function convertToBoolean(value) { - if (value === "true") - return true; - if (value === "false") - return false; - return value; -} -function convertToNumber(value) { - return Number(value); -} -function getConvertedValue(value) { - if (isBoolean(value)) - return convertToBoolean(value); - if (isNumber(value)) - return convertToNumber(value); - return value; -} -function getParams(value) { - const params = /* @__PURE__ */ Object.create(null); - const searchParams = new URLSearchParams(value); - for (const entry of searchParams.entries()) { - const [key, value2] = entry; - params[key] = getConvertedValue(value2); - } - return Object.freeze(params); -} function getParent(lookupStartNode, path) { lookupStartNode = lookupStartNode.shadowRoot ?? lookupStartNode; const parent = path.reduce((root, selector) => { @@ -248,7 +376,6 @@ function connectFromRemote(name, version) { return; switch (event.data.type) { case "benchmark-suite": - const params = getParams(window.location.search); const { result } = await window.benchmarkSuitesManager.getSuiteByName(event.data.name).runAndRecord(params, (test) => sendMessage({ type: "step-complete", status: "success", appId, name, test })); sendMessage({ type: "suite-complete", status: "success", appId, result }); break; @@ -285,4 +412,4 @@ document.querySelector("#app").innerHTML = ` `; setupCounter(document.querySelector("#counter")); connectFromRemote("remote-hello-world", 1); -//# sourceMappingURL=index-Dev1YoUL.js.map +//# sourceMappingURL=index-DZh9gsEf.js.map diff --git a/resources/remote-helloworld/dist/assets/index-DZh9gsEf.js.map b/resources/remote-helloworld/dist/assets/index-DZh9gsEf.js.map new file mode 100644 index 000000000..54757a2e5 --- /dev/null +++ b/resources/remote-helloworld/dist/assets/index-DZh9gsEf.js.map @@ -0,0 +1 @@ +{"version":3,"file":"index-DZh9gsEf.js","sources":["../../counter.js","../../../test-invoker.mjs","../../../test-runner.mjs","../../../params.mjs","../../../workload-testing-utils.mjs","../../main.js"],"sourcesContent":["export function setupCounter(element) {\n let counter = 0;\n const setCounter = (count) => {\n counter = count;\n element.innerHTML = `count is ${counter}`;\n };\n element.addEventListener(\"click\", () => setCounter(counter + 1));\n setCounter(0);\n}\n","class TestInvoker {\n constructor(syncCallback, asyncCallback, reportCallback, params) {\n this._syncCallback = syncCallback;\n this._asyncCallback = asyncCallback;\n this._reportCallback = reportCallback;\n this._params = params;\n }\n}\n\nexport class TimerTestInvoker extends TestInvoker {\n start() {\n return new Promise((resolve) => {\n setTimeout(() => {\n this._syncCallback();\n setTimeout(() => {\n this._asyncCallback();\n requestAnimationFrame(async () => {\n const result = await this._reportCallback();\n resolve(result);\n });\n }, 0);\n }, this._params.waitBeforeSync);\n });\n }\n}\n\nexport class RAFTestInvoker extends TestInvoker {\n start() {\n return new Promise((resolve) => {\n if (this._params.waitBeforeSync)\n setTimeout(() => this._scheduleCallbacks(resolve), this._params.waitBeforeSync);\n else\n this._scheduleCallbacks(resolve);\n });\n }\n\n _scheduleCallbacks(resolve) {\n requestAnimationFrame(() => this._syncCallback());\n requestAnimationFrame(() => {\n setTimeout(() => {\n this._asyncCallback();\n setTimeout(async () => {\n const result = await this._reportCallback();\n resolve(result);\n }, 0);\n }, 0);\n });\n }\n}\n\nexport const TEST_INVOKER_LOOKUP = {\n __proto__: null,\n timer: TimerTestInvoker,\n raf: RAFTestInvoker,\n};\n","import { TEST_INVOKER_LOOKUP } from \"./test-invoker.mjs\";\n\nexport class TestRunner {\n #frame;\n #page;\n #params;\n #suite;\n #test;\n #callback;\n\n constructor(frame, page, params, suite, test, callback) {\n this.#suite = suite;\n this.#test = test;\n this.#params = params;\n this.#callback = callback;\n\n this.#page = page;\n this.#frame = frame;\n }\n\n async runTest() {\n // Prepare all mark labels outside the measuring loop.\n const suiteName = this.#suite.name;\n const testName = this.#test.name;\n const syncStartLabel = `${suiteName}.${testName}-start`;\n const syncEndLabel = `${suiteName}.${testName}-sync-end`;\n const asyncStartLabel = `${suiteName}.${testName}-async-start`;\n const asyncEndLabel = `${suiteName}.${testName}-async-end`;\n\n let syncTime;\n let asyncStartTime;\n let asyncTime;\n\n const runSync = () => {\n if (this.#params.warmupBeforeSync) {\n performance.mark(\"warmup-start\");\n const startTime = performance.now();\n // Infinite loop for the specified ms.\n while (performance.now() - startTime < this.#params.warmupBeforeSync)\n continue;\n performance.mark(\"warmup-end\");\n }\n performance.mark(syncStartLabel);\n const syncStartTime = performance.now();\n this.#test.run(this.#page);\n const syncEndTime = performance.now();\n performance.mark(syncEndLabel);\n\n syncTime = syncEndTime - syncStartTime;\n\n performance.mark(asyncStartLabel);\n asyncStartTime = performance.now();\n };\n const measureAsync = () => {\n const bodyReference = this.#frame ? this.#frame.contentDocument.body : document.body;\n const windowReference = this.#frame ? this.#frame.contentWindow : window;\n // Some browsers don't immediately update the layout for paint.\n // Force the layout here to ensure we're measuring the layout time.\n const height = bodyReference.getBoundingClientRect().height;\n windowReference._unusedHeightValue = height; // Prevent dead code elimination.\n\n const asyncEndTime = performance.now();\n performance.mark(asyncEndLabel);\n\n asyncTime = asyncEndTime - asyncStartTime;\n\n if (this.#params.warmupBeforeSync)\n performance.measure(\"warmup\", \"warmup-start\", \"warmup-end\");\n performance.measure(`${suiteName}.${testName}-sync`, syncStartLabel, syncEndLabel);\n performance.measure(`${suiteName}.${testName}-async`, asyncStartLabel, asyncEndLabel);\n };\n\n const report = () => this.#callback(this.#test, syncTime, asyncTime);\n const invokerClass = TEST_INVOKER_LOOKUP[this.#params.measurementMethod];\n const invoker = new invokerClass(runSync, measureAsync, report, this.#params);\n\n return invoker.start();\n }\n}\n","class Params {\n viewport = {\n width: 800,\n height: 600,\n };\n // Enable a detailed developer menu to change the current Params.\n developerMode = false;\n startAutomatically = false;\n iterationCount = 10;\n suites = [];\n // A list of tags to filter suites\n tags = [];\n // Toggle running a dummy suite once before the normal test suites.\n useWarmupSuite = false;\n // Change how a test measurement is triggered and async time is measured:\n // \"timer\": The classic (as in Speedometer 2.x) way using setTimeout\n // \"raf\": Using rAF callbacks, both for triggering the sync part and for measuring async time.\n measurementMethod = \"raf\"; // or \"timer\"\n // Wait time before the sync step in ms.\n waitBeforeSync = 0;\n // Warmup time before the sync step in ms.\n warmupBeforeSync = 0;\n // Seed for shuffling the execution order of suites.\n // \"off\": do not shuffle\n // \"generate\": generate a random seed\n // : use the provided integer as a seed\n shuffleSeed = \"off\";\n\n constructor(searchParams = undefined) {\n if (searchParams)\n this._copyFromSearchParams(searchParams);\n if (!this.developerMode) {\n Object.freeze(this.viewport);\n Object.freeze(this);\n }\n }\n\n _parseInt(value, errorMessage) {\n const number = Number(value);\n if (!Number.isInteger(number) && errorMessage)\n throw new Error(`Invalid ${errorMessage} param: '${value}', expected int.`);\n return parseInt(number);\n }\n\n _copyFromSearchParams(searchParams) {\n this.viewport = this._parseViewport(searchParams);\n this.startAutomatically = this._parseBooleanParam(searchParams, \"startAutomatically\");\n this.iterationCount = this._parseIntParam(searchParams, \"iterationCount\", 1);\n this.suites = this._parseSuites(searchParams);\n this.tags = this._parseTags(searchParams);\n this.developerMode = this._parseBooleanParam(searchParams, \"developerMode\");\n this.useWarmupSuite = this._parseBooleanParam(searchParams, \"useWarmupSuite\");\n this.waitBeforeSync = this._parseIntParam(searchParams, \"waitBeforeSync\", 0);\n this.warmupBeforeSync = this._parseIntParam(searchParams, \"warmupBeforeSync\", 0);\n this.measurementMethod = this._parseMeasurementMethod(searchParams);\n this.shuffleSeed = this._parseShuffleSeed(searchParams);\n\n const unused = Array.from(searchParams.keys());\n if (unused.length > 0)\n console.error(\"Got unused search params\", unused);\n }\n\n _parseBooleanParam(searchParams, paramKey) {\n if (!searchParams.has(paramKey))\n return false;\n searchParams.delete(paramKey);\n return true;\n }\n\n _parseIntParam(searchParams, paramKey, minValue) {\n if (!searchParams.has(paramKey))\n return defaultParams[paramKey];\n\n const parsedValue = this._parseInt(searchParams.get(paramKey), \"waitBeforeSync\");\n if (parsedValue < minValue)\n throw new Error(`Invalid ${paramKey} param: '${parsedValue}', value must be >= ${minValue}.`);\n searchParams.delete(paramKey);\n return parsedValue;\n }\n\n _parseViewport(searchParams) {\n if (!searchParams.has(\"viewport\"))\n return defaultParams.viewport;\n const viewportParam = searchParams.get(\"viewport\");\n const [width, height] = viewportParam.split(\"x\");\n const viewport = {\n width: this._parseInt(width, \"viewport.width\"),\n height: this._parseInt(height, \"viewport.height\"),\n };\n if (this.viewport.width < 800 || this.viewport.height < 600)\n throw new Error(`Invalid viewport param: ${viewportParam}`);\n searchParams.delete(\"viewport\");\n return viewport;\n }\n\n _parseSuites(searchParams) {\n if (searchParams.has(\"suite\") || searchParams.has(\"suites\")) {\n if (searchParams.has(\"suite\") && searchParams.has(\"suites\"))\n throw new Error(\"Params 'suite' and 'suites' can not be used together.\");\n const value = searchParams.get(\"suite\") || searchParams.get(\"suites\");\n const suites = value.split(\",\");\n if (suites.length === 0)\n throw new Error(\"No suites selected\");\n searchParams.delete(\"suite\");\n searchParams.delete(\"suites\");\n return suites;\n }\n return defaultParams.suites;\n }\n\n _parseTags() {\n if (!searchParams.has(\"tags\"))\n return defaultParams.tags;\n if (this.suites.length)\n throw new Error(\"'suites' and 'tags' cannot be used together.\");\n const tags = searchParams.get(\"tags\").split(\",\");\n searchParams.delete(\"tags\");\n return tags;\n }\n\n _parseMeasurementMethod(searchParams) {\n if (!searchParams.has(\"measurementMethod\"))\n return defaultParams.measurementMethod;\n const measurementMethod = searchParams.get(\"measurementMethod\");\n if (measurementMethod !== \"timer\" && measurementMethod !== \"raf\")\n throw new Error(`Invalid measurement method: '${measurementMethod}', must be either 'raf' or 'timer'.`);\n searchParams.delete(\"measurementMethod\");\n return measurementMethod;\n }\n\n _parseShuffleSeed(searchParams) {\n if (!searchParams.has(\"shuffleSeed\"))\n return defaultParams.shuffleSeed;\n let shuffleSeed = searchParams.get(\"shuffleSeed\");\n if (shuffleSeed !== \"off\") {\n if (shuffleSeed === \"generate\") {\n shuffleSeed = Math.floor((Math.random() * 1) << 16);\n console.log(`Generated a random suite order seed: ${shuffleSeed}`);\n } else {\n shuffleSeed = parseInt(shuffleSeed);\n }\n if (!Number.isInteger(shuffleSeed))\n throw new Error(`Invalid shuffle seed: '${shuffleSeed}', must be either 'off', 'generate' or an integer.`);\n }\n searchParams.delete(\"shuffleSeed\");\n return shuffleSeed;\n }\n\n toSearchParams(forRemote = false) {\n const rawParams = { ...this };\n rawParams[\"viewport\"] = `${this.viewport.width}x${this.viewport.height}`;\n\n if (forRemote) {\n delete rawParams[\"suites\"];\n delete rawParams[\"tags\"];\n }\n return new URLSearchParams(rawParams).toString();\n }\n}\n\nexport const defaultParams = new Params();\n\nconst searchParams = new URLSearchParams(window.location.search);\nlet maybeCustomParams = new Params();\ntry {\n maybeCustomParams = new Params(searchParams);\n} catch (e) {\n console.error(\"Invalid URL Param\", e, \"\\nUsing defaults as fallback:\", maybeCustomParams);\n alert(`Invalid URL Param: ${e}`);\n}\nexport const params = maybeCustomParams;\n","/*\n This is loaded by the remote test page and provides utilities & client-side communication with the test runner.\n*/\n\nimport { TestRunner } from \"./test-runner.mjs\";\nimport { params } from \"./params.mjs\";\n\n/**\n * BenchmarkTestStep\n *\n * A single test step, with a common interface to interact with.\n */\nexport class BenchmarkTestStep {\n constructor(name, run) {\n this.name = name;\n this.run = run;\n }\n\n async runAndRecord(params, suite, test, callback) {\n const testRunner = new TestRunner(null, null, params, suite, test, callback);\n const result = await testRunner.runTest();\n return result;\n }\n}\n\n/**\n * BenchmarkTestSuite\n *\n * A single test suite that contains one or more test steps.\n */\nexport class BenchmarkTestSuite {\n constructor(name, tests) {\n this.name = name;\n this.tests = tests;\n }\n\n record(_test, syncTime, asyncTime) {\n const total = syncTime + asyncTime;\n const results = {\n tests: { Sync: syncTime, Async: asyncTime },\n total: total,\n };\n\n return results;\n }\n\n async runAndRecord(params, onProgress) {\n const measuredValues = {\n tests: {},\n total: 0,\n };\n const suiteStartLabel = `suite-${this.name}-start`;\n const suiteEndLabel = `suite-${this.name}-end`;\n\n performance.mark(suiteStartLabel);\n\n for (const test of this.tests) {\n const result = await test.runAndRecord(params, this, test, this.record);\n measuredValues.tests[test.name] = result;\n measuredValues.total += result.total;\n onProgress?.(test.name);\n }\n\n performance.mark(suiteEndLabel);\n performance.measure(`suite-${this.name}`, suiteStartLabel, suiteEndLabel);\n\n return {\n type: \"suite-tests-complete\",\n status: \"success\",\n result: measuredValues,\n suitename: this.name,\n };\n }\n}\n\n/**\n * BenchmarkSuitesManager\n *\n * A collection of test suites for a single workload.\n */\nexport class BenchmarkSuitesManager {\n constructor(name, suites) {\n this.name = name;\n this.suites = suites;\n }\n\n getSuiteByName(name) {\n return this.suites.find((suite) => suite.name === name);\n }\n}\n\n/**\n * Helper Methods\n *\n * Various methods that are extracted from the Page class.\n */\nexport function getParent(lookupStartNode, path) {\n lookupStartNode = lookupStartNode.shadowRoot ?? lookupStartNode;\n const parent = path.reduce((root, selector) => {\n const node = root.querySelector(selector);\n return node.shadowRoot ?? node;\n }, lookupStartNode);\n\n return parent;\n}\n\nexport function getElement(selector, path = [], lookupStartNode = document) {\n const element = getParent(lookupStartNode, path).querySelector(selector);\n return element;\n}\n\nexport function getAllElements(selector, path = [], lookupStartNode = document) {\n const elements = Array.from(getParent(lookupStartNode, path).querySelectorAll(selector));\n return elements;\n}\n\nexport function forceLayout() {\n const rect = document.body.getBoundingClientRect();\n const e = document.elementFromPoint((rect.width / 2) | 0, (rect.height / 2) | 0);\n return e;\n}\n\n/** **********************************************************************\n * Benchmark Connector\n *\n * postMessage is used to communicate between app and benchmark.\n * When the app os ready, an 'app-ready' message is sent to signal that the app can receive instructions.\n *\n * A prepare script within the apps appends window.name and window.version from the package.json file.\n * The appId is build by appending name-version\n * It's used as an additional safe-guard to ensure the correct app responds to a message.\n *************************************************************************/\nexport function connectFromRemote(name, version) {\n const appId = name && version ? `${name}-${version}` : -1;\n\n function sendMessage(message) {\n window.top.postMessage(message, \"*\");\n }\n\n window.onmessage = async (event) => {\n // ensure we only let legit functions run...\n if (event.data.id !== appId || event.data.key !== \"benchmark-connector\")\n return;\n\n switch (event.data.type) {\n case \"benchmark-suite\":\n // eslint-disable-next-line no-case-declarations\n const { result } = await window.benchmarkSuitesManager.getSuiteByName(event.data.name).runAndRecord(params, (test) => sendMessage({ type: \"step-complete\", status: \"success\", appId, name, test }));\n sendMessage({ type: \"suite-complete\", status: \"success\", appId, result });\n break;\n }\n };\n\n // Initialize the workload\n sendMessage({ type: \"app-ready\", status: \"success\", appId });\n}\n","import \"./style.css\";\nimport { setupCounter } from \"./counter.js\";\nimport { BenchmarkTestStep, BenchmarkTestSuite, BenchmarkSuitesManager, forceLayout, getElement, connectFromRemote } from \"speedometer/resources/workload-testing-utils.mjs\";\n\nwindow.benchmarkSuitesManager = new BenchmarkSuitesManager(window.name, [\n new BenchmarkTestSuite(\"default\", [\n new BenchmarkTestStep(\"Click counter (1000)\", () => {\n for (let i = 0; i < 1000; i++) {\n getElement(\"#counter\").click();\n forceLayout();\n }\n }),\n new BenchmarkTestStep(\"Click counter (5000)\", () => {\n for (let i = 0; i < 5000; i++) {\n getElement(\"#counter\").click();\n forceLayout();\n }\n }),\n ]),\n]);\n\ndocument.querySelector(\"#app\").innerHTML = `\n
\n

Hello Vite!

\n
\n \n
\n

\n Click on the Vite logo to learn more\n

\n
\n`;\n\nsetupCounter(document.querySelector(\"#counter\"));\n\nconnectFromRemote(\"remote-hello-world\", 1);\n"],"names":["params","searchParams","_test"],"mappings":"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"} \ No newline at end of file diff --git a/resources/remote-helloworld/dist/assets/index-Dev1YoUL.js.map b/resources/remote-helloworld/dist/assets/index-Dev1YoUL.js.map deleted file mode 100644 index 432650cde..000000000 --- a/resources/remote-helloworld/dist/assets/index-Dev1YoUL.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"index-Dev1YoUL.js","sources":["../../counter.js","../../../test-invoker.mjs","../../../test-runner.mjs","../../../workload-testing-utils.mjs","../../main.js"],"sourcesContent":["export function setupCounter(element) {\n let counter = 0;\n const setCounter = (count) => {\n counter = count;\n element.innerHTML = `count is ${counter}`;\n };\n element.addEventListener(\"click\", () => setCounter(counter + 1));\n setCounter(0);\n}\n","class TestInvoker {\n constructor(syncCallback, asyncCallback, reportCallback, params) {\n this._syncCallback = syncCallback;\n this._asyncCallback = asyncCallback;\n this._reportCallback = reportCallback;\n this._params = params;\n }\n}\n\nexport class TimerTestInvoker extends TestInvoker {\n start() {\n return new Promise((resolve) => {\n setTimeout(() => {\n this._syncCallback();\n setTimeout(() => {\n this._asyncCallback();\n requestAnimationFrame(async () => {\n const result = await this._reportCallback();\n resolve(result);\n });\n }, 0);\n }, this._params.waitBeforeSync);\n });\n }\n}\n\nexport class RAFTestInvoker extends TestInvoker {\n start() {\n return new Promise((resolve) => {\n if (this._params.waitBeforeSync) setTimeout(() => this._scheduleCallbacks(resolve), this._params.waitBeforeSync);\n else this._scheduleCallbacks(resolve);\n });\n }\n\n _scheduleCallbacks(resolve) {\n requestAnimationFrame(() => this._syncCallback());\n requestAnimationFrame(() => {\n setTimeout(() => {\n this._asyncCallback();\n setTimeout(async () => {\n const result = await this._reportCallback();\n resolve(result);\n }, 0);\n }, 0);\n });\n }\n}\n\nexport const TEST_INVOKER_LOOKUP = {\n __proto__: null,\n timer: TimerTestInvoker,\n raf: RAFTestInvoker,\n};\n","import { TEST_INVOKER_LOOKUP } from \"./test-invoker.mjs\";\n\nexport class TestRunner {\n #frame;\n #page;\n #params;\n #suite;\n #test;\n #callback;\n\n constructor(frame, page, params, suite, test, callback) {\n this.#suite = suite;\n this.#test = test;\n this.#params = params;\n this.#callback = callback;\n\n this.#page = page;\n this.#frame = frame;\n }\n\n async runTest() {\n // Prepare all mark labels outside the measuring loop.\n const suiteName = this.#suite.name;\n const testName = this.#test.name;\n const syncStartLabel = `${suiteName}.${testName}-start`;\n const syncEndLabel = `${suiteName}.${testName}-sync-end`;\n const asyncStartLabel = `${suiteName}.${testName}-async-start`;\n const asyncEndLabel = `${suiteName}.${testName}-async-end`;\n\n let syncTime;\n let asyncStartTime;\n let asyncTime;\n\n const runSync = () => {\n if (this.#params.warmupBeforeSync) {\n performance.mark(\"warmup-start\");\n const startTime = performance.now();\n // Infinite loop for the specified ms.\n while (performance.now() - startTime < this.#params.warmupBeforeSync) continue;\n performance.mark(\"warmup-end\");\n }\n performance.mark(syncStartLabel);\n const syncStartTime = performance.now();\n this.#test.run(this.#page);\n const syncEndTime = performance.now();\n performance.mark(syncEndLabel);\n\n syncTime = syncEndTime - syncStartTime;\n\n performance.mark(asyncStartLabel);\n asyncStartTime = performance.now();\n };\n const measureAsync = () => {\n const bodyReference = this.#frame ? this.#frame.contentDocument.body : document.body;\n const windowReference = this.#frame ? this.#frame.contentWindow : window;\n // Some browsers don't immediately update the layout for paint.\n // Force the layout here to ensure we're measuring the layout time.\n const height = bodyReference.getBoundingClientRect().height;\n windowReference._unusedHeightValue = height; // Prevent dead code elimination.\n\n const asyncEndTime = performance.now();\n performance.mark(asyncEndLabel);\n\n asyncTime = asyncEndTime - asyncStartTime;\n\n if (this.#params.warmupBeforeSync) performance.measure(\"warmup\", \"warmup-start\", \"warmup-end\");\n performance.measure(`${suiteName}.${testName}-sync`, syncStartLabel, syncEndLabel);\n performance.measure(`${suiteName}.${testName}-async`, asyncStartLabel, asyncEndLabel);\n };\n\n const report = () => this.#callback(this.#test, syncTime, asyncTime);\n const invokerClass = TEST_INVOKER_LOOKUP[this.#params.measurementMethod];\n const invoker = new invokerClass(runSync, measureAsync, report, this.#params);\n\n return invoker.start();\n }\n}\n","/*\n This is loaded by the remote test page and provides utilities & client-side communication with the test runner.\n*/\n\nimport { TestRunner } from \"./test-runner.mjs\";\n\n\n/**\n * BenchmarkTestStep\n *\n * A single test step, with a common interface to interact with.\n */\nexport class BenchmarkTestStep {\n constructor(name, run) {\n this.name = name;\n this.run = run;\n }\n\n async runAndRecord(params, suite, test, callback) {\n const testRunner = new TestRunner(null, null, params, suite, test, callback);\n const result = await testRunner.runTest();\n return result;\n }\n}\n\n/**\n * BenchmarkTestSuite\n *\n * A single test suite that contains one or more test steps.\n */\nexport class BenchmarkTestSuite {\n constructor(name, tests) {\n this.name = name;\n this.tests = tests;\n }\n\n record(_test, syncTime, asyncTime) {\n const total = syncTime + asyncTime;\n const results = {\n tests: { Sync: syncTime, Async: asyncTime },\n total: total,\n };\n\n return results;\n }\n\n async runAndRecord(params, onProgress) {\n const measuredValues = {\n tests: {},\n total: 0,\n };\n const suiteStartLabel = `suite-${this.name}-start`;\n const suiteEndLabel = `suite-${this.name}-end`;\n\n performance.mark(suiteStartLabel);\n\n for (const test of this.tests) {\n const result = await test.runAndRecord(params, this, test, this.record);\n measuredValues.tests[test.name] = result;\n measuredValues.total += result.total;\n onProgress?.(test.name);\n }\n\n performance.mark(suiteEndLabel);\n performance.measure(`suite-${this.name}`, suiteStartLabel, suiteEndLabel);\n\n return {\n type: \"suite-tests-complete\",\n status: \"success\",\n result: measuredValues,\n suitename: this.name,\n };\n }\n}\n\n/**\n * BenchmarkSuitesManager\n *\n * A collection of test suites for a single workload.\n */\nexport class BenchmarkSuitesManager {\n constructor(name, suites) {\n this.name = name;\n this.suites = suites;\n }\n\n getSuiteByName(name) {\n return this.suites.find((suite) => suite.name === name);\n }\n}\n\n/** **********************************************************************\n * Params\n *\n * All params are now forwarded from the benchmark to the workload, via its url.\n * To ensure we're handling any used params the same way as the benchmark,\n * we are converting the values to their native type.\n *************************************************************************/\nfunction isBoolean(value) {\n if (value === \"true\" || value === \"false\")\n return true;\n\n return false;\n}\n\nfunction isNumber(value) {\n const number = Number(value);\n return Number.isInteger(number);\n}\n\nfunction convertToBoolean(value) {\n if (value === \"true\")\n return true;\n\n if (value === \"false\")\n return false;\n\n return value;\n}\n\nfunction convertToNumber(value) {\n return Number(value);\n}\n\nfunction getConvertedValue(value) {\n if (isBoolean(value))\n return convertToBoolean(value);\n\n if (isNumber(value))\n return convertToNumber(value);\n\n return value;\n}\n\nfunction getParams(value) {\n const params = Object.create(null);\n const searchParams = new URLSearchParams(value);\n\n for (const entry of searchParams.entries()) {\n const [key, value] = entry;\n params[key] = getConvertedValue(value);\n }\n\n return Object.freeze(params);\n}\n\n/**\n * Helper Methods\n *\n * Various methods that are extracted from the Page class.\n */\nexport function getParent(lookupStartNode, path) {\n lookupStartNode = lookupStartNode.shadowRoot ?? lookupStartNode;\n const parent = path.reduce((root, selector) => {\n const node = root.querySelector(selector);\n return node.shadowRoot ?? node;\n }, lookupStartNode);\n\n return parent;\n}\n\nexport function getElement(selector, path = [], lookupStartNode = document) {\n const element = getParent(lookupStartNode, path).querySelector(selector);\n return element;\n}\n\nexport function getAllElements(selector, path = [], lookupStartNode = document) {\n const elements = Array.from(getParent(lookupStartNode, path).querySelectorAll(selector));\n return elements;\n}\n\nexport function forceLayout() {\n const rect = document.body.getBoundingClientRect();\n const e = document.elementFromPoint((rect.width / 2) | 0, (rect.height / 2) | 0);\n return e;\n}\n\n/** **********************************************************************\n * Benchmark Connector\n *\n * postMessage is used to communicate between app and benchmark.\n * When the app os ready, an 'app-ready' message is sent to signal that the app can receive instructions.\n *\n * A prepare script within the apps appends window.name and window.version from the package.json file.\n * The appId is build by appending name-version\n * It's used as an additional safe-guard to ensure the correct app responds to a message.\n *************************************************************************/\nexport function connectFromRemote(name, version) {\n const appId = name && version ? `${name}-${version}` : -1;\n\n function sendMessage(message) {\n window.top.postMessage(message, \"*\");\n }\n\n window.onmessage = async (event) => {\n // ensure we only let legit functions run...\n if (event.data.id !== appId || event.data.key !== \"benchmark-connector\")\n return;\n\n switch (event.data.type) {\n case \"benchmark-suite\":\n // eslint-disable-next-line no-case-declarations\n const params = getParams(window.location.search);\n // eslint-disable-next-line no-case-declarations\n const { result } = await window.benchmarkSuitesManager.getSuiteByName(event.data.name).runAndRecord(params, (test) => sendMessage({ type: \"step-complete\", status: \"success\", appId, name, test }));\n sendMessage({ type: \"suite-complete\", status: \"success\", appId, result });\n break;\n }\n };\n\n // Initialize the workload\n sendMessage({ type: \"app-ready\", status: \"success\", appId });\n}\n","import \"./style.css\";\nimport { setupCounter } from \"./counter.js\";\nimport { BenchmarkTestStep, BenchmarkTestSuite, BenchmarkSuitesManager, forceLayout, getElement, connectFromRemote } from \"speedometer/resources/workload-testing-utils.mjs\";\n\nwindow.benchmarkSuitesManager = new BenchmarkSuitesManager(window.name, [\n new BenchmarkTestSuite(\"default\", [\n new BenchmarkTestStep(\"Click counter (1000)\", () => {\n for (let i = 0; i < 1000; i++) {\n getElement(\"#counter\").click();\n forceLayout();\n }\n }),\n new BenchmarkTestStep(\"Click counter (5000)\", () => {\n for (let i = 0; i < 5000; i++) {\n getElement(\"#counter\").click();\n forceLayout();\n }\n }),\n ]),\n]);\n\ndocument.querySelector(\"#app\").innerHTML = `\n
\n

Hello Vite!

\n
\n \n
\n

\n Click on the Vite logo to learn more\n

\n
\n`;\n\nsetupCounter(document.querySelector(\"#counter\"));\n\nconnectFromRemote(\"remote-hello-world\", 1);\n"],"names":["_test","value"],"mappings":"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"} \ No newline at end of file diff --git a/resources/remote-helloworld/dist/index.html b/resources/remote-helloworld/dist/index.html index 596e17a38..911741f1f 100644 --- a/resources/remote-helloworld/dist/index.html +++ b/resources/remote-helloworld/dist/index.html @@ -5,7 +5,7 @@ Vite App - + diff --git a/resources/suite-runner.mjs b/resources/suite-runner.mjs index 764084924..5bde39949 100644 --- a/resources/suite-runner.mjs +++ b/resources/suite-runner.mjs @@ -98,7 +98,7 @@ export class SuiteRunner { const frame = this.#frame; frame.onload = () => resolve(); frame.onerror = () => reject(); - frame.src = `${this.#suite.url}?${this.#params.toSearchParams()}`; + frame.src = `${this.#suite.url}?${this.#params.toSearchParams(true)}`; }); } diff --git a/resources/workload-testing-utils.mjs b/resources/workload-testing-utils.mjs index b0aae5197..9485b83c8 100644 --- a/resources/workload-testing-utils.mjs +++ b/resources/workload-testing-utils.mjs @@ -3,6 +3,7 @@ */ import { TestRunner } from "./test-runner.mjs"; +import { params } from "./params.mjs"; /** * BenchmarkTestStep @@ -88,61 +89,6 @@ export class BenchmarkSuitesManager { } } -/** ********************************************************************** - * Params - * - * All params are now forwarded from the benchmark to the workload, via its url. - * To ensure we're handling any used params the same way as the benchmark, - * we are converting the values to their native type. - *************************************************************************/ -function isBoolean(value) { - if (value === "true" || value === "false") - return true; - - return false; -} - -function isNumber(value) { - const number = Number(value); - return Number.isInteger(number); -} - -function convertToBoolean(value) { - if (value === "true") - return true; - - if (value === "false") - return false; - - return value; -} - -function convertToNumber(value) { - return Number(value); -} - -function getConvertedValue(value) { - if (isBoolean(value)) - return convertToBoolean(value); - - if (isNumber(value)) - return convertToNumber(value); - - return value; -} - -function getParams(value) { - const params = Object.create(null); - const searchParams = new URLSearchParams(value); - - for (const entry of searchParams.entries()) { - const [key, value] = entry; - params[key] = getConvertedValue(value); - } - - return Object.freeze(params); -} - /** * Helper Methods * @@ -198,8 +144,6 @@ export function connectFromRemote(name, version) { switch (event.data.type) { case "benchmark-suite": - // eslint-disable-next-line no-case-declarations - const params = getParams(window.location.search); // eslint-disable-next-line no-case-declarations const { result } = await window.benchmarkSuitesManager.getSuiteByName(event.data.name).runAndRecord(params, (test) => sendMessage({ type: "step-complete", status: "success", appId, name, test })); sendMessage({ type: "suite-complete", status: "success", appId, result });