| <!DOCTYPE html> |
| <script src="../resources/testharness.js"></script> |
| <script src="../resources/testharnessreport.js"></script> |
| |
| <p id="paragraph"> |
| The <b id="quick">quick</b> brown fox |
| <br> |
| jumps over the lazy <b id="dog">dog</b>. |
| </p> |
| |
| <div contentEditable="true" id="contentEditable"> |
| <div> |
| <span>Line </span><span>one has one trailing space.</span><span> </span> |
| </div> |
| <div> |
| <span>		</span><span>Line</span><span> two has two leading tabs.</span> |
| </div> |
| </div> |
| |
| <p id="paragraphWithLink"> |
| Paragraph with a <a href="#">link</a> inside. |
| </p> |
| |
| <p id="paragraphWithAnonymousBlock"> |
| Paragraph with an <span style="background-color: red;">anonymous block</span> inside. |
| </p> |
| |
| <ol id="list"> |
| <li>List item</li> |
| </ol> |
| |
| <script> |
| test(() => { |
| let axObj = accessibilityController.accessibleElementById('paragraph'); |
| // Find the first inline text box. |
| while (axObj.childrenCount > 0) |
| axObj = axObj.childAtIndex(0); |
| assert_equals(axObj.role, 'AXRole: AXInlineTextBox'); |
| |
| let lineText = []; |
| let lastInlineText = axObj; |
| while (axObj && axObj.isValid) { |
| assert_equals(axObj.role, 'AXRole: AXInlineTextBox'); |
| lineText.push(axObj.name.replace('AXValue: ', '')); |
| lastInlineText = axObj; |
| axObj = axObj.nextOnLine(); |
| } |
| assert_array_equals(lineText, ['The ', 'quick', ' brown fox ']); |
| |
| // Now walk backwards. |
| lineText = []; |
| axObj = lastInlineText; |
| while (axObj && axObj.isValid) { |
| assert_equals(axObj.role, 'AXRole: AXInlineTextBox'); |
| lineText.unshift(axObj.name.replace('AXValue: ', '')); |
| axObj = axObj.previousOnLine(); |
| } |
| assert_array_equals(lineText, ['The ', 'quick', ' brown fox ']); |
| }, 'Test |NextOnLine| and |PreviousOnLine| on |AXInlineTextBox|.'); |
| |
| test(() => { |
| let axEditable = accessibilityController.accessibleElementById('contentEditable'); |
| // There should be two lines in this content editable. |
| assert_equals(axEditable.childrenCount, 2); |
| let lines = [axEditable.childAtIndex(0), axEditable.childAtIndex(1)]; |
| let lineText = [ |
| ['Line ', 'one has one trailing space.'], |
| ['Line', ' two has two leading tabs.'] |
| ]; |
| |
| for (let i = 0; i < lines.length; ++i) { |
| let currentLine = lines[i]; |
| assert_equals(currentLine.nextOnLine(), undefined); |
| assert_equals(currentLine.previousOnLine(), undefined); |
| } |
| |
| for (let i = 0; i < lines.length; ++i) { |
| let currentLine = lines[i]; |
| let currentLineText = lineText[i]; |
| // There should be two spans per line since white space is removed. |
| assert_equals(currentLine.childrenCount, 2); |
| |
| let span1 = currentLine.childAtIndex(0); |
| let span2 = currentLine.childAtIndex(1); |
| let inlineText1 = span1.childAtIndex(0); |
| let inlineText2 = span2.childAtIndex(0); |
| let spanText1 = currentLineText[0]; |
| let spanText2 = currentLineText[1]; |
| assert_equals(span1.role, 'AXRole: AXStaticText'); |
| assert_equals(span2.role, 'AXRole: AXStaticText'); |
| assert_equals(span1.name, spanText1); |
| assert_equals(span2.name, spanText2); |
| |
| // |next/previousOnLine| APIs jump directly to the inline text boxes |
| // skipping the parent span element. |
| assert_equals(span1.nextOnLine(), inlineText2, 'span1 -> inlineText2'); |
| assert_equals(inlineText1.nextOnLine(), inlineText2, 'inlineText1 -> inlineText2'); |
| assert_equals(span2.previousOnLine(), inlineText1, 'span2 -> inlineText1'); |
| assert_equals(inlineText2.previousOnLine(), inlineText1, 'inlineText2 -> inlineText1'); |
| } |
| }, 'Test |NextOnLine| and |PreviousOnLine| on |AXLayoutObject|.'); |
| |
| test(() => { |
| let axObj = accessibilityController.accessibleElementById('paragraphWithLink'); |
| // There should be two static text children and a link in this paragraph. |
| assert_equals(axObj.childrenCount, 3); |
| axObj = axObj.childAtIndex(0); |
| assert_equals(axObj.role, 'AXRole: AXStaticText'); |
| |
| let lineText = []; |
| lineText.push(axObj.name); |
| for (let i = 0; i < 2; ++i) { |
| axObj = axObj.nextOnLine(); |
| assert_equals(axObj.role, 'AXRole: AXInlineTextBox'); |
| lineText.push(axObj.name); |
| } |
| |
| for (let i = 0; i < 2; ++i) { |
| axObj = axObj.previousOnLine(); |
| assert_equals(axObj.role, 'AXRole: AXInlineTextBox'); |
| lineText.push(axObj.name); |
| } |
| |
| assert_array_equals(lineText, ['Paragraph with a ', 'link', ' inside.', |
| 'link', 'Paragraph with a ']); |
| }, 'Test |NextOnLine| and |PreviousOnLine| on paragraphs with links.'); |
| |
| test(() => { |
| let axObj = accessibilityController.accessibleElementById('paragraphWithAnonymousBlock'); |
| // There should be three static text children in this paragraph. |
| assert_equals(axObj.childrenCount, 3); |
| axObj = axObj.childAtIndex(0); |
| assert_equals(axObj.role, 'AXRole: AXStaticText'); |
| |
| let lineText = []; |
| lineText.push(axObj.name); |
| for (let i = 0; i < 2; ++i) { |
| axObj = axObj.nextOnLine(); |
| assert_equals(axObj.role, 'AXRole: AXInlineTextBox'); |
| lineText.push(axObj.name); |
| } |
| |
| for (let i = 0; i < 2; ++i) { |
| axObj = axObj.previousOnLine(); |
| assert_equals(axObj.role, 'AXRole: AXInlineTextBox'); |
| lineText.push(axObj.name); |
| } |
| |
| assert_array_equals(lineText, ['Paragraph with an ', 'anonymous block', ' inside.', |
| 'anonymous block', 'Paragraph with an ']); |
| }, 'Test |NextOnLine| and |PreviousOnLine| on paragraphs with anonymous blocks.'); |
| |
| test(() => { |
| let axObj = accessibilityController.accessibleElementById('list'); |
| // There should be a list item in this list. |
| assert_equals(axObj.childrenCount, 1); |
| axObj = axObj.childAtIndex(0); |
| assert_equals(axObj.role, 'AXRole: AXListItem'); |
| // There should be a list marker and some text in this list item. |
| assert_equals(axObj.childrenCount, 2); |
| axObj = axObj.childAtIndex(0); |
| assert_equals(axObj.role, 'AXRole: AXListMarker'); |
| |
| let lineText = []; |
| lineText.push(axObj.name); |
| axObj = axObj.nextOnLine(); |
| assert_equals(axObj.role, 'AXRole: AXInlineTextBox'); |
| lineText.push(axObj.name); |
| axObj = axObj.previousOnLine(); |
| assert_equals(axObj.role, 'AXRole: AXListMarker'); |
| lineText.push(axObj.name); |
| assert_array_equals(lineText, ['1. ', 'List item', '1. ']); |
| }, 'Test |NextOnLine| and |PreviousOnLine| on list markers.'); |
| |
| if (window.testRunner) { |
| document.getElementById('paragraph').style.display = 'none'; |
| document.getElementById('contentEditable').style.display = 'none'; |
| document.getElementById('paragraphWithLink').style.display = 'none'; |
| document.getElementById('paragraphWithAnonymousBlock').style.display = 'none'; |
| document.getElementById('list').style.display = 'none'; |
| } |
| </script> |