From ad60e750d75471d7c7f31f9f40ff233a29aba332 Mon Sep 17 00:00:00 2001 From: Anonymous <65428781+00ff0000red@users.noreply.github.com> Date: Sun, 24 Jan 2021 07:05:18 -0800 Subject: [PATCH] fix(runtime/js): use DOMException in Performance#measure (#9142) --- cli/tests/wpt.jsonc | 11 +---------- runtime/js/40_performance.js | 28 +++++++++++++++++++++------- 2 files changed, 22 insertions(+), 17 deletions(-) diff --git a/cli/tests/wpt.jsonc b/cli/tests/wpt.jsonc index 8774ca793b..7c636b68cc 100644 --- a/cli/tests/wpt.jsonc +++ b/cli/tests/wpt.jsonc @@ -164,16 +164,7 @@ "mark-errors", "mark-measure-return-objects", "mark.any", - { - "name": "measure_syntax_err", - "expectFail": [ - // TODO(lucacasonato): re-enable when #9009 is fixed. - "self.performance.measure(\"measure\", \"mark\"), where \"mark\" is a non-existent mark, throws a SyntaxError exception.", - "self.performance.measure(\"measure\", \"mark\", \"existing_mark\"), where \"mark\" is a non-existent mark, throws a SyntaxError exception.", - "self.performance.measure(\"measure\", \"existing_mark\", \"mark\"), where \"mark\" is a non-existent mark, throws a SyntaxError exception.", - "self.performance.measure(\"measure\", \"mark\", \"mark\"), where \"mark\" is a non-existent mark, throws a SyntaxError exception." - ] - }, + "measure_syntax_err", "measure-l3", "structured-serialize-detail", "user_timing_exists" diff --git a/runtime/js/40_performance.js b/runtime/js/40_performance.js index d76c3f73ac..f8f9ad7693 100644 --- a/runtime/js/40_performance.js +++ b/runtime/js/40_performance.js @@ -3,6 +3,7 @@ ((window) => { const { opNow } = window.__bootstrap.timers; const { cloneValue, illegalConstructorKey } = window.__bootstrap.webUtil; + const { requiredArguments } = window.__bootstrap.webUtil; const customInspect = Symbol.for("Deno.customInspect"); let performanceEntries = []; @@ -21,7 +22,10 @@ if (typeof mark === "string") { const entry = findMostRecent(mark, "mark"); if (!entry) { - throw new SyntaxError(`Cannot find mark: "${mark}".`); + throw new DOMException( + `Cannot find mark: "${mark}".`, + "SyntaxError", + ); } return entry.startTime; } @@ -42,9 +46,7 @@ ); } - function now() { - return opNow(); - } + const now = opNow; class PerformanceEntry { #name = ""; @@ -115,10 +117,22 @@ name, options = {}, ) { - if (typeof options !== "object") { - throw new TypeError("Invalid options"); + requiredArguments("PerformanceMark", arguments.length, 1); + + // ensure options is object-ish, or null-ish + switch (typeof options) { + case "object": // includes null + case "function": + case "undefined": { + break; + } + default: { + throw new TypeError("Invalid options"); + } } - const { detail = null, startTime = now() } = options; + + const { detail = null, startTime = now() } = options ?? {}; + super(name, "mark", startTime, 0, illegalConstructorKey); if (startTime < 0) { throw new TypeError("startTime cannot be negative");