/* 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);
}
}