Bug 1050376 - Test docshell recording of restyle/reflow/paint; r=smaug

This commit is contained in:
Patrick Brosset 2014-09-09 20:54:12 +02:00
Родитель fb1884e4ec
Коммит 41b6ab8ebe
3 изменённых файлов: 175 добавлений и 0 удалений

Просмотреть файл

@ -100,3 +100,6 @@ skip-if = e10s # Bug ?????? - event handler checks event.target is the content d
skip-if = e10s
[browser_search_notification.js]
skip-if = e10s
[browser_timelineMarkers-01.js]
[browser_timelineMarkers-02.js]
skip-if = e10s # Bug 1064848

Просмотреть файл

@ -0,0 +1,50 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
// Test that the docShell has the right profile timeline API
let test = Task.async(function*() {
waitForExplicitFinish();
yield openUrl("data:text/html;charset=utf-8,Test page");
let docShell = content.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIWebNavigation)
.QueryInterface(Ci.nsIDocShell);
ok("recordProfileTimelineMarkers" in docShell,
"The recordProfileTimelineMarkers attribute exists");
ok("popProfileTimelineMarkers" in docShell,
"The popProfileTimelineMarkers function exists");
ok(docShell.recordProfileTimelineMarkers === false,
"recordProfileTimelineMarkers is false by default");
ok(docShell.popProfileTimelineMarkers().length === 0,
"There are no markers by default");
docShell.recordProfileTimelineMarkers = true;
ok(docShell.recordProfileTimelineMarkers === true,
"recordProfileTimelineMarkers can be set to true");
docShell.recordProfileTimelineMarkers = false;
ok(docShell.recordProfileTimelineMarkers === false,
"recordProfileTimelineMarkers can be set to false");
gBrowser.removeCurrentTab();
finish();
});
function openUrl(url) {
return new Promise(function(resolve, reject) {
window.focus();
let tab = window.gBrowser.selectedTab = window.gBrowser.addTab(url);
let linkedBrowser = tab.linkedBrowser;
linkedBrowser.addEventListener("load", function onload() {
linkedBrowser.removeEventListener("load", onload, true);
resolve(tab);
}, true);
});
}

Просмотреть файл

@ -0,0 +1,122 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
// Test that the docShell profile timeline API returns the right markers when
// restyles, reflows and paints occur
let URL = '<!DOCTYPE html><style>' +
'div {width:100px;height:100px;background:red;} ' +
'.resize-change-color {width:50px;height:50px;background:blue;} ' +
'.change-color {width:50px;height:50px;background:yellow;} ' +
'.add-class {}' +
'</style><div></div>';
let TESTS = [{
desc: "Changing the width of the test element",
setup: function(div) {
div.setAttribute("class", "resize-change-color");
},
check: function(markers) {
ok(markers.length > 0, "markers were returned");
console.log(markers);
ok(markers.some(m => m.name == "Reflow"), "markers includes Reflow");
ok(markers.some(m => m.name == "Paint"), "markers includes Paint");
ok(markers.some(m => m.name == "Styles"), "markers includes Restyle");
}
}, {
desc: "Changing the test element's background color",
setup: function(div) {
div.setAttribute("class", "change-color");
},
check: function(markers) {
ok(markers.length > 0, "markers were returned");
ok(!markers.some(m => m.name == "Reflow"), "markers doesn't include Reflow");
ok(markers.some(m => m.name == "Paint"), "markers includes Paint");
ok(markers.some(m => m.name == "Styles"), "markers includes Restyle");
}
}, {
desc: "Changing the test element's classname",
setup: function(div) {
div.setAttribute("class", "change-color add-class");
},
check: function(markers) {
ok(markers.length > 0, "markers were returned");
ok(!markers.some(m => m.name == "Reflow"), "markers doesn't include Reflow");
ok(!markers.some(m => m.name == "Paint"), "markers doesn't include Paint");
ok(markers.some(m => m.name == "Styles"), "markers includes Restyle");
}
}];
let test = Task.async(function*() {
waitForExplicitFinish();
yield openUrl("data:text/html;charset=utf8," + encodeURIComponent(URL));
let docShell = content.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIWebNavigation)
.QueryInterface(Ci.nsIDocShell);
let div = content.document.querySelector("div");
info("Start recording");
docShell.recordProfileTimelineMarkers = true;
for (let {desc, setup, check} of TESTS) {
info("Running test: " + desc);
info("Flushing the previous markers if any");
docShell.popProfileTimelineMarkers();
info("Running the test setup function");
let onMarkers = waitForMarkers(docShell);
setup(div);
info("Waiting for new markers on the docShell");
let markers = yield onMarkers;
info("Running the test check function");
check(markers);
}
info("Stop recording");
docShell.recordProfileTimelineMarkers = false;
gBrowser.removeCurrentTab();
finish();
});
function openUrl(url) {
return new Promise(function(resolve, reject) {
window.focus();
let tab = window.gBrowser.selectedTab = window.gBrowser.addTab(url);
let linkedBrowser = tab.linkedBrowser;
linkedBrowser.addEventListener("load", function onload() {
linkedBrowser.removeEventListener("load", onload, true);
resolve(tab);
}, true);
});
}
function waitForMarkers(docshell) {
return new Promise(function(resolve, reject) {
let waitIterationCount = 0;
let maxWaitIterationCount = 10; // Wait for 2sec maximum
let interval = setInterval(() => {
let markers = docshell.popProfileTimelineMarkers();
if (markers.length > 0) {
clearInterval(interval);
resolve(markers);
}
if (waitIterationCount > maxWaitIterationCount) {
clearInterval(interval);
resolve([]);
}
waitIterationCount++;
}, 200);
});
}