Source code

Revision control

Copy as Markdown

Other Tools

Test Info:

/* 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";
/* import-globals-from ../../mochitest/text.js */
addAccessibleTask(
`
<p id="p" style="white-space: pre-line;">A bug
h<a href="#">id i</a>n
the <strong>big</strong> rug.</p>
`,
function (browser, docAcc) {
const container = findAccessibleChildByID(docAcc, "p");
const firstPoint = createTextLeafPoint(container, 0);
const lastPoint = createTextLeafPoint(container, kTextEndOffset);
let charSequence = [
...textBoundaryGenerator(firstPoint, BOUNDARY_CHAR, DIRECTION_NEXT),
];
testPointEqual(
firstPoint,
charSequence[0],
"Point constructed via container and offset 0 is first character point."
);
testPointEqual(
lastPoint,
charSequence[charSequence.length - 1],
"Point constructed via container and kTextEndOffset is last character point."
);
const expectedCharSequence = [
["A bug\nh", 0],
["A bug\nh", 1],
["A bug\nh", 2],
["A bug\nh", 3],
["A bug\nh", 4],
["A bug\nh", 5],
["A bug\nh", 6],
["id i", 0],
["id i", 1],
["id i", 2],
["id i", 3],
["n\nthe ", 0],
["n\nthe ", 1],
["n\nthe ", 2],
["n\nthe ", 3],
["n\nthe ", 4],
["n\nthe ", 5],
["big", 0],
["big", 1],
["big", 2],
[" rug.", 0],
[" rug.", 1],
[" rug.", 2],
[" rug.", 3],
[" rug.", 4],
[" rug.", 5],
];
testBoundarySequence(
firstPoint,
BOUNDARY_CHAR,
DIRECTION_NEXT,
expectedCharSequence,
"Forward BOUNDARY_CHAR sequence is correct"
);
testBoundarySequence(
lastPoint,
BOUNDARY_CHAR,
DIRECTION_PREVIOUS,
[...expectedCharSequence].reverse(),
"Backward BOUNDARY_CHAR sequence is correct"
);
const expectedWordStartSequence = [
["A bug\nh", 0],
["A bug\nh", 2],
["A bug\nh", 6],
["id i", 3],
["n\nthe ", 2],
["big", 0],
[" rug.", 1],
];
testBoundarySequence(
firstPoint,
BOUNDARY_WORD_START,
DIRECTION_NEXT,
// Add last point in doc
[...expectedWordStartSequence, readablePoint(lastPoint)],
"Forward BOUNDARY_WORD_START sequence is correct"
);
testBoundarySequence(
lastPoint,
BOUNDARY_WORD_START,
DIRECTION_PREVIOUS,
[...expectedWordStartSequence].reverse(),
"Backward BOUNDARY_WORD_START sequence is correct"
);
const expectedWordEndSequence = [
["A bug\nh", 1],
["A bug\nh", 5],
["id i", 2],
["n\nthe ", 1],
["n\nthe ", 5],
[" rug.", 0],
[" rug.", 5],
];
testBoundarySequence(
firstPoint,
BOUNDARY_WORD_END,
DIRECTION_NEXT,
expectedWordEndSequence,
"Forward BOUNDARY_WORD_END sequence is correct"
);
testBoundarySequence(
lastPoint,
BOUNDARY_WORD_END,
DIRECTION_PREVIOUS,
[readablePoint(firstPoint), ...expectedWordEndSequence].reverse(),
"Backward BOUNDARY_WORD_END sequence is correct"
);
const expectedLineStartSequence = [
["A bug\nh", 0],
["A bug\nh", 6],
["n\nthe ", 2],
];
testBoundarySequence(
firstPoint,
BOUNDARY_LINE_START,
DIRECTION_NEXT,
// Add last point in doc
[...expectedLineStartSequence, readablePoint(lastPoint)],
"Forward BOUNDARY_LINE_START sequence is correct"
);
testBoundarySequence(
lastPoint,
BOUNDARY_LINE_START,
DIRECTION_PREVIOUS,
[...expectedLineStartSequence].reverse(),
"Backward BOUNDARY_LINE_START sequence is correct"
);
const expectedLineEndSequence = [
["A bug\nh", 5],
["n\nthe ", 1],
];
testBoundarySequence(
firstPoint,
BOUNDARY_LINE_END,
DIRECTION_NEXT,
// Add last point in doc
[...expectedLineEndSequence, readablePoint(lastPoint)],
"Forward BOUNDARY_LINE_END sequence is correct",
{ todo: true }
);
testBoundarySequence(
lastPoint,
BOUNDARY_LINE_END,
DIRECTION_PREVIOUS,
[readablePoint(firstPoint), ...expectedLineEndSequence].reverse(),
"Backward BOUNDARY_LINE_END sequence is correct"
);
},
{ chrome: true, topLevel: true, iframe: false, remoteIframe: false }
);
addAccessibleTask(
`<p id="p">
Rob ca<input id="i1" value="n m">op up.
</p>`,
function (browser, docAcc) {
const container = findAccessibleChildByID(docAcc, "p");
const firstPoint = createTextLeafPoint(container, 0);
const lastPoint = createTextLeafPoint(container, kTextEndOffset);
testBoundarySequence(
firstPoint,
BOUNDARY_CHAR,
DIRECTION_NEXT,
[
["Rob ca", 0],
["Rob ca", 1],
["Rob ca", 2],
["Rob ca", 3],
["Rob ca", 4],
["Rob ca", 5],
["n m", 0],
["n m", 1],
["n m", 2],
["n m", 3],
],
"Forward BOUNDARY_CHAR sequence when stopping in editable is correct",
{ flags: BOUNDARY_FLAG_STOP_IN_EDITABLE }
);
testBoundarySequence(
lastPoint,
BOUNDARY_CHAR,
DIRECTION_PREVIOUS,
[
["op up. ", 7],
["op up. ", 6],
["op up. ", 5],
["op up. ", 4],
["op up. ", 3],
["op up. ", 2],
["op up. ", 1],
["op up. ", 0],
["n m", 2],
["n m", 1],
["n m", 0],
],
"Backward BOUNDARY_CHAR sequence when stopping in editable is correct",
{ flags: BOUNDARY_FLAG_STOP_IN_EDITABLE }
);
testBoundarySequence(
firstPoint,
BOUNDARY_WORD_START,
DIRECTION_NEXT,
[
["Rob ca", 0],
["Rob ca", 4],
["n m", 2],
],
"Forward BOUNDARY_WORD_START sequence when stopping in editable is correct",
{
flags: BOUNDARY_FLAG_STOP_IN_EDITABLE,
todo: true, // Shouldn't consider end of input a word start
}
);
},
{ chrome: true, topLevel: true, iframe: false, remoteIframe: false }
);
addAccessibleTask(
`
<p id="p" style="white-space: pre-line;">A bug
on a <span style="display: block;">rug</span></p>
<p id="p2">
Numbers:
</p>
<ul>
<li>One</li>
<li>Two</li>
<li>Three</li>
</ul>`,
function (browser, docAcc) {
const firstPoint = createTextLeafPoint(docAcc, 0);
const lastPoint = createTextLeafPoint(docAcc, kTextEndOffset);
const expectedParagraphStart = [
["A bug\non a ", 0],
["A bug\non a ", 6],
["rug", 0],
["Numbers: ", 0],
["• ", 0],
["• ", 0],
["• ", 0],
];
testBoundarySequence(
firstPoint,
BOUNDARY_PARAGRAPH,
DIRECTION_NEXT,
[...expectedParagraphStart, readablePoint(lastPoint)],
"Forward BOUNDARY_PARAGRAPH sequence is correct"
);
const paragraphStart = createTextLeafPoint(
findAccessibleChildByID(docAcc, "p2").firstChild,
0
);
const wordEnd = paragraphStart.findBoundary(
BOUNDARY_WORD_END,
DIRECTION_NEXT,
BOUNDARY_FLAG_INCLUDE_ORIGIN
);
testPointEqual(
wordEnd,
paragraphStart,
"The word end from the previous block is the first point in this block"
);
},
{ chrome: true, topLevel: true, iframe: false, remoteIframe: false }
);
// Test for skipping list item bullets.
addAccessibleTask(
`<ul>
<li>One</li>
<li>Two</li>
<li style="white-space: pre-line;">Three
Four</li>
</ul>`,
function (browser, docAcc) {
const firstPoint = createTextLeafPoint(docAcc, 0);
const lastPoint = createTextLeafPoint(docAcc, kTextEndOffset);
const firstNonMarkerPoint = firstPoint.findBoundary(
BOUNDARY_CHAR,
DIRECTION_NEXT,
BOUNDARY_FLAG_SKIP_LIST_ITEM_MARKER | BOUNDARY_FLAG_INCLUDE_ORIGIN
);
Assert.deepEqual(
readablePoint(firstNonMarkerPoint),
["One", 0],
"First non-marker point is correct"
);
const expectedParagraphStart = [
["One", 0],
["Two", 0],
["Three\nFour", 0],
["Three\nFour", 6],
];
testBoundarySequence(
firstPoint,
BOUNDARY_PARAGRAPH,
DIRECTION_NEXT,
[...expectedParagraphStart, readablePoint(lastPoint)],
"Forward BOUNDARY_PARAGRAPH skipping list item markers sequence is correct",
{ flags: BOUNDARY_FLAG_SKIP_LIST_ITEM_MARKER }
);
testBoundarySequence(
lastPoint,
BOUNDARY_PARAGRAPH,
DIRECTION_PREVIOUS,
[...expectedParagraphStart].reverse(),
"Backward BOUNDARY_PARAGRAPH skipping list item markers sequence is correct",
{ flags: BOUNDARY_FLAG_SKIP_LIST_ITEM_MARKER }
);
const expectedCharSequence = [
["One", 0],
["One", 1],
["One", 2],
["Two", 0],
["Two", 1],
["Two", 2],
["Three\nFour", 0],
["Three\nFour", 1],
["Three\nFour", 2],
["Three\nFour", 3],
["Three\nFour", 4],
["Three\nFour", 5],
["Three\nFour", 6],
["Three\nFour", 7],
["Three\nFour", 8],
["Three\nFour", 9],
["Three\nFour", 10],
];
testBoundarySequence(
firstPoint,
BOUNDARY_CHAR,
DIRECTION_NEXT,
expectedCharSequence,
"Forward BOUNDARY_CHAR skipping list item markers sequence is correct",
{ flags: BOUNDARY_FLAG_SKIP_LIST_ITEM_MARKER }
);
testBoundarySequence(
lastPoint,
BOUNDARY_CHAR,
DIRECTION_PREVIOUS,
[...expectedCharSequence].reverse(),
"Backward BOUNDARY_CHAR skipping list item markers sequence is correct",
{ flags: BOUNDARY_FLAG_SKIP_LIST_ITEM_MARKER }
);
const expectedWordStartSequence = [
["One", 0],
["Two", 0],
["Three\nFour", 0],
["Three\nFour", 6],
];
testBoundarySequence(
firstPoint,
BOUNDARY_WORD_START,
DIRECTION_NEXT,
[...expectedWordStartSequence, readablePoint(lastPoint)],
"Forward BOUNDARY_WORD_START skipping list item markers sequence is correct",
{ flags: BOUNDARY_FLAG_SKIP_LIST_ITEM_MARKER }
);
testBoundarySequence(
lastPoint,
BOUNDARY_WORD_START,
DIRECTION_PREVIOUS,
[...expectedWordStartSequence].reverse(),
"Backward BOUNDARY_WORD_START skipping list item markers sequence is correct",
{ flags: BOUNDARY_FLAG_SKIP_LIST_ITEM_MARKER }
);
const expectedWordEndSequence = [
["Two", 0],
["Three\nFour", 0],
["Three\nFour", 5],
["Three\nFour", 10],
];
testBoundarySequence(
firstPoint,
BOUNDARY_WORD_END,
DIRECTION_NEXT,
expectedWordEndSequence,
"Forward BOUNDARY_WORD_END skipping list item markers sequence is correct",
{ flags: BOUNDARY_FLAG_SKIP_LIST_ITEM_MARKER }
);
testBoundarySequence(
lastPoint,
BOUNDARY_WORD_END,
DIRECTION_PREVIOUS,
[
readablePoint(firstNonMarkerPoint),
...expectedWordEndSequence,
].reverse(),
"Backward BOUNDARY_WORD_END skipping list item markers sequence is correct",
{ flags: BOUNDARY_FLAG_SKIP_LIST_ITEM_MARKER }
);
const expectedLineStartSequence = [
["One", 0],
["Two", 0],
["Three\nFour", 0],
["Three\nFour", 6],
];
testBoundarySequence(
firstPoint,
BOUNDARY_LINE_START,
DIRECTION_NEXT,
// Add last point in doc
[...expectedLineStartSequence, readablePoint(lastPoint)],
"Forward BOUNDARY_LINE_START skipping list item markers sequence is correct",
{ flags: BOUNDARY_FLAG_SKIP_LIST_ITEM_MARKER }
);
testBoundarySequence(
lastPoint,
BOUNDARY_LINE_START,
DIRECTION_PREVIOUS,
// Add last point in doc
[...expectedLineStartSequence].reverse(),
"Backward BOUNDARY_LINE_START skipping list item markers sequence is correct",
{ flags: BOUNDARY_FLAG_SKIP_LIST_ITEM_MARKER }
);
},
{ chrome: true, topLevel: true, iframe: false, remoteIframe: false }
);
/**
* Test the paragraph boundary on tables.
*/
addAccessibleTask(
`
<table id="table">
<tr><th>a</th><td>b</td></tr>
<tr><td>c</td><td>d</td></tr>
</table>
`,
async function (browser, docAcc) {
const firstPoint = createTextLeafPoint(docAcc, 0);
const lastPoint = createTextLeafPoint(docAcc, kTextEndOffset);
testBoundarySequence(
firstPoint,
BOUNDARY_PARAGRAPH,
DIRECTION_NEXT,
[["a", 0], ["b", 0], ["c", 0], ["d", 0], readablePoint(lastPoint)],
"Forward BOUNDARY_PARAGRAPH sequence is correct"
);
},
{ chrome: true, topLevel: true, iframe: false, remoteIframe: false }
);
/*
* Test the word boundary with punctuation character
*/
addAccessibleTask(
`
<p>ab'cd</p>
`,
async function (browser, docAcc) {
const firstPoint = createTextLeafPoint(docAcc, 0);
const lastPoint = createTextLeafPoint(docAcc, kTextEndOffset);
const expectedWordStartSequence = [
["ab'cd", 0],
["ab'cd", 3],
["ab'cd", 5],
];
testBoundarySequence(
firstPoint,
BOUNDARY_WORD_START,
DIRECTION_NEXT,
expectedWordStartSequence,
"Forward BOUNDARY_WORD_START sequence is correct"
);
const expectedWordEndSequence = [
["ab'cd", 5],
["ab'cd", 3],
["ab'cd", 0],
];
testBoundarySequence(
lastPoint,
BOUNDARY_WORD_END,
DIRECTION_PREVIOUS,
expectedWordEndSequence,
"Backward BOUNDARY_WORD_END sequence is correct"
);
},
{ chrome: true, topLevel: true, iframe: false, remoteIframe: false }
);