| <!doctype html> |
| <title>DOMParser basic test of HTML parsing</title> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script> |
| // |expected| should be an object indicating the expected type of node. |
| function assert_node(actual, expected) { |
| assert_true(actual instanceof expected.type, |
| 'Node type mismatch: actual = ' + actual.constructor.name + ', expected = ' + expected.type.name); |
| if (typeof(expected.id) !== 'undefined') |
| assert_equals(actual.id, expected.id, expected.idMessage); |
| } |
| |
| var doc; |
| setup(function() { |
| var parser = new DOMParser(); |
| var input = '<html id="root"><head></head><body></body></html>'; |
| doc = parser.parseFromString(input, 'text/html'); |
| }); |
| |
| test(function() { |
| var root = doc.documentElement; |
| assert_node(root, { type: HTMLHtmlElement, id: 'root', |
| idMessage: 'documentElement id attribute should be root.' }); |
| }, 'Parsing of id attribute'); |
| |
| test(function() { |
| assert_equals(doc.contentType, "text/html") |
| }, 'contentType'); |
| |
| test(function() { |
| assert_equals(doc.compatMode, "BackCompat") |
| }, 'compatMode'); |
| |
| test(function() { |
| var parser = new DOMParser(); |
| var input = '<!DOCTYPE html><html id="root"><head></head><body></body></html>'; |
| doc = parser.parseFromString(input, 'text/html'); |
| assert_equals(doc.compatMode, "CSS1Compat") |
| }, 'compatMode for a proper DOCTYPE'); |
| |
| // URL- and encoding-related stuff tested separately. |
| |
| test(function() { |
| assert_equals(doc.location, null, |
| 'The document must have a location value of null.'); |
| }, 'Location value'); |
| |
| test(function() { |
| var soup = "<!DOCTYPE foo></><foo></multiple></>"; |
| var htmldoc = new DOMParser().parseFromString(soup, "text/html"); |
| assert_equals(htmldoc.documentElement.localName, "html"); |
| assert_equals(htmldoc.documentElement.namespaceURI, "http://www.w3.org/1999/xhtml"); |
| }, "DOMParser parses HTML tag soup with no problems"); |
| |
| test(function() { |
| const doc = new DOMParser().parseFromString('<noembed><a></noembed>', 'text/html'); |
| assert_equals(doc.querySelector('noembed').textContent, '<a>'); |
| }, 'DOMParser should handle the content of <noembed> as raw text'); |
| |
| test(function() { |
| assert_throws_js(TypeError, function() { |
| new DOMParser().parseFromString("", "text/foo-this-is-invalid"); |
| }) |
| }, "DOMParser throws on an invalid enum value") |
| |
| test(() => { |
| const doc = new DOMParser().parseFromString(` |
| <html><body> |
| <style> |
| @import url(/dummy.css) |
| </style> |
| <script>document.x = 8<\/script> |
| </body></html>`, 'text/html'); |
| |
| assert_not_equals(doc.querySelector('script'), null, 'script must be found'); |
| assert_equals(doc.x, undefined, 'script must not be executed on the inner document'); |
| assert_equals(document.x, undefined, 'script must not be executed on the outer document'); |
| }, 'script is found synchronously even when there is a css import'); |
| |
| test(() => { |
| const doc = new DOMParser().parseFromString(`<body><noscript><p id="test1">test1<p id="test2">test2</noscript>`, 'text/html'); |
| assert_node(doc.body.firstChild.childNodes[0], { type: HTMLParagraphElement, id: 'test1' }); |
| assert_node(doc.body.firstChild.childNodes[1], { type: HTMLParagraphElement, id: 'test2' }); |
| }, 'must be parsed with scripting disabled, so noscript works'); |
| </script> |