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,68 +10,49 @@
* for tips on how to do that. * for tips on how to do that.
*/ */
const EXPECTED_APPMENU_OPEN_REFLOWS = [ const EXPECTED_APPMENU_OPEN_REFLOWS = [
[ {
"openPopup@chrome://global/content/bindings/popup.xml", stack: [
"show/</<@chrome://browser/content/customizableui/panelUI.js", "openPopup@chrome://global/content/bindings/popup.xml",
], "show/</<@chrome://browser/content/customizableui/panelUI.js",
],
},
[ {
"get_alignmentPosition@chrome://global/content/bindings/popup.xml", stack: [
"adjustArrowPosition@chrome://global/content/bindings/popup.xml", "get_alignmentPosition@chrome://global/content/bindings/popup.xml",
"onxblpopupshowing@chrome://global/content/bindings/popup.xml", "adjustArrowPosition@chrome://global/content/bindings/popup.xml",
"openPopup@chrome://global/content/bindings/popup.xml", "onxblpopupshowing@chrome://global/content/bindings/popup.xml",
"show/</<@chrome://browser/content/customizableui/panelUI.js", "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.
"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",
],
[ {
"get_alignmentPosition@chrome://global/content/bindings/popup.xml", stack: [
"adjustArrowPosition@chrome://global/content/bindings/popup.xml", "get_alignmentPosition@chrome://global/content/bindings/popup.xml",
"onxblpopuppositioned@chrome://global/content/bindings/popup.xml", "adjustArrowPosition@chrome://global/content/bindings/popup.xml",
], "onxblpopuppositioned@chrome://global/content/bindings/popup.xml",
],
},
[ {
"get_alignmentPosition@chrome://global/content/bindings/popup.xml", stack: [
"handleEvent@resource:///modules/PanelMultiView.jsm", "get_alignmentPosition@chrome://global/content/bindings/popup.xml",
"openPopup@chrome://global/content/bindings/popup.xml", "handleEvent@resource:///modules/PanelMultiView.jsm",
], "openPopup@chrome://global/content/bindings/popup.xml",
],
},
[ {
"handleEvent@resource:///modules/PanelMultiView.jsm", stack: [
"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.
"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",
],
]; ];
const EXPECTED_APPMENU_SUBVIEW_REFLOWS = [ 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 * If we add more views where this is necessary, we may need to duplicate
* these expected reflows further. * these expected reflows further.
*/ */
[ {
"descriptionHeightWorkaround@resource:///modules/PanelMultiView.jsm", stack: [
"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.
"descriptionHeightWorkaround@resource:///modules/PanelMultiView.jsm", },
"onTransitionEnd@resource:///modules/PanelMultiView.jsm",
],
/** /**
* Please don't add anything new! * Please don't add anything new!

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

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

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

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

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

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

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

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