OLD | NEW |
| (Empty) |
1 <!DOCTYPE html> | |
2 <html> | |
3 <head> | |
4 <title>Testing Widows and Orphans</title> | |
5 <script src="../../resources/js-test.js"></script> | |
6 <style> | |
7 body.hide-containers .container, body.hide-containers h3 { | |
8 display: none; | |
9 } | |
10 | |
11 .region { | |
12 height: 200px; | |
13 -webkit-region-fragment: break; | |
14 display: inline-block; | |
15 } | |
16 | |
17 .region0 { | |
18 width: 150px; | |
19 } | |
20 | |
21 .region1 { | |
22 width: 200px; | |
23 } | |
24 | |
25 .region2 { | |
26 width: 150px; | |
27 } | |
28 | |
29 .container { | |
30 width: 600px; | |
31 height: 200px; | |
32 line-height: 20px; /* 10 lines per page */ | |
33 font-size: 16px; | |
34 margin: 0 0 20px 0; | |
35 padding: 0; | |
36 overflow: hidden; | |
37 } | |
38 | |
39 .block { | |
40 margin: 0 0 15px 0; | |
41 padding: 0; | |
42 } | |
43 | |
44 .top { | |
45 color: red; | |
46 } | |
47 | |
48 .bottom { | |
49 color: green; | |
50 } | |
51 </style> | |
52 <script> | |
53 | |
54 description("Testing widows and orphans. Any green lines should be at the bottom
of regions, and any red lines should be at the top of regions."); | |
55 | |
56 if (window.testRunner) | |
57 testRunner.dumpAsText(); | |
58 | |
59 function createRegions(id, container) | |
60 { | |
61 for (var i = 0; i < 3; ++i) { | |
62 var element = document.createElement("div"); | |
63 element.className = "region region" + i; | |
64 element.style.webkitFlowFrom = id; | |
65 | |
66 container.appendChild(element); | |
67 } | |
68 } | |
69 | |
70 function createTestContainer(id, description, blocks) | |
71 { | |
72 var label = document.createElement("h3"); | |
73 label.textContent = id + " - " + description; | |
74 document.body.appendChild(label); | |
75 var element = document.createElement("div"); | |
76 element.className = "container"; | |
77 element.id = id; | |
78 | |
79 createRegions(id, element); | |
80 | |
81 for (var i = 1; i <= blocks.length; ++i) { | |
82 var block = document.createElement("div"); | |
83 block.className = "block"; | |
84 var numLines = blocks[i-1]; | |
85 for (var j = 1; j <= numLines; ++j) { | |
86 var line = document.createElement("span"); | |
87 line.id = id + "-block-" + i + "-line-" + j; | |
88 line.textContent = "Block " + i + " Line " + j; | |
89 block.appendChild(line); | |
90 block.appendChild(document.createElement("br")); | |
91 } | |
92 block.style.webkitFlowInto = id; | |
93 element.appendChild(block); | |
94 } | |
95 document.body.appendChild(element); | |
96 return element; | |
97 } | |
98 | |
99 function markTopLine(containerId, blockNumber, lineNumber) | |
100 { | |
101 var element = document.getElementById(containerId + "-block-" + blockNumber
+ "-line-" + lineNumber); | |
102 element.className = "top"; | |
103 } | |
104 | |
105 function markBottomLine(containerId, blockNumber, lineNumber) | |
106 { | |
107 var element = document.getElementById(containerId + "-block-" + blockNumber
+ "-line-" + lineNumber); | |
108 element.className = "bottom"; | |
109 } | |
110 | |
111 function testIsFirstInRegion(containerId, blockNumber, lineNumber) | |
112 { | |
113 var topOfContainer = document.getElementById(containerId).getBoundingClientR
ect().top; | |
114 var topOfLine = document.getElementById(containerId + "-block-" + blockNumbe
r + "-line-" + lineNumber).getBoundingClientRect().top; | |
115 | |
116 if (Math.abs(topOfContainer - topOfLine) < 5) // Give 5 pixels to account fo
r subpixel layout. | |
117 testPassed(containerId + " Block " + blockNumber + " Line " + lineNumber
+ " is correct."); | |
118 else | |
119 testFailed(containerId + " Block " + blockNumber + " Line " + lineNumber
+ " wasn't at the top of the region."); | |
120 } | |
121 | |
122 function runTest() | |
123 { | |
124 var container; | |
125 | |
126 createTestContainer("test1", "Normal breaking", [5, 6, 5, 5]); | |
127 | |
128 markTopLine("test1", 1, 1); | |
129 markBottomLine("test1", 2, 4); | |
130 markTopLine("test1", 2, 5); | |
131 markBottomLine("test1", 4, 1); | |
132 markTopLine("test1", 4, 2); | |
133 | |
134 testIsFirstInRegion("test1", 1, 1); | |
135 testIsFirstInRegion("test1", 2, 5); | |
136 testIsFirstInRegion("test1", 4, 2); | |
137 | |
138 container = createTestContainer("test2", "Basic Orphan", [8, 6]); | |
139 container.style.orphans = 2; | |
140 | |
141 markTopLine("test2", 1, 1); | |
142 markBottomLine("test2", 1, 8); // Orphan break happens here. | |
143 markTopLine("test2", 2, 1); | |
144 | |
145 testIsFirstInRegion("test2", 1, 1); | |
146 testIsFirstInRegion("test2", 2, 1); | |
147 | |
148 container = createTestContainer("test3", "Basic Widow", [4, 6, 3]); | |
149 container.style.widows = 2; | |
150 | |
151 markTopLine("test3", 1, 1); | |
152 markBottomLine("test3", 2, 4); // Widow break happens here. | |
153 markTopLine("test3", 2, 5); | |
154 | |
155 testIsFirstInRegion("test3", 1, 1); | |
156 testIsFirstInRegion("test3", 2, 5); | |
157 | |
158 container = createTestContainer("test4", "Orphans causing Widows", [8, 6, 4,
4]); | |
159 container.style.orphans = 2; | |
160 container.style.widows = 2; | |
161 | |
162 markTopLine("test4", 1, 1); | |
163 markBottomLine("test4", 1, 8); // Orphan break happens here. | |
164 markTopLine("test4", 2, 1); | |
165 markBottomLine("test4", 3, 2); // And that creates a widow forcing a break h
ere. | |
166 markTopLine("test4", 3, 3); | |
167 | |
168 testIsFirstInRegion("test4", 1, 1); | |
169 testIsFirstInRegion("test4", 2, 1); | |
170 testIsFirstInRegion("test4", 3, 3); | |
171 | |
172 container = createTestContainer("test5", "Widows blocked by Orphan rule", [7
, 3, 4]); | |
173 container.style.orphans = 2; | |
174 container.style.widows = 2; | |
175 | |
176 markTopLine("test5", 1, 1); | |
177 markBottomLine("test5", 2, 2); // This line should not move - protected by o
rphaning. | |
178 markTopLine("test5", 2, 3); // This line won't be un-widowed - blocked by or
phaning. | |
179 | |
180 testIsFirstInRegion("test5", 1, 1); | |
181 testIsFirstInRegion("test5", 2, 3); | |
182 | |
183 container = createTestContainer("test6", "Ridiculous values", [7, 7, 7, 7]); | |
184 container.style.orphans = 100; | |
185 container.style.widows = 100; | |
186 | |
187 markTopLine("test6", 1, 1); | |
188 markBottomLine("test6", 1, 7); // Orphan break happens here. | |
189 markTopLine("test6", 2, 1); // Adopted. | |
190 markBottomLine("test6", 2, 7); // Orphan break. | |
191 markTopLine("test6", 3, 1); // Adopted. | |
192 | |
193 testIsFirstInRegion("test6", 1, 1); | |
194 testIsFirstInRegion("test6", 2, 1); | |
195 testIsFirstInRegion("test6", 3, 1); | |
196 | |
197 if (window.testRunner) { | |
198 // Hide all the containers and leave just the test results for text outp
ut. | |
199 document.body.className = "hide-containers"; | |
200 } | |
201 | |
202 isSuccessfullyParsed(); | |
203 } | |
204 | |
205 window.addEventListener("load", runTest, false); | |
206 </script> | |
207 </head> | |
208 <body> | |
209 </body> | |
210 </html> | |
OLD | NEW |