diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2016-03-31 00:47:07 +0530 |
---|---|---|
committer | bors-servo <lbergstrom+bors@mozilla.com> | 2016-03-31 00:47:07 +0530 |
commit | 723989b9dddeb9bcdc28dc7d640fd6fd7247a27f (patch) | |
tree | 1cc0d0875809577e8d2dafab2a3623b043022523 /components/layout/wrapper.rs | |
parent | e1485718128bff632eff5445583e925ff796bdba (diff) | |
parent | 46829bd53ced5d7d5a4b4c6600f2061cc8720536 (diff) | |
download | servo-723989b9dddeb9bcdc28dc7d640fd6fd7247a27f.tar.gz servo-723989b9dddeb9bcdc28dc7d640fd6fd7247a27f.zip |
Auto merge of #10252 - emilio:selection, r=mbrubeck
Implement ::selection pseudo-element
It only supports `color` and `background`, for now, but it shouldn't be hard to add more properties (like text-shadow).
r? @mbrubeck
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="35" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/10252)
<!-- Reviewable:end -->
Diffstat (limited to 'components/layout/wrapper.rs')
-rw-r--r-- | components/layout/wrapper.rs | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/components/layout/wrapper.rs b/components/layout/wrapper.rs index 387e5238d07..a0f7c54de93 100644 --- a/components/layout/wrapper.rs +++ b/components/layout/wrapper.rs @@ -702,11 +702,14 @@ pub trait ThreadSafeLayoutNode : Clone + Copy + Sized + PartialEq { }) } + // TODO(emilio): Since the ::-details-* pseudos are internal, just affecting one element, and + // only changing `display` property when the element `open` attribute changes, this should be + // eligible for not being cascaded eagerly, reading the display property from layout instead. #[inline] fn get_details_summary_pseudo(&self) -> Option<Self> { if self.is_element() && - self.as_element().get_local_name() == &atom!("details") && - self.as_element().get_namespace() == &ns!(html) { + self.as_element().get_local_name() == &atom!("details") && + self.as_element().get_namespace() == &ns!(html) { self.borrow_layout_data().unwrap() .style_data.per_pseudo .get(&PseudoElement::DetailsSummary) @@ -721,8 +724,8 @@ pub trait ThreadSafeLayoutNode : Clone + Copy + Sized + PartialEq { #[inline] fn get_details_content_pseudo(&self) -> Option<Self> { if self.is_element() && - self.as_element().get_local_name() == &atom!("details") && - self.as_element().get_namespace() == &ns!(html) { + self.as_element().get_local_name() == &atom!("details") && + self.as_element().get_namespace() == &ns!(html) { self.borrow_layout_data().unwrap() .style_data.per_pseudo .get(&PseudoElement::DetailsContent) @@ -764,6 +767,13 @@ pub trait ThreadSafeLayoutNode : Clone + Copy + Sized + PartialEq { }) } + #[inline] + fn selected_style(&self) -> Ref<Arc<ServoComputedValues>> { + Ref::map(self.borrow_layout_data().unwrap(), |data| { + data.style_data.per_pseudo.get(&PseudoElement::Selection).unwrap_or(data.style_data.style.as_ref().unwrap()) + }) + } + /// Removes the style from this node. /// /// Unlike the version on TNode, this handles pseudo-elements. @@ -1015,7 +1025,7 @@ impl<'ln> ThreadSafeLayoutNode for ServoThreadSafeLayoutNode<'ln> { } fn text_content(&self) -> TextContent { - if self.pseudo != PseudoElementType::Normal { + if self.pseudo.is_before_or_after() { let data = &self.borrow_layout_data().unwrap().style_data; let style = if self.pseudo.is_before() { @@ -1136,7 +1146,6 @@ impl<ConcreteNode> Iterator for ThreadSafeLayoutNodeChildrenIterator<ConcreteNod type Item = ConcreteNode; fn next(&mut self) -> Option<ConcreteNode> { match self.parent_node.get_pseudo_element_type() { - PseudoElementType::Before(_) | PseudoElementType::After(_) => None, PseudoElementType::DetailsSummary(_) => { @@ -1162,8 +1171,8 @@ impl<ConcreteNode> Iterator for ThreadSafeLayoutNodeChildrenIterator<ConcreteNod let node = self.current_node.clone(); let node = node.and_then(|node| { if node.is_element() && - node.as_element().get_local_name() == &atom!("summary") && - node.as_element().get_namespace() == &ns!(html) { + node.as_element().get_local_name() == &atom!("summary") && + node.as_element().get_namespace() == &ns!(html) { unsafe { node.dangerous_next_sibling() } } else { Some(node) |