Skip to content

Commit

Permalink
Implements Node::isSameNode
Browse files Browse the repository at this point in the history
Fixes #10746

Adapted the tests from dom/nodes/Node-isEqualNode.html
  • Loading branch information
amarant committed Apr 23, 2016
1 parent 305c283 commit ed42cc7
Show file tree
Hide file tree
Showing 5 changed files with 116 additions and 52 deletions.
8 changes: 8 additions & 0 deletions components/script/dom/node.rs
Expand Up @@ -2230,6 +2230,14 @@ impl NodeMethods for Node {
}
}

// https://dom.spec.whatwg.org/#dom-node-issamenode
fn IsSameNode(&self, otherNode: Option<&Node>) -> bool {
match otherNode {
Some(node) => self == node,
None => false,
}
}

// https://dom.spec.whatwg.org/#dom-node-comparedocumentposition
fn CompareDocumentPosition(&self, other: &Node) -> u16 {
if self == other {
Expand Down
2 changes: 2 additions & 0 deletions components/script/dom/webidls/Node.webidl
Expand Up @@ -58,6 +58,8 @@ interface Node : EventTarget {
Node cloneNode(optional boolean deep = false);
[Pure]
boolean isEqualNode(Node? node);
[Pure]
boolean isSameNode(Node? otherNode); // historical alias of ===

const unsigned short DOCUMENT_POSITION_DISCONNECTED = 0x01;
const unsigned short DOCUMENT_POSITION_PRECEDING = 0x02;
Expand Down
6 changes: 6 additions & 0 deletions tests/wpt/metadata/MANIFEST.json
Expand Up @@ -35235,6 +35235,12 @@
"path": "dom/nodes/Element-hasAttributes.html",
"url": "/dom/nodes/Element-hasAttributes.html"
}
],
"dom/nodes/Node-isSameNode.html": [
{
"path": "dom/nodes/Node-isSameNode.html",
"url": "/dom/nodes/Node-isSameNode.html"
}
]
}
},
Expand Down
52 changes: 0 additions & 52 deletions tests/wpt/metadata/dom/interfaces.html.ini
Expand Up @@ -186,45 +186,18 @@
[Node interface: attribute isConnected]
expected: FAIL
[Node interface: operation isSameNode(Node)]
expected: FAIL
[Node interface: new Document() must inherit property "isConnected" with the proper type (15)]
expected: FAIL
[Node interface: new Document() must inherit property "isSameNode" with the proper type (31)]
expected: FAIL
[Node interface: calling isSameNode(Node) on new Document() with too few arguments must throw TypeError]
expected: FAIL
[Node interface: xmlDoc must inherit property "isConnected" with the proper type (15)]
expected: FAIL
[Node interface: xmlDoc must inherit property "isSameNode" with the proper type (31)]
expected: FAIL
[Node interface: calling isSameNode(Node) on xmlDoc with too few arguments must throw TypeError]
expected: FAIL
[Node interface: document.doctype must inherit property "isConnected" with the proper type (15)]
expected: FAIL
[Node interface: document.doctype must inherit property "isSameNode" with the proper type (31)]
expected: FAIL
[Node interface: calling isSameNode(Node) on document.doctype with too few arguments must throw TypeError]
expected: FAIL
[Node interface: document.createDocumentFragment() must inherit property "isConnected" with the proper type (15)]
expected: FAIL
[Node interface: document.createDocumentFragment() must inherit property "isSameNode" with the proper type (31)]
expected: FAIL
[Node interface: calling isSameNode(Node) on document.createDocumentFragment() with too few arguments must throw TypeError]
expected: FAIL
[ShadowRoot interface: existence and properties of interface object]
expected: FAIL
Expand Down Expand Up @@ -276,12 +249,6 @@
[Node interface: element must inherit property "isConnected" with the proper type (15)]
expected: FAIL

[Node interface: element must inherit property "isSameNode" with the proper type (31)]
expected: FAIL

[Node interface: calling isSameNode(Node) on element with too few arguments must throw TypeError]
expected: FAIL

[Text interface: attribute assignedSlot]
expected: FAIL

Expand All @@ -291,27 +258,8 @@
[Node interface: document.createTextNode("abc") must inherit property "isConnected" with the proper type (15)]
expected: FAIL

[Node interface: document.createTextNode("abc") must inherit property "isSameNode" with the proper type (31)]
expected: FAIL

