gecko/accessible/tests/mochitest/test_nsIAccessibleHyperLink.html

328 lines
14 KiB
HTML

<!DOCTYPE html>
<html>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=418368
-->
<head>
<title>nsIHyperLinkAccessible chrome tests</title>
<link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css" />
<script type="application/javascript"
src="chrome://mochikit/content/MochiKit/packed.js"></script>
<script type="application/javascript"
src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
<script type="application/javascript"
src="chrome://mochikit/content/a11y/accessible/common.js"></script>
<script type="application/javascript"
src="chrome://mochikit/content/a11y/accessible/role.js"></script>
<script type="application/javascript"
src="chrome://mochikit/content/a11y/accessible/nsIAccessible_states.js"></script>
<script type="application/javascript">
function testThis(aID, aAcc, aRole, aAnchors, aName, aValid, aStartIndex,
aEndIndex)
{
testRole(aAcc, aRole);
is(aAcc.anchorCount, aAnchors, "Wrong number of anchors for ID "
+ aID + "!");
is(aAcc.getAnchor(0).name, aName, "Wrong name for ID "
+ aID + "!");
is(aAcc.valid, aValid, "No correct valid state for ID "
+ aID + "!");
is(aAcc.startIndex, aStartIndex, "Wrong startIndex value for ID "
+ aID + "!");
is(aAcc.endIndex, aEndIndex, "Wrong endIndex value for ID "
+ aID + "!");
}
function testFocus(aID, aAcc, aSelectedBefore, aSelectedAfter)
{
is(aAcc.selected, aSelectedBefore,
"Wrong selected state before focus for ID " + aID + "!");
document.getElementById(aID).focus();
is(aAcc.selected, aSelectedAfter,
"Wrong seleccted state after focus for ID " + aID + "!");
}
function testAction(aId, aAcc, aActionName)
{
var numActions = aActionName ? 1 : 0;
is(aAcc.numActions, numActions,
"Wrong actions number for ID " + aId);
try {
is(aAcc.getActionName(0), aActionName,
"Wrong action name for ID " + aId);
} catch (e) {
if (numActions)
ok(false, "Exception on action name getting for ID " + aId);
else
ok(true, "Correct action name for ID " + aId);
}
}
function doTest()
{
//////////////////////////////////////////////////////////////////////////
// normal hyperlink
var normalHyperlinkAcc = getAccessible("NormalHyperlink",
[nsIAccessibleHyperLink]);
testThis("NormalHyperlink", normalHyperlinkAcc, ROLE_LINK, 1,
"Mozilla Foundation", true, 18, 19);
is(normalHyperlinkAcc.getURI(0).spec, "http://www.mozilla.org/",
"URI wrong for normalHyperlinkElement!");
testStates(normalHyperlinkAcc,
(STATE_FOCUSABLE | STATE_LINKED),
(EXT_STATE_HORIZONTAL));
testFocus("NormalHyperlink", normalHyperlinkAcc, false, true);
testStates(normalHyperlinkAcc,
(STATE_FOCUSABLE | STATE_FOCUSED | STATE_LINKED),
(EXT_STATE_HORIZONTAL));
//////////////////////////////////////////////////////////////////////////
// ARIA hyperlink
var ariaHyperlinkAcc = getAccessible("AriaHyperlink",
[nsIAccessibleHyperLink]);
testThis("AriaHyperlink", ariaHyperlinkAcc, ROLE_LINK, 1,
"Mozilla Foundation Home", true, 32, 33);
testStates(ariaHyperlinkAcc,
(STATE_FOCUSABLE | STATE_LINKED),
(EXT_STATE_HORIZONTAL));
testFocus("AriaHyperlink", ariaHyperlinkAcc, false, true);
testStates(ariaHyperlinkAcc,
(STATE_FOCUSABLE | STATE_FOCUSED | STATE_LINKED),
(EXT_STATE_HORIZONTAL));
testAction("AriaHyperlink", ariaHyperlinkAcc, "click");
//////////////////////////////////////////////////////////////////////////
// ARIA hyperlink with status invalid
var invalidAriaHyperlinkAcc = getAccessible("InvalidAriaHyperlink",
[nsIAccessibleHyperLink]);
is(invalidAriaHyperlinkAcc.valid, false, "Should not be valid!");
testStates(invalidAriaHyperlinkAcc,
(STATE_LINKED),
(EXT_STATE_HORIZONTAL), (STATE_FOCUSABLE));
testFocus("InvalidAriaHyperlink", invalidAriaHyperlinkAcc,
false, false);
//////////////////////////////////////////////////////////////////////////
// image map and its link children
var imageMapHyperlinkAcc = getAccessible("imgmap",
[nsIAccessibleHyperLink]);
testThis("imgmap", imageMapHyperlinkAcc, ROLE_IMAGE_MAP, 2, "b", true,
83, 84);
is(imageMapHyperlinkAcc.getURI(0).spec,
"http://www.bbc.co.uk/radio4/atoz/index.shtml#b", "URI wrong!");
is(imageMapHyperlinkAcc.getURI(1).spec,
"http://www.bbc.co.uk/radio4/atoz/index.shtml#a", "URI wrong!");
testStates(imageMapHyperlinkAcc,
(0),
(EXT_STATE_HORIZONTAL));
var area1 = getAccessible(imageMapHyperlinkAcc.firstChild,
[nsIAccessibleHyperLink]);
testThis("Area1", area1, ROLE_LINK, 1, "b", true, 0, 1);
is(area1.getURI(0).spec,
"http://www.bbc.co.uk/radio4/atoz/index.shtml#b", "URI wrong!");
testStates(area1, (STATE_LINKED));
var area2 = getAccessible(area1.nextSibling,
[nsIAccessibleHyperLink]);
testThis("Area2", area2, ROLE_LINK, 1, "a", true, 1, 2);
is(area2.getURI(0).spec,
"http://www.bbc.co.uk/radio4/atoz/index.shtml#a", "URI wrong!");
testStates(area2, (STATE_LINKED));
//////////////////////////////////////////////////////////////////////////
// empty hyperlink
var EmptyHLAcc = getAccessible("emptyLink",
[nsIAccessibleHyperLink]);
testThis("emptyLink", EmptyHLAcc, ROLE_LINK, 1, null, true, 98, 99);
testStates(EmptyHLAcc,
(STATE_FOCUSABLE | STATE_LINKED),
(EXT_STATE_HORIZONTAL));
testAction("emptyLink", EmptyHLAcc, "jump");
//////////////////////////////////////////////////////////////////////////
// normal hyperlink with embedded span
var hyperlinkWithSpanAcc = getAccessible("LinkWithSpan",
[nsIAccessibleHyperLink]);
testThis("LinkWithSpan", hyperlinkWithSpanAcc, ROLE_LINK, 1,
"Heise Online", true, 124, 125);
is(hyperlinkWithSpanAcc.getURI(0).spec, "http://www.heise.de/",
"URI wrong for hyperlinkElementWithSpan!");
testStates(hyperlinkWithSpanAcc,
(STATE_FOCUSABLE | STATE_LINKED),
(EXT_STATE_HORIZONTAL));
testFocus("LinkWithSpan", hyperlinkWithSpanAcc, false, true);
testStates(hyperlinkWithSpanAcc,
(STATE_FOCUSABLE | STATE_FOCUSED | STATE_LINKED),
(EXT_STATE_HORIZONTAL));
testAction("LinkWithSpan", hyperlinkWithSpanAcc, "jump");
//////////////////////////////////////////////////////////////////////////
// Named anchor, should never have state_linked
var namedAnchorAcc = getAccessible("namedAnchor",
[nsIAccessibleHyperLink]);
testThis("namedAnchor", namedAnchorAcc, ROLE_LINK, 1,
"This should never be of state_linked", true, 202, 203);
testStates(namedAnchorAcc,
(STATE_SELECTABLE),
(EXT_STATE_HORIZONTAL), (STATE_FOCUSABLE | STATE_LINKED));
testAction("namedAnchor", namedAnchorAcc, "");
//////////////////////////////////////////////////////////////////////////
// No link (hasn't any attribute), should never have state_linked
var noLinkAcc = getAccessible("noLink",
[nsIAccessibleHyperLink]);
testThis("noLink", noLinkAcc, ROLE_LINK, 1,
"This should never be of state_linked", true, 262, 263);
testStates(noLinkAcc,
0,
(EXT_STATE_HORIZONTAL), (STATE_FOCUSABLE | STATE_LINKED));
testAction("noLink", noLinkAcc, "");
//////////////////////////////////////////////////////////////////////////
// Link with registered 'click' event, should have state_linked
var linkWithClickAcc = getAccessible("linkWithClick",
[nsIAccessibleHyperLink]);
testThis("linkWithClick", linkWithClickAcc, ROLE_LINK, 1,
"This should have state_linked", true, 301, 302);
testStates(linkWithClickAcc,
(STATE_LINKED),
(EXT_STATE_HORIZONTAL));
testAction("linkWithClick", linkWithClickAcc, "click");
//////////////////////////////////////////////////////////////////////////
// Maps to group links (bug 431615).
var linksMapAcc = getAccessible("linksmap");
//////////////////////////////////////////////////////////////////////////
// Link with title attribute, no name from the subtree (bug 438325).
var id = "linkWithTitleNoNameFromSubtree";
var linkAcc = getAccessible(id, [nsIAccessibleHyperLink]);
testThis(id, linkAcc, ROLE_LINK, 1, "Link with title", true, 354, 355);
testStates(linkAcc,
(STATE_LINKED),
(EXT_STATE_HORIZONTAL));
testAction(id, linkAcc, "jump");
//////////////////////////////////////////////////////////////////////////
// Link with title attribute, name from the subtree - onscreen name
// (bug 438325).
id = "linkWithTitleNameFromSubtree";
linkAcc = getAccessible(id, [nsIAccessibleHyperLink]);
testThis(id, linkAcc, ROLE_LINK, 1, "the name from subtree", true, 403,
404);
testStates(linkAcc,
(STATE_LINKED),
(EXT_STATE_HORIZONTAL));
testAction(id, linkAcc, "jump");
//////////////////////////////////////////////////////////////////////////
// Link with title attribute, name from the nested html:img (bug 438325).
id = "linkWithTitleNameFromImg";
linkAcc = getAccessible(id, [nsIAccessibleHyperLink]);
testThis(id, linkAcc, ROLE_LINK, 1, "The title for link", true, 458,
459);
testStates(linkAcc,
(STATE_LINKED),
(EXT_STATE_HORIZONTAL));
testAction(id, linkAcc, "jump");
//////////////////////////////////////////////////////////////////////////
// Link with label, no name from the subtree (bug 438325).
id = "linkWithLabelNoNameFromSubtree";
linkAcc = getAccessible(id, [nsIAccessibleHyperLink]);
testThis(id, linkAcc, ROLE_LINK, 1, "Link with label and nested image:",
true, 462, 463);
testStates(linkAcc,
(STATE_LINKED),
(EXT_STATE_HORIZONTAL));
testAction(id, linkAcc, "jump");
//////////////////////////////////////////////////////////////////////////
//
SimpleTest.finish();
}
SimpleTest.waitForExplicitFinish();
addLoadEvent(doTest);
</script>
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=418368">Mozilla Bug 418368</a>
<p id="display"></p>
<div id="content" style="display: none"></div>
<pre id="test">
</pre>
<br>Simple link:<br>
<a id="NormalHyperlink" href="http://www.mozilla.org">Mozilla Foundation</a>
<br>ARIA link:<br>
<span id="AriaHyperlink" role="link"
onclick="window.open('http://www.mozilla.org/');"
tabindex="0">Mozilla Foundation Home</span>
<br>Invalid, non-focusable hyperlink:<br>
<span id="InvalidAriaHyperlink" role="link" aria-invalid="true"
onclick="window.open('http:/www.mozilla.org/');">Invalid link</span>
<br>Image map:<br>
<map name="atoz_map">
<area href="http://www.bbc.co.uk/radio4/atoz/index.shtml#b"
coords="17,0,30,14"
alt="b"
shape="rect"></area>
<area href="http://www.bbc.co.uk/radio4/atoz/index.shtml#a"
coords="0,0,13,14"
alt="a"
shape="rect"></area>
</map>
<img width="447" id="imgmap"
height="15"
usemap="#atoz_map"
src="letters.gif"></img>
<br>Empty link:<br>
<a id="emptyLink" href=""><img src=""></img></a>
<br>Link with embedded span<br>
<a id="LinkWithSpan" href="http://www.heise.de/"><span lang="de">Heise Online</span></a>
<br>Named anchor, must not have "linked" state for it to be exposed correctly:<br>
<a id="namedAnchor" name="named_anchor">This should never be of state_linked</a>
<br>Link having no attributes, must not have "linked" state:</br>
<a id="noLink">This should never be of state_linked</a>
<br>Link with registered 'click' event: </br>
<a id="linkWithClick" onclick="var clicked = true;">This should have state_linked</a>
<br>Link with title attribute (no name from subtree): </br>
<a id="linkWithTitleNoNameFromSubtree" href="http://www.heise.de/"
title="Link with title"><img src=""/></a>
<br>Link with title attribute (name from subtree): </br>
<a id="linkWithTitleNameFromSubtree" href="http://www.heise.de/"
title="Link with title">the name from subtree</a>
<br>Link with title attribute (name from nested image): </br>
<a id="linkWithTitleNameFromImg" href="http://www.heise.de/"
title="Link with title"><img src="" alt="The title for link"/></a>
<br><label for="linkWithLabelNoNameFromSubtree">Link with label and nested image: </label></br>
<a id="linkWithLabelNoNameFromSubtree"
href="http://www.heise.de/"><img src=""/></a>
<br>Map that is used to group links (www.w3.org/TR/WCAG10-HTML-TECHS/#group-bypass),
also see the bug 431615:<br>
<map id="linksmap" title="Site navigation">
<ul>
<li><a href="http://mozilla.org">About the project</a></li>
<li><a href="http://mozilla.org">Sites and sounds</a></li>
</ul>
</map>
</body>
</html>