test_bug682592.html (5884B)
1 <!DOCTYPE html> 2 <html> 3 <!-- 4 https://bugzilla.mozilla.org/show_bug.cgi?id=682592 5 --> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" > 8 <title>Test for bug 682592</title> 9 <script src="/tests/SimpleTest/WindowSnapshot.js"></script> 10 <script src="/tests/SimpleTest/SimpleTest.js"></script> 11 <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" /> 12 </head> 13 <body> 14 <p id="display"></p> 15 <div id="content"> 16 <iframe id="iframe-ref"></iframe> 17 <iframe id="iframe-test"></iframe> 18 </div> 19 <pre id="test"> 20 <script class="testbody" type="text/javascript"> 21 /** Test for Bug 682592 */ 22 23 /* 24 We want to check that bidi is detected correctly. So, we have a reference 25 document where ltr is set explicitely with <bdo> element. Then, we compare 26 it with test document. 27 28 In mozilla, once bidi has been detected in a document, document always 29 consider it's in bidi mode. So, if one fragment enables bidi correctly, and 30 we create or update a fragment in the same document, that operation may not 31 enable bidi by itself, but it will not be detected. So, we need to have new 32 document for each test. 33 34 So, instead of many diferent reftests, this mochitest implements a 35 reftest-like. It creates reference text fragments in reference iframe, test 36 text fragments in test iframe, and compare the documents. Then, it reloads 37 test iframe. Reference iframe does not need to be reloaded between tests. 38 It's ok (and maybe, desired) to keep bidi always enabled in that document. 39 */ 40 41 SimpleTest.waitForExplicitFinish(); 42 SimpleTest.requestLongerTimeout(3); 43 if (navigator.platform.startsWith("Linux arm")) { /* bugs 982875, 999429 */ 44 SimpleTest.expectAssertions(0, 4); 45 } 46 47 var page = `<!DOCTYPE html> 48 <html><meta charset='UTF-8'><body><p id="content"></p></body></html>`; 49 var refFrame = document.getElementById("iframe-ref") 50 var testFrame = document.getElementById("iframe-test"); 51 52 refFrame.addEventListener("load", function() { 53 testFrame.addEventListener("load", async function() { 54 let {done} = tests.next(); 55 if (!done) { 56 ok(compareSnapshots(await snapshotWindow(testFrame.contentWindow), 57 await snapshotWindow(refFrame.contentWindow), true)[0], 58 "bidi is not detected correctly"); 59 60 testFrame.contentWindow.location.reload(); 61 } else { 62 SimpleTest.finish(); 63 } 64 }); 65 testFrame.srcdoc = page; 66 }); 67 refFrame.srcdoc = page; 68 69 var rtl = "עִבְרִית"; 70 var non8bit = "ʃ"; 71 var is8bit = "a"; 72 73 // concats aStr aNumber of times 74 function strMult(aStr, aNumber) { 75 if (aNumber === 0) { 76 return ""; 77 } 78 return strMult(aStr, aNumber - 1) + aStr; 79 } 80 81 function* runTests () { 82 var ltr = "", prefix = null; 83 var refContainer = refFrame.contentDocument.getElementById('content'); 84 var testContainer, textNode; 85 var i = 0; 86 87 // 8bit chars + bidi 88 for (i = 0; i <= 16; i++) { 89 ltr = strMult(is8bit, i); 90 refContainer.innerHTML = ltr + '<bdo dir="rtl">' + rtl + '</bdo>'; 91 testContainer = testFrame.contentDocument.getElementById('content'); 92 testContainer.innerHTML = ltr + rtl; 93 yield undefined; 94 } 95 96 // non-8bit char + 8bit chars + bidi 97 for (i = 0; i <= 16; i++) { 98 ltr = non8bit + strMult(is8bit, i); 99 refContainer.innerHTML = ltr + '<bdo dir="rtl">' + rtl + '</bdo>'; 100 testContainer = testFrame.contentDocument.getElementById('content'); 101 testContainer.innerHTML = ltr + rtl; 102 yield undefined; 103 } 104 105 // appendData 106 for (i = 0; i <= 16; i++) { 107 ltr = strMult(is8bit, i); 108 refContainer.innerHTML = ltr + '<bdo dir="rtl">' + rtl + '</bdo>'; 109 testContainer = testFrame.contentDocument.getElementById('content'); 110 textNode = document.createTextNode(""); 111 testContainer.appendChild(textNode); 112 textNode.appendData(ltr + rtl); 113 yield undefined; 114 } 115 116 for (i = 0; i <= 16; i++) { 117 ltr = non8bit + strMult(is8bit, i); 118 refContainer.innerHTML = ltr + '<bdo dir="rtl">' + rtl + '</bdo>'; 119 testContainer = testFrame.contentDocument.getElementById('content'); 120 textNode = document.createTextNode(""); 121 testContainer.appendChild(textNode); 122 textNode.appendData(ltr + rtl); 123 yield undefined; 124 } 125 126 // appendData with 8bit prefix 127 for (i = 0; i <= 16; i++) { 128 prefix = is8bit; 129 ltr = strMult(is8bit, i); 130 refContainer.innerHTML = prefix + ltr + '<bdo dir="rtl">' + rtl + '</bdo>'; 131 testContainer = testFrame.contentDocument.getElementById('content'); 132 textNode = document.createTextNode(prefix); 133 testContainer.appendChild(textNode); 134 textNode.appendData(ltr + rtl); 135 yield undefined; 136 } 137 138 for (i = 0; i <= 16; i++) { 139 prefix = is8bit; 140 ltr = non8bit + strMult(is8bit, i); 141 refContainer.innerHTML = prefix + ltr + '<bdo dir="rtl">' + rtl + '</bdo>'; 142 testContainer = testFrame.contentDocument.getElementById('content'); 143 textNode = document.createTextNode(prefix); 144 testContainer.appendChild(textNode); 145 textNode.appendData(ltr + rtl); 146 yield undefined; 147 } 148 149 // appendData with non-8bit prefix 150 for (i = 0; i <= 16; i++) { 151 prefix = non8bit; 152 ltr = strMult(is8bit, i); 153 refContainer.innerHTML = prefix + ltr + '<bdo dir="rtl">' + rtl + '</bdo>'; 154 testContainer = testFrame.contentDocument.getElementById('content'); 155 textNode = document.createTextNode(prefix); 156 testContainer.appendChild(textNode); 157 textNode.appendData(ltr + rtl); 158 yield undefined; 159 } 160 161 for (i = 0; i <= 16; i++) { 162 prefix = non8bit; 163 ltr = non8bit + strMult(is8bit, i); 164 refContainer.innerHTML = prefix + ltr + '<bdo dir="rtl">' + rtl + '</bdo>'; 165 testContainer = testFrame.contentDocument.getElementById('content'); 166 textNode = document.createTextNode(prefix); 167 testContainer.appendChild(textNode); 168 textNode.appendData(ltr + rtl); 169 yield undefined; 170 } 171 }; 172 173 var tests = runTests(); 174 175 </script> 176 </pre> 177 </body> 178 </html>