mirror of
https://github.com/servo/servo.git
synced 2025-08-06 22:15:33 +01:00
Bug 1350140: stylo: Implement all the remaining state pseudo-classes. r=heycam
Also implements :link, :visited, and :any-link more efficiently, and stops matching :-moz-read-only in everything that is not read-write, which is kind of dumb, and probably creates some artifacts. MozReview-Commit-ID: 6BQqi7nAWdT Signed-off-by: Emilio Cobos Álvarez <emilio@crisal.io>
This commit is contained in:
parent
299f9446e6
commit
a6277d5513
5 changed files with 188 additions and 82 deletions
|
@ -27,8 +27,7 @@ use gecko::snapshot_helpers;
|
|||
use gecko_bindings::bindings;
|
||||
use gecko_bindings::bindings::{Gecko_DropStyleChildrenIterator, Gecko_MaybeCreateStyleChildrenIterator};
|
||||
use gecko_bindings::bindings::{Gecko_ElementState, Gecko_GetLastChild, Gecko_GetNextStyleChild};
|
||||
use gecko_bindings::bindings::{Gecko_IsLink, Gecko_IsRootElement, Gecko_MatchesElement};
|
||||
use gecko_bindings::bindings::{Gecko_IsUnvisitedLink, Gecko_IsVisitedLink, Gecko_Namespace};
|
||||
use gecko_bindings::bindings::{Gecko_IsRootElement, Gecko_MatchesElement, Gecko_Namespace};
|
||||
use gecko_bindings::bindings::{Gecko_SetNodeFlags, Gecko_UnsetNodeFlags};
|
||||
use gecko_bindings::bindings::Gecko_ClassOrClassList;
|
||||
use gecko_bindings::bindings::Gecko_ElementHasAnimations;
|
||||
|
@ -465,7 +464,7 @@ impl<'le> TElement for GeckoElement<'le> {
|
|||
|
||||
fn get_state(&self) -> ElementState {
|
||||
unsafe {
|
||||
ElementState::from_bits_truncate(Gecko_ElementState(self.0) as u32)
|
||||
ElementState::from_bits_truncate(Gecko_ElementState(self.0))
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -705,17 +704,15 @@ impl<'le> ::selectors::Element for GeckoElement<'le> {
|
|||
{
|
||||
use selectors::matching::*;
|
||||
match *pseudo_class {
|
||||
// https://github.com/servo/servo/issues/8718
|
||||
NonTSPseudoClass::AnyLink => unsafe { Gecko_IsLink(self.0) },
|
||||
NonTSPseudoClass::Link => unsafe { Gecko_IsUnvisitedLink(self.0) },
|
||||
NonTSPseudoClass::Visited => unsafe { Gecko_IsVisitedLink(self.0) },
|
||||
NonTSPseudoClass::AnyLink |
|
||||
NonTSPseudoClass::Link |
|
||||
NonTSPseudoClass::Visited |
|
||||
NonTSPseudoClass::Active |
|
||||
NonTSPseudoClass::Focus |
|
||||
NonTSPseudoClass::Hover |
|
||||
NonTSPseudoClass::Enabled |
|
||||
NonTSPseudoClass::Disabled |
|
||||
NonTSPseudoClass::Checked |
|
||||
NonTSPseudoClass::ReadWrite |
|
||||
NonTSPseudoClass::Fullscreen |
|
||||
NonTSPseudoClass::Indeterminate |
|
||||
NonTSPseudoClass::PlaceholderShown |
|
||||
|
@ -731,12 +728,31 @@ impl<'le> ::selectors::Element for GeckoElement<'le> {
|
|||
NonTSPseudoClass::MozHandlerDisabled |
|
||||
NonTSPseudoClass::MozHandlerCrashed |
|
||||
NonTSPseudoClass::Required |
|
||||
NonTSPseudoClass::Optional => {
|
||||
self.get_state().contains(pseudo_class.state_flag())
|
||||
NonTSPseudoClass::Optional |
|
||||
NonTSPseudoClass::MozReadOnly |
|
||||
NonTSPseudoClass::MozReadWrite |
|
||||
NonTSPseudoClass::Unresolved |
|
||||
NonTSPseudoClass::FocusWithin |
|
||||
NonTSPseudoClass::MozDragOver |
|
||||
NonTSPseudoClass::MozDevtoolsHighlighted |
|
||||
NonTSPseudoClass::MozStyleeditorTransitioning |
|
||||
NonTSPseudoClass::MozFocusRing |
|
||||
NonTSPseudoClass::MozHandlerClickToPlay |
|
||||
NonTSPseudoClass::MozHandlerVulnerableUpdatable |
|
||||
NonTSPseudoClass::MozHandlerVulnerableNoUpdate |
|
||||
NonTSPseudoClass::MozMathIncrementScriptLevel |
|
||||
NonTSPseudoClass::InRange |
|
||||
NonTSPseudoClass::OutOfRange |
|
||||
NonTSPseudoClass::Default |
|
||||
NonTSPseudoClass::MozSubmitInvalid |
|
||||
NonTSPseudoClass::MozUIInvalid |
|
||||
NonTSPseudoClass::MozMeterOptimum |
|
||||
NonTSPseudoClass::MozMeterSubOptimum |
|
||||
NonTSPseudoClass::MozMeterSubSubOptimum => {
|
||||
// NB: It's important to use `intersect` instead of `contains`
|
||||
// here, to handle `:any-link` correctly.
|
||||
self.get_state().intersects(pseudo_class.state_flag())
|
||||
},
|
||||
NonTSPseudoClass::ReadOnly => {
|
||||
!self.get_state().contains(pseudo_class.state_flag())
|
||||
}
|
||||
NonTSPseudoClass::MozFirstNode => {
|
||||
flags_setter(self, HAS_EDGE_CHILD_SELECTOR);
|
||||
let mut elem = self.as_node();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue