diff options
author | bors-servo <release+servo@mozilla.com> | 2014-03-12 09:07:38 -0400 |
---|---|---|
committer | bors-servo <release+servo@mozilla.com> | 2014-03-12 09:07:38 -0400 |
commit | b84bd4c894e0e0c381b4485fd25b3df873df321e (patch) | |
tree | 3736777cab8fc08fb47b454ff4e5567f0fa1b0fd /src | |
parent | af616dba58cbf589b116b9e3cde4429df43e72cd (diff) | |
parent | a2e15df4ab738721017b4d01437afb3d0c2376eb (diff) | |
download | servo-b84bd4c894e0e0c381b4485fd25b3df873df321e.tar.gz servo-b84bd4c894e0e0c381b4485fd25b3df873df321e.zip |
auto merge of #1862 : Manishearth/servo/comparedoc-1794, r=Ms2ger
Diffstat (limited to 'src')
-rw-r--r-- | src/components/script/dom/bindings/codegen/Bindings.conf | 1 | ||||
-rw-r--r-- | src/components/script/dom/node.rs | 47 | ||||
-rw-r--r-- | src/test/html/content/test_node_compareDocumentPosition.html | 36 |
3 files changed, 81 insertions, 3 deletions
diff --git a/src/components/script/dom/bindings/codegen/Bindings.conf b/src/components/script/dom/bindings/codegen/Bindings.conf index 369d08bfdf0..a002e893823 100644 --- a/src/components/script/dom/bindings/codegen/Bindings.conf +++ b/src/components/script/dom/bindings/codegen/Bindings.conf @@ -82,6 +82,7 @@ DOMInterfaces = { 'needsAbstract': [ 'appendChild', 'childNodes', + 'compareDocumentPosition', 'contains', 'insertBefore', 'isEqualNode', diff --git a/src/components/script/dom/node.rs b/src/components/script/dom/node.rs index 9999503a758..71e8eebfd81 100644 --- a/src/components/script/dom/node.rs +++ b/src/components/script/dom/node.rs @@ -31,6 +31,7 @@ use std::cast; use std::cell::{RefCell, Ref, RefMut}; use std::iter::{Map, Filter}; use std::libc::uintptr_t; +use std::ptr; use std::unstable::raw::Box; use std::util; @@ -1507,9 +1508,49 @@ impl Node { } // http://dom.spec.whatwg.org/#dom-node-comparedocumentposition - pub fn CompareDocumentPosition(&self, _other: &JS<Node>) -> u16 { - // FIXME (#1794) implement. - 0 + + pub fn CompareDocumentPosition(&self, abstract_self: &JS<Node>, other: &JS<Node>) -> u16 { + static DOCUMENT_POSITION_DISCONNECTED: u16 = 0x01u16; + static DOCUMENT_POSITION_PRECEDING: u16 = 0x02u16; + static DOCUMENT_POSITION_FOLLOWING: u16 = 0x04u16; + static DOCUMENT_POSITION_CONTAINS: u16 = 0x08u16; + static DOCUMENT_POSITION_CONTAINED_BY: u16 = 0x10u16; + static DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC: u16 = 0x20u16; + if abstract_self == other { + 0 + } else { + let mut lastself = abstract_self.clone(); + let mut lastother = other.clone(); + for ancestor in abstract_self.ancestors() { + if &ancestor == other { + return DOCUMENT_POSITION_CONTAINS + DOCUMENT_POSITION_PRECEDING; + } + lastself = ancestor; + } + for ancestor in other.ancestors() { + if &ancestor == abstract_self { + return DOCUMENT_POSITION_CONTAINED_BY + DOCUMENT_POSITION_FOLLOWING; + } + lastother = ancestor; + } + if lastself != lastother { + let random = if ptr::to_unsafe_ptr(abstract_self.get()) < ptr::to_unsafe_ptr(other.get()) { + DOCUMENT_POSITION_FOLLOWING + } else { + DOCUMENT_POSITION_PRECEDING + }; + return random + DOCUMENT_POSITION_DISCONNECTED + DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC; + } + for child in lastself.traverse_preorder() { + if &child == other { + return DOCUMENT_POSITION_PRECEDING; + } + if &child == abstract_self { + return DOCUMENT_POSITION_FOLLOWING; + } + } + unreachable!() + } } // http://dom.spec.whatwg.org/#dom-node-contains diff --git a/src/test/html/content/test_node_compareDocumentPosition.html b/src/test/html/content/test_node_compareDocumentPosition.html new file mode 100644 index 00000000000..ed03add639a --- /dev/null +++ b/src/test/html/content/test_node_compareDocumentPosition.html @@ -0,0 +1,36 @@ +<!DOCTYPE html> +<html> + <head> + <script src="harness.js"></script> + <script> + { + var elem = document.createElement("div"); + var other = document.createElement("div"); + is(elem.compareDocumentPosition(elem),0); + + var nonTree = elem.compareDocumentPosition(other); + var prefix = Node.DOCUMENT_POSITION_DISCONNECTED + Node.DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC; + is(nonTree == prefix + Node.DOCUMENT_POSITION_FOLLOWING || nonTree == prefix + Node.DOCUMENT_POSITION_PRECEDING, + true); + + elem.appendChild(other); + is(elem.compareDocumentPosition(other), Node.DOCUMENT_POSITION_CONTAINED_BY + Node.DOCUMENT_POSITION_FOLLOWING); + is(other.compareDocumentPosition(elem), Node.DOCUMENT_POSITION_CONTAINS + Node.DOCUMENT_POSITION_PRECEDING); + + var another = document.createElement("div"); + other.appendChild(another); + is(elem.compareDocumentPosition(another), Node.DOCUMENT_POSITION_CONTAINED_BY + Node.DOCUMENT_POSITION_FOLLOWING); + is(another.compareDocumentPosition(elem), Node.DOCUMENT_POSITION_CONTAINS + Node.DOCUMENT_POSITION_PRECEDING); + + var follower = document.createElement("div"); + elem.appendChild(follower); + var preceder = document.createElement("div"); + another.appendChild(preceder); + is(another.compareDocumentPosition(follower), Node.DOCUMENT_POSITION_FOLLOWING); + is(follower.compareDocumentPosition(another), Node.DOCUMENT_POSITION_PRECEDING); + is(follower.compareDocumentPosition(preceder), Node.DOCUMENT_POSITION_PRECEDING); + finish(); + } + </script> + </head> +</html> |