|
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> |