forked from mirrors/gecko-dev
127 lines
4.7 KiB
JavaScript
127 lines
4.7 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
"use strict";
|
|
|
|
const A11Y_INDICATOR_ENABLED_PREF = "accessibility.indicator.enabled";
|
|
|
|
/**
|
|
* Test various pref and UI properties based on whether the accessibility
|
|
* indicator is enabled and the accessibility service is initialized.
|
|
* @param {Object} win browser window to check the indicator in.
|
|
* @param {Boolean} enabled pref flag for accessibility indicator.
|
|
* @param {Boolean} active whether accessibility service is started or not.
|
|
*/
|
|
function testIndicatorState(win, enabled, active) {
|
|
is(Services.prefs.getBoolPref(A11Y_INDICATOR_ENABLED_PREF), enabled,
|
|
`Indicator is ${enabled ? "enabled" : "disabled"}.`);
|
|
is(Services.appinfo.accessibilityEnabled, active,
|
|
`Accessibility service is ${active ? "enabled" : "disabled"}.`);
|
|
|
|
let visible = enabled && active;
|
|
is(win.document.documentElement.hasAttribute("accessibilitymode"), visible,
|
|
`accessibilitymode flag is ${visible ? "set" : "unset"}.`);
|
|
|
|
// Browser UI has 2 indicators in markup for OSX and Windows but only 1 is
|
|
// shown depending on whether the titlebar is enabled.
|
|
let expectedVisibleCount = visible ? 1 : 0;
|
|
let visibleCount = 0;
|
|
[...win.document.querySelectorAll(".accessibility-indicator")].forEach(indicator =>
|
|
win.getComputedStyle(indicator).getPropertyValue("display") !== "none" &&
|
|
visibleCount++);
|
|
is(expectedVisibleCount, visibleCount,
|
|
`Indicator is ${visible ? "visible" : "invisible"}.`);
|
|
}
|
|
|
|
/**
|
|
* Instantiate accessibility service and wait for event associated with its
|
|
* startup, if necessary.
|
|
*/
|
|
async function initAccessibilityService() {
|
|
let accService = Cc["@mozilla.org/accessibilityService;1"].getService(
|
|
Ci.nsIAccessibilityService);
|
|
|
|
if (!Services.appinfo.accessibilityEnabled) {
|
|
await new Promise(resolve => {
|
|
let observe = (subject, topic, data) => {
|
|
Services.obs.removeObserver(observe, "a11y-init-or-shutdown");
|
|
// "1" indicates that the accessibility service is initialized.
|
|
data === "1" && resolve();
|
|
};
|
|
Services.obs.addObserver(observe, "a11y-init-or-shutdown");
|
|
});
|
|
}
|
|
|
|
return accService;
|
|
}
|
|
|
|
/**
|
|
* If accessibility service is not yet disabled, wait for the event associated
|
|
* with its shutdown.
|
|
*/
|
|
async function shutdownAccessibilityService() {
|
|
if (Services.appinfo.accessibilityEnabled) {
|
|
await new Promise(resolve => {
|
|
let observe = (subject, topic, data) => {
|
|
Services.obs.removeObserver(observe, "a11y-init-or-shutdown");
|
|
// "1" indicates that the accessibility service is shutdown.
|
|
data === "0" && resolve();
|
|
};
|
|
Services.obs.addObserver(observe, "a11y-init-or-shutdown");
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Force garbage collection.
|
|
*/
|
|
function forceGC() {
|
|
SpecialPowers.gc();
|
|
SpecialPowers.forceShrinkingGC();
|
|
SpecialPowers.forceCC();
|
|
}
|
|
|
|
add_task(async function test_accessibility_indicator() {
|
|
info("Preff on accessibility indicator.");
|
|
Services.prefs.setBoolPref(A11Y_INDICATOR_ENABLED_PREF, true);
|
|
|
|
info("Test default accessibility indicator state.");
|
|
let newWin = await BrowserTestUtils.openNewBrowserWindow();
|
|
testIndicatorState(window, true, false);
|
|
testIndicatorState(newWin, true, false);
|
|
|
|
info("Enable accessibility and ensure the indicator is shown in all windows.");
|
|
let accService = await initAccessibilityService(); // eslint-disable-line no-unused-vars
|
|
testIndicatorState(window, true, true);
|
|
testIndicatorState(newWin, true, true);
|
|
|
|
info("Open a new window and ensure the indicator is shown there by default.");
|
|
let dynamicWin = await BrowserTestUtils.openNewBrowserWindow({ private: true });
|
|
testIndicatorState(dynamicWin, true, true);
|
|
await BrowserTestUtils.closeWindow(dynamicWin);
|
|
|
|
info("Preff off accessibility indicator.");
|
|
Services.prefs.setBoolPref(A11Y_INDICATOR_ENABLED_PREF, false);
|
|
testIndicatorState(window, false, true);
|
|
testIndicatorState(newWin, false, true);
|
|
dynamicWin = await BrowserTestUtils.openNewBrowserWindow({ private: true });
|
|
testIndicatorState(dynamicWin, false, true);
|
|
|
|
info("Preff on accessibility indicator.");
|
|
Services.prefs.setBoolPref(A11Y_INDICATOR_ENABLED_PREF, true);
|
|
testIndicatorState(window, true, true);
|
|
testIndicatorState(newWin, true, true);
|
|
testIndicatorState(dynamicWin, true, true);
|
|
|
|
info("Disable accessibility and ensure the indicator is hidden in all windows.");
|
|
accService = undefined;
|
|
forceGC();
|
|
await shutdownAccessibilityService();
|
|
testIndicatorState(window, true, false);
|
|
testIndicatorState(newWin, true, false);
|
|
testIndicatorState(dynamicWin, true, false);
|
|
|
|
Services.prefs.clearUserPref(A11Y_INDICATOR_ENABLED_PREF);
|
|
await BrowserTestUtils.closeWindow(newWin);
|
|
await BrowserTestUtils.closeWindow(dynamicWin);
|
|
});
|