| <!DOCTYPE html> | |
| <meta charset="utf-8"> | |
| <title>Console Timing Methods - Automated Test</title> | |
| <link rel="help" href="https://console.spec.whatwg.org/#timing"> | |
| <meta name="assert" content="Console timing methods emit observable log entries via WebDriver BiDi log.entryAdded"> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <script src="/resources/testdriver.js?feature=bidi"></script> | |
| <script src="/resources/testdriver-vendor.js"></script> | |
| <script src="/console/helper.js"></script> | |
| <script> | |
| function escapeRegExp(s) { | |
| return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); | |
| } | |
| function hasStringArg(entry, expected) { | |
| if (!Array.isArray(entry.args)) | |
| return false; | |
| return entry.args.some(arg => | |
| arg && arg.type === "string" && arg.value === expected | |
| ); | |
| } | |
| function isTimingLine(message) { | |
| return message.startsWith("default:") || | |
| message.startsWith("custom toString():") || | |
| message.startsWith("a label:"); | |
| } | |
| function assertLabelledDuration(message, label) { | |
| const re = new RegExp("^" + escapeRegExp(label) + ":\\s*\\S"); | |
| assert_true( | |
| re.test(message), | |
| `Expected a "${label}: <duration>"-shaped message, got: "${message}"` | |
| ); | |
| } | |
| promise_test(async (t) => { | |
| const unsubscribe = await test_driver.bidi.log.entry_added.subscribe({contexts: [window]}); | |
| t.add_cleanup(async () => await unsubscribe()); | |
| const expected = [ | |
| {label: "default", extra: false}, // timeLog() | |
| {label: "default", extra: false}, // timeEnd() | |
| {label: "default", extra: false}, // timeLog(undefined) | |
| {label: "default", extra: true }, // timeLog(undefined, "extra data") | |
| {label: "default", extra: false}, // timeEnd(undefined) | |
| {label: "default", extra: false}, // timeLog("default") | |
| {label: "default", extra: true }, | |
| {label: "default", extra: false}, // timeEnd("default") | |
| {label: "default", extra: false}, // timeLog({toString:"default"}) | |
| {label: "default", extra: true }, | |
| {label: "default", extra: false}, // timeEnd({toString:"default"}) | |
| {label: "custom toString()", extra: false}, | |
| {label: "custom toString()", extra: true }, | |
| {label: "custom toString()", extra: false}, | |
| {label: "a label", extra: false}, | |
| {label: "a label", extra: true }, | |
| {label: "a label", extra: false}, | |
| ]; | |
| const entriesPromise = waitForConsoleEntries(t, { | |
| count: expected.length, | |
| accept: (entry) => | |
| typeof entry.text === "string" && isTimingLine(entry.text), | |
| }); | |
| console.time(); | |
| console.timeLog(); | |
| console.timeEnd(); | |
| console.time(undefined); | |
| console.timeLog(undefined); | |
| console.timeLog(undefined, "extra data"); | |
| console.timeEnd(undefined); | |
| console.time("default"); | |
| console.timeLog("default"); | |
| console.timeLog("default", "extra data"); | |
| console.timeEnd("default"); | |
| console.time({toString() {return "default"}}); | |
| console.timeLog({toString() {return "default"}}); | |
| console.timeLog({toString() {return "default"}}, "extra data"); | |
| console.timeEnd({toString() {return "default"}}); | |
| console.time({toString() {return "custom toString()"}}); | |
| console.timeLog({toString() {return "custom toString()"}}); | |
| console.timeLog({toString() {return "custom toString()"}}, "extra data"); | |
| console.timeEnd({toString() {return "custom toString()"}}); | |
| console.time("a label"); | |
| console.timeLog("a label"); | |
| console.timeLog("a label", "extra data"); | |
| console.timeEnd("a label"); | |
| const entries = await entriesPromise; | |
| assert_equals(entries.length, expected.length); | |
| for (let i = 0; i < expected.length; i++) { | |
| const exp = expected[i]; | |
| const entry = entries[i]; | |
| const msg = entry.text; | |
| assert_true(msg !== null, `Entry ${i} should have a message`); | |
| assertLabelledDuration(msg, exp.label); | |
| if (exp.extra) { | |
| assert_true( | |
| msg.includes("extra data") || hasStringArg(entry, "extra data"), | |
| `Entry ${i} should include extra data; got: "${msg}"` | |
| ); | |
| } | |
| } | |
| }, "Console timing methods produce observable timing log entries"); | |
| </script> |