tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

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>