зеркало из https://github.com/mozilla/gecko-dev.git
204 строки
6.8 KiB
JavaScript
204 строки
6.8 KiB
JavaScript
/* import-globals-from common.js */
|
|
|
|
// //////////////////////////////////////////////////////////////////////////////
|
|
// Constants
|
|
|
|
var RELATION_CONTROLLED_BY = nsIAccessibleRelation.RELATION_CONTROLLED_BY;
|
|
var RELATION_CONTROLLER_FOR = nsIAccessibleRelation.RELATION_CONTROLLER_FOR;
|
|
var RELATION_DEFAULT_BUTTON = nsIAccessibleRelation.RELATION_DEFAULT_BUTTON;
|
|
var RELATION_DESCRIBED_BY = nsIAccessibleRelation.RELATION_DESCRIBED_BY;
|
|
var RELATION_DESCRIPTION_FOR = nsIAccessibleRelation.RELATION_DESCRIPTION_FOR;
|
|
var RELATION_EMBEDDED_BY = nsIAccessibleRelation.RELATION_EMBEDDED_BY;
|
|
var RELATION_EMBEDS = nsIAccessibleRelation.RELATION_EMBEDS;
|
|
var RELATION_FLOWS_FROM = nsIAccessibleRelation.RELATION_FLOWS_FROM;
|
|
var RELATION_FLOWS_TO = nsIAccessibleRelation.RELATION_FLOWS_TO;
|
|
var RELATION_LABEL_FOR = nsIAccessibleRelation.RELATION_LABEL_FOR;
|
|
var RELATION_LABELLED_BY = nsIAccessibleRelation.RELATION_LABELLED_BY;
|
|
var RELATION_MEMBER_OF = nsIAccessibleRelation.RELATION_MEMBER_OF;
|
|
var RELATION_NODE_CHILD_OF = nsIAccessibleRelation.RELATION_NODE_CHILD_OF;
|
|
var RELATION_NODE_PARENT_OF = nsIAccessibleRelation.RELATION_NODE_PARENT_OF;
|
|
var RELATION_PARENT_WINDOW_OF = nsIAccessibleRelation.RELATION_PARENT_WINDOW_OF;
|
|
var RELATION_POPUP_FOR = nsIAccessibleRelation.RELATION_POPUP_FOR;
|
|
var RELATION_SUBWINDOW_OF = nsIAccessibleRelation.RELATION_SUBWINDOW_OF;
|
|
var RELATION_CONTAINING_DOCUMENT =
|
|
nsIAccessibleRelation.RELATION_CONTAINING_DOCUMENT;
|
|
var RELATION_CONTAINING_TAB_PANE =
|
|
nsIAccessibleRelation.RELATION_CONTAINING_TAB_PANE;
|
|
var RELATION_CONTAINING_APPLICATION =
|
|
nsIAccessibleRelation.RELATION_CONTAINING_APPLICATION;
|
|
const RELATION_DETAILS = nsIAccessibleRelation.RELATION_DETAILS;
|
|
const RELATION_DETAILS_FOR = nsIAccessibleRelation.RELATION_DETAILS_FOR;
|
|
const RELATION_ERRORMSG = nsIAccessibleRelation.RELATION_ERRORMSG;
|
|
const RELATION_ERRORMSG_FOR = nsIAccessibleRelation.RELATION_ERRORMSG_FOR;
|
|
|
|
// //////////////////////////////////////////////////////////////////////////////
|
|
// General
|
|
|
|
/**
|
|
* Test the accessible relation.
|
|
*
|
|
* @param aIdentifier [in] identifier to get an accessible, may be ID
|
|
* attribute or DOM element or accessible object
|
|
* @param aRelType [in] relation type (see constants above)
|
|
* @param aRelatedIdentifiers [in] identifier or array of identifiers of
|
|
* expected related accessibles
|
|
*/
|
|
function testRelation(aIdentifier, aRelType, aRelatedIdentifiers) {
|
|
var relation = getRelationByType(aIdentifier, aRelType);
|
|
|
|
var relDescr = getRelationErrorMsg(aIdentifier, aRelType);
|
|
var relDescrStart = getRelationErrorMsg(aIdentifier, aRelType, true);
|
|
|
|
if (!relation || !relation.targetsCount) {
|
|
if (!aRelatedIdentifiers) {
|
|
ok(true, "No" + relDescr);
|
|
return;
|
|
}
|
|
|
|
var msg =
|
|
relDescrStart +
|
|
"has no expected targets: '" +
|
|
prettyName(aRelatedIdentifiers) +
|
|
"'";
|
|
|
|
ok(false, msg);
|
|
return;
|
|
} else if (!aRelatedIdentifiers) {
|
|
ok(false, "There are unexpected targets of " + relDescr);
|
|
return;
|
|
}
|
|
|
|
var relatedIds =
|
|
aRelatedIdentifiers instanceof Array
|
|
? aRelatedIdentifiers
|
|
: [aRelatedIdentifiers];
|
|
|
|
var targets = [];
|
|
for (let idx = 0; idx < relatedIds.length; idx++) {
|
|
targets.push(getAccessible(relatedIds[idx]));
|
|
}
|
|
|
|
if (targets.length != relatedIds.length) {
|
|
return;
|
|
}
|
|
|
|
var actualTargets = relation.getTargets();
|
|
|
|
// Check if all given related accessibles are targets of obtained relation.
|
|
for (let idx = 0; idx < targets.length; idx++) {
|
|
var isFound = false;
|
|
for (let relatedAcc of actualTargets.enumerate(Ci.nsIAccessible)) {
|
|
if (targets[idx] == relatedAcc) {
|
|
isFound = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
ok(isFound, prettyName(relatedIds[idx]) + " is not a target of" + relDescr);
|
|
}
|
|
|
|
// Check if all obtained targets are given related accessibles.
|
|
for (let relatedAcc of actualTargets.enumerate(Ci.nsIAccessible)) {
|
|
let idx;
|
|
// eslint-disable-next-line no-empty
|
|
for (idx = 0; idx < targets.length && relatedAcc != targets[idx]; idx++) {}
|
|
|
|
if (idx == targets.length) {
|
|
ok(
|
|
false,
|
|
"There is unexpected target" + prettyName(relatedAcc) + "of" + relDescr
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Test that the given accessible relations don't exist.
|
|
*
|
|
* @param aIdentifier [in] identifier to get an accessible, may be ID
|
|
* attribute or DOM element or accessible object
|
|
* @param aRelType [in] relation type (see constants above)
|
|
* @param aUnrelatedIdentifiers [in] identifier or array of identifiers of
|
|
* accessibles that shouldn't exist for this
|
|
* relation.
|
|
*/
|
|
function testAbsentRelation(aIdentifier, aRelType, aUnrelatedIdentifiers) {
|
|
var relation = getRelationByType(aIdentifier, aRelType);
|
|
|
|
var relDescr = getRelationErrorMsg(aIdentifier, aRelType);
|
|
|
|
if (!aUnrelatedIdentifiers) {
|
|
ok(false, "No identifiers given for unrelated accessibles.");
|
|
return;
|
|
}
|
|
|
|
if (!relation || !relation.targetsCount) {
|
|
ok(true, "No relations exist.");
|
|
return;
|
|
}
|
|
|
|
var relatedIds =
|
|
aUnrelatedIdentifiers instanceof Array
|
|
? aUnrelatedIdentifiers
|
|
: [aUnrelatedIdentifiers];
|
|
|
|
var targets = [];
|
|
for (let idx = 0; idx < relatedIds.length; idx++) {
|
|
targets.push(getAccessible(relatedIds[idx]));
|
|
}
|
|
|
|
if (targets.length != relatedIds.length) {
|
|
return;
|
|
}
|
|
|
|
var actualTargets = relation.getTargets();
|
|
|
|
// Any found targets that match given accessibles should be called out.
|
|
for (let idx = 0; idx < targets.length; idx++) {
|
|
var notFound = true;
|
|
for (let relatedAcc of actualTargets.enumerate(Ci.nsIAccessible)) {
|
|
if (targets[idx] == relatedAcc) {
|
|
notFound = false;
|
|
break;
|
|
}
|
|
}
|
|
|
|
ok(notFound, prettyName(relatedIds[idx]) + " is a target of " + relDescr);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Return related accessible for the given relation type.
|
|
*
|
|
* @param aIdentifier [in] identifier to get an accessible, may be ID attribute
|
|
* or DOM element or accessible object
|
|
* @param aRelType [in] relation type (see constants above)
|
|
*/
|
|
function getRelationByType(aIdentifier, aRelType) {
|
|
var acc = getAccessible(aIdentifier);
|
|
if (!acc) {
|
|
return null;
|
|
}
|
|
|
|
var relation = null;
|
|
try {
|
|
relation = acc.getRelationByType(aRelType);
|
|
} catch (e) {
|
|
ok(false, "Can't get" + getRelationErrorMsg(aIdentifier, aRelType));
|
|
}
|
|
|
|
return relation;
|
|
}
|
|
|
|
// //////////////////////////////////////////////////////////////////////////////
|
|
// Private implementation details
|
|
|
|
function getRelationErrorMsg(aIdentifier, aRelType, aIsStartSentence) {
|
|
var relStr = relationTypeToString(aRelType);
|
|
var msg = aIsStartSentence ? "Relation of '" : " relation of '";
|
|
msg += relStr + "' type for '" + prettyName(aIdentifier) + "'";
|
|
msg += aIsStartSentence ? " " : ".";
|
|
|
|
return msg;
|
|
}
|