Bug 1380065 - Disable arrow-panel animations if the cosmeticAnimations pref is set to false. r=jaws

* Toggle animate=false attribute on arrow panels when toolkit.cosmeticAnimations.enabled is false
* Use preferences-service component to lookup the pref in the arrowpanel binding
* Disable this pref during tests to remove a source of instability and timing-based test failures in chrome/UI tests.
* Enable cosmeticAnimations for tests which depend on existing behavior
* Re-enable cosmeticAnimations pref for browser_ext_popup_select.js which is known to be more reliable with animations

MozReview-Commit-ID: IvA2ySPPmeJ

--HG--
extra : rebase_source : 577f534d2409da76eecd6c36dfa3db50eca50f40
This commit is contained in:
Sam Foster 2017-07-13 14:30:38 -04:00
Родитель 7ae4dbf848
Коммит fef0cddea2
24 изменённых файлов: 165 добавлений и 13 удалений

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

@ -11,6 +11,13 @@ function stopReloadMutationCallback() {
Assert.ok(false, "stop-reload's animate attribute should not have been mutated");
}
// run these tests with notification animations enabled
add_task(async function setup() {
await SpecialPowers.pushPrefEnv({
"set": [["toolkit.cosmeticAnimations.enabled", true]]
});
});
add_task(async function checkDontShowStopOnNewTab() {
let stopReloadContainer = document.getElementById("stop-reload-button");
let stopReloadContainerObserver = new MutationObserver(stopReloadMutationCallback);

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

@ -9,6 +9,13 @@ var notification;
var notificationURL = "http://example.org/browser/browser/base/content/test/alerts/file_dom_notifications.html";
var newWindowOpenedFromTab;
// run these tests with notification animations enabled
add_task(async function setup() {
await SpecialPowers.pushPrefEnv({
"set": [["toolkit.cosmeticAnimations.enabled", true]]
});
});
add_task(async function test_notificationPreventDefaultAndSwitchTabs() {
let pm = Services.perms;
pm.add(makeURI(notificationURL), "desktop-notification", pm.ALLOW_ACTION);

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

@ -84,9 +84,17 @@ var gTestPage = "/browser/browser/base/content/test/general/alltabslistener.html
const kBasePage = "http://example.org/browser/browser/base/content/test/general/dummy_page.html";
var gNextTest;
function test() {
waitForExplicitFinish();
// run these tests with notification animations enabled
const origAnimationsPrefValue = Services.prefs.getBoolPref("toolkit.cosmeticAnimations.enabled");
Services.prefs.setBoolPref("toolkit.cosmeticAnimations.enabled", true);
registerCleanupFunction(() => {
Services.prefs.setBoolPref("toolkit.cosmeticAnimations.enabled", origAnimationsPrefValue);
});
gBackgroundTab = BrowserTestUtils.addTab(gBrowser);
gForegroundTab = BrowserTestUtils.addTab(gBrowser);
gBackgroundBrowser = gBrowser.getBrowserForTab(gBackgroundTab);

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

@ -15,6 +15,13 @@ const EXPECTED_REFLOWS = [
*/
];
// run these tests with notification animations enabled
add_task(async function setup() {
await SpecialPowers.pushPrefEnv({
"set": [["toolkit.cosmeticAnimations.enabled", true]]
});
});
/*
* This test ensures that there are no unexpected
* uninterruptible reflows when closing a tab that will

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

@ -15,6 +15,13 @@ const EXPECTED_REFLOWS = [
*/
];
// run these tests with notification animations enabled
add_task(async function setup() {
await SpecialPowers.pushPrefEnv({
"set": [["toolkit.cosmeticAnimations.enabled", true]]
});
});
/*
* This test ensures that there are no unexpected
* uninterruptible reflows when closing new tabs.

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

@ -20,6 +20,13 @@ const EXPECTED_REFLOWS = [
],
];
// run these tests with notification animations enabled
add_task(async function setup() {
await SpecialPowers.pushPrefEnv({
"set": [["toolkit.cosmeticAnimations.enabled", true]]
});
});
/*
* This test ensures that there are no unexpected
* uninterruptible reflows when opening new tabs.

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

@ -17,6 +17,13 @@ const EXPECTED_REFLOWS = [
],
];
// run these tests with notification animations enabled
add_task(async function setup() {
await SpecialPowers.pushPrefEnv({
"set": [["toolkit.cosmeticAnimations.enabled", true]]
});
});
/*
* This test ensures that there are no unexpected
* uninterruptible reflows when opening a new tab that will

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

@ -68,11 +68,16 @@ const PREF_SECURITY_DELAY_INITIAL = Services.prefs.getIntPref("security.notifica
// tests to be run.
/* global tests */
function setup() {
// run these tests with notification animations enabled
const origAnimationsPrefValue = Services.prefs.getBoolPref("toolkit.cosmeticAnimations.enabled");
Services.prefs.setBoolPref("toolkit.cosmeticAnimations.enabled", true);
BrowserTestUtils.openNewForegroundTab(gBrowser, "http://example.com/")
.then(goNext);
registerCleanupFunction(() => {
gBrowser.removeTab(gBrowser.selectedTab);
PopupNotifications.buttonDelay = PREF_SECURITY_DELAY_INITIAL;
Services.prefs.setBoolPref("toolkit.cosmeticAnimations.enabled", origAnimationsPrefValue);
});
}

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

@ -23,17 +23,20 @@
*/
const PREF_ACTIVE = "security.mixed_content.block_active_content";
const ANIMATIONS_ENABLED = "toolkit.cosmeticAnimations.enabled";
// We alternate for even and odd test cases to simulate different hosts
const HTTPS_TEST_ROOT_1 = getRootDirectory(gTestPath).replace("chrome://mochitests/content", "https://test1.example.com");
const HTTPS_TEST_ROOT_2 = getRootDirectory(gTestPath).replace("chrome://mochitests/content", "https://test2.example.com");
var origBlockActive;
var origAnimationsPrefValue;
var gTestBrowser = null;
registerCleanupFunction(function() {
// Set preferences back to their original values
Services.prefs.setBoolPref(PREF_ACTIVE, origBlockActive);
Services.prefs.setBoolPref(ANIMATIONS_ENABLED, origAnimationsPrefValue);
});
function cleanUpAfterTests() {
@ -158,8 +161,11 @@ function test() {
// Store original preferences so we can restore settings after testing
origBlockActive = Services.prefs.getBoolPref(PREF_ACTIVE);
origAnimationsPrefValue = Services.prefs.getBoolPref(ANIMATIONS_ENABLED);
Services.prefs.setBoolPref(PREF_ACTIVE, true);
Services.prefs.setBoolPref(PREF_ACTIVE, true);
// run these tests with animations enabled
Services.prefs.setBoolPref(ANIMATIONS_ENABLED, true);
// Not really sure what this is doing
var newTab = BrowserTestUtils.addTab(gBrowser);

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

@ -2,6 +2,13 @@
const PAGE = "data:text/html,<html><body>A%20regular,%20everyday,%20normal%20page.";
// run these tests with notification animations enabled
add_task(async function setup() {
await SpecialPowers.pushPrefEnv({
"set": [["toolkit.cosmeticAnimations.enabled", true]]
});
});
add_task(async function setup() {
await setupLocalCrashReportServer();
});

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

@ -5,8 +5,13 @@ const PAGE = "data:text/html,<html><body>A%20regular,%20everyday,%20normal%20pag
/**
* Monkey patches TabCrashHandler.getDumpID to return null in order to test
* about:tabcrashed when a dump is not available.
* Set pref to ensure these tests are run with notification animations enabled
*/
add_task(async function setup() {
// run these tests with animations enabled
await SpecialPowers.pushPrefEnv({
"set": [["toolkit.cosmeticAnimations.enabled", true]]
});
let originalGetDumpID = TabCrashHandler.getDumpID;
TabCrashHandler.getDumpID = function(browser) { return null; };
registerCleanupFunction(() => {

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

@ -27,8 +27,12 @@ function assertCount(snapshot, expectedCount) {
add_task(async function setup() {
// These probes are opt-in, meaning we only capture them if extended
// Telemetry recording is enabled.
// Run these tests with animations enabled
await SpecialPowers.pushPrefEnv({
set: [["toolkit.telemetry.enabled", true]]
set: [
["toolkit.telemetry.enabled", true],
["toolkit.cosmeticAnimations.enabled", true]
]
});
let oldCanRecord = Services.telemetry.canRecordExtended;

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

@ -15,6 +15,13 @@ const mockRemoteClients = [
{ id: "2", name: "baz", type: "mobile" },
];
// run these tests with animations enabled
add_task(async function setup() {
await SpecialPowers.pushPrefEnv({
"set": [["toolkit.cosmeticAnimations.enabled", true]]
});
});
add_task(async function bookmark() {
// Open a unique page.
let url = "http://example.com/browser_page_action_menu";

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

@ -2,6 +2,13 @@
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";
// run these tests with animations enabled
add_task(async function setup() {
await SpecialPowers.pushPrefEnv({
"set": [["toolkit.cosmeticAnimations.enabled", true]]
});
});
add_task(async function testPopupSelectPopup() {
let extension = ExtensionTestUtils.loadExtension({
background() {

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

@ -4,6 +4,7 @@ let scope = {};
Cu.import("resource:///modules/AutoMigrate.jsm", scope);
let oldCanUndo = scope.AutoMigrate.canUndo;
let oldUndo = scope.AutoMigrate.undo;
registerCleanupFunction(function() {
scope.AutoMigrate.canUndo = oldCanUndo;
scope.AutoMigrate.undo = oldUndo;
@ -11,6 +12,13 @@ registerCleanupFunction(function() {
const kExpectedNotificationId = "automigration-undo";
// run these tests with notification animations enabled
add_task(async function setup() {
await SpecialPowers.pushPrefEnv({
"set": [["toolkit.cosmeticAnimations.enabled", true]]
});
});
add_task(async function autoMigrationUndoNotificationShows() {
let getNotification = browser =>
gBrowser.getNotificationBox(browser).getNotificationWithValue(kExpectedNotificationId);

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

@ -26,6 +26,13 @@ function promiseReportCallMade(aValue) {
});
}
// run these tests with notification animations enabled
add_task(async function setup() {
await SpecialPowers.pushPrefEnv({
"set": [["toolkit.cosmeticAnimations.enabled", true]]
});
});
function pushPrefs(...aPrefs) {
return SpecialPowers.pushPrefEnv({"set": aPrefs});
}

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

@ -172,6 +172,11 @@ function waitForIgnoredReports(reportIDs) {
let gNotificationBox;
add_task(async function setup() {
// run these tests with notification animations enabled
await SpecialPowers.pushPrefEnv({
"set": [["toolkit.cosmeticAnimations.enabled", true]]
});
// Pending crash reports are stored in the UAppData folder,
// which exists outside of the profile folder. In order to
// not overwrite / clear pending crash reports for the poor

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

@ -22,6 +22,14 @@ function checkIsChromeFullscreen(win, inFullscreen) {
}
SimpleTest.waitForExplicitFinish();
// run these tests with animations enabled
const origAnimationsPrefValue = SpecialPowers.getBoolPref("toolkit.cosmeticAnimations.enabled");
SpecialPowers.setBoolPref("toolkit.cosmeticAnimations.enabled", true);
SimpleTest.registerCleanupFunction(() => {
SpecialPowers.setBoolPref("toolkit.cosmeticAnimations.enabled", origAnimationsPrefValue);
});
// XXX This actually exposes a true race condition, but it could rarely
// happen in real world, because it only happens when requestFullscreen
// is called immediately after exiting fullscreen in certain condition,

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

@ -260,6 +260,9 @@ user_pref("toolkit.telemetry.newProfilePing.enabled", false);
user_pref("toolkit.telemetry.test.pref1", true);
user_pref("toolkit.telemetry.test.pref2", false);
// Disable cosmetic-only UI animations and transitions
user_pref("toolkit.cosmeticAnimations.enabled", false);
// We don't want to hit the real Firefox Accounts server for tests. We don't
// actually need a functioning FxA server, so just set it to something that
// resolves and accepts requests, even if they all fail.

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

@ -194,6 +194,10 @@ function* nextTest()
}
}
// Run this check with animations enabled
let origPrefValue = SpecialPowers.getBoolPref("toolkit.cosmeticAnimations.enabled");
SpecialPowers.setBoolPref("toolkit.cosmeticAnimations.enabled", true);
// Check that the transition occurs for an arrow panel with animate="true"
window.addEventListener("transitionend", transitionEnded, false);
$("animatepanel").openPopup($("topleft"), "after_start", 0, 0, false, false, null, "start");
@ -204,6 +208,9 @@ function* nextTest()
synthesizeKey("VK_ESCAPE", { });
ok(!animatedPopupHidden, "animated popup not hidden yet");
yield;
// restore the pref value
SpecialPowers.setBoolPref("toolkit.cosmeticAnimations.enabled", origPrefValue);
}
SimpleTest.finish()

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

@ -6,7 +6,7 @@
-->
<window title="Bug 457632" width="500" height="600"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
<script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
<notificationbox id="nb"/>
@ -28,8 +28,14 @@ function completeAnimation(nextTest) {
setTimeout(completeAnimation, 50, nextTest);
}
function test() {
async function test() {
SimpleTest.waitForExplicitFinish();
// run these tests with notification animations enabled
await SpecialPowers.pushPrefEnv({
"set": [["toolkit.cosmeticAnimations.enabled", true]]
});
gNotificationBox = document.getElementById("nb");
is(gNotificationBox.allNotifications.length, 0, "There should be no initial notifications");

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

@ -25,6 +25,13 @@ var cachedMouseDown = null;
var previousWidth = 0, originalWidth = 0;
var loadInWindow = false;
// run these tests with animations enabled
const origAnimationsPrefValue = SpecialPowers.getBoolPref("toolkit.cosmeticAnimations.enabled");
SpecialPowers.setBoolPref("toolkit.cosmeticAnimations.enabled", true);
SimpleTest.registerCleanupFunction(() => {
SpecialPowers.setBoolPref("toolkit.cosmeticAnimations.enabled", origAnimationsPrefValue);
})
function splitterCallback(adjustment) {
var newWidth = Number($("leftbox").width); // getBoundingClientRect().width;
var expectedWidth = previousWidth + adjustment;

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

@ -402,6 +402,7 @@
</content>
<implementation>
<field name="_fadeTimer">null</field>
<field name="_previousAnimateAttrValue">null</field>
<method name="sizeTo">
<parameter name="aWidth"/>
<parameter name="aHeight"/>
@ -487,6 +488,16 @@
<handlers>
<handler event="popupshowing" phase="target">
<![CDATA[
let prefsService = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefBranch);
let animationsEnabled = prefsService.getBoolPref("toolkit.cosmeticAnimations.enabled");
if (!animationsEnabled) {
this._previousAnimateAttrValue = this.getAttribute("animate");
this.setAttribute("animate", "false");
} else {
this._previousAnimateAttrValue = null;
}
var arrow = document.getAnonymousElementByAttribute(this, "anonid", "arrow");
arrow.hidden = this.anchorNode == null;
document.getAnonymousElementByAttribute(this, "anonid", "arrowbox")
@ -529,7 +540,10 @@
</handler>
<handler event="popuphidden" phase="target">
this.removeAttribute("panelopen");
if (this.getAttribute("animate") != "false") {
if (this._previousAnimateAttrValue == "false") {
this.setAttribute("animate", this._previousAnimateAttrValue);
} else {
this.removeAttribute("animate");
}
</handler>

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

@ -37,14 +37,10 @@ function openNotification() {
callback: null,
popup: null
}]);
n.addEventListener("transitionend", function (event) {
if (event.propertyName == "margin-top") {
setTimeout(function () {
is(n.getBoundingClientRect().height, 27, "notification bar has wrong height");
SimpleTest.finish();
}, 0);
}
}, false);
setTimeout(function () {
is(n.getBoundingClientRect().height, 27, "notification bar has wrong height");
SimpleTest.finish();
}, 0);
}
window.onload = openNotification;