test_sendQueryContentAndSelectionSetEvent.html (12972B)
1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <title>Test for nsIDOMWindowUtils.sendQueryContentEvent() and .sendSelectionSetEvent()</title> 5 <script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script> 6 <link rel="stylesheet" type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"/> 7 </head> 8 <body> 9 <p id="display"></p> 10 <div id="content" style="display: none"> 11 12 </div> 13 <div contenteditable>abc<br>def</div> 14 <pre id="test"> 15 <script type="application/javascript"> 16 17 const { AppConstants } = ChromeUtils.importESModule( 18 "resource://gre/modules/AppConstants.sys.mjs" 19 ); 20 21 SimpleTest.waitForExplicitFinish(); 22 23 const kLineBreak = navigator.platform.indexOf("Win") == 0 && false ? "\r\n" : "\n"; 24 25 SimpleTest.waitForFocus(async () => { 26 const gUtils = window.windowUtils; 27 28 function escape(aStr) 29 { 30 var result = aStr.replace("\n", "\\n"); 31 return result.replace("\r", "\\r"); 32 } 33 34 function waitForFlushingIMEContentObserver() { 35 return new Promise(resolve => requestAnimationFrame( 36 () => requestAnimationFrame(resolve) 37 )); 38 } 39 40 const editor = document.querySelector("div[contenteditable]"); 41 editor.focus(); 42 43 // NOTE: For compatibility, calling without flags should work as with QUERY_CONTENT_FLAG_USE_NATIVE_LINE_BREAK. 44 45 // QueryTextContent 46 var expectedStr = escape(("abc" + kLineBreak + "def").substr(2, 4)); 47 var result = gUtils.sendQueryContentEvent(gUtils.QUERY_TEXT_CONTENT, 2, 4, 0, 0, 48 gUtils.QUERY_CONTENT_FLAG_USE_NATIVE_LINE_BREAK); 49 ok(result.succeeded, 50 "sendQueryContentEvent(QUERY_TEXT_CONTENT, QUERY_CONTENT_FLAG_USE_NATIVE_LINE_BREAK) should succeed"); 51 is(escape(result.text), expectedStr, 52 "sendQueryContentEvent(QUERY_TEXT_CONTENT, QUERY_CONTENT_FLAG_USE_NATIVE_LINE_BREAK) got unexpected string"); 53 54 result = gUtils.sendQueryContentEvent(gUtils.QUERY_TEXT_CONTENT, 2, 4, 0, 0); 55 ok(result.succeeded, 56 "sendQueryContentEvent(QUERY_TEXT_CONTENT) should succeed"); 57 is(escape(result.text), expectedStr, 58 "sendQueryContentEvent(QUERY_TEXT_CONTENT) should return same string as calling with QUERY_CONTENT_FLAG_USE_NATIVE_LINE_BREAK"); 59 60 expectedStr = escape(("abc\ndef").substr(2, 4)); 61 result = gUtils.sendQueryContentEvent(gUtils.QUERY_TEXT_CONTENT, 2, 4, 0, 0, 62 gUtils.QUERY_CONTENT_FLAG_USE_XP_LINE_BREAK); 63 ok(result.succeeded, 64 "sendQueryContentEvent(QUERY_TEXT_CONTENT, QUERY_CONTENT_FLAG_USE_XP_LINE_BREAK) should succeed"); 65 is(escape(result.text), expectedStr, 66 "sendQueryContentEvent(QUERY_TEXT_CONTENT, QUERY_CONTENT_FLAG_USE_XP_LINE_BREAK) got unexpected string"); 67 68 // QueryCaretRect 69 getSelection().collapse(editor.firstChild, 0); 70 71 var caretNative = gUtils.sendQueryContentEvent(gUtils.QUERY_CARET_RECT, 6, 0, 0, 0, 72 gUtils.QUERY_CONTENT_FLAG_USE_NATIVE_LINE_BREAK); 73 ok(caretNative.succeeded, 74 "sendQueryContentEvent(QUERY_CARET_RECT, QUERY_CONTENT_FLAG_USE_NATIVE_LINE_BREAK) should succeed"); 75 var caretXP = gUtils.sendQueryContentEvent(gUtils.QUERY_CARET_RECT, 6 - kLineBreak.length + 1, 0, 0, 0, 76 gUtils.QUERY_CONTENT_FLAG_USE_XP_LINE_BREAK); 77 ok(caretXP.succeeded, 78 "sendQueryContentEvent(QUERY_CARET_RECT, QUERY_CONTENT_FLAG_USE_XP_LINE_BREAK) should succeed"); 79 80 is(caretXP.top, caretNative.top, 81 "The caret top should be same"); 82 is(caretXP.left, caretNative.left, 83 "The caret left should be same"); 84 85 result = gUtils.sendQueryContentEvent(gUtils.QUERY_CARET_RECT, 6, 0, 0, 0); 86 ok(result.succeeded, 87 "sendQueryContentEvent(QUERY_CARET_RECT) should succeed"); 88 is(result.top, caretNative.top, 89 "sendQueryContentEvent(QUERY_CARET_RECT) should return same top as calling with QUERY_CONTENT_FLAG_USE_NATIVE_LINE_BREAK"); 90 is(result.left, caretNative.left, 91 "sendQueryContentEvent(QUERY_CARET_RECT) should return same left as calling with QUERY_CONTENT_FLAG_USE_NATIVE_LINE_BREAK"); 92 93 // QueryTextRect 94 var textRectNative = gUtils.sendQueryContentEvent(gUtils.QUERY_TEXT_RECT, 6, 1, 0, 0, 95 gUtils.QUERY_CONTENT_FLAG_USE_NATIVE_LINE_BREAK); 96 ok(textRectNative.succeeded, 97 "sendQueryContentEvent(QUERY_TEXT_RECT, QUERY_CONTENT_FLAG_USE_NATIVE_LINE_BREAK) should succeed"); 98 var textRectXP = gUtils.sendQueryContentEvent(gUtils.QUERY_TEXT_RECT, 6 - kLineBreak.length + 1, 1, 0, 0, 99 gUtils.QUERY_CONTENT_FLAG_USE_XP_LINE_BREAK); 100 ok(textRectXP.succeeded, 101 "sendQueryContentEvent(QUERY_TEXT_RECT, QUERY_CONTENT_FLAG_USE_XP_LINE_BREAK) should succeed"); 102 103 is(textRectXP.top, textRectNative.top, 104 "The text top should be same"); 105 is(textRectXP.left, textRectNative.left, 106 "The text left should be same"); 107 is(textRectXP.height, textRectNative.height, 108 "The text height should be same"); 109 is(textRectXP.width, textRectNative.width, 110 "The text width should be same"); 111 112 result = gUtils.sendQueryContentEvent(gUtils.QUERY_TEXT_RECT, 6, 1, 0, 0); 113 ok(result.succeeded, 114 "sendQueryContentEvent(QUERY_TEXT_RECT) should succeed"); 115 is(result.top, textRectNative.top, 116 "sendQueryContentEvent(QUERY_TEXT_RECT) should return same top as calling with QUERY_CONTENT_FLAG_USE_NATIVE_LINE_BREAK"); 117 is(result.left, textRectNative.left, 118 "sendQueryContentEvent(QUERY_TEXT_RECT) should return same left as calling with QUERY_CONTENT_FLAG_USE_NATIVE_LINE_BREAK"); 119 is(result.height, textRectNative.height, 120 "sendQueryContentEvent(QUERY_TEXT_RECT) should return same height as calling with QUERY_CONTENT_FLAG_USE_NATIVE_LINE_BREAK"); 121 is(result.width, textRectNative.width, 122 "sendQueryContentEvent(QUERY_TEXT_RECT) should return same width as calling with QUERY_CONTENT_FLAG_USE_NATIVE_LINE_BREAK"); 123 124 // QueryTextRectArray 125 var textRectArray = gUtils.sendQueryContentEvent(gUtils.QUERY_TEXT_RECT_ARRAY, 1, 2, 0, 0); 126 ok(textRectArray.succeeded, 127 "sendQueryContentEvent(QUERY_TEXT_RECT_ARRAY) should succeed"); 128 var textRect = gUtils.sendQueryContentEvent(gUtils.QUERY_TEXT_RECT, 1, 2, 0, 0); 129 ok(textRect.succeeded, 130 "sendQueryContentEvent(QUERY_TEXT_RECT) should succeed"); 131 var left = {}; 132 var top = {}; 133 var width = {}; 134 var height = {}; 135 textRectArray.getCharacterRect(0, left, top, width, height); 136 is(top.value, textRect.top, 137 "sendQueryContentEvent(QUERY_TEXT_RECT_ARRAY) should return same top that returns QUERY_TEXT_RECT"); 138 is(left.value, textRect.left, 139 "sendQueryContentEvent(QUERY_TEXT_RECT_ARRAY) should return same left that returns QUERY_TEXT_RECT"); 140 141 var left2 = {}; 142 var top2 = {}; 143 var width2 = {}; 144 var height2 = {}; 145 textRectArray.getCharacterRect(1, left2, top2, width2, height2); 146 isfuzzy(width.value + width2.value, textRect.width, 2, 147 "sendQueryContentEvent(QUERY_TEXT_RECT_ARRAY) should return same width that QUERY_TEXT_RECT is returned for offset 1 and 2"); 148 149 is(height.value, textRect.height, 150 "sendQueryContentEvent(QUERY_TEXT_RECT_ARRAY) should return same height that returns QUERY_TEXT_RECT"); 151 152 // QueryCharacterAtOffset 153 result = gUtils.sendQueryContentEvent(gUtils.QUERY_CHARACTER_AT_POINT, 0, 0, textRectNative.left + 1, textRectNative.top + 1, 154 gUtils.QUERY_CONTENT_FLAG_USE_NATIVE_LINE_BREAK); 155 ok(result.succeeded, 156 "sendQueryContentEvent(QUERY_CHARACTER_AT_POINT, QUERY_CONTENT_FLAG_USE_NATIVE_LINE_BREAK) should succeed"); 157 is(result.top, textRectNative.top, 158 "The character top is wrong"); 159 is(result.left, textRectNative.left, 160 "The character left is wrong"); 161 is(result.height, textRectNative.height, 162 "The character height is wrong"); 163 is(result.width, textRectNative.width, 164 "The character width is wrong"); 165 is(result.offset, 6, 166 "The character offset is wrong"); 167 168 result = gUtils.sendQueryContentEvent(gUtils.QUERY_CHARACTER_AT_POINT, 0, 0, textRectNative.left + 1, textRectNative.top + 1); 169 ok(result.succeeded, 170 "sendQueryContentEvent(QUERY_CHARACTER_AT_POINT) should succeed"); 171 is(result.top, textRectNative.top, 172 "The character top should be same as calling with QUERY_CONTENT_FLAG_USE_NATIVE_LINE_BREAK"); 173 is(result.left, textRectNative.left, 174 "The character left should be same as calling with QUERY_CONTENT_FLAG_USE_NATIVE_LINE_BREAK"); 175 is(result.height, textRectNative.height, 176 "The character height should be same as calling with QUERY_CONTENT_FLAG_USE_NATIVE_LINE_BREAK"); 177 is(result.width, textRectNative.width, 178 "The character width should be same as calling with QUERY_CONTENT_FLAG_USE_NATIVE_LINE_BREAK"); 179 is(result.offset, 6, 180 "The character offset should be same as calling with QUERY_CONTENT_FLAG_USE_NATIVE_LINE_BREAK"); 181 182 result = gUtils.sendQueryContentEvent(gUtils.QUERY_CHARACTER_AT_POINT, 0, 0, textRectXP.left + 1, textRectXP.top + 1, 183 gUtils.QUERY_CONTENT_FLAG_USE_XP_LINE_BREAK); 184 ok(result.succeeded, 185 "sendQueryContentEvent(QUERY_CHARACTER_AT_POINT, QUERY_CONTENT_FLAG_USE_XP_LINE_BREAK) should succeed"); 186 is(result.top, textRectXP.top, 187 "The character top is wrong"); 188 is(result.left, textRectXP.left, 189 "The character left is wrong"); 190 is(result.height, textRectXP.height, 191 "The character height is wrong"); 192 is(result.width, textRectXP.width, 193 "The character width is wrong"); 194 is(result.offset, 6 - kLineBreak.length + 1, 195 "The character offset is wrong"); 196 197 // SelectionSet and QuerySelectedText 198 await waitForFlushingIMEContentObserver(); 199 var selectionSet = gUtils.sendSelectionSetEvent(0, 6, gUtils.SELECTION_SET_FLAG_USE_NATIVE_LINE_BREAK); 200 ok(selectionSet, 201 "sendSelectionSetEvent(0, 6, SELECTION_SET_FLAG_USE_NATIVE_LINE_BREAK) should succeed"); 202 expectedStr = escape(("abc" + kLineBreak + "def").substr(0, 6)); 203 204 result = gUtils.sendQueryContentEvent(gUtils.QUERY_SELECTED_TEXT, 0, 0, 0, 0, 205 gUtils.QUERY_CONTENT_FLAG_USE_NATIVE_LINE_BREAK); 206 ok(result.succeeded, 207 "sendQueryContentEvent(QUERY_SELECTED_TEXT, QUERY_CONTENT_FLAG_USE_NATIVE_LINE_BREAK) should succeed"); 208 ok(!result.reversed, 209 "sendSelectionSetEvent(0, 6, SELECTION_SET_FLAG_USE_NATIVE_LINE_BREAK) should set non-reversed selection"); 210 is(escape(result.text), expectedStr, 211 "sendQueryContentEvent(QUERY_SELECTED_TEXT, QUERY_CONTENT_FLAG_USE_NATIVE_LINE_BREAK) got unexpected string"); 212 213 await waitForFlushingIMEContentObserver(); 214 selectionSet = gUtils.sendSelectionSetEvent(0, 6, gUtils.SELECTION_SET_FLAG_USE_XP_LINE_BREAK); 215 ok(selectionSet, 216 "sendSelectionSetEvent(0, 6, SELECTION_SET_FLAG_USE_XP_LINE_BREAK) should succeed"); 217 expectedStr = escape(("abc\ndef").substr(0, 6)); 218 219 result = gUtils.sendQueryContentEvent(gUtils.QUERY_SELECTED_TEXT, 0, 0, 0, 0, 220 gUtils.QUERY_CONTENT_FLAG_USE_XP_LINE_BREAK); 221 ok(result.succeeded, 222 "sendQueryContentEvent(QUERY_SELECTED_TEXT, QUERY_CONTENT_FLAG_USE_XP_LINE_BREAK) should succeed"); 223 ok(!result.reversed, 224 "sendSelectionSetEvent(0, 6, SELECTION_SET_FLAG_USE_XP_LINE_BREAK) should set non-reversed selection"); 225 is(escape(result.text), expectedStr, 226 "sendQueryContentEvent(QUERY_SELECTED_TEXT, QUERY_CONTENT_FLAG_USE_XP_LINE_BREAK) got unexpected string"); 227 228 getSelection().collapse(editor, 0); 229 await waitForFlushingIMEContentObserver(); 230 var selectionSet = gUtils.sendSelectionSetEvent(0, 6, gUtils.SELECTION_SET_FLAG_USE_NATIVE_LINE_BREAK | gUtils.SELECTION_SET_FLAG_REVERSE); 231 ok(selectionSet, 232 "sendSelectionSetEvent(0, 6, SELECTION_SET_FLAG_USE_NATIVE_LINE_BREAK) should succeed"); 233 234 result = gUtils.sendQueryContentEvent(gUtils.QUERY_SELECTED_TEXT, 0, 0, 0, 0, 235 gUtils.QUERY_CONTENT_FLAG_USE_NATIVE_LINE_BREAK); 236 ok(result.succeeded, 237 "sendQueryContentEvent(QUERY_SELECTED_TEXT, QUERY_CONTENT_FLAG_USE_NATIVE_LINE_BREAK) should succeed"); 238 ok(result.reversed, 239 "sendSelectionSetEvent(0, 6, SELECTION_SET_FLAG_USE_NATIVE_LINE_BREAK | SELECTION_SET_FLAG_REVERSE) should set reversed selection"); 240 241 selectionSet = gUtils.sendSelectionSetEvent(0, 6, gUtils.SELECTION_SET_FLAG_USE_XP_LINE_BREAK | gUtils.SELECTION_SET_FLAG_REVERSE); 242 ok(selectionSet, 243 "sendSelectionSetEvent(0, 6, SELECTION_SET_FLAG_USE_XP_LINE_BREAK | SELECTION_SET_FLAG_REVERSE) should succeed"); 244 245 result = gUtils.sendQueryContentEvent(gUtils.QUERY_SELECTED_TEXT, 0, 0, 0, 0, 246 gUtils.QUERY_CONTENT_FLAG_USE_XP_LINE_BREAK); 247 ok(result.succeeded, 248 "sendQueryContentEvent(QUERY_SELECTED_TEXT, QUERY_CONTENT_FLAG_USE_XP_LINE_BREAK) should succeed"); 249 ok(result.reversed, 250 "sendSelectionSetEvent(0, 6, SELECTION_SET_FLAG_USE_XP_LINE_BREAK | SELECTION_SET_FLAG_REVERSE) should set reversed selection"); 251 252 SimpleTest.finish(); 253 }); 254 </script> 255 </pre> 256 </body> 257 </html>