Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

<!DOCTYPE html>
<html>
<head>
<title>nsIHyper>TextAccessible in dynamic tests</title>
<link rel="stylesheet" type="text/css"
<script type="application/javascript"
src="../common.js"></script>
<script type="application/javascript"
src="../events.js"></script>
<script type="application/javascript">
const kLinksCount = 128;
function addLinks(aContainerID) {
this.containerNode = getNode(aContainerID);
this.eventSeq = [
new invokerChecker(EVENT_REORDER, this.containerNode),
];
this.invoke = function addLinks_invoke() {
for (var jdx = 0; jdx < kLinksCount; jdx++) {
var a = document.createElement("a");
a.setAttribute("href", "mozilla.org");
a.textContent = "mozilla";
this.containerNode.appendChild(a);
var span = document.createElement("span");
span.textContent = " text ";
this.containerNode.appendChild(span);
}
};
this.finalCheck = function addLinks_finalCheck() {
// getLinkAt and getLinkIndex.
var htAcc = getAccessible(this.containerNode, [nsIAccessibleHyperText]);
for (var jdx = 0; jdx < kLinksCount; jdx++) {
var link = htAcc.getLinkAt(jdx);
ok(link, "No link at index " + jdx + " for '" + aContainerID + "'");
var linkIdx = htAcc.getLinkIndex(link);
is(linkIdx, jdx, "Wrong link index for '" + aContainerID + "'!");
}
};
this.getID = function addLinks_getID() {
return "Add links for '" + aContainerID + "'";
};
}
function updateText(aContainerID) {
this.containerNode = getNode(aContainerID);
this.container = getAccessible(this.containerNode, nsIAccessibleHyperText);
this.text = this.container.firstChild;
this.textNode = this.text.DOMNode;
this.textLen = this.textNode.data.length;
this.eventSeq = [
new invokerChecker(EVENT_TEXT_INSERTED, this.containerNode),
];
this.invoke = function updateText_invoke() {
is(this.container.getLinkIndexAtOffset(this.textLen), 0,
"Wrong intial text offsets!");
this.text.DOMNode.appendData(" my");
};
this.finalCheck = function updateText_finalCheck() {
is(this.container.getLinkIndexAtOffset(this.textLen), -1,
"Text offsets weren't updated!");
};
this.getID = function updateText_getID() {
return "update text for '" + aContainerID + "'";
};
}
/**
* Text offsets must be updated when hypertext child is removed.
*/
function removeChild(aContainerID, aChildID, aInitialText, aFinalText) {
this.containerNode = getNode(aContainerID);
this.container = getAccessible(this.containerNode, nsIAccessibleText);
this.childNode = getNode(aChildID);
// Call first to getText so offsets are cached
is(this.container.getText(0, -1), aInitialText,
"Wrong text before child removal");
this.eventSeq = [
new invokerChecker(EVENT_REORDER, this.containerNode),
];
this.invoke = function removeChild_invoke() {
this.containerNode.removeChild(this.childNode);
};
this.finalCheck = function removeChild_finalCheck() {
is(this.container.getText(0, -1), aFinalText,
"Wrong text after child removal");
is(this.container.characterCount, aFinalText.length,
"Wrong text after child removal");
};
this.getID = function removeChild_getID() {
return "check text after removing child from '" + aContainerID + "'";
};
}
function removeFirstChild(aContainer) {
this.ht = getAccessible(aContainer, [ nsIAccessibleHyperText ]);
this.eventSeq = [
new invokerChecker(EVENT_REORDER, aContainer),
];
this.invoke = function removeFirstChild_invoke() {
is(this.ht.linkCount, 2, "Wrong embedded objects count before removal");
getNode(aContainer).removeChild(getNode(aContainer).firstElementChild);
};
this.finalCheck = function removeFirstChild_finalCheck() {
// check list index before link count
is(this.ht.getLinkIndex(this.ht.firstChild), 0, "Wrong child index");
is(this.ht.linkCount, 1, "Wrong embedded objects count after removal");
};
this.getID = function removeFirstChild_getID() {
return "Remove first child and check embedded object indeces";
};
}
function removeLastChild(aContainer) {
this.ht = getAccessible(aContainer, [ nsIAccessibleHyperText ]);
this.eventSeq = [
new invokerChecker(EVENT_REORDER, aContainer),
];
this.invoke = function removeLastChild_invoke() {
is(this.ht.linkCount, 1, "Wrong embedded objects count before removal");
getNode(aContainer).removeChild(getNode(aContainer).lastElementChild);
};
this.finalCheck = function removeLastChild_finalCheck() {
is(this.ht.linkCount, 0, "Wrong embedded objects count after removal");
var link = null;
try {
link = this.ht.getLinkAt(0);
} catch (e) { }
ok(!link, "No embedded object is expected");
};
this.getID = function removeLastChild_getID() {
return "Remove last child and try its embedded object";
};
}
// gA11yEventDumpToConsole = true; // debug stuff
var gQueue = null;
function doTest() {
gQueue = new eventQueue();
gQueue.push(new addLinks("p1"));
gQueue.push(new updateText("p2"));
gQueue.push(new removeChild("div1", "div2",
"hello my good friend", "hello friend"));
gQueue.push(new removeFirstChild("c4"));
gQueue.push(new removeLastChild("c5"));
gQueue.invoke(); // Will call SimpleTest.finish();
}
SimpleTest.waitForExplicitFinish();
addA11yLoadEvent(doTest);
</script>
</head>
<body>
<a target="_blank"
title="Cache links within hypertext accessible"
Mozilla Bug 572394
</a>
<a target="_blank"
title="Text offsets don't get updated when text of first child text accessible is changed"
Mozilla Bug 625009
</a>
<a target="_blank"
title="Crash in nsHyperTextAccessible::GetText()"
Mozilla Bug 630841
</a><br>
<p id="display"></p>
<div id="content" style="display: none"></div>
<pre id="test">
</pre>
<p id="p1"></p>
<p id="p2"><b>hello</b><a>friend</a></p>
<div id="div1">hello<span id="div2"> my<span id="div3"> good</span></span> friend</span></div>
<form id="c4">
<label for="c4_input">label</label>
<input id="c4_input">
</form>
<div id="c5">TextLeaf<input id="c5_input"></div>
</body>
</html>