blob: a452306cbd4e455d8693c8dabe42956431d95138 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<script src="../../http/tests/inspector/resources/protocol-test.js"></script>
<script>
function bar(x)
{
return x * 10;
}
function foo() {
bar(42);
}
function load() {
document.querySelector("#button").addEventListener("click", (event) => {
foo();
});
runTest();
}
function willCallFunctionTest() {
console.profile();
document.querySelector("#button").click();
console.profileEnd();
}
function willEvaluateScriptTest() {
console.profile();
foo();
console.profileEnd();
}
function test()
{
let suite = ProtocolTest.createAsyncSuite("Timeline.LineColumn");
InspectorProtocol.sendCommand("Page.enable", {});
InspectorProtocol.sendCommand("Timeline.enable");
// To avoid flakiness print only events that we always expect.
const eventAllowlist = new Set(["RenderingFrame", "ConsoleProfile", "EventDispatch", "FunctionCall"]);
// The inspector injected script call frame(s) have different line numbers between release and debug builds. We only
// want to filter those values for those specific call frames in order to ensure other line/column numbers remain stable.
let functionNameLength = 0;
let urlLength = 0;
function replacer(key, value) {
if (key === "functionName") {
functionNameLength = value.length;
return value;
}
if (key === "children" && this.startTime)
return value.filter(e => eventAllowlist.has(e.type));
if (key === "startTime" || key === "endTime" || key === "scriptId" || key === "frameId")
return "<filtered>";
if ((key === "lineNumber" || key === "columnNumber") && !functionNameLength && !urlLength)
return "<filtered>";
if (key === "url")
urlLength = value.length;
if (key === "url" || key === "scriptName")
return value.replace(/^.+LayoutTests\/inspector\//, "");
return value;
}
const tests = [
{
name: "Timeline.LineColumn.willCallFunction",
description: "Test that column numbers are passed through the willCallFunction instrumentation point.",
expression: `willCallFunctionTest()`,
},
{
name: "Timeline.LineColumn.willEvaluateScript",
description: "Test that column numbers are passed through the willEvaluateScript instrumentation point.",
expression: `willEvaluateScriptTest()`,
},
];
for (let {name, description, expression} of tests) {
suite.addTestCase({
name,
description,
test(resolve, reject) {
let eventNames = [];
function handleEvent(eventName, handler) {
eventNames.push(eventName);
InspectorProtocol.eventHandler[eventName] = handler;
}
handleEvent("Timeline.eventRecorded", (event) => {
ProtocolTest.log(JSON.stringify(event.params.record, replacer, 2));
});
handleEvent("Timeline.recordingStarted", () => {
ProtocolTest.pass("Capturing started.");
});
handleEvent("Timeline.recordingStopped", () => {
ProtocolTest.pass("Capturing stopped.");
for (let eventName of eventNames)
delete InspectorProtocol.eventHandler[eventName];
resolve();
});
ProtocolTest.log("Evaluating in page...");
ProtocolTest.evaluateInPage(expression)
.catch(reject);
},
});
}
suite.runTestCasesAndFinish();
}
</script>
</head>
<body onload="load()">
<p>Test that script Timeline records have column numbers.</p>
<button id="button"></button>
</body>
</html>