diff --git a/components/layout/wrapper.rs b/components/layout/wrapper.rs index a223c154ba5..6b93514ad6e 100644 --- a/components/layout/wrapper.rs +++ b/components/layout/wrapper.rs @@ -211,7 +211,9 @@ impl<'ln> LayoutNode<'ln> { } } -impl<'ln> ::selectors::Node> for LayoutNode<'ln> { +impl<'ln> ::selectors::Node for LayoutNode<'ln> { + type Element = LayoutElement<'ln>; + fn parent_node(&self) -> Option> { unsafe { self.node.parent_node_ref().map(|node| self.new_with_this_lifetime(&node)) @@ -244,7 +246,7 @@ impl<'ln> ::selectors::Node> for LayoutNode<'ln> { /// If this is an element, accesses the element data. #[inline] - fn as_element(&self) -> Option> { + fn as_element(&self) -> Option { ElementCast::to_layout_js(&self.node).map(|element| { LayoutElement { element: element, @@ -259,6 +261,16 @@ impl<'ln> ::selectors::Node> for LayoutNode<'ln> { _ => false } } + + fn is_element_or_non_empty_text(&self) -> bool { + if let Some(text) = TextCast::to_layout_js(&self.node) { + unsafe { + !CharacterDataCast::from_layout_js(&text).data_for_layout().is_empty() + } + } else { + ElementCast::to_layout_js(&self.node).is_some() + } + } } impl<'ln> LayoutNode<'ln> { diff --git a/components/script/dom/node.rs b/components/script/dom/node.rs index d7432c570b0..3c0eb8e337e 100644 --- a/components/script/dom/node.rs +++ b/components/script/dom/node.rs @@ -2579,7 +2579,9 @@ impl<'a> VirtualMethods for &'a Node { } } -impl<'a> ::selectors::Node<&'a Element> for &'a Node { +impl<'a> ::selectors::Node for &'a Node { + type Element = &'a Element; + fn parent_node(&self) -> Option<&'a Node> { (*self).parent_node.get() .map(|node| node.root().get_unsound_ref_forever()) @@ -2609,9 +2611,17 @@ impl<'a> ::selectors::Node<&'a Element> for &'a Node { DocumentDerived::is_document(*self) } - fn as_element(&self) -> Option<&'a Element> { + fn as_element(&self) -> Option { ElementCast::to_ref(*self) } + + fn is_element_or_non_empty_text(&self) -> bool { + if self.is_text() { + self.GetTextContent().map_or(false, |s| !s.is_empty()) + } else { + self.is_element() + } + } } pub trait DisabledStateHelpers { diff --git a/components/servo/Cargo.lock b/components/servo/Cargo.lock index 568a41f5e7f..3fddb2443bd 100644 --- a/components/servo/Cargo.lock +++ b/components/servo/Cargo.lock @@ -1192,7 +1192,7 @@ dependencies = [ [[package]] name = "selectors" version = "0.1.0" -source = "git+https://github.com/servo/rust-selectors#a16e32540845548d46857f2896248c382ef34393" +source = "git+https://github.com/servo/rust-selectors#a6cf1fba8f31960254aa62434ab8aeee13aff080" dependencies = [ "bitflags 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "cssparser 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/ports/cef/Cargo.lock b/ports/cef/Cargo.lock index 5ef0cf62916..833e993e929 100644 --- a/ports/cef/Cargo.lock +++ b/ports/cef/Cargo.lock @@ -1164,7 +1164,7 @@ dependencies = [ [[package]] name = "selectors" version = "0.1.0" -source = "git+https://github.com/servo/rust-selectors#a16e32540845548d46857f2896248c382ef34393" +source = "git+https://github.com/servo/rust-selectors#a6cf1fba8f31960254aa62434ab8aeee13aff080" dependencies = [ "bitflags 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "cssparser 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/ports/gonk/Cargo.lock b/ports/gonk/Cargo.lock index c55071856d4..51c68710c3e 100644 --- a/ports/gonk/Cargo.lock +++ b/ports/gonk/Cargo.lock @@ -1072,7 +1072,7 @@ dependencies = [ [[package]] name = "selectors" version = "0.1.0" -source = "git+https://github.com/servo/rust-selectors#a16e32540845548d46857f2896248c382ef34393" +source = "git+https://github.com/servo/rust-selectors#a6cf1fba8f31960254aa62434ab8aeee13aff080" dependencies = [ "bitflags 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "cssparser 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/tests/wpt/metadata/dom/nodes/Element-closest.html.ini b/tests/wpt/metadata/dom/nodes/Element-closest.html.ini index acb0ee0c989..7947188eb27 100644 --- a/tests/wpt/metadata/dom/nodes/Element-closest.html.ini +++ b/tests/wpt/metadata/dom/nodes/Element-closest.html.ini @@ -1,8 +1,5 @@ [Element-closest.html] type: testharness - [Element.closest with context node 'test10' and selector ':empty'] - expected: FAIL - [Element.closest with context node 'test11' and selector ':invalid'] expected: FAIL diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index 02ec1797a79..5410b15ebeb 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -63,6 +63,18 @@ "url": "/_mozilla/css/absolute_hypothetical_float.html" } ], + "css/empty_pseudo_selector.html": [ + { + "path": "css/empty_pseudo_selector.html", + "references": [ + [ + "/_mozilla/css/empty_pseudo_selector_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/empty_pseudo_selector.html" + } + ], "css/class-namespaces.html": [ { "path": "css/class-namespaces.html", @@ -455,6 +467,12 @@ "url": "/_mozilla/mozilla/element_matches.html" } ], + "mozilla/element_matches_empty.html": [ + { + "path": "mozilla/element_matches_empty.html", + "url": "/_mozilla/mozilla/element_matches_empty.html" + } + ], "mozilla/empty_clientrect.html": [ { "path": "mozilla/empty_clientrect.html", diff --git a/tests/wpt/mozilla/tests/css/empty_pseudo_selector.html b/tests/wpt/mozilla/tests/css/empty_pseudo_selector.html new file mode 100644 index 00000000000..a477b8a5ac1 --- /dev/null +++ b/tests/wpt/mozilla/tests/css/empty_pseudo_selector.html @@ -0,0 +1,17 @@ + + +
+
+
+
+
foo
diff --git a/tests/wpt/mozilla/tests/css/empty_pseudo_selector_ref.html b/tests/wpt/mozilla/tests/css/empty_pseudo_selector_ref.html new file mode 100644 index 00000000000..4c420045dcd --- /dev/null +++ b/tests/wpt/mozilla/tests/css/empty_pseudo_selector_ref.html @@ -0,0 +1,20 @@ + + +
+
+
+
+
foo
diff --git a/tests/wpt/mozilla/tests/mozilla/element_matches_empty.html b/tests/wpt/mozilla/tests/mozilla/element_matches_empty.html new file mode 100644 index 00000000000..2f90014344b --- /dev/null +++ b/tests/wpt/mozilla/tests/mozilla/element_matches_empty.html @@ -0,0 +1,26 @@ + + + + + + + +
+
+
+
+
foo
+ + + +