blob: afc1cc73e62be90e4df64ad29e60c2e3127a6d58 [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
(async function() {
TestRunner.addResult(`Tests js cpu profile in timeline.\n`);
await TestRunner.loadModule('performance_test_runner');
await TestRunner.showPanel('timeline');
await TestRunner.evaluateInPagePromise(`
// Save references to the worker objects to make sure they are not GC'ed.
var worker1;
var worker2;
// The function ensures call stack for the current frame is captured.
function makeDOMEvent()
{
var e = document.createElement("div");
e.innerHTML = "<p>test</p>";
return e.lastChild.textContents;
}
function startFirstWorker()
{
worker1 = new Worker("resources/worker.js");
worker1.postMessage("");
return new Promise((fulfill) => worker1.onmessage = fulfill);
}
function startSecondWorker()
{
var callback;
var promise = new Promise((fulfill) => callback = fulfill);
// Make sure there is at least one trace event recorded for the first worker.
worker1.onmessage = gotResponseFromFirstWorker;
worker1.postMessage("");
makeDOMEvent();
function gotResponseFromFirstWorker()
{
worker1.onmessage = null;
worker2 = new Worker("resources/worker.js");
worker2.postMessage("");
worker2.onmessage = function(event)
{
worker2.onmessage = null;
makeDOMEvent();
callback();
}
}
return promise;
}
`);
await TestRunner.evaluateInPageAsync(`startFirstWorker()`);
PerformanceTestRunner.invokeWithTracing(
'startSecondWorker', processTracingEvents, 'disabled-by-default-devtools.timeline.stack', true);
function processTracingEvents() {
processTrack(new Set(['startSecondWorker', 'worker2.onmessage']), PerformanceTestRunner.mainTrack());
for (var track of PerformanceTestRunner.timelineModel().tracks()) {
if (track.type !== TimelineModel.TimelineModel.TrackType.Worker)
continue;
processTrack(new Set(['Function Call']), track);
}
TestRunner.completeTest();
}
function processTrack(expectedEvents, track) {
TestRunner.addResult(track.name);
var missingEvents = track.events.reduce(processEvent, expectedEvents);
if (missingEvents.size) {
TestRunner.addResult('FAIL: missing events:');
missingEvents.forEach(TestRunner.addResult);
}
}
function processEvent(expectedEvents, event) {
expectedEvents.delete(Timeline.TimelineUIUtils.eventTitle(event));
return expectedEvents;
}
})();