Bug 1772588 [wpt PR 34302] - [wpt] Add test for block-in-inline offsetParent., a...
[gecko.git] / editor / libeditor / tests / test_nsIHTMLEditor_getSelectedElement.html
blob009591c252854d57d585cd4ec41ab9eb97208e7a
1 <!DOCTYPE>
2 <html>
3 <head>
4 <title>Test for nsIHTMLEditor.getSelectedElement()</title>
5 <script src="/tests/SimpleTest/SimpleTest.js"></script>
6 <script src="/tests/SimpleTest/EventUtils.js"></script>
7 <link rel="stylesheet" href="/tests/SimpleTest/test.css">
8 </head>
9 <body>
10 <div id="display">
11 </div>
12 <div id="content" contenteditable></div>
13 <img src="green.png"><!-- necessary to load this image before start testing -->
14 <pre id="test">
15 </pre>
17 <script class="testbody" type="application/javascript">
19 SimpleTest.waitForExplicitFinish();
20 SimpleTest.waitForFocus(async function() {
21 let editor = document.getElementById("content");
22 let selection = window.getSelection();
24 // nsIHTMLEditor.getSelectedElement() is probably designed to retrieve
25 // a[href]:not([href=""]), a[name]:not([name=""]), or void element like
26 // <img> element. When user selects usual inline elements with dragging,
27 // double-clicking, Gecko sets start and/or end to point in text nodes
28 // as far as possible. Therefore, this API users don't expect that this
29 // returns usual inline elements like <b> element.
31 // So, we need to check user's operation works fine.
32 for (let eatSpaceToNextWord of [true, false]) {
33 await SpecialPowers.pushPrefEnv({"set": [["layout.word_select.eat_space_to_next_word", eatSpaceToNextWord]]});
35 editor.innerHTML = "<p>This <b>is</b> an <i>example </i>text.<br></p>" +
36 "<p>and an image <img src=\"green.png\"> is here.</p>" +
37 "<p>An anchor with href attr <a href=\"about:blank\">is</a> here.</p>";
38 editor.focus();
39 editor.scrollTop; // flush layout.
41 let b = editor.firstChild.firstChild.nextSibling;
42 let i = b.nextSibling.nextSibling;
43 let img = editor.firstChild.nextSibling.firstChild.nextSibling;
44 let href = editor.firstChild.nextSibling.nextSibling.firstChild.nextSibling;
46 // double clicking usual inline element shouldn't cause "selecting" the element.
47 synthesizeMouseAtCenter(b, {clickCount: 1});
48 synthesizeMouseAtCenter(b, {clickCount: 2});
49 is(selection.getRangeAt(0).startContainer, b.previousSibling,
50 `#0-1 Double-clicking in <b> element should set start of selection to end of previous text node (eat_space_to_next_word: ${eatSpaceToNextWord})`);
51 is(selection.getRangeAt(0).startOffset, b.previousSibling.length,
52 `#0-1 Double-clicking in <b> element should set start of selection to end of previous text node (eat_space_to_next_word: ${eatSpaceToNextWord})`);
53 is(selection.getRangeAt(0).endContainer, b.nextSibling,
54 `#0-1 Double-clicking in <b> element should set end of selection to start of next text node (eat_space_to_next_word: ${eatSpaceToNextWord})`);
55 is(selection.getRangeAt(0).endOffset, eatSpaceToNextWord ? 1 : 0,
56 `#0-1 Double-clicking in <b> element should set end of selection to start of next text node (eat_space_to_next_word: ${eatSpaceToNextWord})`);
58 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
59 null,
60 `#0-1 nsIHTMLEditor::getSelectedElement(\"\") should return null after double-clicking in <b> element (eat_space_to_next_word: ${eatSpaceToNextWord})`);
62 synthesizeMouseAtCenter(i, {clickCount: 1});
63 synthesizeMouseAtCenter(i, {clickCount: 2});
64 is(selection.getRangeAt(0).startContainer, i.previousSibling,
65 `#0-2 Double-clicking in <i> element should set start of selection to end of previous text node (eat_space_to_next_word: ${eatSpaceToNextWord})`);
66 is(selection.getRangeAt(0).startOffset, i.previousSibling.length,
67 `#0-2 Double-clicking in <i> element should set start of selection to end of previous text node (eat_space_to_next_word: ${eatSpaceToNextWord})`);
68 if (eatSpaceToNextWord) {
69 is(selection.getRangeAt(0).endContainer, i.nextSibling,
70 "#0-2 Double-clicking in <i> element should set end of selection to start of next text node (eat_space_to_next_word: true)");
71 is(selection.getRangeAt(0).endOffset, 0,
72 "#0-2 Double-clicking in <i> element should set end of selection to start of next text node (eat_space_to_next_word: true)");
73 } else {
74 is(selection.getRangeAt(0).endContainer, i.firstChild,
75 "#0-2 Double-clicking in <i> element should set end of selection to end of the word in <i> (eat_space_to_next_word: false)");
76 is(selection.getRangeAt(0).endOffset, "example".length,
77 "#0-2 Double-clicking in <i> element should set end of selection to end of the word in <i> (eat_space_to_next_word: false)");
80 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
81 null,
82 `#0-2 nsIHTMLEditor::getSelectedElement(\"\") should return null after double-clicking in <b> element (eat_space_to_next_word: ${eatSpaceToNextWord})`);
84 // Both clicking and double-clicking on <img> element should "select" it.
85 synthesizeMouseAtCenter(img, {clickCount: 1});
86 is(selection.getRangeAt(0).startContainer, img.parentElement,
87 `#0-3 Clicking in <img> element should set start of selection to the <img> element (eat_space_to_next_word: ${eatSpaceToNextWord})`);
88 is(selection.getRangeAt(0).startOffset, 1,
89 `#0-3 Clicking in <img> element should set start of selection to the <img> element (eat_space_to_next_word: ${eatSpaceToNextWord})`);
90 is(selection.getRangeAt(0).endContainer, img.parentElement,
91 `#0-3 Clicking in <img> element should set end of selection to start of next text node (eat_space_to_next_word: ${eatSpaceToNextWord})`);
92 is(selection.getRangeAt(0).endOffset, 2,
93 `#0-3 Clicking in <img> element should set end of selection to start of next text node (eat_space_to_next_word: ${eatSpaceToNextWord})`);
95 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
96 img,
97 `#0-3 nsIHTMLEditor::getSelectedElement(\"\") should return the <img> element after clicking in it (eat_space_to_next_word: ${eatSpaceToNextWord})`);
99 synthesizeMouseAtCenter(img, {clickCount: 1});
100 synthesizeMouseAtCenter(img, {clickCount: 2});
101 is(selection.getRangeAt(0).startContainer, img.parentElement,
102 `#0-4 Double-clicking in <img> element should set start of selection to the <img> element (eat_space_to_next_word: ${eatSpaceToNextWord})`);
103 is(selection.getRangeAt(0).startOffset, 1,
104 `#0-4 Double-clicking in <img> element should set start of selection to the <img> element (eat_space_to_next_word: ${eatSpaceToNextWord})`);
105 is(selection.getRangeAt(0).endContainer, img.parentElement,
106 `#0-4 Double-clicking in <img> element should set end of selection to start of next text node (eat_space_to_next_word: ${eatSpaceToNextWord})`);
107 is(selection.getRangeAt(0).endOffset, 2,
108 `#0-4 Double-clicking in <img> element should set end of selection to start of next text node (eat_space_to_next_word: ${eatSpaceToNextWord})`);
110 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
111 img,
112 `#0-4 nsIHTMLEditor::getSelectedElement(\"\") should return the <img> element after double-clicking in it (eat_space_to_next_word: ${eatSpaceToNextWord})`);
114 // Puts caret into the <a href> element.
115 synthesizeMouseAtCenter(href, {clickCount: 1});
116 is(selection.getRangeAt(0).startContainer, href.firstChild,
117 `#0-5 Clicking in <a href> element should set start of selection to the text node in it (eat_space_to_next_word: ${eatSpaceToNextWord})`);
118 is(selection.isCollapsed, true,
119 `#0-5 Clicking in <a href> element should cause collapsing Selection (eat_space_to_next_word: ${eatSpaceToNextWord})`);
121 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
122 null,
123 `#0-5 nsIHTMLEditor::getSelectedElement(\"\") should return null after clicking in the <a href> element (eat_space_to_next_word: ${eatSpaceToNextWord})`);
124 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("href")),
125 href,
126 `#0-5 nsIHTMLEditor::getSelectedElement(\"href\") should return the <a href> element after clicking in it (eat_space_to_next_word: ${eatSpaceToNextWord})`);
128 // Selects the <a href> element with a triple-click.
129 synthesizeMouseAtCenter(href, {clickCount: 1});
130 synthesizeMouseAtCenter(href, {clickCount: 2});
131 synthesizeMouseAtCenter(href, {clickCount: 3});
132 is(selection.getRangeAt(0).startContainer, href.parentElement,
133 `#0-6 Triple-clicking in <a href> element should set start of selection to the element (eat_space_to_next_word: ${eatSpaceToNextWord})`);
134 is(selection.getRangeAt(0).startOffset, 1,
135 `#0-6 Triple-clicking in <a href> element should set start of selection to the element (eat_space_to_next_word: ${eatSpaceToNextWord})`);
136 is(selection.getRangeAt(0).endContainer, href.parentElement,
137 `#0-6 Triple-clicking in <a href> element should set end of selection to start of next <br> element (eat_space_to_next_word: ${eatSpaceToNextWord})`);
138 is(selection.getRangeAt(0).endOffset, 2,
139 `#0-6 Triple-clicking in <a href> element should set end of selection to start of next <br> element (eat_space_to_next_word: ${eatSpaceToNextWord})`);
141 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
142 href,
143 `#0-6 nsIHTMLEditor::getSelectedElement(\"\") should return the <a href> element after double-clicking in it (eat_space_to_next_word: ${eatSpaceToNextWord})`);
144 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("href")),
145 href,
146 `#0-6 nsIHTMLEditor::getSelectedElement(\"href\") should return the <a href> element after double-clicking in it (eat_space_to_next_word: ${eatSpaceToNextWord})`);
149 editor.innerHTML = "<p>p1<b>b1</b><i>i1</i></p>";
150 editor.focus();
152 // <p>[]p1...
153 let range = document.createRange();
154 range.setStart(editor.firstChild.firstChild, 0);
155 range.setEnd(editor.firstChild.firstChild, 0);
156 selection.removeAllRanges();
157 selection.addRange(range);
159 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
160 null,
161 "#1-1 nsIHTMLEditor::getSelectedElement(\"\") should return null when selection is collapsed in a text node");
163 // <p>[p1]<b>...
164 range = document.createRange();
165 range.setStart(editor.firstChild.firstChild, 0);
166 range.setEnd(editor.firstChild.firstChild, 2);
167 selection.removeAllRanges();
168 selection.addRange(range);
170 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
171 null,
172 "#1-2 nsIHTMLEditor::getSelectedElement(\"\") should return null when selection ends in a text node");
174 // <p>[p1<b>]b1</b>...
175 range = document.createRange();
176 range.setStart(editor.firstChild.firstChild, 0);
177 range.setEnd(editor.firstChild.firstChild.nextSibling.firstChild, 0);
178 selection.removeAllRanges();
179 selection.addRange(range);
181 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
182 null,
183 "#1-3 nsIHTMLEditor::getSelectedElement(\"\") should return null when Selection ends at start of text node in <b> element");
184 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("b")),
185 null,
186 "#1-3 nsIHTMLEditor::getSelectedElement(\"b\") should return null when Selection ends at start of text node in <b> element");
187 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("i")),
188 editor.firstChild.nextSibling,
189 "#1-3 nsIHTMLEditor::getSelectedElement(\"i\") should return the <b> element when Selection ends at start of text node in <b> element");
191 // <p>[p1<b>b1]</b>...
192 range = document.createRange();
193 range.setStart(editor.firstChild.firstChild, 0);
194 range.setEnd(editor.firstChild.firstChild.nextSibling.firstChild, 2);
195 selection.removeAllRanges();
196 selection.addRange(range);
198 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
199 null,
200 "#1-4 nsIHTMLEditor::getSelectedElement(\"\") should return null when Selection ends at end of text node in a text node");
201 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("b")),
202 null,
203 "#1-4 nsIHTMLEditor::getSelectedElement(\"b\") should return null when Selection ends at end of text node in a text node");
204 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("i")),
205 editor.firstChild.nextSibling,
206 "#1-4 nsIHTMLEditor::getSelectedElement(\"i\") should return the <b> element when Selection ends at end of text node in <b> element");
208 // <p>[p1}<b>b1...
209 range = document.createRange();
210 range.setStart(editor.firstChild.firstChild, 0);
211 range.setEnd(editor.firstChild.firstChild.nextSibling, 0);
212 selection.removeAllRanges();
213 selection.addRange(range);
215 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
216 null,
217 "#1-5 nsIHTMLEditor::getSelectedElement(\"\") should return null when Selection ends at text node and there are no elements");
218 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("b")),
219 null,
220 "#1-5 nsIHTMLEditor::getSelectedElement(\"b\") should return null when Selection ends at text node and there are no elements");
221 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("i")),
222 null,
223 "#1-5 nsIHTMLEditor::getSelectedElement(\"i\") should return null when Selection ends at text node and there are no elements");
225 // <p>p1<b>{b1}</b>...
226 range = document.createRange();
227 range.setStart(editor.firstChild.firstChild.nextSibling, 0);
228 range.setEnd(editor.firstChild.firstChild.nextSibling, 1);
229 selection.removeAllRanges();
230 selection.addRange(range);
232 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
233 null,
234 "#1-6 nsIHTMLEditor::getSelectedElement(\"\") should return null when Selection only selects a text node");
235 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("b")),
236 null,
237 "#1-6 nsIHTMLEditor::getSelectedElement(\"b\") should return null when Selection only selects a text node");
238 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("i")),
239 null,
240 "#1-6 nsIHTMLEditor::getSelectedElement(\"i\") should return null when Selection only selects a text node");
242 // <p>[p1<b>b1</b>}<i>...
243 range = document.createRange();
244 range.setStart(editor.firstChild.firstChild, 0);
245 range.setEnd(editor.firstChild, 2);
246 selection.removeAllRanges();
247 selection.addRange(range);
249 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
250 null,
251 "#1-7 nsIHTMLEditor::getSelectedElement(\"\") should return null when Selection ends the <b> element but starts from the previous text node");
252 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("b")),
253 null,
254 "#1-7 nsIHTMLEditor::getSelectedElement(\"b\") should return null when Selection ends the <b> element but starts from the previous text node");
255 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("i")),
256 null,
257 "#1-7 nsIHTMLEditor::getSelectedElement(\"i\") should return null when Selection ends the <b> element but starts from the previous text node");
258 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("href")),
259 null,
260 "#1-7 nsIHTMLEditor::getSelectedElement(\"href\") should return null when Selection ends the <b> element but starts from the previous text node");
261 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("anchor")),
262 null,
263 "#1-7 nsIHTMLEditor::getSelectedElement(\"anchor\") should return null when Selection ends the <b> element but starts from the previous text node");
264 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("namedanchor")),
265 null,
266 "#1-7 nsIHTMLEditor::getSelectedElement(\"namedanchor\") should return null when Selection ends the <b> element but starts from the previous text node");
268 // <p>[p1<b>b1</b><i>i1</i>}...
269 range = document.createRange();
270 range.setStart(editor.firstChild.firstChild, 0);
271 range.setEnd(editor.firstChild, 3);
272 selection.removeAllRanges();
273 selection.addRange(range);
275 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
276 null,
277 "#1-8 nsIHTMLEditor::getSelectedElement(\"\") should return null when Selection includes 2 elements and starts from previous text node");
278 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("b")),
279 null,
280 "#1-8 nsIHTMLEditor::getSelectedElement(\"b\") should return null when Selection includes 2 elements and starts from previous text node");
281 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("i")),
282 null,
283 "#1-8 nsIHTMLEditor::getSelectedElement(\"i\") should return null when Selection includes 2 elements and starts from previous text node");
284 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("href")),
285 null,
286 "#1-8 nsIHTMLEditor::getSelectedElement(\"href\") should null when Selection includes 2 elements and starts from previous text node");
287 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("anchor")),
288 null,
289 "#1-8 nsIHTMLEditor::getSelectedElement(\"anchor\") should return null when Selection includes 2 elements and starts from previous text node");
290 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("namedanchor")),
291 null,
292 "#1-8 nsIHTMLEditor::getSelectedElement(\"namedanchor\") should return null when Selection includes 2 elements and starts from previous text node");
294 // <p>p1{<b>b1</b>}<i>i1</i>...
295 // Note that this won't happen with user operation since Gecko sets
296 // start and end of Selection to points in text nodes as far as possible.
297 range = document.createRange();
298 range.setStart(editor.firstChild, 1);
299 range.setEnd(editor.firstChild, 2);
300 selection.removeAllRanges();
301 selection.addRange(range);
303 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
304 editor.firstChild.firstChild.nextSibling,
305 "#1-9 nsIHTMLEditor::getSelectedElement(\"\") should return <b> element when only it is selected and matched");
306 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("b")),
307 editor.firstChild.firstChild.nextSibling,
308 "#1-9 nsIHTMLEditor::getSelectedElement(\"b\") should return <b> element when only it is selected and matched");
309 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("i")),
310 null,
311 "#1-9 nsIHTMLEditor::getSelectedElement(\"i\") should return null when only a <b> element is selected but it is unmatched");
312 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("href")),
313 null,
314 "#1-9 nsIHTMLEditor::getSelectedElement(\"href\") should return null when only a <b> element is selected but it is unmatched");
315 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("anchor")),
316 null,
317 "#1-9 nsIHTMLEditor::getSelectedElement(\"anchor\") should return null when only a <b> element is selected but it is unmatched");
318 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("namedanchor")),
319 null,
320 "#1-9 nsIHTMLEditor::getSelectedElement(\"namedanchor\") should return when only a <b> element is selected but it is unmatched");
322 // <p>p1<b>b1</b>{<i>i1</i>}</p>...
323 range = document.createRange();
324 range.setStart(editor.firstChild, 2);
325 range.setEnd(editor.firstChild, 3);
326 selection.removeAllRanges();
327 selection.addRange(range);
329 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
330 editor.firstChild.firstChild.nextSibling.nextSibling,
331 "#1-10 nsIHTMLEditor::getSelectedElement(\"\") should return <i> element when only it is selected and matched");
332 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("b")),
333 null,
334 "#1-10 nsIHTMLEditor::getSelectedElement(\"b\") should return null when only an <i> element is selected but it is unmatched");
335 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("i")),
336 editor.firstChild.firstChild.nextSibling.nextSibling,
337 "#1-10 nsIHTMLEditor::getSelectedElement(\"i\") should return <i> element when only it is selected and matched");
338 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("href")),
339 null,
340 "#1-10 nsIHTMLEditor::getSelectedElement(\"href\") should return null when only an <i> element is selected but it is unmatched");
341 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("anchor")),
342 null,
343 "#1-10 nsIHTMLEditor::getSelectedElement(\"anchor\") should return null when only an <i> element is selected but it is unmatched");
344 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("namedanchor")),
345 null,
346 "#1-10 nsIHTMLEditor::getSelectedElement(\"namedanchor\") should return null when only an <i> element is selected but it is unmatched");
348 // <p>{p1}<b>b1</b><i>...
349 range = document.createRange();
350 range.setStart(editor.firstChild, 0);
351 range.setEnd(editor.firstChild, 1);
352 selection.removeAllRanges();
353 selection.addRange(range);
355 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
356 null,
357 "#1-11 nsIHTMLEditor::getSelectedElement(\"\") should return null when only a text node is selected");
358 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("b")),
359 null,
360 "#1-11 nsIHTMLEditor::getSelectedElement(\"b\") should return null when only a text node is selected");
361 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("i")),
362 null,
363 "#1-11 nsIHTMLEditor::getSelectedElement(\"i\") should return null when only a text node is selected");
364 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("href")),
365 null,
366 "#1-11 nsIHTMLEditor::getSelectedElement(\"href\") should return null when only a text node is selected");
367 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("anchor")),
368 null,
369 "#1-11 nsIHTMLEditor::getSelectedElement(\"anchor\") should return null when only a text node is selected");
370 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("namedanchor")),
371 null,
372 "#1-11 nsIHTMLEditor::getSelectedElement(\"namedanchor\") should return null when only a text node is selected");
374 editor.innerHTML = "<p>p1<b>b1</b><b>b2</b><b>b3</b></p>";
375 editor.focus();
377 // <p>p1<b>b[1</b><b>b2</b><b>b]3</b>...
378 range = document.createRange();
379 range.setStart(editor.firstChild.firstChild.nextSibling.firstChild, 1);
380 range.setEnd(editor.firstChild.firstChild.nextSibling.nextSibling.nextSibling.firstChild, 1);
381 selection.removeAllRanges();
382 selection.addRange(range);
384 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
385 null,
386 "#2-1 nsIHTMLEditor::getSelectedElement(\"\") should return null when Selection is across 3 <b> elements");
387 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("b")),
388 null,
389 "#2-1 nsIHTMLEditor::getSelectedElement(\"b\") should return null when Selection is across 3 <b> elements");
390 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("i")),
391 null,
392 "#2-1 nsIHTMLEditor::getSelectedElement(\"i\") should return null when Selection is across 3 <b> elements");
394 // <p>p[1<b>b1</b><b>b2</b><b>b]3</b>...
395 range = document.createRange();
396 range.setStart(editor.firstChild.firstChild, 1);
397 range.setEnd(editor.firstChild.firstChild.nextSibling.nextSibling.nextSibling.firstChild, 1);
398 selection.removeAllRanges();
399 selection.addRange(range);
401 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
402 null,
403 "#2-2 nsIHTMLEditor::getSelectedElement(\"\") should return null when Selection is across 3 <b> elements and previous text node");
404 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("b")),
405 null,
406 "#2-2 nsIHTMLEditor::getSelectedElement(\"b\") should return null when Selection is across 3 <b> elements and previous text node");
407 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("i")),
408 null,
409 "#2-2 nsIHTMLEditor::getSelectedElement(\"i\") should return null when Selection is across 3 <b> elements and previous text node");
411 editor.innerHTML = "<p>p1<b>b1<b>b2<b>b3</b></b></b>p2</p>";
412 editor.focus();
414 // <p>p1<b>b[1<b>b1-2<b>b]1-3</b>...
415 range = document.createRange();
416 range.setStart(editor.firstChild.firstChild.nextSibling.firstChild, 1);
417 range.setEnd(editor.firstChild.firstChild.nextSibling.firstChild.nextSibling.firstChild.nextSibling.firstChild, 1);
418 selection.removeAllRanges();
419 selection.addRange(range);
421 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
422 null,
423 "#3-1 nsIHTMLEditor::getSelectedElement(\"\") should return null when Selection is across 3 <b> elements which are nested");
424 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("b")),
425 null,
426 "#3-1 nsIHTMLEditor::getSelectedElement(\"b\") should return null when Selection is across 3 <b> elements which are nested");
427 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("i")),
428 null,
429 "#3-1 nsIHTMLEditor::getSelectedElement(\"i\") should return null when Selection is across 3 <b> elements which are nested");
431 // <p>p[1<b>b1<b>b1-2<b>b]1-3</b>...
432 range = document.createRange();
433 range.setStart(editor.firstChild.firstChild, 1);
434 range.setEnd(editor.firstChild.firstChild.nextSibling.firstChild.nextSibling.firstChild.nextSibling.firstChild, 1);
435 selection.removeAllRanges();
436 selection.addRange(range);
438 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
439 null,
440 "#3-2 nsIHTMLEditor::getSelectedElement(\"\") should return null when Selection is across a text node and 3 <b> elements which are nested");
441 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("b")),
442 null,
443 "#3-2 nsIHTMLEditor::getSelectedElement(\"b\") should return null when Selection is across a text node and 3 <b> elements which are nested");
444 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("i")),
445 null,
446 "#3-2 nsIHTMLEditor::getSelectedElement(\"i\") should return null when Selection is across a text node and 3 <b> elements which are nested");
448 // <p>p1<b>b1<b>b1-2<b>b[1-3</b></b></b>p]2...
449 range = document.createRange();
450 range.setStart(editor.firstChild.firstChild.nextSibling.firstChild.nextSibling.firstChild.nextSibling.firstChild, 1);
451 range.setEnd(editor.firstChild.firstChild.nextSibling.nextSibling, 1);
452 selection.removeAllRanges();
453 selection.addRange(range);
455 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
456 null,
457 "#3-3 nsIHTMLEditor::getSelectedElement(\"\") should return null when Selection is across 3 <b> elements which are nested and following text node");
458 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("b")),
459 null,
460 "#3-3 nsIHTMLEditor::getSelectedElement(\"b\") should return null when Selection is across 3 <b> elements which are nested and following text node");
461 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("i")),
462 null,
463 "#3-3 nsIHTMLEditor::getSelectedElement(\"i\") should return null when Selection is across 3 <b> elements which are nested and following text node");
465 editor.innerHTML = "<p><b>b1</b><a href=\"about:blank\">a1</a><a href=\"about:blank\">a2</a><a name=\"foo\">a3</a><b>b2</b></p>";
466 editor.focus();
468 // <p><b>b1</b>{<a href="...">a1</a>}<a href="...">a2...
469 // Note that this won't happen with user operation since Gecko sets
470 // start and end of Selection to points in text nodes as far as possible.
471 range = document.createRange();
472 range.setStart(editor.firstChild, 1);
473 range.setEnd(editor.firstChild, 2);
474 selection.removeAllRanges();
475 selection.addRange(range);
477 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
478 editor.firstChild.firstChild.nextSibling,
479 "#4-1 nsIHTMLEditor::getSelectedElement(\"\") should return the first <a> element when only it is selected and matched");
480 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("href")),
481 editor.firstChild.firstChild.nextSibling,
482 "#4-1 nsIHTMLEditor::getSelectedElement(\"href\") should return the first <a> element when only it is selected and matched");
483 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("anchor")),
484 null,
485 "#4-1 nsIHTMLEditor::getSelectedElement(\"anchor\") should return null when the first <a> element is selected but it is unmatched");
486 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("namedanchor")),
487 null,
488 "#4-1 nsIHTMLEditor::getSelectedElement(\"namedanchor\") should return null when the first <a> element is selected but it is unmatched");
490 // <p><b>b1</b><a href="...">a[]1</a><a href="...">a2...
491 range = document.createRange();
492 range.setStart(editor.firstChild.firstChild.nextSibling.firstChild, 1);
493 range.setEnd(editor.firstChild.firstChild.nextSibling.firstChild, 1);
494 selection.removeAllRanges();
495 selection.addRange(range);
497 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
498 null,
499 "#4-2 nsIHTMLEditor::getSelectedElement(\"\") should return null when Selection is collapsed");
500 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("href")),
501 editor.firstChild.firstChild.nextSibling,
502 "#4-2 nsIHTMLEditor::getSelectedElement(\"href\") should return the first <a> element when Selection is collapsed in the element");
503 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("anchor")),
504 null,
505 "#4-2 nsIHTMLEditor::getSelectedElement(\"anchor\") should return null when Selection is collapsed");
506 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("namedanchor")),
507 null,
508 "#4-2 nsIHTMLEditor::getSelectedElement(\"namedanchor\") should return null when Selection is collapsed");
510 // <p><b>b1</b><a href="...">a[1]</a><a href="...">a2...
511 range = document.createRange();
512 range.setStart(editor.firstChild.firstChild.nextSibling.firstChild, 1);
513 range.setEnd(editor.firstChild.firstChild.nextSibling.firstChild, 2);
514 selection.removeAllRanges();
515 selection.addRange(range);
517 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
518 null,
519 "#4-3 nsIHTMLEditor::getSelectedElement(\"\") should return null when Selection is in a text node");
520 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("href")),
521 editor.firstChild.firstChild.nextSibling,
522 "#4-3 nsIHTMLEditor::getSelectedElement(\"href\") should return the first <a> element when Selection is in the element");
523 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("anchor")),
524 null,
525 "#4-3 nsIHTMLEditor::getSelectedElement(\"anchor\") should return null when Selection is in a text node");
526 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("namedanchor")),
527 null,
528 "#4-3 nsIHTMLEditor::getSelectedElement(\"namedanchor\") should return null when Selection is in a text node");
530 // <p><b>b1</b><a href="...">a[1</a><a href="...">a]2...
531 range = document.createRange();
532 range.setStart(editor.firstChild.firstChild.nextSibling.firstChild, 1);
533 range.setEnd(editor.firstChild.firstChild.nextSibling.nextSibling.firstChild, 1);
534 selection.removeAllRanges();
535 selection.addRange(range);
537 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
538 null,
539 "#4-4 nsIHTMLEditor::getSelectedElement(\"\") should return null when Selection crosses 2 <a> elements");
540 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("href")),
541 null,
542 "#4-4 nsIHTMLEditor::getSelectedElement(\"href\") should return null when Selection crosses 2 <a> elements");
543 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("anchor")),
544 null,
545 "#4-4 nsIHTMLEditor::getSelectedElement(\"anchor\") should return null when Selection crosses 2 <a> elements");
546 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("namedanchor")),
547 null,
548 "#4-4 nsIHTMLEditor::getSelectedElement(\"namedanchor\") should return null when Selection crosses 2 <a> elements");
550 // <p><b>b1</b><a href="...">a1</a><a href="...">a2</a>{<a name="...">a3</a>}<b>b2</b></p>
551 // Note that this won't happen with user operation since Gecko sets
552 // start and end of Selection to points in text nodes as far as possible.
553 range = document.createRange();
554 range.setStart(editor.firstChild, 3);
555 range.setEnd(editor.firstChild, 4);
556 selection.removeAllRanges();
557 selection.addRange(range);
559 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
560 editor.firstChild.firstChild.nextSibling.nextSibling.nextSibling,
561 "#4-5 nsIHTMLEditor::getSelectedElement(\"\") should return the third <a> element when only it is selected and matched");
562 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("href")),
563 null,
564 "#4-5 nsIHTMLEditor::getSelectedElement(\"href\") should return null when the third <a> element is selected but it is unmatched");
565 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("anchor")),
566 editor.firstChild.firstChild.nextSibling.nextSibling.nextSibling,
567 "#4-5 nsIHTMLEditor::getSelectedElement(\"anchor\") should return the third <a> element when only it is selected and matched");
568 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("namedanchor")),
569 null,
570 "#4-5 nsIHTMLEditor::getSelectedElement(\"namedanchor\") should return null when the third <a> element is selected but it is unmatched");
572 // <p><b>b1</b><a href="...">a1</a><a href="...">a2</a><a name="...">a[]3</a><b>b2</b></p>
573 range = document.createRange();
574 range.setStart(editor.firstChild.firstChild.nextSibling.nextSibling.nextSibling.firstChild, 1);
575 range.setEnd(editor.firstChild.firstChild.nextSibling.nextSibling.nextSibling.firstChild, 1);
576 selection.removeAllRanges();
577 selection.addRange(range);
579 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
580 null,
581 "#4-6 nsIHTMLEditor::getSelectedElement(\"\") should return null when Selection is collapsed in a text node even in named anchor element");
582 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("href")),
583 null,
584 "#4-6 nsIHTMLEditor::getSelectedElement(\"href\") should return null when Selection is collapsed in a text node even in named anchor element");
585 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("anchor")),
586 null,
587 "#4-6 nsIHTMLEditor::getSelectedElement(\"anchor\") should return null when Selection is collapsed in a text node even in named anchor element");
588 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("namedanchor")),
589 null,
590 "#4-6 nsIHTMLEditor::getSelectedElement(\"namedanchor\") should return null when Selection is collapsed in a text node even in named anchor element");
592 editor.innerHTML = "<p>p1<b>b1</b>p1</p>";
593 editor.focus();
595 // <p>p1[<b>b1</b>]p1</p>
596 // This is usual case that user selects <b> element with dragging or double-clicking.
597 range = document.createRange();
598 range.setStart(editor.firstChild.firstChild, 2);
599 range.setEnd(editor.firstChild.firstChild.nextSibling.nextSibling, 0);
600 selection.removeAllRanges();
601 selection.addRange(range);
603 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
604 null,
605 "#5-1 nsIHTMLEditor::getSelectedElement(\"\") should return null even when Selection starts from end of preceding text node and ends at start or following text node of <b> element");
606 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("href")),
607 null,
608 "#5-1 nsIHTMLEditor::getSelectedElement(\"href\") should return null even when Selection starts from end of preceding text node and ends at start or following text node of <b> element");
609 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("anchor")),
610 null,
611 "#5-1 nsIHTMLEditor::getSelectedElement(\"anchor\") should return null even when Selection starts from end of preceding text node and ends at start or following text node of <b> element");
613 // <p>p[1<b>b1</b>]p1</p>
614 range = document.createRange();
615 range.setStart(editor.firstChild.firstChild, 1);
616 range.setEnd(editor.firstChild.firstChild.nextSibling.nextSibling, 0);
617 selection.removeAllRanges();
618 selection.addRange(range);
620 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
621 null,
622 "#5-2 nsIHTMLEditor::getSelectedElement(\"\") should return null when Selection ends at start of following text node of <b> element");
623 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("href")),
624 null,
625 "#5-2 nsIHTMLEditor::getSelectedElement(\"href\") should return null when Selection ends at start of following text node of <b> element");
626 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("anchor")),
627 null,
628 "#5-2 nsIHTMLEditor::getSelectedElement(\"anchor\") should return null when Selection ends at start of following text node of <b> element");
630 // <p>p1[<b>b1</b>p]1</p>
631 range = document.createRange();
632 range.setStart(editor.firstChild.firstChild, 2);
633 range.setEnd(editor.firstChild.firstChild.nextSibling.nextSibling, 1);
634 selection.removeAllRanges();
635 selection.addRange(range);
637 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
638 null,
639 "#5-3 nsIHTMLEditor::getSelectedElement(\"\") should return null when Selection starts from end of following text node of <b> element");
640 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("href")),
641 null,
642 "#5-3 nsIHTMLEditor::getSelectedElement(\"href\") should return null when Selection starts from at end of following text node of <b> element");
643 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("anchor")),
644 null,
645 "#5-3 nsIHTMLEditor::getSelectedElement(\"anchor\") should return null when Selection starts from end of following text node of <b> element");
647 // <p>p1<b>[b1</b>]p1</p>
648 range = document.createRange();
649 range.setStart(editor.firstChild.firstChild.nextSibling.firstChild, 0);
650 range.setEnd(editor.firstChild.firstChild.nextSibling.nextSibling, 0);
651 selection.removeAllRanges();
652 selection.addRange(range);
654 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
655 null,
656 "#5-4 nsIHTMLEditor::getSelectedElement(\"\") should return null when Selection starts from start of text node in <b> element and ends at start of following text node of <b> element");
657 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("href")),
658 null,
659 "#5-4 nsIHTMLEditor::getSelectedElement(\"href\") should return null when Selection starts from start of text node in <b> element and ends at start of following text node of <b> element");
660 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("anchor")),
661 null,
662 "#5-4 nsIHTMLEditor::getSelectedElement(\"anchor\") should return null when Selection starts from start of text node in <b> element and ends at start of following text node of <b> element");
664 // <p>p1[<b>b1]</b>p1</p>
665 range = document.createRange();
666 range.setStart(editor.firstChild.firstChild, 2);
667 range.setEnd(editor.firstChild.firstChild.nextSibling.firstChild, 2);
668 selection.removeAllRanges();
669 selection.addRange(range);
671 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
672 null,
673 "#5-5 nsIHTMLEditor::getSelectedElement(\"\") should return null when Selection starts from end of preceding text node of <b> element and ends at end of text node in <b> element");
674 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("href")),
675 null,
676 "#5-5 nsIHTMLEditor::getSelectedElement(\"href\") should return null when Selection starts from end of preceding text node of <b> element and ends at end of text node in <b> element");
677 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("anchor")),
678 null,
679 "#5-5 nsIHTMLEditor::getSelectedElement(\"anchor\") should return null when Selection starts from end of preceding text node of <b> element and ends at end of text node in <b> element");
681 // <p>p1<b>b[1</b>}p1</p>
682 range = document.createRange();
683 range.setStart(editor.firstChild.firstChild.nextSibling.firstChild, 1);
684 range.setEnd(editor.firstChild, 2);
685 selection.removeAllRanges();
686 selection.addRange(range);
688 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
689 editor.firstChild.firstChild.nextSibling,
690 "#5-6 nsIHTMLEditor::getSelectedElement(\"\") should the <b> element when Selection starts from in the <b> element's text node and end of preceding text node of <b> element and ends at end of the <b> element");
691 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("href")),
692 null,
693 "#5-6 nsIHTMLEditor::getSelectedElement(\"href\") should return null when Selection starts from in the <b> element's text node and end of preceding text node of <b> element and ends at end of the <b> element");
694 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("anchor")),
695 null,
696 "#5-6 nsIHTMLEditor::getSelectedElement(\"anchor\") should return null when Selection starts from in the <b> element's text node and end of preceding text node of <b> element and ends at end of the <b> element");
698 editor.innerHTML = "<p>p1<b>b1</b></p>";
699 editor.focus();
701 // <p>p1[<b>b1</b>}</p>
702 // This is usual case of double-clicking in the <b> element.
703 range = document.createRange();
704 range.setStart(editor.firstChild.firstChild, 2);
705 range.setEnd(editor.firstChild, 2);
706 selection.removeAllRanges();
707 selection.addRange(range);
709 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
710 null,
711 "#6-1 nsIHTMLEditor::getSelectedElement(\"\") should return null when Selection starts from previous text node of <b> element and end at end of <b> element");
712 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("href")),
713 null,
714 "#6-1 nsIHTMLEditor::getSelectedElement(\"href\") should return null when Selection starts from previous text node of <b> element and end at end of <b> element");
715 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("anchor")),
716 null,
717 "#6-1 nsIHTMLEditor::getSelectedElement(\"anchor\") should return null when Selection starts from previous text node of <b> element and end at end of <b> element");
719 editor.innerHTML = "<p><b>b1</b>p1</p>";
720 editor.focus();
722 // <p><b>[b1</b>]p1</p>
723 // This is usual case of double-clicking in the <b> element.
724 range = document.createRange();
725 range.setStart(editor.firstChild.firstChild.firstChild, 0);
726 range.setEnd(editor.firstChild.firstChild.nextSibling, 0);
727 selection.removeAllRanges();
728 selection.addRange(range);
730 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
731 null,
732 "#7-1 nsIHTMLEditor::getSelectedElement(\"\") should return null when Selection starts from a text node in <b> element and ends at start of following text node");
733 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("href")),
734 null,
735 "#7-1 nsIHTMLEditor::getSelectedElement(\"href\") should return null when Selection starts from a text node in <b> element and ends at start of following text node");
736 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("anchor")),
737 null,
738 "#7-1 nsIHTMLEditor::getSelectedElement(\"anchor\") should return null when Selection starts from a text node in <b> element and ends at start of following text node");
740 editor.innerHTML = "<p>p1<b>b1</b><br></p>";
741 editor.focus();
743 // <p>p1[<b>b1</b>}<br></p>
744 // This is usual case of double-clicking in the <b> element.
745 range = document.createRange();
746 range.setStart(editor.firstChild.firstChild, 2);
747 range.setEnd(editor.firstChild, 2);
748 selection.removeAllRanges();
749 selection.addRange(range);
751 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
752 null,
753 "#8-1 nsIHTMLEditor::getSelectedElement(\"\") should return null when Selection starts from previous text node of <b> element and ends before the following <br> element");
754 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("href")),
755 null,
756 "#8-1 nsIHTMLEditor::getSelectedElement(\"href\") should return null when Selection starts from previous text node of <b> element and ends before the following <br> element");
757 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("anchor")),
758 null,
759 "#8-1 nsIHTMLEditor::getSelectedElement(\"anchor\") should return null when Selection starts from previous text node of <b> element and ends before the following <br> element");
762 editor.innerHTML = "<p><b>b1</b><br></p>";
763 editor.focus();
765 // <p><b>[b1</b>}<br></p>
766 // This is usual case of double-clicking in the <b> element.
767 range = document.createRange();
768 range.setStart(editor.firstChild.firstChild.firstChild, 0);
769 range.setEnd(editor.firstChild, 1);
770 selection.removeAllRanges();
771 selection.addRange(range);
773 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
774 null,
775 "#9-1 nsIHTMLEditor::getSelectedElement(\"\") should return null when Selection starts from a text node in <b> element and ends before the following <br> element");
776 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("href")),
777 null,
778 "#9-1 nsIHTMLEditor::getSelectedElement(\"href\") should return null when Selection starts from a text node in <b> element and ends before the following <br> element");
779 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("anchor")),
780 null,
781 "#9-1 nsIHTMLEditor::getSelectedElement(\"anchor\") should return null when Selection starts from a text node in <b> element and ends before the following <br> element");
783 editor.innerHTML = "<p><b>b1</b><b><br></b><b>b2</b></p>";
784 editor.focus();
786 // <p><b>[b1</b><b>}<br></b><b>b2</b></p>
787 // This is usual case of double-clicking in the first <b> element.
788 range = document.createRange();
789 range.setStart(editor.firstChild.firstChild.firstChild, 0);
790 range.setEnd(editor.firstChild.firstChild.nextSibling, 0);
791 selection.removeAllRanges();
792 selection.addRange(range);
794 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("")),
795 null,
796 "#10-1 nsIHTMLEditor::getSelectedElement(\"\") should return null when Selection starts from a text node in <b> element and ends before the following <br> element in another <b> element");
797 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("href")),
798 null,
799 "#10-1 nsIHTMLEditor::getSelectedElement(\"href\") should return null when Selection starts from a text node in <b> element and ends before the following <br> element in another <b> element");
800 is(SpecialPowers.unwrap(getHTMLEditor().getSelectedElement("anchor")),
801 null,
802 "#10-1 nsIHTMLEditor::getSelectedElement(\"anchor\") should return null when Selection starts from a text node in <b> element and ends before the following <br> element in another <b> element");
804 SimpleTest.finish();
807 function getHTMLEditor() {
808 var Ci = SpecialPowers.Ci;
809 var editingSession = SpecialPowers.wrap(window).docShell.editingSession;
810 return editingSession.getEditorForWindow(window).QueryInterface(Ci.nsIHTMLEditor);
813 </script>
814 </body>
816 </html>