test_bug116083.html (6515B)
1 <!DOCTYPE HTML> 2 <html> 3 <!-- 4 https://bugzilla.mozilla.org/show_bug.cgi?id=116083 5 --> 6 <head> 7 <title>Test for Bug 116083</title> 8 <script src="/tests/SimpleTest/SimpleTest.js"></script> 9 <script src="/tests/SimpleTest/EventUtils.js"></script> 10 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/> 11 </head> 12 <body> 13 <a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=116083">Mozilla Bug 116083</a> 14 <div id="content"> 15 <div style="white-space: pre">foo bar</div> 16 <div style="white-space: pre-wrap">foo bar</div> 17 <div style="white-space: pre-line">foo bar</div> 18 <div style="white-space: preserve-spaces">foo bar</div> 19 <div style="white-space: pre" data-collapse-selection-to-child-and-extend>foo bar</div> 20 <div style="white-space: pre-wrap" data-collapse-selection-to-child-and-extend>foo bar</div> 21 <div style="white-space: pre-line" data-collapse-selection-to-child-and-extend>foo bar</div> 22 <div style="white-space: preserve-spaces" data-collapse-selection-to-child-and-extend>foo bar</div> 23 <div data-result="bar baz"><span style="white-space: pre">bar </span>baz</div> 24 <div data-result="bar baz"><span style="white-space: pre-wrap">bar </span>baz</div> 25 <div data-result="bar baz"><span style="white-space: pre-line">bar </span>baz</div> 26 <div data-result="bar baz"><span style="white-space: preserve-spaces">bar </span>baz</div> 27 <div data-result="foo bar ! baz" style="white-space: pre"><div>foo </div><div> bar</div><div><br></div><div>!</div><div><br><br></div><div>baz</div></div> 28 <div data-result="foo bar ! baz" style="white-space: pre" contenteditable><div>foo </div><div> bar</div><div><br></div><div>!</div><div><br><br></div><div>baz</div></div> 29 <div data-result="foo bar ! baz" style="white-space: pre-wrap"><div>foo </div><div> bar</div><div><br></div><div>!</div><div><br><br></div><div>baz</div></div> 30 <div data-result="foo bar ! baz" style="white-space: pre-wrap" contenteditable><div>foo </div><div> bar</div><div><br></div><div>!</div><div><br><br></div><div>baz</div></div> 31 <div data-result="foo bar ! baz" style="white-space: pre-line"><div>foo </div><div> bar</div><div><br></div><div>!</div><div><br><br></div><div>baz</div></div> 32 <div data-result="foo bar ! baz" style="white-space: pre-line" contenteditable><div>foo </div><div> bar</div><div><br></div><div>!</div><div><br><br></div><div>baz</div></div> 33 <div data-result="foo bar ! baz" style="white-space: preserve-spaces"><div>foo </div><div> bar</div><div><br></div><div>!</div><div><br><br></div><div>baz</div></div> 34 <div data-result="foo bar ! baz" style="white-space: preserve-spaces" contenteditable><div>foo </div><div> bar</div><div><br></div><div>!</div><div><br><br></div><div>baz</div></div> 35 <div data-result="foo bar baz qux"><div>foo<br></div><span>bar<br>baz<br>qux</span></div> 36 <div data-result="foo bar baz qux" contenteditable><div>foo<br></div><span>bar<br>baz<br>qux</span></div> 37 <div data-result="foo "><div>foo</div><span><br></span></div> 38 <div data-result="foo " contenteditable><div>foo</div><span><br></span></div> 39 <div data-result="foo bar"><div>foo</div><span><br></span><div>bar</div></div> 40 <div data-result="foo bar" contenteditable><div>foo</div><span><br></span><div>bar</div></div> 41 <div data-result="foo bar "><div>foo</div><span>bar<br></span></div> 42 <div data-result="foo bar" contenteditable><div>foo</div><span>bar<br></span></div> 43 <div data-result="foo bar baz"><div>foo</div><span>bar<br></span><div>baz</div></div> 44 <div data-result="foo bar baz" contenteditable><div>foo</div><span>bar<br></span><div>baz</div></div> 45 <div data-result=" foo"><div><br><br><div>foo</div></div></div> 46 <div data-result=" foo" contenteditable><div><br><br><div>foo</div></div></div> 47 <div data-result="foo bar"><div>foo<br>bar</div></div> 48 <div data-result="foo bar" contenteditable><div>foo<br>bar</div></div> 49 <div data-result="foo bar "><div>foo<br>bar<br></div></div> 50 <div data-result="foo bar" contenteditable><div>foo<br>bar<br></div></div> 51 <div data-result="foo bar">foo bar</div> 52 </div> 53 <script type="application/javascript"> 54 55 const Cc = SpecialPowers.Cc; 56 const Ci = SpecialPowers.Ci; 57 58 function hasExpectedFlavors() { 59 var cb = SpecialPowers.Services.clipboard; 60 61 ok(cb.hasDataMatchingFlavors(["text/plain"], cb.kGlobalClipboard), 62 "The clipboard has text/plain"); 63 64 ok(cb.hasDataMatchingFlavors(["text/html"], cb.kGlobalClipboard), 65 "The clipboard has text/html"); 66 67 if (navigator.appVersion.includes("Win")) { 68 ok(cb.hasDataMatchingFlavors(["application/x-moz-nativehtml"], cb.kGlobalClipboard), 69 "The clipboard has application/x-moz-nativehtml"); 70 } 71 } 72 73 function collapseSelectionToChildAndExtend(divElement) { 74 is(divElement.childNodes.length, 1, "Expected exactly one child node."); 75 var textChildNode = divElement.childNodes[0]; 76 getSelection().collapse(textChildNode); 77 getSelection().extend(textChildNode, divElement.textContent.length); 78 } 79 80 function selectDependingOnAttributes(divElement) { 81 if (divElement.hasAttribute("data-collapse-selection-to-child-and-extend")) { 82 // Selecting text as follow comes closest to user behaviour. 83 collapseSelectionToChildAndExtend(divElement); 84 } else { 85 getSelection().selectAllChildren(divElement); 86 } 87 } 88 89 function nextTest() { 90 var div = document.querySelector("#content>div"); 91 if (!div) { 92 SimpleTest.finish(); 93 return; 94 } 95 96 selectDependingOnAttributes(div); 97 98 var expected = div.hasAttribute("data-result") ? 99 div.getAttribute("data-result") : 100 div.textContent; 101 if (!div.nextElementSibling && 102 SpecialPowers.getBoolPref("dom.serializer.includeCommonAncestor.enabled")) { 103 expected = `\n${expected}\n`; 104 } 105 106 SimpleTest.waitForClipboard(expected, function() { 107 synthesizeKey("C", {accelKey: true}); 108 }, function() { 109 ok(true, div.getAttribute("style") + " passed"); 110 hasExpectedFlavors(); 111 div.remove(); 112 nextTest(); 113 }, function() { 114 ok(false, "failed to copy the expected content to the clipboard"); 115 SimpleTest.finish(); 116 }); 117 } 118 119 SimpleTest.waitForExplicitFinish(); 120 SimpleTest.waitForFocus(nextTest); 121 </script> 122 </body> 123 </html>