Bug 1356271 - Make it so that it's easier to define repeating reflows for reflow tests. r=florian

MozReview-Commit-ID: 5ZL5RtItbiL

--HG--
extra : rebase_source : 93fbacfde3a9825e46c0d81bb3ad29af448551fa
extra : source : 7629e34f7fb6f756c09f0d6735b746a9d1050c5f
This commit is contained in:
Mike Conley 2017-07-10 18:07:25 -04:00
Родитель 7670733223
Коммит 5f9f0cd7f2
5 изменённых файлов: 151 добавлений и 173 удалений

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

@ -10,12 +10,15 @@
* for tips on how to do that.
*/
const EXPECTED_APPMENU_OPEN_REFLOWS = [
[
{
stack: [
"openPopup@chrome://global/content/bindings/popup.xml",
"show/</<@chrome://browser/content/customizableui/panelUI.js",
],
},
[
{
stack: [
"get_alignmentPosition@chrome://global/content/bindings/popup.xml",
"adjustArrowPosition@chrome://global/content/bindings/popup.xml",
"onxblpopupshowing@chrome://global/content/bindings/popup.xml",
@ -23,55 +26,33 @@ const EXPECTED_APPMENU_OPEN_REFLOWS = [
"show/</<@chrome://browser/content/customizableui/panelUI.js",
],
[
"get_alignmentPosition@chrome://global/content/bindings/popup.xml",
"adjustArrowPosition@chrome://global/content/bindings/popup.xml",
"onxblpopupshowing@chrome://global/content/bindings/popup.xml",
"openPopup@chrome://global/content/bindings/popup.xml",
"show/</<@chrome://browser/content/customizableui/panelUI.js",
],
times: 2, // This number should only ever go down - never up.
},
[
{
stack: [
"get_alignmentPosition@chrome://global/content/bindings/popup.xml",
"adjustArrowPosition@chrome://global/content/bindings/popup.xml",
"onxblpopuppositioned@chrome://global/content/bindings/popup.xml",
],
},
[
{
stack: [
"get_alignmentPosition@chrome://global/content/bindings/popup.xml",
"handleEvent@resource:///modules/PanelMultiView.jsm",
"openPopup@chrome://global/content/bindings/popup.xml",
],
},
[
{
stack: [
"handleEvent@resource:///modules/PanelMultiView.jsm",
"openPopup@chrome://global/content/bindings/popup.xml",
],
[
"handleEvent@resource:///modules/PanelMultiView.jsm",
"openPopup@chrome://global/content/bindings/popup.xml",
],
[
"handleEvent@resource:///modules/PanelMultiView.jsm",
"openPopup@chrome://global/content/bindings/popup.xml",
],
[
"handleEvent@resource:///modules/PanelMultiView.jsm",
"openPopup@chrome://global/content/bindings/popup.xml",
],
[
"handleEvent@resource:///modules/PanelMultiView.jsm",
"openPopup@chrome://global/content/bindings/popup.xml",
],
[
"handleEvent@resource:///modules/PanelMultiView.jsm",
"openPopup@chrome://global/content/bindings/popup.xml",
],
times: 6, // This number should only ever go down - never up.
},
];
const EXPECTED_APPMENU_SUBVIEW_REFLOWS = [
@ -84,15 +65,14 @@ const EXPECTED_APPMENU_SUBVIEW_REFLOWS = [
* If we add more views where this is necessary, we may need to duplicate
* these expected reflows further.
*/
[
{
stack: [
"descriptionHeightWorkaround@resource:///modules/PanelMultiView.jsm",
"onTransitionEnd@resource:///modules/PanelMultiView.jsm",
],
[
"descriptionHeightWorkaround@resource:///modules/PanelMultiView.jsm",
"onTransitionEnd@resource:///modules/PanelMultiView.jsm",
],
times: 2, // This number should only ever go down - never up.
},
/**
* Please don't add anything new!

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

@ -15,9 +15,11 @@
const EXPECTED_REFLOWS = [
// selection change notification may cause querying the focused editor content
// by IME and that will cause reflow.
[
{
stack: [
"select@chrome://global/content/bindings/textbox.xml",
],
}
];
/*

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

@ -10,11 +10,13 @@
* for tips on how to do that.
*/
const EXPECTED_REFLOWS = [
[
{
stack: [
"select@chrome://global/content/bindings/textbox.xml",
"focusAndSelectUrlBar@chrome://browser/content/browser.js",
"_adjustFocusAfterTabSwitch@chrome://browser/content/tabbrowser.xml",
],
}
];
/*

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

@ -13,114 +13,94 @@
* for tips on how to do that.
*/
const EXPECTED_REFLOWS = [
[
{
stack: [
"select@chrome://global/content/bindings/textbox.xml",
"focusAndSelectUrlBar@chrome://browser/content/browser.js",
"_delayedStartup@chrome://browser/content/browser.js",
],
},
];
if (Services.appinfo.OS == "Linux") {
if (gMultiProcessBrowser) {
EXPECTED_REFLOWS.push(
[
EXPECTED_REFLOWS.push({
stack: [
"handleEvent@chrome://browser/content/tabbrowser.xml",
"EventListener.handleEvent*tabbrowser-tabs_XBL_Constructor@chrome://browser/content/tabbrowser.xml",
],
);
});
} else {
EXPECTED_REFLOWS.push(
[
EXPECTED_REFLOWS.push({
stack: [
"handleEvent@chrome://browser/content/tabbrowser.xml",
"inferFromText@chrome://browser/content/browser.js",
"handleEvent@chrome://browser/content/browser.js",
],
);
});
}
}
if (Services.appinfo.OS == "Darwin") {
EXPECTED_REFLOWS.push(
[
EXPECTED_REFLOWS.push({
stack: [
"handleEvent@chrome://browser/content/tabbrowser.xml",
"inferFromText@chrome://browser/content/browser.js",
"handleEvent@chrome://browser/content/browser.js",
],
);
});
}
if (Services.appinfo.OS == "WINNT") {
EXPECTED_REFLOWS.push(
[
{
stack: [
"verticalMargins@chrome://browser/content/browser-tabsintitlebar.js",
"_update@chrome://browser/content/browser-tabsintitlebar.js",
"updateAppearance@chrome://browser/content/browser-tabsintitlebar.js",
"handleEvent@chrome://browser/content/tabbrowser.xml",
],
times: 2, // This number should only ever go down - never up.
},
[
"verticalMargins@chrome://browser/content/browser-tabsintitlebar.js",
"_update@chrome://browser/content/browser-tabsintitlebar.js",
"updateAppearance@chrome://browser/content/browser-tabsintitlebar.js",
"handleEvent@chrome://browser/content/tabbrowser.xml",
],
[
{
stack: [
"handleEvent@chrome://browser/content/tabbrowser.xml",
"inferFromText@chrome://browser/content/browser.js",
"handleEvent@chrome://browser/content/browser.js",
],
},
[
{
stack: [
"handleEvent@chrome://browser/content/tabbrowser.xml",
"EventListener.handleEvent*tabbrowser-tabs_XBL_Constructor@chrome://browser/content/tabbrowser.xml",
],
}
);
}
if (Services.appinfo.OS == "WINNT" || Services.appinfo.OS == "Darwin") {
EXPECTED_REFLOWS.push(
[
{
stack: [
"rect@chrome://browser/content/browser-tabsintitlebar.js",
"_update@chrome://browser/content/browser-tabsintitlebar.js",
"updateAppearance@chrome://browser/content/browser-tabsintitlebar.js",
"handleEvent@chrome://browser/content/tabbrowser.xml",
],
times: 4, // This number should only ever go down - never up.
},
[
"rect@chrome://browser/content/browser-tabsintitlebar.js",
"_update@chrome://browser/content/browser-tabsintitlebar.js",
"updateAppearance@chrome://browser/content/browser-tabsintitlebar.js",
"handleEvent@chrome://browser/content/tabbrowser.xml",
],
[
"rect@chrome://browser/content/browser-tabsintitlebar.js",
"_update@chrome://browser/content/browser-tabsintitlebar.js",
"updateAppearance@chrome://browser/content/browser-tabsintitlebar.js",
"handleEvent@chrome://browser/content/tabbrowser.xml",
],
[
"rect@chrome://browser/content/browser-tabsintitlebar.js",
"_update@chrome://browser/content/browser-tabsintitlebar.js",
"updateAppearance@chrome://browser/content/browser-tabsintitlebar.js",
"handleEvent@chrome://browser/content/tabbrowser.xml",
],
[
"verticalMargins@chrome://browser/content/browser-tabsintitlebar.js",
"_update@chrome://browser/content/browser-tabsintitlebar.js",
"updateAppearance@chrome://browser/content/browser-tabsintitlebar.js",
"handleEvent@chrome://browser/content/tabbrowser.xml",
],
[
{
stack: [
"verticalMargins@chrome://browser/content/browser-tabsintitlebar.js",
"_update@chrome://browser/content/browser-tabsintitlebar.js",
"updateAppearance@chrome://browser/content/browser-tabsintitlebar.js",
"handleEvent@chrome://browser/content/tabbrowser.xml",
],
times: 2, // This number should only ever go down - never up.
}
);
}

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

@ -5,28 +5,35 @@
* @param testFn (async function)
* The async function that will exercise the browser activity that is
* being tested for reflows.
* @param expectedStacks (Array, optional)
* An Array of Arrays representing stacks.
* @param expectedReflows (Array, optional)
* An Array of Objects representing reflows.
*
* Example:
*
* [
* {
* // This reflow is caused by lorem ipsum
* [
* stack: [
* "select@chrome://global/content/bindings/textbox.xml",
* "focusAndSelectUrlBar@chrome://browser/content/browser.js",
* "openLinkIn@chrome://browser/content/utilityOverlay.js",
* "openUILinkIn@chrome://browser/content/utilityOverlay.js",
* "BrowserOpenTab@chrome://browser/content/browser.js",
* ],
* // We expect this particular reflow to happen 2 times
* times: 2,
* },
*
* // This reflow is caused by lorem ipsum
* [
* {
* // This reflow is caused by lorem ipsum. We expect this reflow
* // to only happen once, so we can omit the "times" property.
* stack: [
* "get_scrollPosition@chrome://global/content/bindings/scrollbox.xml",
* "_fillTrailingGap@chrome://browser/content/tabbrowser.xml",
* "_handleNewTab@chrome://browser/content/tabbrowser.xml",
* "onxbltransitionend@chrome://browser/content/tabbrowser.xml",
* ],
* }
*
* ]
*
@ -38,7 +45,7 @@
* @param window (browser window, optional)
* The browser window to monitor. Defaults to the current window.
*/
async function withReflowObserver(testFn, expectedStacks = [], win = window) {
async function withReflowObserver(testFn, expectedReflows = [], win = window) {
let dwu = win.QueryInterface(Ci.nsIInterfaceRequestor)
.getInterface(Ci.nsIDOMWindowUtils);
let dirtyFrameFn = () => {
@ -53,9 +60,14 @@ async function withReflowObserver(testFn, expectedStacks = [], win = window) {
let els = Cc["@mozilla.org/eventlistenerservice;1"]
.getService(Ci.nsIEventListenerService);
// We're going to remove the stacks one by one as we see them so that
// We're going to remove the reflows one by one as we see them so that
// we can check for expected, unseen reflows, so let's clone the array.
expectedStacks = expectedStacks.slice(0);
// While we're at it, for reflows that omit the "times" property, default
// it to 1.
expectedReflows = expectedReflows.slice(0);
expectedReflows.forEach(r => {
r.times = r.times || 1;
});
let observer = {
reflow(start, end) {
@ -76,12 +88,14 @@ async function withReflowObserver(testFn, expectedStacks = [], win = window) {
return;
}
let index = expectedStacks.findIndex(stack => path.startsWith(stack.join("|")));
let index = expectedReflows.findIndex(reflow => path.startsWith(reflow.stack.join("|")));
if (index != -1) {
Assert.ok(true, "expected uninterruptible reflow: '" +
JSON.stringify(pathWithLineNumbers, null, "\t") + "'");
expectedStacks.splice(index, 1);
if (--expectedReflows[index].times == 0) {
expectedReflows.splice(index, 1);
}
} else {
Assert.ok(false, "unexpected uninterruptible reflow \n" +
JSON.stringify(pathWithLineNumbers, null, "\t") + "\n");
@ -109,14 +123,14 @@ async function withReflowObserver(testFn, expectedStacks = [], win = window) {
dirtyFrameFn();
await testFn();
} finally {
for (let remainder of expectedStacks) {
for (let remainder of expectedReflows) {
Assert.ok(false,
`Unused expected reflow: ${JSON.stringify(remainder, null, "\t")}.\n` +
`Unused expected reflow: ${JSON.stringify(remainder.stack, null, "\t")}\n` +
`This reflow was supposed to be hit ${remainder.times} more time(s).\n` +
"This is probably a good thing - just remove it from the " +
"expected list.");
}
els.removeListenerForAllEvents(win, dirtyFrameFn, true);
docShell.removeWeakReflowObserver(observer);
}