| <!doctype html> |
| <script src="../../resources/testharness.js"></script> |
| <script src="../../resources/testharnessreport.js"></script> |
| <script src="../assert_selection.js"></script> |
| <script> |
| // Test to check if last and first word can be selected when they double-clicked |
| // https://bugs.webkit.org/show_bug.cgi?id=36359 |
| |
| function computePoint(selection) { |
| const target = selection.document.getElementById('target'); |
| const width = target.offsetWidth; |
| const height = target.offsetHeight; |
| const left = selection.computeLeft(target); |
| const top = selection.computeTop(target); |
| return {x: left + width / 2, y: top + height / 2}; |
| |
| } |
| |
| function doubleClick(selection) { |
| resetMouse(); |
| const point = computePoint(selection); |
| eventSender.mouseMoveTo(point.x, point.y); |
| eventSender.mouseDown(); |
| eventSender.mouseUp(); |
| eventSender.mouseDown(); |
| eventSender.mouseUp(); |
| } |
| |
| function resetMouse() { |
| if (!window.eventSender) |
| throw 'This test requires eventSender.'; |
| eventSender.mouseMoveTo(0, 0); |
| eventSender.mouseDown(); |
| eventSender.mouseUp(); |
| } |
| |
| function singleClickAndModify(selection) { |
| resetMouse(); |
| const point = computePoint(selection); |
| eventSender.mouseMoveTo(point.x, point.y); |
| eventSender.mouseDown(); |
| eventSender.mouseUp(); |
| selection.modify('extend', 'backward', 'word'); |
| selection.collapseToStart(); |
| selection.modify('extend', 'forward', 'word'); |
| } |
| |
| // double click |
| selection_test( |
| '<span contenteditable id="target">xyz</span> abc', |
| selection => doubleClick(selection), |
| '<span contenteditable id="target">^xyz|</span> abc', |
| 'double-click-1 first word'); |
| |
| selection_test( |
| 'abc <span contenteditable id="target">xyz</span>', |
| selection => doubleClick(selection), |
| 'abc <span contenteditable id="target">^xyz|</span>', |
| 'double-click-2 last word'); |
| |
| selection_test( |
| 'abc <span contenteditable id="target">xyz</span> def', |
| selection => doubleClick(selection), |
| 'abc <span contenteditable id="target">^xyz|</span> def', |
| 'double-click-3 middle word'); |
| |
| selection_test( |
| '<div contenteditable><b id="target">xyz</b></div> abc', |
| selection => doubleClick(selection), |
| '<div contenteditable><b id="target">^xyz|</b></div> abc', |
| 'double-click-4 first block'); |
| |
| selection_test( |
| 'abc <div contenteditable><b id="target">xyz</b></div>', |
| selection => doubleClick(selection), |
| 'abc <div contenteditable><b id="target">^xyz|</b></div>', |
| 'double-click-5 last block'); |
| |
| selection_test( |
| 'abc <div contenteditable><b id="target">xyz</b></div> def', |
| selection => doubleClick(selection), |
| 'abc <div contenteditable><b id="target">^xyz|</b></div> def', |
| 'double-click-6 middle block'); |
| |
| // single click + modify |
| selection_test( |
| '<span contenteditable id="target">xyz</span> abc', |
| selection => singleClickAndModify(selection), |
| '<span contenteditable id="target">^xyz|</span> abc', |
| 'single-click-modify-1 first word'); |
| |
| selection_test( |
| 'abc <span contenteditable id="target">xyz</span>', |
| selection => singleClickAndModify(selection), |
| 'abc <span contenteditable id="target">^xyz|</span>', |
| 'single-click-modify-2 last word'); |
| |
| selection_test( |
| 'abc <span contenteditable id="target">xyz</span> def', |
| selection => singleClickAndModify(selection), |
| 'abc <span contenteditable id="target">^xyz|</span> def', |
| 'single-click-modify-3 middle word'); |
| |
| selection_test( |
| '<div contenteditable><b id="target">xyz</b></div> abc', |
| selection => singleClickAndModify(selection), |
| '<div contenteditable><b id="target">^xyz|</b></div> abc', |
| 'single-click-modify-4 first block'); |
| |
| selection_test( |
| 'abc <div contenteditable><b id="target">xyz</b></div>', |
| selection => singleClickAndModify(selection), |
| 'abc <div contenteditable><b id="target">^xyz|</b></div>', |
| 'single-click-modify-5 last block'); |
| |
| selection_test( |
| 'abc <div contenteditable><b id="target">xyz</b></div> def', |
| selection => singleClickAndModify(selection), |
| 'abc <div contenteditable><b id="target">^xyz|</b></div> def', |
| 'single-click-modify-6 middle block'); |
| </script> |