OLD | NEW |
(Empty) | |
| 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.contentWin
dow.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.contentW
indow.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.ge
tSelection()); |
| 128 }); |
| 129 |
| 130 testDescs.push("getSelection() inside and outside iframe must return different o
bjects"); |
| 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 nu
ll 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> |
OLD | NEW |