forked from mirrors/gecko-dev
92 lines
2.9 KiB
JavaScript
92 lines
2.9 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"use strict";
|
|
|
|
/*
|
|
* This test ensures that there is no unexpected flicker
|
|
* on the first window opened during startup.
|
|
*/
|
|
|
|
add_task(async function() {
|
|
const isWebRenderEnabled = Services.prefs.getBoolPref("gfx.webrender.all");
|
|
const isFissionEnabled = SpecialPowers.useRemoteSubframes;
|
|
if (isFissionEnabled && !isWebRenderEnabled) {
|
|
// This configuration is not supported.
|
|
// Also, in this specific configuration, we're displaying a warning, which looks like a flicker.
|
|
// Deactivating test.
|
|
ok(
|
|
true,
|
|
"Detected Fission without WebRender. Flicker expected, deactivating flicker test"
|
|
);
|
|
return;
|
|
}
|
|
|
|
let startupRecorder = Cc["@mozilla.org/test/startuprecorder;1"].getService()
|
|
.wrappedJSObject;
|
|
await startupRecorder.done;
|
|
|
|
// Ensure all the frame data is in the test compartment to avoid traversing
|
|
// a cross compartment wrapper for each pixel.
|
|
let frames = Cu.cloneInto(startupRecorder.data.frames, {});
|
|
ok(!!frames.length, "Should have captured some frames.");
|
|
|
|
let unexpectedRects = 0;
|
|
let alreadyFocused = false;
|
|
for (let i = 1; i < frames.length; ++i) {
|
|
let frame = frames[i],
|
|
previousFrame = frames[i - 1];
|
|
let rects = compareFrames(frame, previousFrame);
|
|
|
|
// The first screenshot we get in OSX / Windows shows an unfocused browser
|
|
// window for some reason. See bug 1445161.
|
|
//
|
|
// We'll assume the changes we are seeing are due to this focus change if
|
|
// there are at least 5 areas that changed near the top of the screen, but
|
|
// will only ignore this once (hence the alreadyFocused variable).
|
|
if (!alreadyFocused && rects.length > 5 && rects.every(r => r.y2 < 100)) {
|
|
alreadyFocused = true;
|
|
todo(
|
|
false,
|
|
"bug 1445161 - the window should be focused at first paint, " +
|
|
rects.toSource()
|
|
);
|
|
continue;
|
|
}
|
|
|
|
rects = rects.filter(rect => {
|
|
let width = frame.width;
|
|
|
|
let exceptions = [
|
|
/**
|
|
* Nothing here! Please don't add anything new!
|
|
*/
|
|
];
|
|
|
|
let rectText = `${rect.toSource()}, window width: ${width}`;
|
|
for (let e of exceptions) {
|
|
if (e.condition(rect)) {
|
|
todo(false, e.name + ", " + rectText);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
ok(false, "unexpected changed rect: " + rectText);
|
|
return true;
|
|
});
|
|
if (!rects.length) {
|
|
info("ignoring identical frame");
|
|
continue;
|
|
}
|
|
|
|
// Before dumping a frame with unexpected differences for the first time,
|
|
// ensure at least one previous frame has been logged so that it's possible
|
|
// to see the differences when examining the log.
|
|
if (!unexpectedRects) {
|
|
dumpFrame(previousFrame);
|
|
}
|
|
unexpectedRects += rects.length;
|
|
dumpFrame(frame);
|
|
}
|
|
is(unexpectedRects, 0, "should have 0 unknown flickering areas");
|
|
});
|