diff options
author | J. Ryan Stinnett <jryans@gmail.com> | 2017-05-15 10:14:49 -0500 |
---|---|---|
committer | J. Ryan Stinnett <jryans@gmail.com> | 2017-05-24 18:07:24 -0500 |
commit | e3a256803d4e5b8dbd8a65252ea45c05784aeef9 (patch) | |
tree | e96184631c75a02eb6e62df5d2851b75495053b8 /components/script/layout_wrapper.rs | |
parent | 8ae546f7ea158466441987d4a86c5c440f0a5e00 (diff) | |
download | servo-e3a256803d4e5b8dbd8a65252ea45c05784aeef9.tar.gz servo-e3a256803d4e5b8dbd8a65252ea45c05784aeef9.zip |
Look for relevant links while matching
Adjust the matching process to look for a "relevant link" while matching. A
"relevant link" is the element being matched if it is a link or the nearest
ancestor link.
Matching for links now depends on the `VisitedHandlingMode`, which determines
whether all links match as if they are unvisited (the default) or if the
relevant link matches as visited (and all others remain unvisited).
If a relevant link is ever found for any selector, track this as part of the
`MatchingContext` object. This is used in the next patch to determine if an
additional match and cascade should be performed to compute the styles when
visited.
MozReview-Commit-ID: 3xUbRo7vpuD
Diffstat (limited to 'components/script/layout_wrapper.rs')
-rw-r--r-- | components/script/layout_wrapper.rs | 34 |
1 files changed, 23 insertions, 11 deletions
diff --git a/components/script/layout_wrapper.rs b/components/script/layout_wrapper.rs index 5241d01785d..eab6f2fd9c9 100644 --- a/components/script/layout_wrapper.rs +++ b/components/script/layout_wrapper.rs @@ -51,7 +51,7 @@ use script_layout_interface::{OpaqueStyleAndLayoutData, PartialPersistentLayoutD use script_layout_interface::wrapper_traits::{DangerousThreadSafeLayoutNode, GetLayoutData, LayoutNode}; use script_layout_interface::wrapper_traits::{PseudoElementType, ThreadSafeLayoutElement, ThreadSafeLayoutNode}; use selectors::attr::{AttrSelectorOperation, NamespaceConstraint}; -use selectors::matching::{ElementSelectorFlags, MatchingContext}; +use selectors::matching::{ElementSelectorFlags, MatchingContext, RelevantLinkStatus}; use servo_atoms::Atom; use servo_url::ServoUrl; use std::fmt; @@ -680,6 +680,7 @@ impl<'le> ::selectors::Element for ServoLayoutElement<'le> { fn match_non_ts_pseudo_class<F>(&self, pseudo_class: &NonTSPseudoClass, _: &mut MatchingContext, + _: &RelevantLinkStatus, _: &mut F) -> bool where F: FnMut(&Self, ElementSelectorFlags), @@ -687,16 +688,7 @@ impl<'le> ::selectors::Element for ServoLayoutElement<'le> { match *pseudo_class { // https://github.com/servo/servo/issues/8718 NonTSPseudoClass::Link | - NonTSPseudoClass::AnyLink => unsafe { - match self.as_node().script_type_id() { - // https://html.spec.whatwg.org/multipage/#selector-link - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLAnchorElement)) | - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLAreaElement)) | - NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLLinkElement)) => - (*self.element.unsafe_get()).get_attr_val_for_layout(&ns!(), &local_name!("href")).is_some(), - _ => false, - } - }, + NonTSPseudoClass::AnyLink => self.is_link(), NonTSPseudoClass::Visited => false, // FIXME(#15746): This is wrong, we need to instead use extended filtering as per RFC4647 @@ -732,6 +724,20 @@ impl<'le> ::selectors::Element for ServoLayoutElement<'le> { } #[inline] + fn is_link(&self) -> bool { + unsafe { + match self.as_node().script_type_id() { + // https://html.spec.whatwg.org/multipage/#selector-link + NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLAnchorElement)) | + NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLAreaElement)) | + NodeTypeId::Element(ElementTypeId::HTMLElement(HTMLElementTypeId::HTMLLinkElement)) => + (*self.element.unsafe_get()).get_attr_val_for_layout(&ns!(), &local_name!("href")).is_some(), + _ => false, + } + } + } + + #[inline] fn get_id(&self) -> Option<Atom> { unsafe { (*self.element.id_attribute()).clone() @@ -1187,6 +1193,7 @@ impl<'le> ::selectors::Element for ServoThreadSafeLayoutElement<'le> { fn match_non_ts_pseudo_class<F>(&self, _: &NonTSPseudoClass, _: &mut MatchingContext, + _: &RelevantLinkStatus, _: &mut F) -> bool where F: FnMut(&Self, ElementSelectorFlags), @@ -1196,6 +1203,11 @@ impl<'le> ::selectors::Element for ServoThreadSafeLayoutElement<'le> { false } + fn is_link(&self) -> bool { + warn!("ServoThreadSafeLayoutElement::is_link called"); + false + } + fn get_id(&self) -> Option<Atom> { debug!("ServoThreadSafeLayoutElement::get_id called"); None |