tor-browser

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

getSelection.html (6732B)


      1 <!doctype html>
      2 <title>getSelection() tests</title>
      3 <div id=log></div>
      4 <script src=/resources/testharness.js></script>
      5 <script src=/resources/testharnessreport.js></script>
      6 <script>
      7 "use strict";
      8 
      9 // TODO: Figure out more places where defaultView is or is not guaranteed to be
     10 // null, and test whether getSelection() is null.
     11 //
     12 // TODO: Figure out a good way to test display: none iframes.
     13 
     14 test(function() {
     15    // Sanity checks like this are to flag known browser bugs with clearer
     16    // error messages, instead of throwing inscrutable exceptions.
     17    assert_true("Selection" in window,
     18        "Sanity check: window must have Selection property");
     19 
     20    assert_true(window.getSelection() instanceof Selection);
     21 }, "window.getSelection() instanceof Selection");
     22 
     23 test(function() {
     24    assert_equals(window.getSelection(), window.getSelection());
     25 }, "window.getSelection() === window.getSelection()");
     26 
     27 test(function() {
     28    assert_true("Selection" in window,
     29        "Sanity check: window must have Selection property");
     30    // This sanity check (which occurs a number of times below, too) is because
     31    // document.getSelection() is supposed to return null if defaultView is
     32    // null, so we need to figure out whether defaultView is null or not before
     33    // we can make correct assertions about getSelection().
     34    assert_not_equals(document.defaultView, null,
     35        "Sanity check: document.defaultView must not be null");
     36 
     37    assert_equals(typeof document.getSelection(), "object",
     38        "document.getSelection() must be an object");
     39    assert_true(document.getSelection() instanceof Selection);
     40 }, "document.getSelection() instanceof Selection");
     41 
     42 test(function() {
     43    assert_not_equals(document.defaultView, null,
     44        "Sanity check: document.defaultView must not be null");
     45    assert_equals(document.getSelection(), document.getSelection());
     46 }, "document.getSelection() === document.getSelection()");
     47 
     48 test(function() {
     49    assert_not_equals(document.defaultView, null,
     50        "Sanity check: document.defaultView must not be null");
     51    assert_equals(window.getSelection(), document.getSelection());
     52 }, "window.getSelection() === document.getSelection()");
     53 
     54 // "Each selection is associated with a single range, which may be null and is
     55 // initially null."
     56 //
     57 // "The rangeCount attribute must return 0 if the context object's range is
     58 // null, otherwise 1."
     59 test(function() {
     60    assert_equals(window.getSelection().rangeCount, 0,
     61        "window.getSelection().rangeCount must initially be 0");
     62    assert_equals(typeof document.getSelection(), "object",
     63        "Sanity check: document.getSelection() must be an object");
     64    assert_equals(document.getSelection().rangeCount, 0,
     65        "document.getSelection().rangeCount must initially be 0");
     66 }, "Selection's range must initially be null");
     67 
     68 test(function() {
     69    var doc = document.implementation.createHTMLDocument("");
     70    assert_equals(doc.defaultView, null,
     71        "Sanity check: defaultView of created HTML document must be null");
     72    assert_equals(doc.getSelection(), null);
     73 }, "getSelection() on HTML document with null defaultView must be null");
     74 
     75 test(function() {
     76    var xmlDoc = document.implementation.createDocument(null, "", null);
     77 
     78    assert_true("getSelection" in xmlDoc, "XML document must have getSelection()");
     79 
     80    assert_equals(xmlDoc.defaultView, null,
     81        "Sanity check: defaultView of created XML document must be null");
     82    assert_equals(xmlDoc.getSelection(), null);
     83 }, "getSelection() on XML document with null defaultView must be null");
     84 
     85 
     86 // Run a bunch of iframe tests, once immediately after the iframe is appended
     87 // to the document and once onload.  This makes a difference, because browsers
     88 // differ (at the time of this writing) in whether they load about:blank in
     89 // iframes synchronously or not.  Per the HTML spec, there must be a browsing
     90 // context associated with the iframe as soon as it's appended to the document,
     91 // so there should be a selection too.
     92 var iframe = document.createElement("iframe");
     93 add_completion_callback(function() {
     94    document.body.removeChild(iframe);
     95 });
     96 
     97 var testDescs = [];
     98 var testFuncs = [];
     99 testDescs.push("window.getSelection() instanceof Selection in an iframe");
    100 testFuncs.push(function() {
    101    assert_true("Selection" in iframe.contentWindow,
    102        "Sanity check: window must have Selection property");
    103    assert_not_equals(iframe.contentWindow.document.defaultView, null,
    104        "Sanity check: document.defaultView must not be null");
    105    assert_not_equals(iframe.contentWindow.getSelection(), null,
    106        "window.getSelection() must not be null");
    107    assert_true(iframe.contentWindow.getSelection() instanceof iframe.contentWindow.Selection);
    108 });
    109 
    110 testDescs.push("document.getSelection() instanceof Selection in an iframe");
    111 testFuncs.push(function() {
    112    assert_true("Selection" in iframe.contentWindow,
    113        "Sanity check: window must have Selection property");
    114    assert_not_equals(iframe.contentDocument.defaultView, null,
    115        "Sanity check: document.defaultView must not be null");
    116    assert_not_equals(iframe.contentDocument.getSelection(), null,
    117        "document.getSelection() must not be null");
    118    assert_equals(typeof iframe.contentDocument.getSelection(), "object",
    119        "document.getSelection() must be an object");
    120    assert_true(iframe.contentDocument.getSelection() instanceof iframe.contentWindow.Selection);
    121 });
    122 
    123 testDescs.push("window.getSelection() === document.getSelection() in an iframe");
    124 testFuncs.push(function() {
    125    assert_not_equals(iframe.contentDocument.defaultView, null,
    126        "Sanity check: document.defaultView must not be null");
    127    assert_equals(iframe.contentWindow.getSelection(), iframe.contentDocument.getSelection());
    128 });
    129 
    130 testDescs.push("getSelection() inside and outside iframe must return different objects");
    131 testFuncs.push(function() {
    132    assert_not_equals(iframe.contentWindow.getSelection(), getSelection());
    133 });
    134 
    135 testDescs.push("getSelection() on HTML document with null defaultView must be null inside an iframe");
    136 testFuncs.push(function() {
    137    var doc = iframe.contentDocument.implementation.createHTMLDocument("");
    138    assert_equals(doc.defaultView, null,
    139        "Sanity check: defaultView of created HTML document must be null");
    140    assert_equals(doc.getSelection(), null);
    141 });
    142 
    143 var asyncTests = [];
    144 testDescs.forEach(function(desc) {
    145    asyncTests.push(async_test(desc + " onload"));
    146 });
    147 
    148 iframe.onload = function() {
    149    asyncTests.forEach(function(t, i) {
    150        t.step(testFuncs[i]);
    151        t.done();
    152    });
    153 };
    154 
    155 document.body.appendChild(iframe);
    156 
    157 testDescs.forEach(function(desc, i) {
    158    test(testFuncs[i], desc + " immediately after appendChild");
    159 });
    160 </script>