mirror of
https://github.com/servo/servo.git
synced 2025-08-05 21:50:18 +01:00
style: Factor out whether a stylesheet matches all the existing medium-affected-values in CascadeData.
MozReview-Commit-ID: IE6RFiBXZ8s Signed-off-by: Emilio Cobos Álvarez <emilio@crisal.io>
This commit is contained in:
parent
49f753523a
commit
985c6193eb
1 changed files with 97 additions and 84 deletions
|
@ -963,107 +963,33 @@ impl Stylist {
|
||||||
&self,
|
&self,
|
||||||
guards: &StylesheetGuards,
|
guards: &StylesheetGuards,
|
||||||
) -> OriginSet {
|
) -> OriginSet {
|
||||||
use invalidation::media_queries::PotentiallyEffectiveMediaRules;
|
|
||||||
|
|
||||||
debug!("Stylist::media_features_change_changed_style");
|
debug!("Stylist::media_features_change_changed_style");
|
||||||
|
|
||||||
let mut origins = OriginSet::empty();
|
let mut origins = OriginSet::empty();
|
||||||
let stylesheets = self.stylesheets.iter();
|
let stylesheets = self.stylesheets.iter();
|
||||||
|
|
||||||
'stylesheets_loop: for (stylesheet, origin) in stylesheets {
|
for (stylesheet, origin) in stylesheets {
|
||||||
let guard = guards.for_origin(origin);
|
|
||||||
let effective_now =
|
|
||||||
stylesheet.is_effective_for_device(&self.device, guard);
|
|
||||||
|
|
||||||
if origins.contains(origin.into()) {
|
if origins.contains(origin.into()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let guard = guards.for_origin(origin);
|
||||||
let origin_cascade_data =
|
let origin_cascade_data =
|
||||||
self.cascade_data.per_origin.borrow_for_origin(&origin);
|
self.cascade_data.per_origin.borrow_for_origin(&origin);
|
||||||
|
|
||||||
let effective_then =
|
let affected_changed = !origin_cascade_data.media_feature_affected_matches(
|
||||||
origin_cascade_data
|
stylesheet,
|
||||||
.effective_media_query_results
|
guard,
|
||||||
.was_effective(stylesheet);
|
&self.device,
|
||||||
|
self.quirks_mode
|
||||||
|
);
|
||||||
|
|
||||||
if effective_now != effective_then {
|
if affected_changed {
|
||||||
debug!(" > Stylesheet changed -> {}, {}",
|
|
||||||
effective_then, effective_now);
|
|
||||||
origins |= origin;
|
origins |= origin;
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if !effective_now {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut iter =
|
|
||||||
stylesheet.iter_rules::<PotentiallyEffectiveMediaRules>(
|
|
||||||
&self.device,
|
|
||||||
guard
|
|
||||||
);
|
|
||||||
|
|
||||||
while let Some(rule) = iter.next() {
|
|
||||||
match *rule {
|
|
||||||
CssRule::Style(..) |
|
|
||||||
CssRule::Namespace(..) |
|
|
||||||
CssRule::FontFace(..) |
|
|
||||||
CssRule::CounterStyle(..) |
|
|
||||||
CssRule::Supports(..) |
|
|
||||||
CssRule::Keyframes(..) |
|
|
||||||
CssRule::Page(..) |
|
|
||||||
CssRule::Viewport(..) |
|
|
||||||
CssRule::Document(..) |
|
|
||||||
CssRule::FontFeatureValues(..) => {
|
|
||||||
// Not affected by device changes.
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
CssRule::Import(ref lock) => {
|
|
||||||
let import_rule = lock.read_with(guard);
|
|
||||||
let effective_now =
|
|
||||||
import_rule.stylesheet
|
|
||||||
.is_effective_for_device(&self.device, guard);
|
|
||||||
let effective_then =
|
|
||||||
origin_cascade_data
|
|
||||||
.effective_media_query_results
|
|
||||||
.was_effective(import_rule);
|
|
||||||
if effective_now != effective_then {
|
|
||||||
debug!(" > @import rule changed {} -> {}",
|
|
||||||
effective_then, effective_now);
|
|
||||||
origins |= origin;
|
|
||||||
continue 'stylesheets_loop;
|
|
||||||
}
|
|
||||||
|
|
||||||
if !effective_now {
|
|
||||||
iter.skip_children();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
CssRule::Media(ref lock) => {
|
|
||||||
let media_rule = lock.read_with(guard);
|
|
||||||
let mq = media_rule.media_queries.read_with(guard);
|
|
||||||
let effective_now =
|
|
||||||
mq.evaluate(&self.device, self.quirks_mode);
|
|
||||||
let effective_then =
|
|
||||||
origin_cascade_data
|
|
||||||
.effective_media_query_results
|
|
||||||
.was_effective(media_rule);
|
|
||||||
if effective_now != effective_then {
|
|
||||||
debug!(" > @media rule changed {} -> {}",
|
|
||||||
effective_then, effective_now);
|
|
||||||
origins |= origin;
|
|
||||||
continue 'stylesheets_loop;
|
|
||||||
}
|
|
||||||
|
|
||||||
if !effective_now {
|
|
||||||
iter.skip_children();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return origins
|
origins
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the viewport constraints that apply to this document because of
|
/// Returns the viewport constraints that apply to this document because of
|
||||||
|
@ -1943,6 +1869,93 @@ impl CascadeData {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns whether all the media-feature affected values matched before and
|
||||||
|
/// match now in the given stylesheet.
|
||||||
|
fn media_feature_affected_matches<S>(
|
||||||
|
&self,
|
||||||
|
stylesheet: &S,
|
||||||
|
guard: &SharedRwLockReadGuard,
|
||||||
|
device: &Device,
|
||||||
|
quirks_mode: QuirksMode,
|
||||||
|
) -> bool
|
||||||
|
where
|
||||||
|
S: StylesheetInDocument + ToMediaListKey + 'static,
|
||||||
|
{
|
||||||
|
use invalidation::media_queries::PotentiallyEffectiveMediaRules;
|
||||||
|
|
||||||
|
let effective_now =
|
||||||
|
stylesheet.is_effective_for_device(device, guard);
|
||||||
|
|
||||||
|
let effective_then =
|
||||||
|
self.effective_media_query_results.was_effective(stylesheet);
|
||||||
|
|
||||||
|
if effective_now != effective_then {
|
||||||
|
debug!(" > Stylesheet changed -> {}, {}",
|
||||||
|
effective_then, effective_now);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if !effective_now {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut iter =
|
||||||
|
stylesheet.iter_rules::<PotentiallyEffectiveMediaRules>(device, guard);
|
||||||
|
|
||||||
|
while let Some(rule) = iter.next() {
|
||||||
|
match *rule {
|
||||||
|
CssRule::Style(..) |
|
||||||
|
CssRule::Namespace(..) |
|
||||||
|
CssRule::FontFace(..) |
|
||||||
|
CssRule::CounterStyle(..) |
|
||||||
|
CssRule::Supports(..) |
|
||||||
|
CssRule::Keyframes(..) |
|
||||||
|
CssRule::Page(..) |
|
||||||
|
CssRule::Viewport(..) |
|
||||||
|
CssRule::Document(..) |
|
||||||
|
CssRule::FontFeatureValues(..) => {
|
||||||
|
// Not affected by device changes.
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
CssRule::Import(ref lock) => {
|
||||||
|
let import_rule = lock.read_with(guard);
|
||||||
|
let effective_now =
|
||||||
|
import_rule.stylesheet
|
||||||
|
.is_effective_for_device(&device, guard);
|
||||||
|
let effective_then =
|
||||||
|
self.effective_media_query_results.was_effective(import_rule);
|
||||||
|
if effective_now != effective_then {
|
||||||
|
debug!(" > @import rule changed {} -> {}",
|
||||||
|
effective_then, effective_now);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if !effective_now {
|
||||||
|
iter.skip_children();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
CssRule::Media(ref lock) => {
|
||||||
|
let media_rule = lock.read_with(guard);
|
||||||
|
let mq = media_rule.media_queries.read_with(guard);
|
||||||
|
let effective_now = mq.evaluate(device, quirks_mode);
|
||||||
|
let effective_then =
|
||||||
|
self.effective_media_query_results.was_effective(media_rule);
|
||||||
|
|
||||||
|
if effective_now != effective_then {
|
||||||
|
debug!(" > @media rule changed {} -> {}",
|
||||||
|
effective_then, effective_now);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if !effective_now {
|
||||||
|
iter.skip_children();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
fn borrow_for_pseudo(&self, pseudo: Option<&PseudoElement>) -> Option<&SelectorMap<Rule>> {
|
fn borrow_for_pseudo(&self, pseudo: Option<&PseudoElement>) -> Option<&SelectorMap<Rule>> {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue