| <!DOCTYPE html> | |
| <meta charset=utf-8> | |
| <title>Node.textContent</title> | |
| <script src="/resources/testharness.js"></script> | |
| <script src="/resources/testharnessreport.js"></script> | |
| <div id="log"></div> | |
| <script> | |
| // XXX mutation observers? | |
| // XXX Range gravitation? | |
| var documents, doctypes; | |
| setup(function() { | |
| documents = [ | |
| [document, "parser"], | |
| [document.implementation.createDocument("", "test", null), "createDocument"], | |
| [document.implementation.createHTMLDocument("title"), "createHTMLDocument"], | |
| ] | |
| doctypes = [ | |
| [document.doctype, "parser"], | |
| [document.implementation.createDocumentType("x", "", ""), "script"], | |
| ] | |
| }) | |
| // Getting | |
| // DocumentFragment, Element: | |
| test(function() { | |
| var element = document.createElement("div") | |
| assert_equals(element.textContent, "") | |
| }, "For an empty Element, textContent should be the empty string") | |
| test(function() { | |
| assert_equals(document.createDocumentFragment().textContent, "") | |
| }, "For an empty DocumentFragment, textContent should be the empty string") | |
| test(function() { | |
| var el = document.createElement("div") | |
| el.appendChild(document.createComment(" abc ")) | |
| el.appendChild(document.createTextNode("\tDEF\t")) | |
| el.appendChild(document.createProcessingInstruction("x", " ghi ")) | |
| assert_equals(el.textContent, "\tDEF\t") | |
| }, "Element with children") | |
| test(function() { | |
| var el = document.createElement("div") | |
| var child = document.createElement("div") | |
| el.appendChild(child) | |
| child.appendChild(document.createComment(" abc ")) | |
| child.appendChild(document.createTextNode("\tDEF\t")) | |
| child.appendChild(document.createProcessingInstruction("x", " ghi ")) | |
| assert_equals(el.textContent, "\tDEF\t") | |
| }, "Element with descendants") | |
| test(function() { | |
| var df = document.createDocumentFragment() | |
| df.appendChild(document.createComment(" abc ")) | |
| df.appendChild(document.createTextNode("\tDEF\t")) | |
| df.appendChild(document.createProcessingInstruction("x", " ghi ")) | |
| assert_equals(df.textContent, "\tDEF\t") | |
| }, "DocumentFragment with children") | |
| test(function() { | |
| var df = document.createDocumentFragment() | |
| var child = document.createElement("div") | |
| df.appendChild(child) | |
| child.appendChild(document.createComment(" abc ")) | |
| child.appendChild(document.createTextNode("\tDEF\t")) | |
| child.appendChild(document.createProcessingInstruction("x", " ghi ")) | |
| assert_equals(df.textContent, "\tDEF\t") | |
| }, "DocumentFragment with descendants") | |
| // Text, ProcessingInstruction, Comment: | |
| test(function() { | |
| assert_equals(document.createTextNode("").textContent, "") | |
| }, "For an empty Text, textContent should be the empty string") | |
| test(function() { | |
| assert_equals(document.createProcessingInstruction("x", "").textContent, "") | |
| }, "For an empty ProcessingInstruction, textContent should be the empty string") | |
| test(function() { | |
| assert_equals(document.createComment("").textContent, "") | |
| }, "For an empty Comment, textContent should be the empty string") | |
| test(function() { | |
| assert_equals(document.createTextNode("abc").textContent, "abc") | |
| }, "For a Text with data, textContent should be that data") | |
| test(function() { | |
| assert_equals(document.createProcessingInstruction("x", "abc").textContent, | |
| "abc") | |
| }, "For a ProcessingInstruction with data, textContent should be that data") | |
| test(function() { | |
| assert_equals(document.createComment("abc").textContent, "abc") | |
| }, "For a Comment with data, textContent should be that data") | |
| // Any other node: | |
| documents.forEach(function(argument) { | |
| var doc = argument[0], creator = argument[1] | |
| test(function() { | |
| assert_equals(doc.textContent, null) | |
| }, "For Documents created by " + creator + ", textContent should be null") | |
| }) | |
| doctypes.forEach(function(argument) { | |
| var doctype = argument[0], creator = argument[1] | |
| test(function() { | |
| assert_equals(doctype.textContent, null) | |
| }, "For DocumentType created by " + creator + ", textContent should be null") | |
| }) | |
| // Setting | |
| // DocumentFragment, Element: | |
| var arguments = [ | |
| [null, null], | |
| [undefined, null], | |
| ["", null], | |
| [42, "42"], | |
| ["abc", "abc"], | |
| ["<b>xyz<\/b>", "<b>xyz<\/b>"], | |
| ["d\0e", "d\0e"] | |
| // XXX unpaired surrogate? | |
| ] | |
| arguments.forEach(function(aValue) { | |
| var argument = aValue[0], expectation = aValue[1] | |
| var check = function(aElementOrDocumentFragment) { | |
| if (expectation === null) { | |
| assert_equals(aElementOrDocumentFragment.textContent, "") | |
| assert_equals(aElementOrDocumentFragment.firstChild, null) | |
| } else { | |
| assert_equals(aElementOrDocumentFragment.textContent, expectation) | |
| assert_equals(aElementOrDocumentFragment.childNodes.length, 1, | |
| "Should have one child") | |
| var firstChild = aElementOrDocumentFragment.firstChild | |
| assert_true(firstChild instanceof Text, "child should be a Text") | |
| assert_equals(firstChild.data, expectation) | |
| } | |
| } | |
| test(function() { | |
| var el = document.createElement("div") | |
| el.textContent = argument | |
| check(el) | |
| }, "Element without children set to " + format_value(argument)) | |
| test(function() { | |
| var el = document.createElement("div") | |
| var text = el.appendChild(document.createTextNode("")) | |
| el.textContent = argument | |
| check(el) | |
| assert_equals(text.parentNode, null, | |
| "Preexisting Text should have been removed") | |
| }, "Element with empty text node as child set to " + format_value(argument)) | |
| test(function() { | |
| var el = document.createElement("div") | |
| el.appendChild(document.createComment(" abc ")) | |
| el.appendChild(document.createTextNode("\tDEF\t")) | |
| el.appendChild(document.createProcessingInstruction("x", " ghi ")) | |
| el.textContent = argument | |
| check(el) | |
| }, "Element with children set to " + format_value(argument)) | |
| test(function() { | |
| var el = document.createElement("div") | |
| var child = document.createElement("div") | |
| el.appendChild(child) | |
| child.appendChild(document.createComment(" abc ")) | |
| child.appendChild(document.createTextNode("\tDEF\t")) | |
| child.appendChild(document.createProcessingInstruction("x", " ghi ")) | |
| el.textContent = argument | |
| check(el) | |
| assert_equals(child.childNodes.length, 3, | |
| "Should not have changed the internal structure of the removed nodes.") | |
| }, "Element with descendants set to " + format_value(argument)) | |
| test(function() { | |
| var df = document.createDocumentFragment() | |
| df.textContent = argument | |
| check(df) | |
| }, "DocumentFragment without children set to " + format_value(argument)) | |
| test(function() { | |
| var df = document.createDocumentFragment() | |
| var text = df.appendChild(document.createTextNode("")) | |
| df.textContent = argument | |
| check(df) | |
| assert_equals(text.parentNode, null, | |
| "Preexisting Text should have been removed") | |
| }, "DocumentFragment with empty text node as child set to " + format_value(argument)) | |
| test(function() { | |
| var df = document.createDocumentFragment() | |
| df.appendChild(document.createComment(" abc ")) | |
| df.appendChild(document.createTextNode("\tDEF\t")) | |
| df.appendChild(document.createProcessingInstruction("x", " ghi ")) | |
| df.textContent = argument | |
| check(df) | |
| }, "DocumentFragment with children set to " + format_value(argument)) | |
| test(function() { | |
| var df = document.createDocumentFragment() | |
| var child = document.createElement("div") | |
| df.appendChild(child) | |
| child.appendChild(document.createComment(" abc ")) | |
| child.appendChild(document.createTextNode("\tDEF\t")) | |
| child.appendChild(document.createProcessingInstruction("x", " ghi ")) | |
| df.textContent = argument | |
| check(df) | |
| assert_equals(child.childNodes.length, 3, | |
| "Should not have changed the internal structure of the removed nodes.") | |
| }, "DocumentFragment with descendants set to " + format_value(argument)) | |
| }) | |
| // Text, ProcessingInstruction, Comment: | |
| test(function() { | |
| var text = document.createTextNode("abc") | |
| text.textContent = "def" | |
| assert_equals(text.textContent, "def") | |
| assert_equals(text.data, "def") | |
| }, "For a Text, textContent should set the data") | |
| test(function() { | |
| var pi = document.createProcessingInstruction("x", "abc") | |
| pi.textContent = "def" | |
| assert_equals(pi.textContent, "def") | |
| assert_equals(pi.data, "def") | |
| assert_equals(pi.target, "x") | |
| }, "For a ProcessingInstruction, textContent should set the data") | |
| test(function() { | |
| var comment = document.createComment("abc") | |
| comment.textContent = "def" | |
| assert_equals(comment.textContent, "def") | |
| assert_equals(comment.data, "def") | |
| }, "For a Comment, textContent should set the data") | |
| // Any other node: | |
| documents.forEach(function(argument) { | |
| var doc = argument[0], creator = argument[1] | |
| test(function() { | |
| var root = doc.documentElement | |
| doc.textContent = "a" | |
| assert_equals(doc.textContent, null) | |
| assert_equals(doc.documentElement, root) | |
| }, "For Documents created by " + creator + ", setting textContent should do nothing") | |
| }) | |
| doctypes.forEach(function(argument) { | |
| var doctype = argument[0], creator = argument[1] | |
| test(function() { | |
| var props = { | |
| name: doctype.name, | |
| publicId: doctype.publicId, | |
| systemId: doctype.systemId, | |
| } | |
| doctype.textContent = "b" | |
| assert_equals(doctype.textContent, null) | |
| assert_equals(doctype.name, props.name, "name should not change") | |
| assert_equals(doctype.publicId, props.publicId, "publicId should not change") | |
| assert_equals(doctype.systemId, props.systemId, "systemId should not change") | |
| }, "For DocumentType created by " + creator + ", setting textContent should do nothing") | |
| }) | |
| </script> |