| OLD | NEW |
| 1 /// Additional feature tests that aren't based on test data. | 1 /// Additional feature tests that aren't based on test data. |
| 2 library parser_feature_test; | 2 library parser_feature_test; |
| 3 | 3 |
| 4 import 'package:unittest/unittest.dart'; | 4 import 'package:unittest/unittest.dart'; |
| 5 import 'package:html5lib/dom.dart'; | 5 import 'package:html5lib/dom.dart'; |
| 6 import 'package:html5lib/parser.dart'; | 6 import 'package:html5lib/parser.dart'; |
| 7 import 'package:html5lib/src/constants.dart'; | 7 import 'package:html5lib/src/constants.dart'; |
| 8 import 'package:html5lib/src/treebuilder.dart'; | 8 import 'package:html5lib/src/treebuilder.dart'; |
| 9 | 9 |
| 10 main() { | 10 main() { |
| 11 test('doctype is cloneable', () { | 11 test('doctype is cloneable', () { |
| 12 var doc = parse('<!DOCTYPE HTML>'); | 12 var doc = parse('<!doctype HTML>'); |
| 13 DocumentType doctype = doc.nodes[0]; | 13 DocumentType doctype = doc.nodes[0]; |
| 14 expect(doctype.clone().outerHtml, '<!DOCTYPE html>'); | 14 expect(doctype.clone().toString(), '<!DOCTYPE html>'); |
| 15 }); | 15 }); |
| 16 | 16 |
| 17 test('line counter', () { | 17 test('line counter', () { |
| 18 // http://groups.google.com/group/html5lib-discuss/browse_frm/thread/f4f00e4
a2f26d5c0 | 18 // http://groups.google.com/group/html5lib-discuss/browse_frm/thread/f4f00e4
a2f26d5c0 |
| 19 var doc = parse("<pre>\nx\n>\n</pre>"); | 19 var doc = parse("<pre>\nx\n>\n</pre>"); |
| 20 expect(doc.body.innerHtml, "<pre>x\n>\n</pre>"); | 20 expect(doc.body.innerHtml, "<pre>x\n>\n</pre>"); |
| 21 }); | 21 }); |
| 22 | 22 |
| 23 test('namespace html elements on', () { | 23 test('namespace html elements on', () { |
| 24 var doc = new HtmlParser('', tree: new TreeBuilder(true)).parse(); | 24 var doc = new HtmlParser('', tree: new TreeBuilder(true)).parse(); |
| 25 expect(doc.nodes[0].namespace, Namespaces.html); | 25 expect(doc.nodes[0].namespaceUri, Namespaces.html); |
| 26 }); | 26 }); |
| 27 | 27 |
| 28 test('namespace html elements off', () { | 28 test('namespace html elements off', () { |
| 29 var doc = new HtmlParser('', tree: new TreeBuilder(false)).parse(); | 29 var doc = new HtmlParser('', tree: new TreeBuilder(false)).parse(); |
| 30 expect(doc.nodes[0].namespace, null); | 30 expect(doc.nodes[0].namespaceUri, null); |
| 31 }); | 31 }); |
| 32 | 32 |
| 33 test('parse error spans - full', () { | 33 test('parse error spans - full', () { |
| 34 var parser = new HtmlParser(''' | 34 var parser = new HtmlParser(''' |
| 35 <!DOCTYPE html> | 35 <!DOCTYPE html> |
| 36 <html> | 36 <html> |
| 37 <body> | 37 <body> |
| 38 <!DOCTYPE html> | 38 <!DOCTYPE html> |
| 39 </body> | 39 </body> |
| 40 </html> | 40 </html> |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 149 doc = parse('<body><script></script></body>'); | 149 doc = parse('<body><script></script></body>'); |
| 150 expect(doc.body.innerHtml, '<script></script>'); | 150 expect(doc.body.innerHtml, '<script></script>'); |
| 151 doc = parse('<br>'); | 151 doc = parse('<br>'); |
| 152 expect(doc.body.innerHtml, '<br>'); | 152 expect(doc.body.innerHtml, '<br>'); |
| 153 doc = parse('<br><foo><bar>'); | 153 doc = parse('<br><foo><bar>'); |
| 154 expect(doc.body.innerHtml, '<br><foo><bar></bar></foo>'); | 154 expect(doc.body.innerHtml, '<br><foo><bar></bar></foo>'); |
| 155 }); | 155 }); |
| 156 | 156 |
| 157 test('empty document has html, body, and head', () { | 157 test('empty document has html, body, and head', () { |
| 158 var doc = parse(''); | 158 var doc = parse(''); |
| 159 expect(doc.outerHtml, '<html><head></head><body></body></html>'); | 159 var html = '<html><head></head><body></body></html>'; |
| 160 expect(doc.outerHtml, html); |
| 161 expect(doc.documentElement.outerHtml, html); |
| 160 expect(doc.head.outerHtml, '<head></head>'); | 162 expect(doc.head.outerHtml, '<head></head>'); |
| 161 expect(doc.body.outerHtml, '<body></body>'); | 163 expect(doc.body.outerHtml, '<body></body>'); |
| 162 }); | 164 }); |
| 163 | 165 |
| 164 test('strange table case', () { | 166 test('strange table case', () { |
| 165 var doc = parseFragment('<table><tbody><foo>'); | 167 var doc = parse('<table><tbody><foo>').body; |
| 166 expect(doc.outerHtml, '<foo></foo><table><tbody></tbody></table>'); | 168 expect(doc.innerHtml, '<foo></foo><table><tbody></tbody></table>'); |
| 167 }); | 169 }); |
| 168 | 170 |
| 169 group('html serialization', () { | 171 group('html serialization', () { |
| 170 test('attribute order', () { | 172 test('attribute order', () { |
| 171 // Note: the spec only requires a stable order. | 173 // Note: the spec only requires a stable order. |
| 172 // However, we preserve the input order via LinkedHashMap | 174 // However, we preserve the input order via LinkedHashMap |
| 173 var doc = parseFragment('<foo d=1 a=2 c=3 b=4>'); | 175 var body = parse('<foo d=1 a=2 c=3 b=4>').body; |
| 174 expect(doc.outerHtml, '<foo d="1" a="2" c="3" b="4"></foo>'); | 176 expect(body.innerHtml, '<foo d="1" a="2" c="3" b="4"></foo>'); |
| 175 expect(doc.querySelector('foo').attributes.remove('a'), '2'); | 177 expect(body.querySelector('foo').attributes.remove('a'), '2'); |
| 176 expect(doc.outerHtml, '<foo d="1" c="3" b="4"></foo>'); | 178 expect(body.innerHtml, '<foo d="1" c="3" b="4"></foo>'); |
| 177 doc.querySelector('foo').attributes['a'] = '0'; | 179 body.querySelector('foo').attributes['a'] = '0'; |
| 178 expect(doc.outerHtml, '<foo d="1" c="3" b="4" a="0"></foo>'); | 180 expect(body.innerHtml, '<foo d="1" c="3" b="4" a="0"></foo>'); |
| 179 }); | 181 }); |
| 180 | 182 |
| 181 test('escaping Text node in <script>', () { | 183 test('escaping Text node in <script>', () { |
| 182 var doc = parseFragment('<script>a && b</script>'); | 184 Element e = parseFragment('<script>a && b</script>').firstChild; |
| 183 expect(doc.outerHtml, '<script>a && b</script>'); | 185 expect(e.outerHtml, '<script>a && b</script>'); |
| 184 }); | 186 }); |
| 185 | 187 |
| 186 test('escaping Text node in <span>', () { | 188 test('escaping Text node in <span>', () { |
| 187 var doc = parseFragment('<span>a && b</span>'); | 189 Element e = parseFragment('<span>a && b</span>').firstChild; |
| 188 expect(doc.outerHtml, '<span>a && b</span>'); | 190 expect(e.outerHtml, '<span>a && b</span>'); |
| 189 }); | 191 }); |
| 190 | 192 |
| 191 test('Escaping attributes', () { | 193 test('Escaping attributes', () { |
| 192 var doc = parseFragment('<div class="a<b>">'); | 194 Element e = parseFragment('<div class="a<b>">').firstChild; |
| 193 expect(doc.outerHtml, '<div class="a<b>"></div>'); | 195 expect(e.outerHtml, '<div class="a<b>"></div>'); |
| 194 doc = parseFragment('<div class=\'a"b\'>'); | 196 e = parseFragment('<div class=\'a"b\'>').firstChild; |
| 195 expect(doc.outerHtml, '<div class="a"b"></div>'); | 197 expect(e.outerHtml, '<div class="a"b"></div>'); |
| 196 }); | 198 }); |
| 197 | 199 |
| 198 test('Escaping non-breaking space', () { | 200 test('Escaping non-breaking space', () { |
| 199 var text = '<span>foO\u00A0bar</span>'; | 201 var text = '<span>foO\u00A0bar</span>'; |
| 200 expect(text.codeUnitAt(text.indexOf('O') + 1), 0xA0); | 202 expect(text.codeUnitAt(text.indexOf('O') + 1), 0xA0); |
| 201 var doc = parseFragment(text); | 203 Element e = parseFragment(text).firstChild; |
| 202 expect(doc.outerHtml, '<span>foO bar</span>'); | 204 expect(e.outerHtml, '<span>foO bar</span>'); |
| 203 }); | 205 }); |
| 204 | 206 |
| 205 test('Newline after <pre>', () { | 207 test('Newline after <pre>', () { |
| 206 var doc = parseFragment('<pre>\n\nsome text</span>'); | 208 Element e = parseFragment('<pre>\n\nsome text</span>').firstChild; |
| 207 expect(doc.querySelector('pre').nodes[0].data, '\nsome text'); | 209 expect((e.firstChild as Text).data, '\nsome text'); |
| 208 expect(doc.outerHtml, '<pre>\n\nsome text</pre>'); | 210 expect(e.outerHtml, '<pre>\n\nsome text</pre>'); |
| 209 | 211 |
| 210 doc = parseFragment('<pre>\nsome text</span>'); | 212 e = parseFragment('<pre>\nsome text</span>').firstChild; |
| 211 expect(doc.querySelector('pre').nodes[0].data, 'some text'); | 213 expect((e.firstChild as Text).data, 'some text'); |
| 212 expect(doc.outerHtml, '<pre>some text</pre>'); | 214 expect(e.outerHtml, '<pre>some text</pre>'); |
| 213 }); | 215 }); |
| 214 | 216 |
| 215 test('xml namespaces', () { | 217 test('xml namespaces', () { |
| 216 // Note: this is a nonsensical example, but it triggers the behavior | 218 // Note: this is a nonsensical example, but it triggers the behavior |
| 217 // we're looking for with attribute names in foreign content. | 219 // we're looking for with attribute names in foreign content. |
| 218 var doc = parse(''' | 220 var doc = parse(''' |
| 219 <body> | 221 <body> |
| 220 <svg> | 222 <svg> |
| 221 <desc xlink:type="simple" | 223 <desc xlink:type="simple" |
| 222 xlink:href="http://example.com/logo.png" | 224 xlink:href="http://example.com/logo.png" |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 281 expect((c as Comment).data, 'foo'); | 283 expect((c as Comment).data, 'foo'); |
| 282 expect(c.text, 'foo'); | 284 expect(c.text, 'foo'); |
| 283 expect(e.text, 'bar'); | 285 expect(e.text, 'bar'); |
| 284 | 286 |
| 285 c.text = 'qux'; | 287 c.text = 'qux'; |
| 286 expect(c.data, 'qux'); | 288 expect(c.data, 'qux'); |
| 287 expect(c.text, 'qux'); | 289 expect(c.text, 'qux'); |
| 288 expect(e.text, 'bar'); | 290 expect(e.text, 'bar'); |
| 289 }); | 291 }); |
| 290 } | 292 } |
| OLD | NEW |