139 lines
5.3 KiB
JavaScript
139 lines
5.3 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 verifyAttributeCached, verifyAttributeCachedNoRetry,
|
|
testAttributeCachePresence, testCachingPerPlatform */
|
|
|
|
// 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 events.js.
|
|
loadScripts(
|
|
{ name: "common.js", dir: MOCHITESTS_DIR },
|
|
{ name: "layout.js", dir: MOCHITESTS_DIR },
|
|
{ name: "promisified-events.js", dir: MOCHITESTS_DIR }
|
|
);
|
|
|
|
/**
|
|
* Verifies that the given attribute is cached on the given acc. Retries until
|
|
* a timeout via untilCacheOk.
|
|
* @param {nsIAccessible} accessible the accessible where the attribute to query
|
|
* should be cached
|
|
* @param {String} attribute the attribute to query in the cache
|
|
*/
|
|
async function verifyAttributeCached(accessible, attribute) {
|
|
// Wait until the attribute is present in the cache.
|
|
await untilCacheOk(() => {
|
|
try {
|
|
accessible.cache.getStringProperty(attribute);
|
|
return true;
|
|
} catch (e) {
|
|
return false;
|
|
}
|
|
}, `${attribute} is present in the cache`);
|
|
}
|
|
|
|
/**
|
|
* Verifies that the given attribute is cached on the given acc. Doesn't retry
|
|
* until a timeout.
|
|
* @param {nsIAccessible} accessible the accessible where the attribute to query
|
|
* should be cached
|
|
* @param {String} attribute the attribute to query in the cache
|
|
*/
|
|
function verifyAttributeCachedNoRetry(accessible, attribute) {
|
|
try {
|
|
accessible.cache.getStringProperty(attribute);
|
|
ok(true, `${attribute} is present in the cache`);
|
|
} catch (e) {
|
|
ok(false, `${attribute} is not present in the cache`);
|
|
}
|
|
}
|
|
|
|
/*
|
|
* @callback QueryCallback A function taking no arguments that queries an
|
|
* attribute that may be cached, e.g., bounds, state
|
|
*/
|
|
|
|
/**
|
|
* Verifies that the given attribute isn't cached. Then, forces the
|
|
* accessibility service to activate those cache domains by running the provided
|
|
* query function, which queries the attribute. Finally, verifies that the
|
|
* attribute is present in the cache.
|
|
* @param {nsIAccessible} accessible the accessible where the attribute to
|
|
* query should be cached
|
|
* @param {String} attribute the attribute to query in the cache
|
|
* @param {QueryCallback} queryCb the callback that this function will
|
|
* invoke to query the given attribute
|
|
*/
|
|
async function testAttributeCachePresence(accessible, attribute, queryCb) {
|
|
// Verify that the attribute isn't cached.
|
|
let hasAttribute;
|
|
try {
|
|
accessible.cache.getStringProperty(attribute);
|
|
hasAttribute = true;
|
|
} catch (e) {
|
|
hasAttribute = false;
|
|
}
|
|
ok(!hasAttribute, `${attribute} is not present in cache`);
|
|
|
|
// Force attribute to be cached by querying it.
|
|
info(`Querying ${attribute} in cache`);
|
|
queryCb();
|
|
|
|
// Wait until the attribute is present in the cache.
|
|
await verifyAttributeCached(accessible, attribute);
|
|
}
|
|
|
|
/**
|
|
* Verify that the given attribute is properly cached, taking into account
|
|
* platform considerations which may affect what is testable. Ideally, test
|
|
* attribute absence and presence, but only presence may be possible.
|
|
* @param {nsIAccessible} accessible the accessible where the attribute to
|
|
* query should be cached
|
|
* @param {String} attribute the attribute to query in the cache
|
|
* @param {QueryCallback} queryCb the callback that this function will
|
|
* invoke to query the given attribute
|
|
*/
|
|
async function testCachingPerPlatform(accessible, attribute, queryCb) {
|
|
// On Linux, the implementation of PlatformEvent for EVENT_NAME_CHANGE calls
|
|
// RemoteAccessible::Name during the test setup, which unavoidably queries the
|
|
// Text cache domain. Therefore, on Linux we avoid checking for the absence of
|
|
// the Text domain attributes. Similarly, we cache the viewport on Linux
|
|
// before a test is ready to run.
|
|
if (
|
|
AppConstants.platform == "linux" &&
|
|
(attribute == "language" ||
|
|
attribute == "text" ||
|
|
attribute == "style" ||
|
|
attribute == "viewport")
|
|
) {
|
|
queryCb();
|
|
await verifyAttributeCached(accessible, attribute);
|
|
} else if (
|
|
AppConstants.platform == "macosx" &&
|
|
(attribute == "headers" ||
|
|
attribute == "colspan" ||
|
|
attribute == "rowspan" ||
|
|
attribute == "layout-guess" ||
|
|
attribute == "language" ||
|
|
attribute == "text" ||
|
|
attribute == "style" ||
|
|
attribute == "viewport")
|
|
) {
|
|
// These attributes work on macOS, but aren't consistent. Events may happen
|
|
// before document load complete that cause caching before the test starts.
|
|
// So, in the (common) event that that doesn't happen, call the queryCb to
|
|
// ensure the necessary cache request happens. See bug 1916578.
|
|
queryCb();
|
|
await verifyAttributeCached(accessible, attribute);
|
|
} else {
|
|
await testAttributeCachePresence(accessible, attribute, queryCb);
|
|
}
|
|
}
|