[Node interface: calling isSameNode(Node) on document.createTextNode("abc") with too few arguments must throw TypeError]
expected: FAIL

[Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isConnected" with the proper type (15)]
expected: FAIL

[Node interface: xmlDoc.createProcessingInstruction("abc", "def") must inherit property "isSameNode" with the proper type (31)]
expected: FAIL

[Node interface: calling isSameNode(Node) on xmlDoc.createProcessingInstruction("abc", "def") with too few arguments must throw TypeError]
expected: FAIL

[Node interface: document.createComment("abc") must inherit property "isConnected" with the proper type (15)]
expected: FAIL

[Node interface: document.createComment("abc") must inherit property "isSameNode" with the proper type (31)]
expected: FAIL

[Node interface: calling isSameNode(Node) on document.createComment("abc") with too few arguments must throw TypeError]
expected: FAIL

100 changes: 100 additions & 0 deletions tests/wpt/web-platform-tests/dom/nodes/Node-isSameNode.html
@@ -0,0 +1,100 @@
<!DOCTYPE html>
<meta charset="utf-8">
<title>Node.prototype.isSameNode</title>
<link rel=help href="https://dom.spec.whatwg.org/#dom-node-issamenode">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>
"use strict";

test(function() {

var doctype1 = document.implementation.createDocumentType("qualifiedName", "publicId", "systemId");
var doctype2 = document.implementation.createDocumentType("qualifiedName", "publicId", "systemId");

assert_true(doctype1.isSameNode(doctype1), "self-comparison");
assert_false(doctype1.isSameNode(doctype2), "same properties");
assert_false(doctype1.isSameNode(null), "with null other node");
}, "doctypes should be comapred on reference");

test(function() {

var element1 = document.createElementNS("namespace", "prefix:localName");
var element2 = document.createElementNS("namespace", "prefix:localName");

assert_true(element1.isSameNode(element1), "self-comparison");
assert_false(element1.isSameNode(element2), "same properties");
assert_false(element1.isSameNode(null), "with null other node");

}, "elements should be compared on reference");

test(function() {

var element1 = document.createElement("element");
element1.setAttributeNS("namespace", "prefix:localName", "value");

var element2 = document.createElement("element");
element2.setAttributeNS("namespace", "prefix:localName", "value");

assert_true(element1.isSameNode(element1), "self-comparison");
assert_false(element1.isSameNode(element2), "same properties");
assert_false(element1.isSameNode(null), "with null other node");

}, "elements should be compared on reference");

test(function() {

var pi1 = document.createProcessingInstruction("target", "data");
var pi2 = document.createProcessingInstruction("target", "data");

assert_true(pi1.isSameNode(pi1), "self-comparison");
assert_false(pi1.isSameNode(pi2), "different target");
assert_false(pi1.isSameNode(null), "with null other node");

}, "processing instructions should be compared on reference");

test(function() {

var text1 = document.createTextNode("data");
var text2 = document.createTextNode("data");

assert_true(text1.isSameNode(text1), "self-comparison");
assert_false(text1.isSameNode(text2), "same properties");
assert_false(text1.isSameNode(null), "with null other node");

}, "text nodes should be compared on reference");

test(function() {

var comment1 = document.createComment("data");
var comment2 = document.createComment("data");

assert_true(comment1.isSameNode(comment1), "self-comparison");
assert_false(comment1.isSameNode(comment2), "same properties");
assert_false(comment1.isSameNode(null), "with null other node");

}, "comments should be compared on reference");

test(function() {

var documentFragment1 = document.createDocumentFragment();
var documentFragment2 = document.createDocumentFragment();

assert_true(documentFragment1.isSameNode(documentFragment1), "self-comparison");
assert_false(documentFragment1.isSameNode(documentFragment2), "same properties");
assert_false(documentFragment1.isSameNode(null), "with null other node");

}, "document fragments should be compared on reference");

test(function() {

var document1 = document.implementation.createDocument("", "");
var document2 = document.implementation.createDocument("", "");

assert_true(document1.isSameNode(document1), "self-comparison");
assert_false(document1.isSameNode(document2), "another empty XML document");
assert_false(document1.isSameNode(null), "with null other node");

}, "documents should not be compared on reference");

</script>

0 comments on commit ed42cc7

Please sign in to comment.