| <!DOCTYPE html> |
| <script src="../resources/testharness.js"></script> |
| <script src="../resources/testharnessreport.js"></script> |
| |
| <div id="main" role="main"> |
| |
| <div id="contenteditable-textbox" role="textbox" contenteditable="true"> |
| <div id="contenteditable-line1">Line 1</div> |
| <textarea id="contenteditable-line2" rows="1" cols="40">Line 2</textarea> |
| </div> |
| |
| <div id="contenteditable-div" contenteditable> |
| <p id="paragraph1">Line 1<br>Line 2</p> |
| <p id="paragraph2">Line 3</p> |
| </div> |
| |
| </div> |
| |
| <script> |
| test(() => |
| { |
| let selection = window.getSelection(); |
| let selectionRange = document.createRange(); |
| let mainAccessible = accessibilityController.accessibleElementById("main"); |
| let rootAccessible = accessibilityController.rootElement; |
| |
| let textbox = document.getElementById("contenteditable-textbox"); |
| let textboxAccessible = accessibilityController.accessibleElementById("contenteditable-textbox"); |
| |
| // Select the entire contents of the outer ARIA textbox. |
| // These include another ARIA textbox and a textarea node |
| // taking up three lines. |
| textbox.focus(); |
| selectionRange.selectNodeContents(textbox); |
| selection.removeAllRanges(); |
| selection.addRange(selectionRange); |
| |
| assert_equals(textboxAccessible.selectionAnchorObject, textboxAccessible); |
| assert_equals(textboxAccessible.selectionAnchorOffset, 0); |
| assert_equals(textboxAccessible.selectionFocusObject, textboxAccessible); |
| // Two nodes have been selected: the two text fields inside the outer one. |
| assert_equals(textboxAccessible.selectionFocusOffset, 2); |
| |
| // Selection offsets should be the same when retrieved from the parent object. |
| assert_equals(mainAccessible.selectionAnchorObject, textboxAccessible); |
| assert_equals(mainAccessible.selectionAnchorOffset, 0); |
| assert_equals(mainAccessible.selectionFocusObject, textboxAccessible); |
| assert_equals(mainAccessible.selectionFocusOffset, 2); |
| |
| assert_equals(rootAccessible.selectionAnchorObject, textboxAccessible); |
| assert_equals(rootAccessible.selectionAnchorOffset, 0); |
| assert_equals(rootAccessible.selectionFocusObject, textboxAccessible); |
| assert_equals(rootAccessible.selectionFocusOffset, 2); |
| }, "Test selectNodeContents on an ARIA textbox."); |
| |
| test(() => |
| { |
| let selection = window.getSelection(); |
| let selectionRange = document.createRange(); |
| let mainAccessible = accessibilityController.accessibleElementById("main"); |
| let rootAccessible = accessibilityController.rootElement; |
| |
| let contenteditable = document.getElementById("contenteditable-div"); |
| let line1 = document.getElementById("paragraph1").firstChild; |
| let line3 = document.getElementById("paragraph2").firstChild; |
| let contenteditableAccessible = accessibilityController.accessibleElementById("contenteditable-div"); |
| |
| // Select the entire contents of the second content editable. |
| contenteditable.focus(); |
| selectionRange.selectNodeContents(contenteditable); |
| selection.removeAllRanges(); |
| selection.addRange(selectionRange); |
| |
| assert_equals(contenteditableAccessible.selectionAnchorObject, contenteditableAccessible); |
| assert_equals(contenteditableAccessible.selectionAnchorOffset, 0); |
| assert_equals(contenteditableAccessible.selectionFocusObject, contenteditableAccessible); |
| assert_equals(contenteditableAccessible.selectionFocusOffset, 2); |
| |
| assert_equals(mainAccessible.selectionAnchorObject, contenteditableAccessible); |
| assert_equals(mainAccessible.selectionAnchorOffset, 0); |
| assert_equals(mainAccessible.selectionFocusObject, contenteditableAccessible); |
| assert_equals(mainAccessible.selectionFocusOffset, 2); |
| |
| assert_equals(rootAccessible.selectionAnchorObject, contenteditableAccessible); |
| assert_equals(rootAccessible.selectionAnchorOffset, 0); |
| assert_equals(rootAccessible.selectionFocusObject, contenteditableAccessible); |
| assert_equals(rootAccessible.selectionFocusOffset, 2); |
| }, "Test selectNodeContents on a contenteditable."); |
| |
| test(() => |
| { |
| let selection = window.getSelection(); |
| let selectionRange = document.createRange(); |
| let mainAccessible = accessibilityController.accessibleElementById("main"); |
| let rootAccessible = accessibilityController.rootElement; |
| let textboxAccessible = accessibilityController.accessibleElementById("contenteditable-textbox"); |
| let line1 = document.getElementById("contenteditable-line1"); |
| let line1Accessible = accessibilityController.accessibleElementById("contenteditable-line1"); |
| let line1TextAccessible = line1Accessible.childAtIndex(0); |
| |
| // Select only the first line of the ARIA textbox. |
| selectionRange.setStart(line1.firstChild, 0); |
| selectionRange.setEnd(line1.firstChild, 6); |
| selection.removeAllRanges(); |
| selection.addRange(selectionRange); |
| |
| assert_equals(textboxAccessible.selectionAnchorObject, line1TextAccessible); |
| assert_equals(textboxAccessible.selectionAnchorOffset, 0); |
| assert_equals(textboxAccessible.selectionFocusObject, line1TextAccessible); |
| assert_equals(textboxAccessible.selectionFocusOffset, 6); |
| |
| assert_equals(mainAccessible.selectionAnchorObject, line1TextAccessible); |
| assert_equals(mainAccessible.selectionAnchorOffset, 0); |
| assert_equals(mainAccessible.selectionFocusObject, line1TextAccessible); |
| assert_equals(mainAccessible.selectionFocusOffset, 6); |
| |
| assert_equals(rootAccessible.selectionAnchorObject, line1TextAccessible); |
| assert_equals(rootAccessible.selectionAnchorOffset, 0); |
| assert_equals(rootAccessible.selectionFocusObject, line1TextAccessible); |
| assert_equals(rootAccessible.selectionFocusOffset, 6); |
| }, "The effects of the setStart and setEnd methods should be reflected in the accessibility API."); |
| |
| test(() => |
| { |
| let textboxAccessible = accessibilityController.accessibleElementById("contenteditable-textbox"); |
| let rootAccessible = accessibilityController.rootElement; |
| let line2 = document.getElementById("contenteditable-line2"); |
| let line2Accessible = accessibilityController.accessibleElementById("contenteditable-line2"); |
| |
| line2.focus(); |
| |
| // The selection should have been removed from the line1 div |
| // due to the focus being moved. |
| assert_equals(textboxAccessible.selectionAnchorObject, line2Accessible); |
| assert_equals(textboxAccessible.selectionAnchorOffset, 0); |
| assert_equals(textboxAccessible.selectionFocusObject, line2Accessible); |
| assert_equals(textboxAccessible.selectionFocusOffset, 0); |
| |
| assert_equals(rootAccessible.selectionAnchorObject, line2Accessible); |
| assert_equals(rootAccessible.selectionAnchorOffset, 0); |
| assert_equals(rootAccessible.selectionFocusObject, line2Accessible); |
| assert_equals(rootAccessible.selectionFocusOffset, 0); |
| }, "Verify that changing the focus removes the selection."); |
| |
| test(() => |
| { |
| let textboxAccessible = accessibilityController.accessibleElementById("contenteditable-textbox"); |
| let mainAccessible = accessibilityController.accessibleElementById("main"); |
| let rootAccessible = accessibilityController.rootElement; |
| let line2Accessible = accessibilityController.accessibleElementById("contenteditable-line2"); |
| let line2 = document.getElementById("contenteditable-line2"); |
| |
| // Select only the second line of the ARIA textbox, that is, |
| // the one found in the textarea. |
| line2.setSelectionRange(0, line2.textLength); |
| |
| assert_equals(line2Accessible.selectionAnchorOffset, 0); |
| assert_equals(line2Accessible.selectionFocusOffset, line2.textLength); |
| |
| assert_equals(textboxAccessible.selectionAnchorObject, line2Accessible); |
| assert_equals(textboxAccessible.selectionAnchorOffset, 0); |
| assert_equals(textboxAccessible.selectionFocusObject, line2Accessible); |
| assert_equals(textboxAccessible.selectionFocusOffset, line2.textLength); |
| |
| assert_equals(mainAccessible.selectionAnchorObject, line2Accessible); |
| assert_equals(mainAccessible.selectionAnchorOffset, 0); |
| assert_equals(mainAccessible.selectionFocusObject, line2Accessible); |
| assert_equals(mainAccessible.selectionFocusOffset, line2.textLength); |
| |
| assert_equals(rootAccessible.selectionAnchorObject, line2Accessible); |
| assert_equals(rootAccessible.selectionAnchorOffset, 0); |
| assert_equals(rootAccessible.selectionFocusObject, line2Accessible); |
| assert_equals(rootAccessible.selectionFocusOffset, line2.textLength); |
| }, "The effects of the textarea.setSelectionRange method should be reflected in the accessibility API."); |
| |
| test(() => |
| { |
| let textboxAccessible = accessibilityController.accessibleElementById("contenteditable-textbox"); |
| let mainAccessible = accessibilityController.accessibleElementById("main"); |
| let rootAccessible = accessibilityController.rootElement; |
| let line2Accessible = accessibilityController.accessibleElementById("contenteditable-line2"); |
| |
| // Selection can also be set via the accessibility API. |
| line2Accessible.setSelectedTextRange(2, 3); |
| |
| assert_equals(line2Accessible.selectionAnchorObject, line2Accessible); |
| assert_equals(line2Accessible.selectionAnchorOffset, 2); |
| assert_equals(line2Accessible.selectionFocusObject, line2Accessible); |
| assert_equals(line2Accessible.selectionFocusOffset, 5); |
| |
| assert_equals(textboxAccessible.selectionAnchorObject, line2Accessible); |
| assert_equals(textboxAccessible.selectionAnchorOffset, 2); |
| assert_equals(textboxAccessible.selectionFocusObject, line2Accessible); |
| assert_equals(textboxAccessible.selectionFocusOffset, 5); |
| |
| assert_equals(mainAccessible.selectionAnchorObject, line2Accessible); |
| assert_equals(mainAccessible.selectionAnchorOffset, 2); |
| assert_equals(mainAccessible.selectionFocusObject, line2Accessible); |
| assert_equals(mainAccessible.selectionFocusOffset, 5); |
| |
| assert_equals(rootAccessible.selectionAnchorObject, line2Accessible); |
| assert_equals(rootAccessible.selectionAnchorOffset, 2); |
| assert_equals(rootAccessible.selectionFocusObject, line2Accessible); |
| assert_equals(rootAccessible.selectionFocusOffset, 5); |
| }, "Test the setSelectedTextRange accessibility API function."); |
| |
| test(() => |
| { |
| let selection = window.getSelection(); |
| let selectionRange = document.createRange(); |
| let mainAccessible = accessibilityController.accessibleElementById("main"); |
| let rootAccessible = accessibilityController.rootElement; |
| |
| let contenteditable = document.getElementById("contenteditable-div"); |
| let line1 = document.getElementById("paragraph1").firstChild; |
| let line2 = document.getElementById("paragraph1").lastChild; |
| let line3 = document.getElementById("paragraph2").firstChild; |
| let contenteditableLines = [ line1, line2, line3 ]; |
| |
| let contenteditableAccessible = accessibilityController.accessibleElementById("contenteditable-div"); |
| let paragraph1Accessible = accessibilityController.accessibleElementById("paragraph1"); |
| let paragraph2Accessible = accessibilityController.accessibleElementById("paragraph2"); |
| let line1Accessible = paragraph1Accessible.childAtIndex(0); |
| let line2Accessible = paragraph1Accessible.childAtIndex(2); |
| let line3Accessible = paragraph2Accessible.childAtIndex(0); |
| let expectations = [ |
| [ line1Accessible, 0, paragraph1Accessible, 1 ], |
| [ line2Accessible, 0, paragraph1Accessible, 3 ], |
| [ line3Accessible, 0, paragraph2Accessible, 1 ], |
| ]; |
| |
| // Select entire lines in the second content editable. |
| for (let testCase = 0; testCase < 2; ++testCase) { |
| for (let i = 0; i < contenteditableLines.length; ++i) { |
| selectionRange.selectNode(contenteditableLines[i]); |
| selection.removeAllRanges(); |
| selection.addRange(selectionRange); |
| |
| assert_equals(contenteditableAccessible.selectionAnchorObject, expectations[i][0]); |
| assert_equals(contenteditableAccessible.selectionAnchorOffset, expectations[i][1]); |
| assert_equals(contenteditableAccessible.selectionFocusObject, expectations[i][2]); |
| assert_equals(contenteditableAccessible.selectionFocusOffset, expectations[i][3]); |
| |
| assert_equals(mainAccessible.selectionAnchorObject, expectations[i][0]); |
| assert_equals(mainAccessible.selectionAnchorOffset, expectations[i][1]); |
| assert_equals(mainAccessible.selectionFocusObject, expectations[i][2]); |
| assert_equals(mainAccessible.selectionFocusOffset, expectations[i][3]); |
| |
| assert_equals(rootAccessible.selectionAnchorObject, expectations[i][0]); |
| assert_equals(rootAccessible.selectionAnchorOffset, expectations[i][1]); |
| assert_equals(rootAccessible.selectionFocusObject, expectations[i][2]); |
| assert_equals(rootAccessible.selectionFocusOffset, expectations[i][3]); |
| } |
| |
| // For a sanity check, try the same test with contenteditable="false". |
| contenteditable.contenteditable = false; |
| } |
| |
| }, "The effects of the selectNode method should be reflected in the accessibility API."); |
| </script> |