Skip to content

Commit

Permalink
style: Invalidate style for ::selection.
Browse files Browse the repository at this point in the history
This patch invalidates the style for `::selection`, which will restore the
behavior before the regression.

However, it's still not quite correct, because repaint is not triggered. Given
that `::selection` requires some major change to implement
w3c/csswg-drafts#2474, we can address this problem
later.

Differential Revision: https://phabricator.services.mozilla.com/D35305
  • Loading branch information
violette77 authored and emilio committed Jun 25, 2019
1 parent 815d189 commit 6eedebe
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 0 deletions.
6 changes: 6 additions & 0 deletions components/style/gecko/pseudo_element.rs
Expand Up @@ -116,6 +116,12 @@ impl PseudoElement {
*self == PseudoElement::Marker
}

/// Whether this pseudo-element is the ::selection pseudo.
#[inline]
pub fn is_selection(&self) -> bool {
*self == PseudoElement::Selection
}

/// Whether this pseudo-element is ::first-letter.
#[inline]
pub fn is_first_letter(&self) -> bool {
Expand Down
13 changes: 13 additions & 0 deletions components/style/invalidation/element/invalidator.rs
Expand Up @@ -805,6 +805,19 @@ where
if pseudo.is_marker() && self.element.marker_pseudo_element().is_none() {
invalidated_self = true;
}

// FIXME: ::selection doesn't generate elements, so the
// regular invalidation doesn't work for it. We store
// the cached selection style holding off the originating
// element, so we need to restyle it in order to invalidate
// it. This is still not quite correct, since nothing
// triggers a repaint necessarily, but matches old Gecko
// behavior, and the ::selection implementation needs to
// change significantly anyway to implement
// https://github.com/w3c/csswg-drafts/issues/2474.
if pseudo.is_selection() {
invalidated_self = true;
}
}
}

Expand Down
6 changes: 6 additions & 0 deletions components/style/servo/selector_parser.rs
Expand Up @@ -143,6 +143,12 @@ impl PseudoElement {
false
}

/// Whether this pseudo-element is the ::selection pseudo.
#[inline]
pub fn is_selection(&self) -> bool {
*self == PseudoElement::Selection
}

/// Whether this pseudo-element is the ::before pseudo.
#[inline]
pub fn is_before(&self) -> bool {
Expand Down

0 comments on commit 6eedebe

Please sign in to comment.