These exceptions exist because of Linux platform code which can cause caching of certain domains before the test begins. Previously, we thought that these platform issues were 100% consistent, but it turns out that they only happen most of the time, and can fail to happen in test verify, causing test failure. To ensure that we don't fail in unexpected situations, call the query function even for these Linux platform exceptions. In the best case, it won't affect anything, and in the worst case, it'll save us from TV failure. Differential Revision: https://phabricator.services.mozilla.com/D222880
140 lines
5.3 KiB
JavaScript
140 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);
|
|
}
|
|
}
|