blob: 9a546f0dd588d12cee707ac903f51a1b5095f803 [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 the instrumentation of a DecodeImage and ResizeImage events\n`);
await TestRunner.loadModule('performance_test_runner');
await TestRunner.showPanel('timeline');
await TestRunner.loadHTML(`
<style>
div {
display: inline-block;
border-style: solid;
}
div.img-container {
position: relative;
width: 99px;
height: 99px;
overflow: clip;
}
.background, .border {
width: 25px;
height: 25px;
};
.border {
border-width: 12px;
}
</style>
`);
await TestRunner.addScriptTag('../../../resources/run-after-layout-and-paint.js');
await TestRunner.evaluateInPagePromise(`
var images = [
["./resources/test.webp", "25", "25"],
["./resources/test.bmp", "25", "25"],
["./resources/test.gif", "25", "25"],
["./resources/test.ico", "25", "25"],
["./resources/test.jpg", "25", "25"],
["./resources/test.png", "25", "25"],
["./resources/big.png", "150", "150"]
];
async function showImages()
{
for (let image of images) {
await addImage(image);
await new Promise(fulfill => runAfterLayoutAndPaint(fulfill));
}
return generateFrames(3);
function addImage(image)
{
var imgContainer = document.createElement("div");
imgContainer.className = "img-container";
document.body.appendChild(imgContainer);
var imgElement = document.createElement("img");
var promise = new Promise((fulfill) => imgElement.onload = fulfill);
imgContainer.appendChild(imgElement);
var backgroundElement = document.createElement("div");
backgroundElement.className = "background";
document.body.appendChild(backgroundElement);
var borderElement = document.createElement("div");
borderElement.className = "border";
document.body.appendChild(borderElement);
imgElement.width = image[1];
imgElement.height = image[2];
imgElement.src = image[0];
backgroundElement.style.backgroundImage = "url(" + image[0] + "?background)";
borderElement.style.borderImage = "url(" + image[0] + "?border)";
return promise;
}
}
`);
PerformanceTestRunner.invokeWithTracing('showImages', TestRunner.safeWrap(onTracingComplete));
function onTracingComplete() {
function isDecodeImageEvent(event) {
return event.name === TimelineModel.TimelineModel.RecordType.DecodeImage;
}
function compareImageURLs(a, b) {
var urlA = TimelineModel.TimelineData.forEvent(a).url;
var urlB = TimelineModel.TimelineData.forEvent(b).url;
urlA = TestRunner.formatters.formatAsURL(urlA || '<missing>');
urlB = TestRunner.formatters.formatAsURL(urlB || '<missing>');
return urlA.localeCompare(urlB);
}
var events = PerformanceTestRunner.timelineModel().inspectedTargetEvents();
var sortedDecodeEvents = events.filter(isDecodeImageEvent).sort(compareImageURLs);
for (var i = 0; i < sortedDecodeEvents.length; ++i) {
var event = sortedDecodeEvents[i];
var timlelineData = TimelineModel.TimelineData.forEvent(event);
var url = timlelineData.url;
// Skip duplicate events, as long as they have the imageURL
if (i && url && url === TimelineModel.TimelineData.forEvent(sortedDecodeEvents[i - 1]).url)
continue;
TestRunner.addResult('event: ' + event.name);
TestRunner.addResult('imageURL: ' + TestRunner.formatters.formatAsURL(url));
TestRunner.addResult('backendNodeId: ' + (timlelineData.backendNodeId > 0 ? 'present' : 'absent'));
}
TestRunner.completeTest();
}
})();