| Index: third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/attributes.html
|
| diff --git a/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/attributes.html b/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/attributes.html
|
| index ab7922f3bb5c85010249d740e48d010d9fb9d73d..574ab6d1c3f83da74c4e5fd2ef9259eb0ab53617 100644
|
| --- a/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/attributes.html
|
| +++ b/third_party/WebKit/LayoutTests/imported/web-platform-tests/dom/nodes/attributes.html
|
| @@ -19,12 +19,17 @@ var XMLNS = "http://www.w3.org/2000/xmlns/"
|
| test(function() {
|
| document.body.setAttribute("abc", "pass")
|
| var attr = document.body.attributes[0]
|
| - assert_true(attr instanceof Attr)
|
| - assert_false(attr instanceof Node)
|
| - assert_throws(new TypeError(), function() { attr.appendChild(document.createTextNode("fail")) })
|
| - assert_throws(new TypeError(), function() { attr.appendChild(null) })
|
| + assert_true(attr instanceof Attr, "should be an Attr")
|
| + assert_false(attr instanceof Node, "should not be a Node")
|
| + var removed_members = [
|
| + "appendChild",
|
| + "insertBefore",
|
| + "childNodes",
|
| + ]
|
| + removed_members.forEach(function(m) {
|
| + assert_false(m in attr, m + " should not be supported")
|
| + })
|
| assert_equals(attr.value, "pass")
|
| - assert_false("childNodes" in attr, "Should not have childNodes")
|
| }, "AttrExodus")
|
|
|
| // setAttribute exhaustive tests
|
| @@ -442,6 +447,26 @@ test(function() {
|
| }, "Basic functionality of setAttributeNodeNS")
|
|
|
| test(function() {
|
| + var el = document.createElement("div");
|
| + var other = document.createElement("div");
|
| + attr = document.createAttribute("foo");
|
| + assert_equals(el.setAttributeNode(attr), null);
|
| + assert_equals(attr.ownerElement, el);
|
| + assert_throws("INUSE_ATTRIBUTE_ERR",
|
| + function() { other.setAttributeNode(attr) },
|
| + "Attribute already associated with el")
|
| +}, "If attr’s element is neither null nor element, throw an InUseAttributeError.");
|
| +
|
| +test(function() {
|
| + var el = document.createElement("div");
|
| + attr = document.createAttribute("foo");
|
| + assert_equals(el.setAttributeNode(attr), null);
|
| + el.setAttribute("bar", "qux");
|
| + assert_equals(el.setAttributeNode(attr), attr);
|
| + assert_equals(el.attributes[0], attr);
|
| +}, "Replacing an attr by itself");
|
| +
|
| +test(function() {
|
| var el = document.createElement("div")
|
| el.setAttribute("foo", "bar")
|
| var attrNode = el.getAttributeNode("foo");
|
| @@ -460,6 +485,60 @@ test(function() {
|
| assert_throws("INUSE_ATTRIBUTE_ERR", function(){el2.setAttributeNode(attrNode)});
|
| }, "setAttributeNode on bound attribute should throw InUseAttributeError")
|
|
|
| +// Have to use an async_test to see what a DOMAttrModified listener sees,
|
| +// because otherwise the event dispatch code will swallow our exceptions. And
|
| +// we want to make sure this test always happens, even when no mutation events
|
| +// run.
|
| +var setAttributeNode_mutation_test = async_test("setAttributeNode, if it fires mutation events, should fire one with the new node when resetting an existing attribute");
|
| +
|
| +test(function(){
|
| + var el = document.createElement("div")
|
| + var attrNode1 = document.createAttribute("foo");
|
| + attrNode1.value = "bar";
|
| + el.setAttributeNode(attrNode1);
|
| + var attrNode2 = document.createAttribute("foo");
|
| + attrNode2.value = "baz";
|
| +
|
| + el.addEventListener("DOMAttrModified", function(e) {
|
| + // If this never gets called, that's OK, I guess. But if it gets called, it
|
| + // better represent a single modification with attrNode2 as the relatedNode.
|
| + // We have to do an inner test() call here, because otherwise the exceptions
|
| + // our asserts trigger will get swallowed by the event dispatch code.
|
| + setAttributeNode_mutation_test.step(function() {
|
| + assert_equals(e.attrName, "foo");
|
| + assert_equals(e.attrChange, MutationEvent.MODIFICATION);
|
| + assert_equals(e.prevValue, "bar");
|
| + assert_equals(e.newValue, "baz");
|
| + assert_equals(e.relatedNode, attrNode2);
|
| + });
|
| + });
|
| +
|
| + var oldNode = el.setAttributeNode(attrNode2);
|
| + assert_equals(oldNode, attrNode1,
|
| + "Must return the old attr node from a setAttributeNode call");
|
| +}, "setAttributeNode, if it fires mutation events, should fire one with the new node when resetting an existing attribute (outer shell)");
|
| +setAttributeNode_mutation_test.done();
|
| +
|
| +test(function(){
|
| + var el = document.createElement("div")
|
| + el.setAttribute("a", "b");
|
| + el.setAttribute("c", "d");
|
| +
|
| + assert_array_equals(Array.prototype.map.call(el.attributes, function(a) { return a.name }),
|
| + ["a", "c"]);
|
| + assert_array_equals(Array.prototype.map.call(el.attributes, function(a) { return a.value }),
|
| + ["b", "d"]);
|
| +
|
| + var attrNode = document.createAttribute("a");
|
| + attrNode.value = "e";
|
| + el.setAttributeNode(attrNode);
|
| +
|
| + assert_array_equals(Array.prototype.map.call(el.attributes, function(a) { return a.name }),
|
| + ["a", "c"]);
|
| + assert_array_equals(Array.prototype.map.call(el.attributes, function(a) { return a.value }),
|
| + ["e", "d"]);
|
| +}, "setAttributeNode called with an Attr that has the same name as an existing one should not change attribute order");
|
| +
|
| test(function() {
|
| var el = document.createElement("div");
|
| el.setAttribute("foo", "bar");
|
| @@ -532,6 +611,10 @@ test(function() {
|
| ["0", "1", "2"])
|
| assert_array_equals(Object.getOwnPropertyNames(el.attributes),
|
| ["0", "1", "2", "a", "b"])
|
| + for (var propName of Object.getOwnPropertyNames(el.attributes)) {
|
| + assert_true(el.attributes[propName] instanceof Attr,
|
| + "el.attributes has an Attr for property name " + propName);
|
| + }
|
| }, "Own property correctness with non-namespaced attribute before same-name namespaced one");
|
|
|
| test(function() {
|
| @@ -545,6 +628,10 @@ test(function() {
|
| ["0", "1", "2"])
|
| assert_array_equals(Object.getOwnPropertyNames(el.attributes),
|
| ["0", "1", "2", "a", "b"])
|
| + for (var propName of Object.getOwnPropertyNames(el.attributes)) {
|
| + assert_true(el.attributes[propName] instanceof Attr,
|
| + "el.attributes has an Attr for property name " + propName);
|
| + }
|
| }, "Own property correctness with namespaced attribute before same-name non-namespaced one");
|
|
|
| test(function() {
|
| @@ -558,5 +645,59 @@ test(function() {
|
| ["0", "1", "2"])
|
| assert_array_equals(Object.getOwnPropertyNames(el.attributes),
|
| ["0", "1", "2", "a:b", "c:d"])
|
| + for (var propName of Object.getOwnPropertyNames(el.attributes)) {
|
| + assert_true(el.attributes[propName] instanceof Attr,
|
| + "el.attributes has an Attr for property name " + propName);
|
| + }
|
| }, "Own property correctness with two namespaced attributes with the same name-with-prefix");
|
| +
|
| +test(function() {
|
| + var el = document.createElement("div");
|
| + el.setAttributeNS("foo", "A:B", "");
|
| + el.setAttributeNS("bar", "c:D", "");
|
| + el.setAttributeNS("baz", "e:F", "");
|
| + el.setAttributeNS("qux", "g:h", "");
|
| + el.setAttributeNS("", "I", "");
|
| + el.setAttributeNS("", "j", "");
|
| + assert_array_equals(Object.getOwnPropertyNames(el.attributes),
|
| + ["0", "1", "2", "3", "4", "5", "g:h", "j"])
|
| + for (var propName of Object.getOwnPropertyNames(el.attributes)) {
|
| + assert_true(el.attributes[propName] instanceof Attr,
|
| + "el.attributes has an Attr for property name " + propName);
|
| + }
|
| +}, "Own property names should only include all-lowercase qualified names for an HTML element in an HTML document");
|
| +
|
| +test(function() {
|
| + var el = document.createElementNS("", "div");
|
| + el.setAttributeNS("foo", "A:B", "");
|
| + el.setAttributeNS("bar", "c:D", "");
|
| + el.setAttributeNS("baz", "e:F", "");
|
| + el.setAttributeNS("qux", "g:h", "");
|
| + el.setAttributeNS("", "I", "");
|
| + el.setAttributeNS("", "j", "");
|
| + assert_array_equals(Object.getOwnPropertyNames(el.attributes),
|
| + ["0", "1", "2", "3", "4", "5", "A:B", "c:D", "e:F", "g:h", "I", "j"])
|
| + for (var propName of Object.getOwnPropertyNames(el.attributes)) {
|
| + assert_true(el.attributes[propName] instanceof Attr,
|
| + "el.attributes has an Attr for property name " + propName);
|
| + }
|
| +}, "Own property names should include all qualified names for a non-HTML element in an HTML document");
|
| +
|
| +test(function() {
|
| + var doc = document.implementation.createDocument(null, "");
|
| + assert_equals(doc.contentType, "application/xml");
|
| + var el = doc.createElementNS("http://www.w3.org/1999/xhtml", "div");
|
| + el.setAttributeNS("foo", "A:B", "");
|
| + el.setAttributeNS("bar", "c:D", "");
|
| + el.setAttributeNS("baz", "e:F", "");
|
| + el.setAttributeNS("qux", "g:h", "");
|
| + el.setAttributeNS("", "I", "");
|
| + el.setAttributeNS("", "j", "");
|
| + assert_array_equals(Object.getOwnPropertyNames(el.attributes),
|
| + ["0", "1", "2", "3", "4", "5", "A:B", "c:D", "e:F", "g:h", "I", "j"])
|
| + for (var propName of Object.getOwnPropertyNames(el.attributes)) {
|
| + assert_true(el.attributes[propName] instanceof Attr,
|
| + "el.attributes has an Attr for property name " + propName);
|
| + }
|
| +}, "Own property names should include all qualified names for an HTML element in a non-HTML document");
|
| </script>
|
|
|