91 lines
3.1 KiB
JavaScript
91 lines
3.1 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
"use strict";
|
|
|
|
/* exported waitForIFrameA11yReady, waitForIFrameUpdates, spawnTestStates, testVisibility */
|
|
|
|
// Load the shared-head file first.
|
|
Services.scriptloader.loadSubScript(
|
|
"chrome://mochitests/content/browser/accessible/tests/browser/shared-head.js",
|
|
this
|
|
);
|
|
|
|
// Loading and common.js from accessible/tests/mochitest/ for all tests, as
|
|
// well as promisified-events.js.
|
|
/* import-globals-from ../../mochitest/states.js */
|
|
/* import-globals-from ../../mochitest/role.js */
|
|
loadScripts(
|
|
{ name: "common.js", dir: MOCHITESTS_DIR },
|
|
{ name: "promisified-events.js", dir: MOCHITESTS_DIR },
|
|
{ name: "role.js", dir: MOCHITESTS_DIR },
|
|
{ name: "states.js", dir: MOCHITESTS_DIR }
|
|
);
|
|
|
|
// This is another version of addA11yLoadEvent for fission.
|
|
async function waitForIFrameA11yReady(iFrameBrowsingContext) {
|
|
await SimpleTest.promiseFocus(window);
|
|
|
|
await SpecialPowers.spawn(iFrameBrowsingContext, [], () => {
|
|
return new Promise(resolve => {
|
|
function waitForDocLoad() {
|
|
SpecialPowers.executeSoon(() => {
|
|
const acc = SpecialPowers.Cc[
|
|
"@mozilla.org/accessibilityService;1"
|
|
].getService(SpecialPowers.Ci.nsIAccessibilityService);
|
|
|
|
const accDoc = acc.getAccessibleFor(content.document);
|
|
let state = {};
|
|
accDoc.getState(state, {});
|
|
if (state.value & SpecialPowers.Ci.nsIAccessibleStates.STATE_BUSY) {
|
|
SpecialPowers.executeSoon(waitForDocLoad);
|
|
return;
|
|
}
|
|
resolve();
|
|
}, 0);
|
|
}
|
|
waitForDocLoad();
|
|
});
|
|
});
|
|
}
|
|
|
|
// A utility function to make sure the information of scroll position or visible
|
|
// area changes reach to out-of-process iframes.
|
|
async function waitForIFrameUpdates() {
|
|
// Wait for two frames since the information is notified via asynchronous IPC
|
|
// calls.
|
|
await new Promise(resolve => requestAnimationFrame(resolve));
|
|
await new Promise(resolve => requestAnimationFrame(resolve));
|
|
}
|
|
|
|
// A utility function to test the state of |elementId| element in out-of-process
|
|
// |browsingContext|.
|
|
async function spawnTestStates(browsingContext, elementId, expectedStates) {
|
|
function testStates(id, expected, unexpected) {
|
|
const acc = SpecialPowers.Cc[
|
|
"@mozilla.org/accessibilityService;1"
|
|
].getService(SpecialPowers.Ci.nsIAccessibilityService);
|
|
const target = content.document.getElementById(id);
|
|
let state = {};
|
|
acc.getAccessibleFor(target).getState(state, {});
|
|
if (expected === 0) {
|
|
Assert.equal(state.value, expected);
|
|
} else {
|
|
Assert.ok(state.value & expected);
|
|
}
|
|
Assert.ok(!(state.value & unexpected));
|
|
}
|
|
await SpecialPowers.spawn(
|
|
browsingContext,
|
|
[elementId, expectedStates],
|
|
testStates
|
|
);
|
|
}
|
|
|
|
function testVisibility(acc, shouldBeOffscreen, shouldBeInvisible) {
|
|
const [states] = getStates(acc);
|
|
let looksGood = shouldBeOffscreen == ((states & STATE_OFFSCREEN) != 0);
|
|
looksGood &= shouldBeInvisible == ((states & STATE_INVISIBLE) != 0);
|
|
return looksGood;
|
|
}
|