diff --git a/layout/base/tests/test_bug629838.html b/layout/base/tests/test_bug629838.html
index 0bc96d1da26..39b6e9d951d 100644
--- a/layout/base/tests/test_bug629838.html
+++ b/layout/base/tests/test_bug629838.html
@@ -23,7 +23,6 @@ var initialPaintCount, afterPaintCount;
var color = 0;
function onAfterPaint () {
- ok(true, "OnAfterPaint");
afterPaintCount += 1;
}
@@ -33,18 +32,30 @@ function startTest() {
initialPaintCount = window.mozPaintCount;
window.addEventListener("MozAfterPaint", onAfterPaint, true);
doBackgroundFlicker();
- }, 1000);
+ }, 500);
}
document.addEventListener("DOMContentLoaded", startTest, true);
+// Unfortunately we cannot reliably assert that mozPaintCount and afterPaintCount increment perfectly
+// in sync, because they can diverge in the presence of OS-triggered paints or system load.
+// Instead, we wait for mozPaintCount to increase by a set amount, and then assert that we got a
+// minimum number of MozAfterPaint events. This number needs to be high enough to ensure that this test
+// will fail if empty transactions are not triggering MozAfterPaint, but low enough to allow the test to
+// pass even if the operating system triggers extra repaints or the browser is running slowly.
+// If this test still fails occasionally, examine the output to see whether minimumAfterPaints needs to be
+// adjusted down or whether you are dealing with a different issue.
+const mozPaintsToWait = 50;
+const minimumAfterPaintsToPass = 37;
+
function doPluginFlicker() {
ok(true, "Plugin color iteration " + color +
", afterpaint count: " + afterPaintCount +
", mozpaint count: " + window.mozPaintCount);
- if ((afterPaintCount >= window.mozPaintCount - initialPaintCount) &&
- (afterPaintCount > 20)) {
- ok(true, "Got enough paints from plugin color changes");
+ var mozPaints = (window.mozPaintCount - initialPaintCount);
+ if (mozPaints >= mozPaintsToWait) {
+ ok(true, "mozPaintCount incremented enough from plugin color changes.");
+ ok(afterPaintCount >= minimumAfterPaintsToPass, "Got MozAfterPaint event " + afterPaintCount + " time(s).");
SimpleTest.finish();
return;
}
@@ -63,9 +74,10 @@ function doBackgroundFlicker() {
ok(true, "Background color iteration " + color +
", afterpaint count: " + afterPaintCount +
", mozpaint count: " + window.mozPaintCount);
- if ((afterPaintCount >= window.mozPaintCount - initialPaintCount) &&
- (afterPaintCount > 20)) {
- ok(true, "Got enough paints from background color changes");
+ var mozPaints = (window.mozPaintCount - initialPaintCount);
+ if (mozPaints >= mozPaintsToWait) {
+ ok(true, "mozPaintCount incremented enough from background color changes.");
+ ok(afterPaintCount >= minimumAfterPaintsToPass, "Got MozAfterPaint event " + afterPaintCount + " time(s).");
afterPaintCount = 0;
initialPaintCount = window.mozPaintCount;
doPluginFlicker();