mirror of
https://github.com/servo/servo.git
synced 2025-08-05 21:50:18 +01:00
style: Update CSSOM for layer rules to the spec
Pretty mechanical. Tests are in https://wpt.live/css/css-cascade/layer-rules-cssom.html which (with a fix for @import tests which I'll submit separately) we pass. Sync for that is bug 1743936. Differential Revision: https://phabricator.services.mozilla.com/D133387
This commit is contained in:
parent
1ac55889bb
commit
dff8f78c42
9 changed files with 155 additions and 141 deletions
|
@ -12,9 +12,10 @@ use crate::gecko::url::CssUrlData;
|
||||||
use crate::gecko_bindings::structs::{
|
use crate::gecko_bindings::structs::{
|
||||||
RawServoAnimationValue, RawServoCounterStyleRule, RawServoCssUrlData, RawServoDeclarationBlock,
|
RawServoAnimationValue, RawServoCounterStyleRule, RawServoCssUrlData, RawServoDeclarationBlock,
|
||||||
RawServoFontFaceRule, RawServoFontFeatureValuesRule, RawServoImportRule, RawServoKeyframe,
|
RawServoFontFaceRule, RawServoFontFeatureValuesRule, RawServoImportRule, RawServoKeyframe,
|
||||||
RawServoKeyframesRule, RawServoLayerRule, RawServoMediaList, RawServoMediaRule,
|
RawServoKeyframesRule, RawServoLayerBlockRule, RawServoLayerStatementRule, RawServoMediaList,
|
||||||
RawServoMozDocumentRule, RawServoNamespaceRule, RawServoPageRule, RawServoScrollTimelineRule,
|
RawServoMediaRule, RawServoMozDocumentRule, RawServoNamespaceRule, RawServoPageRule,
|
||||||
RawServoStyleRule, RawServoStyleSheetContents, RawServoSupportsRule, ServoCssRules,
|
RawServoScrollTimelineRule, RawServoStyleRule, RawServoStyleSheetContents,
|
||||||
|
RawServoSupportsRule, ServoCssRules,
|
||||||
};
|
};
|
||||||
use crate::gecko_bindings::sugar::ownership::{HasArcFFI, HasFFI, Strong};
|
use crate::gecko_bindings::sugar::ownership::{HasArcFFI, HasFFI, Strong};
|
||||||
use crate::media_queries::MediaList;
|
use crate::media_queries::MediaList;
|
||||||
|
@ -24,8 +25,8 @@ use crate::shared_lock::Locked;
|
||||||
use crate::stylesheets::keyframes_rule::Keyframe;
|
use crate::stylesheets::keyframes_rule::Keyframe;
|
||||||
use crate::stylesheets::{
|
use crate::stylesheets::{
|
||||||
CounterStyleRule, CssRules, DocumentRule, FontFaceRule, FontFeatureValuesRule, ImportRule,
|
CounterStyleRule, CssRules, DocumentRule, FontFaceRule, FontFeatureValuesRule, ImportRule,
|
||||||
KeyframesRule, LayerRule, MediaRule, NamespaceRule, PageRule, ScrollTimelineRule, StyleRule,
|
KeyframesRule, LayerBlockRule, LayerStatementRule, MediaRule, NamespaceRule, PageRule,
|
||||||
StylesheetContents, SupportsRule,
|
ScrollTimelineRule, StyleRule, StylesheetContents, SupportsRule,
|
||||||
};
|
};
|
||||||
use servo_arc::{Arc, ArcBorrow};
|
use servo_arc::{Arc, ArcBorrow};
|
||||||
use std::{mem, ptr};
|
use std::{mem, ptr};
|
||||||
|
@ -73,8 +74,11 @@ impl_arc_ffi!(Locked<Keyframe> => RawServoKeyframe
|
||||||
impl_arc_ffi!(Locked<KeyframesRule> => RawServoKeyframesRule
|
impl_arc_ffi!(Locked<KeyframesRule> => RawServoKeyframesRule
|
||||||
[Servo_KeyframesRule_AddRef, Servo_KeyframesRule_Release]);
|
[Servo_KeyframesRule_AddRef, Servo_KeyframesRule_Release]);
|
||||||
|
|
||||||
impl_arc_ffi!(Locked<LayerRule> => RawServoLayerRule
|
impl_arc_ffi!(Locked<LayerBlockRule> => RawServoLayerBlockRule
|
||||||
[Servo_LayerRule_AddRef, Servo_LayerRule_Release]);
|
[Servo_LayerBlockRule_AddRef, Servo_LayerBlockRule_Release]);
|
||||||
|
|
||||||
|
impl_arc_ffi!(Locked<LayerStatementRule> => RawServoLayerStatementRule
|
||||||
|
[Servo_LayerStatementRule_AddRef, Servo_LayerStatementRule_Release]);
|
||||||
|
|
||||||
impl_arc_ffi!(Locked<MediaList> => RawServoMediaList
|
impl_arc_ffi!(Locked<MediaList> => RawServoMediaList
|
||||||
[Servo_MediaList_AddRef, Servo_MediaList_Release]);
|
[Servo_MediaList_AddRef, Servo_MediaList_Release]);
|
||||||
|
|
|
@ -1578,8 +1578,8 @@ impl<'le> TElement for GeckoElement<'le> {
|
||||||
use crate::properties::longhands::_x_text_zoom::SpecifiedValue as SpecifiedZoom;
|
use crate::properties::longhands::_x_text_zoom::SpecifiedValue as SpecifiedZoom;
|
||||||
use crate::properties::longhands::color::SpecifiedValue as SpecifiedColor;
|
use crate::properties::longhands::color::SpecifiedValue as SpecifiedColor;
|
||||||
use crate::properties::longhands::text_align::SpecifiedValue as SpecifiedTextAlign;
|
use crate::properties::longhands::text_align::SpecifiedValue as SpecifiedTextAlign;
|
||||||
use crate::values::specified::color::Color;
|
|
||||||
use crate::stylesheets::layer_rule::LayerOrder;
|
use crate::stylesheets::layer_rule::LayerOrder;
|
||||||
|
use crate::values::specified::color::Color;
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
static ref TH_RULE: ApplicableDeclarationBlock = {
|
static ref TH_RULE: ApplicableDeclarationBlock = {
|
||||||
let global_style_data = &*GLOBAL_STYLE_DATA;
|
let global_style_data = &*GLOBAL_STYLE_DATA;
|
||||||
|
@ -1588,7 +1588,11 @@ impl<'le> TElement for GeckoElement<'le> {
|
||||||
Importance::Normal,
|
Importance::Normal,
|
||||||
);
|
);
|
||||||
let arc = Arc::new_leaked(global_style_data.shared_lock.wrap(pdb));
|
let arc = Arc::new_leaked(global_style_data.shared_lock.wrap(pdb));
|
||||||
ApplicableDeclarationBlock::from_declarations(arc, ServoCascadeLevel::PresHints, LayerOrder::root())
|
ApplicableDeclarationBlock::from_declarations(
|
||||||
|
arc,
|
||||||
|
ServoCascadeLevel::PresHints,
|
||||||
|
LayerOrder::root(),
|
||||||
|
)
|
||||||
};
|
};
|
||||||
static ref TABLE_COLOR_RULE: ApplicableDeclarationBlock = {
|
static ref TABLE_COLOR_RULE: ApplicableDeclarationBlock = {
|
||||||
let global_style_data = &*GLOBAL_STYLE_DATA;
|
let global_style_data = &*GLOBAL_STYLE_DATA;
|
||||||
|
@ -1597,7 +1601,11 @@ impl<'le> TElement for GeckoElement<'le> {
|
||||||
Importance::Normal,
|
Importance::Normal,
|
||||||
);
|
);
|
||||||
let arc = Arc::new_leaked(global_style_data.shared_lock.wrap(pdb));
|
let arc = Arc::new_leaked(global_style_data.shared_lock.wrap(pdb));
|
||||||
ApplicableDeclarationBlock::from_declarations(arc, ServoCascadeLevel::PresHints, LayerOrder::root())
|
ApplicableDeclarationBlock::from_declarations(
|
||||||
|
arc,
|
||||||
|
ServoCascadeLevel::PresHints,
|
||||||
|
LayerOrder::root(),
|
||||||
|
)
|
||||||
};
|
};
|
||||||
static ref MATHML_LANG_RULE: ApplicableDeclarationBlock = {
|
static ref MATHML_LANG_RULE: ApplicableDeclarationBlock = {
|
||||||
let global_style_data = &*GLOBAL_STYLE_DATA;
|
let global_style_data = &*GLOBAL_STYLE_DATA;
|
||||||
|
@ -1606,7 +1614,11 @@ impl<'le> TElement for GeckoElement<'le> {
|
||||||
Importance::Normal,
|
Importance::Normal,
|
||||||
);
|
);
|
||||||
let arc = Arc::new_leaked(global_style_data.shared_lock.wrap(pdb));
|
let arc = Arc::new_leaked(global_style_data.shared_lock.wrap(pdb));
|
||||||
ApplicableDeclarationBlock::from_declarations(arc, ServoCascadeLevel::PresHints, LayerOrder::root())
|
ApplicableDeclarationBlock::from_declarations(
|
||||||
|
arc,
|
||||||
|
ServoCascadeLevel::PresHints,
|
||||||
|
LayerOrder::root(),
|
||||||
|
)
|
||||||
};
|
};
|
||||||
static ref SVG_TEXT_DISABLE_ZOOM_RULE: ApplicableDeclarationBlock = {
|
static ref SVG_TEXT_DISABLE_ZOOM_RULE: ApplicableDeclarationBlock = {
|
||||||
let global_style_data = &*GLOBAL_STYLE_DATA;
|
let global_style_data = &*GLOBAL_STYLE_DATA;
|
||||||
|
@ -1615,7 +1627,11 @@ impl<'le> TElement for GeckoElement<'le> {
|
||||||
Importance::Normal,
|
Importance::Normal,
|
||||||
);
|
);
|
||||||
let arc = Arc::new_leaked(global_style_data.shared_lock.wrap(pdb));
|
let arc = Arc::new_leaked(global_style_data.shared_lock.wrap(pdb));
|
||||||
ApplicableDeclarationBlock::from_declarations(arc, ServoCascadeLevel::PresHints, LayerOrder::root())
|
ApplicableDeclarationBlock::from_declarations(
|
||||||
|
arc,
|
||||||
|
ServoCascadeLevel::PresHints,
|
||||||
|
LayerOrder::root(),
|
||||||
|
)
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -541,6 +541,7 @@ impl StylesheetInvalidationSet {
|
||||||
Page(..) |
|
Page(..) |
|
||||||
Viewport(..) |
|
Viewport(..) |
|
||||||
FontFeatureValues(..) |
|
FontFeatureValues(..) |
|
||||||
|
LayerStatement(..) |
|
||||||
FontFace(..) |
|
FontFace(..) |
|
||||||
Keyframes(..) |
|
Keyframes(..) |
|
||||||
ScrollTimeline(..) |
|
ScrollTimeline(..) |
|
||||||
|
@ -556,7 +557,7 @@ impl StylesheetInvalidationSet {
|
||||||
|
|
||||||
self.collect_invalidations_for_rule(rule, guard, device, quirks_mode)
|
self.collect_invalidations_for_rule(rule, guard, device, quirks_mode)
|
||||||
},
|
},
|
||||||
Document(..) | Import(..) | Media(..) | Supports(..) | Layer(..) => {
|
Document(..) | Import(..) | Media(..) | Supports(..) | LayerBlock(..) => {
|
||||||
if !is_generic_change &&
|
if !is_generic_change &&
|
||||||
!EffectiveRules::is_effective(guard, device, quirks_mode, rule)
|
!EffectiveRules::is_effective(guard, device, quirks_mode, rule)
|
||||||
{
|
{
|
||||||
|
@ -597,7 +598,8 @@ impl StylesheetInvalidationSet {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
Document(..) | Namespace(..) | Import(..) | Media(..) | Supports(..) | Layer(..) => {
|
Document(..) | Namespace(..) | Import(..) | Media(..) | Supports(..) |
|
||||||
|
LayerStatement(..) | LayerBlock(..) => {
|
||||||
// Do nothing, relevant nested rules are visited as part of the
|
// Do nothing, relevant nested rules are visited as part of the
|
||||||
// iteration.
|
// iteration.
|
||||||
},
|
},
|
||||||
|
|
|
@ -159,71 +159,34 @@ impl ToCss for LayerName {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The kind of layer rule this is.
|
|
||||||
#[derive(Debug, ToShmem)]
|
#[derive(Debug, ToShmem)]
|
||||||
pub enum LayerRuleKind {
|
/// A block `@layer <name>? { ... }`
|
||||||
/// A block `@layer <name>? { ... }`
|
/// https://drafts.csswg.org/css-cascade-5/#layer-block
|
||||||
Block {
|
pub struct LayerBlockRule {
|
||||||
/// The layer name, or `None` if anonymous.
|
/// The layer name, or `None` if anonymous.
|
||||||
name: Option<LayerName>,
|
pub name: Option<LayerName>,
|
||||||
/// The nested rules.
|
/// The nested rules.
|
||||||
rules: Arc<Locked<CssRules>>,
|
pub rules: Arc<Locked<CssRules>>,
|
||||||
},
|
/// The source position where this rule was found.
|
||||||
/// A statement `@layer <name>, <name>, <name>;`
|
|
||||||
Statement {
|
|
||||||
/// The list of layers to sort.
|
|
||||||
names: Vec<LayerName>,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
/// A [`@layer`][layer] rule.
|
|
||||||
///
|
|
||||||
/// [layer]: https://drafts.csswg.org/css-cascade-5/#layering
|
|
||||||
#[derive(Debug, ToShmem)]
|
|
||||||
pub struct LayerRule {
|
|
||||||
/// The kind of layer rule we are.
|
|
||||||
pub kind: LayerRuleKind,
|
|
||||||
/// The source position where this media rule was found.
|
|
||||||
pub source_location: SourceLocation,
|
pub source_location: SourceLocation,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ToCssWithGuard for LayerRule {
|
impl ToCssWithGuard for LayerBlockRule {
|
||||||
fn to_css(
|
fn to_css(
|
||||||
&self,
|
&self,
|
||||||
guard: &SharedRwLockReadGuard,
|
guard: &SharedRwLockReadGuard,
|
||||||
dest: &mut crate::str::CssStringWriter,
|
dest: &mut crate::str::CssStringWriter,
|
||||||
) -> fmt::Result {
|
) -> fmt::Result {
|
||||||
dest.write_str("@layer")?;
|
dest.write_str("@layer")?;
|
||||||
match self.kind {
|
if let Some(ref name) = self.name {
|
||||||
LayerRuleKind::Block {
|
dest.write_char(' ')?;
|
||||||
ref name,
|
name.to_css(&mut CssWriter::new(dest))?;
|
||||||
ref rules,
|
|
||||||
} => {
|
|
||||||
if let Some(ref name) = *name {
|
|
||||||
dest.write_char(' ')?;
|
|
||||||
name.to_css(&mut CssWriter::new(dest))?;
|
|
||||||
}
|
|
||||||
rules.read_with(guard).to_css_block(guard, dest)
|
|
||||||
},
|
|
||||||
LayerRuleKind::Statement { ref names } => {
|
|
||||||
let mut writer = CssWriter::new(dest);
|
|
||||||
let mut first = true;
|
|
||||||
for name in &**names {
|
|
||||||
if first {
|
|
||||||
writer.write_char(' ')?;
|
|
||||||
} else {
|
|
||||||
writer.write_str(", ")?;
|
|
||||||
}
|
|
||||||
first = false;
|
|
||||||
name.to_css(&mut writer)?;
|
|
||||||
}
|
|
||||||
dest.write_char(';')
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
self.rules.read_with(guard).to_css_block(guard, dest)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl DeepCloneWithLock for LayerRule {
|
impl DeepCloneWithLock for LayerBlockRule {
|
||||||
fn deep_clone_with_lock(
|
fn deep_clone_with_lock(
|
||||||
&self,
|
&self,
|
||||||
lock: &SharedRwLock,
|
lock: &SharedRwLock,
|
||||||
|
@ -231,25 +194,57 @@ impl DeepCloneWithLock for LayerRule {
|
||||||
params: &DeepCloneParams,
|
params: &DeepCloneParams,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
Self {
|
Self {
|
||||||
kind: match self.kind {
|
name: self.name.clone(),
|
||||||
LayerRuleKind::Block {
|
rules: Arc::new(
|
||||||
ref name,
|
lock.wrap(
|
||||||
ref rules,
|
self.rules
|
||||||
} => LayerRuleKind::Block {
|
.read_with(guard)
|
||||||
name: name.clone(),
|
.deep_clone_with_lock(lock, guard, params),
|
||||||
rules: Arc::new(
|
),
|
||||||
lock.wrap(
|
),
|
||||||
rules
|
|
||||||
.read_with(guard)
|
|
||||||
.deep_clone_with_lock(lock, guard, params),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
},
|
|
||||||
LayerRuleKind::Statement { ref names } => LayerRuleKind::Statement {
|
|
||||||
names: names.clone(),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
source_location: self.source_location.clone(),
|
source_location: self.source_location.clone(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A statement `@layer <name>, <name>, <name>;`
|
||||||
|
///
|
||||||
|
/// https://drafts.csswg.org/css-cascade-5/#layer-empty
|
||||||
|
#[derive(Clone, Debug, ToShmem)]
|
||||||
|
pub struct LayerStatementRule {
|
||||||
|
/// The list of layers to sort.
|
||||||
|
pub names: Vec<LayerName>,
|
||||||
|
/// The source position where this rule was found.
|
||||||
|
pub source_location: SourceLocation,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ToCssWithGuard for LayerStatementRule {
|
||||||
|
fn to_css(
|
||||||
|
&self,
|
||||||
|
_: &SharedRwLockReadGuard,
|
||||||
|
dest: &mut crate::str::CssStringWriter,
|
||||||
|
) -> fmt::Result {
|
||||||
|
let mut writer = CssWriter::new(dest);
|
||||||
|
writer.write_str("@layer ")?;
|
||||||
|
let mut first = true;
|
||||||
|
for name in &*self.names {
|
||||||
|
if !first {
|
||||||
|
writer.write_str(", ")?;
|
||||||
|
}
|
||||||
|
first = false;
|
||||||
|
name.to_css(&mut writer)?;
|
||||||
|
}
|
||||||
|
writer.write_char(';')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DeepCloneWithLock for LayerStatementRule {
|
||||||
|
fn deep_clone_with_lock(
|
||||||
|
&self,
|
||||||
|
_: &SharedRwLock,
|
||||||
|
_: &SharedRwLockReadGuard,
|
||||||
|
_: &DeepCloneParams,
|
||||||
|
) -> Self {
|
||||||
|
self.clone()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -51,7 +51,7 @@ pub use self::font_face_rule::FontFaceRule;
|
||||||
pub use self::font_feature_values_rule::FontFeatureValuesRule;
|
pub use self::font_feature_values_rule::FontFeatureValuesRule;
|
||||||
pub use self::import_rule::ImportRule;
|
pub use self::import_rule::ImportRule;
|
||||||
pub use self::keyframes_rule::KeyframesRule;
|
pub use self::keyframes_rule::KeyframesRule;
|
||||||
pub use self::layer_rule::LayerRule;
|
pub use self::layer_rule::{LayerBlockRule, LayerStatementRule};
|
||||||
pub use self::loader::StylesheetLoader;
|
pub use self::loader::StylesheetLoader;
|
||||||
pub use self::media_rule::MediaRule;
|
pub use self::media_rule::MediaRule;
|
||||||
pub use self::namespace_rule::NamespaceRule;
|
pub use self::namespace_rule::NamespaceRule;
|
||||||
|
@ -261,7 +261,8 @@ pub enum CssRule {
|
||||||
Supports(Arc<Locked<SupportsRule>>),
|
Supports(Arc<Locked<SupportsRule>>),
|
||||||
Page(Arc<Locked<PageRule>>),
|
Page(Arc<Locked<PageRule>>),
|
||||||
Document(Arc<Locked<DocumentRule>>),
|
Document(Arc<Locked<DocumentRule>>),
|
||||||
Layer(Arc<Locked<LayerRule>>),
|
LayerBlock(Arc<Locked<LayerBlockRule>>),
|
||||||
|
LayerStatement(Arc<Locked<LayerStatementRule>>),
|
||||||
ScrollTimeline(Arc<Locked<ScrollTimelineRule>>),
|
ScrollTimeline(Arc<Locked<ScrollTimelineRule>>),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -304,9 +305,8 @@ impl CssRule {
|
||||||
lock.unconditional_shallow_size_of(ops) + lock.read_with(guard).size_of(guard, ops)
|
lock.unconditional_shallow_size_of(ops) + lock.read_with(guard).size_of(guard, ops)
|
||||||
},
|
},
|
||||||
|
|
||||||
// TODO(emilio): Add memory reporting for @layer rules.
|
// TODO(emilio): Add memory reporting for these rules.
|
||||||
CssRule::Layer(_) => 0,
|
CssRule::LayerBlock(_) | CssRule::LayerStatement(_) | CssRule::ScrollTimeline(_) => 0,
|
||||||
CssRule::ScrollTimeline(_) => 0,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -341,8 +341,9 @@ pub enum CssRuleType {
|
||||||
Viewport = 15,
|
Viewport = 15,
|
||||||
// After viewport, all rules should return 0 from the API, but we still need
|
// After viewport, all rules should return 0 from the API, but we still need
|
||||||
// a constant somewhere.
|
// a constant somewhere.
|
||||||
Layer = 16,
|
LayerBlock = 16,
|
||||||
ScrollTimeline = 17,
|
LayerStatement = 17,
|
||||||
|
ScrollTimeline = 18,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(missing_docs)]
|
#[allow(missing_docs)]
|
||||||
|
@ -369,7 +370,8 @@ impl CssRule {
|
||||||
CssRule::Supports(_) => CssRuleType::Supports,
|
CssRule::Supports(_) => CssRuleType::Supports,
|
||||||
CssRule::Page(_) => CssRuleType::Page,
|
CssRule::Page(_) => CssRuleType::Page,
|
||||||
CssRule::Document(_) => CssRuleType::Document,
|
CssRule::Document(_) => CssRuleType::Document,
|
||||||
CssRule::Layer(_) => CssRuleType::Layer,
|
CssRule::LayerBlock(_) => CssRuleType::LayerBlock,
|
||||||
|
CssRule::LayerStatement(_) => CssRuleType::LayerStatement,
|
||||||
CssRule::ScrollTimeline(_) => CssRuleType::ScrollTimeline,
|
CssRule::ScrollTimeline(_) => CssRuleType::ScrollTimeline,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -504,9 +506,15 @@ impl DeepCloneWithLock for CssRule {
|
||||||
lock.wrap(rule.deep_clone_with_lock(lock, guard, params)),
|
lock.wrap(rule.deep_clone_with_lock(lock, guard, params)),
|
||||||
))
|
))
|
||||||
},
|
},
|
||||||
CssRule::Layer(ref arc) => {
|
CssRule::LayerStatement(ref arc) => {
|
||||||
let rule = arc.read_with(guard);
|
let rule = arc.read_with(guard);
|
||||||
CssRule::Layer(Arc::new(
|
CssRule::LayerStatement(Arc::new(
|
||||||
|
lock.wrap(rule.deep_clone_with_lock(lock, guard, params)),
|
||||||
|
))
|
||||||
|
},
|
||||||
|
CssRule::LayerBlock(ref arc) => {
|
||||||
|
let rule = arc.read_with(guard);
|
||||||
|
CssRule::LayerBlock(Arc::new(
|
||||||
lock.wrap(rule.deep_clone_with_lock(lock, guard, params)),
|
lock.wrap(rule.deep_clone_with_lock(lock, guard, params)),
|
||||||
))
|
))
|
||||||
},
|
},
|
||||||
|
@ -534,7 +542,8 @@ impl ToCssWithGuard for CssRule {
|
||||||
CssRule::Supports(ref lock) => lock.read_with(guard).to_css(guard, dest),
|
CssRule::Supports(ref lock) => lock.read_with(guard).to_css(guard, dest),
|
||||||
CssRule::Page(ref lock) => lock.read_with(guard).to_css(guard, dest),
|
CssRule::Page(ref lock) => lock.read_with(guard).to_css(guard, dest),
|
||||||
CssRule::Document(ref lock) => lock.read_with(guard).to_css(guard, dest),
|
CssRule::Document(ref lock) => lock.read_with(guard).to_css(guard, dest),
|
||||||
CssRule::Layer(ref lock) => lock.read_with(guard).to_css(guard, dest),
|
CssRule::LayerBlock(ref lock) => lock.read_with(guard).to_css(guard, dest),
|
||||||
|
CssRule::LayerStatement(ref lock) => lock.read_with(guard).to_css(guard, dest),
|
||||||
CssRule::ScrollTimeline(ref lock) => lock.read_with(guard).to_css(guard, dest),
|
CssRule::ScrollTimeline(ref lock) => lock.read_with(guard).to_css(guard, dest),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,14 +17,14 @@ use crate::stylesheets::document_rule::DocumentCondition;
|
||||||
use crate::stylesheets::font_feature_values_rule::parse_family_name_list;
|
use crate::stylesheets::font_feature_values_rule::parse_family_name_list;
|
||||||
use crate::stylesheets::import_rule::ImportLayer;
|
use crate::stylesheets::import_rule::ImportLayer;
|
||||||
use crate::stylesheets::keyframes_rule::parse_keyframe_list;
|
use crate::stylesheets::keyframes_rule::parse_keyframe_list;
|
||||||
use crate::stylesheets::layer_rule::{LayerName, LayerRuleKind};
|
use crate::stylesheets::layer_rule::{LayerBlockRule, LayerName, LayerStatementRule};
|
||||||
use crate::stylesheets::scroll_timeline_rule::ScrollTimelineDescriptors;
|
use crate::stylesheets::scroll_timeline_rule::ScrollTimelineDescriptors;
|
||||||
use crate::stylesheets::stylesheet::Namespaces;
|
use crate::stylesheets::stylesheet::Namespaces;
|
||||||
use crate::stylesheets::supports_rule::SupportsCondition;
|
use crate::stylesheets::supports_rule::SupportsCondition;
|
||||||
use crate::stylesheets::{
|
use crate::stylesheets::{
|
||||||
viewport_rule, AllowImportRules, CorsMode, CssRule, CssRuleType, CssRules, DocumentRule,
|
viewport_rule, AllowImportRules, CorsMode, CssRule, CssRuleType, CssRules, DocumentRule,
|
||||||
FontFeatureValuesRule, KeyframesRule, LayerRule, MediaRule, NamespaceRule, PageRule,
|
FontFeatureValuesRule, KeyframesRule, MediaRule, NamespaceRule, PageRule, RulesMutateError,
|
||||||
RulesMutateError, ScrollTimelineRule, StyleRule, StylesheetLoader, SupportsRule, ViewportRule,
|
ScrollTimelineRule, StyleRule, StylesheetLoader, SupportsRule, ViewportRule,
|
||||||
};
|
};
|
||||||
use crate::values::computed::font::FamilyName;
|
use crate::values::computed::font::FamilyName;
|
||||||
use crate::values::{CssUrl, CustomIdent, KeyframesName, TimelineName};
|
use crate::values::{CssUrl, CustomIdent, KeyframesName, TimelineName};
|
||||||
|
@ -613,13 +613,13 @@ impl<'a, 'b, 'i> AtRuleParser<'i> for NestedRuleParser<'a, 'b> {
|
||||||
0 | 1 => names.into_iter().next(),
|
0 | 1 => names.into_iter().next(),
|
||||||
_ => return Err(input.new_error(BasicParseErrorKind::AtRuleBodyInvalid)),
|
_ => return Err(input.new_error(BasicParseErrorKind::AtRuleBodyInvalid)),
|
||||||
};
|
};
|
||||||
Ok(CssRule::Layer(Arc::new(self.shared_lock.wrap(LayerRule {
|
Ok(CssRule::LayerBlock(Arc::new(self.shared_lock.wrap(
|
||||||
kind: LayerRuleKind::Block {
|
LayerBlockRule {
|
||||||
name,
|
name,
|
||||||
rules: self.parse_nested_rules(input, CssRuleType::Layer),
|
rules: self.parse_nested_rules(input, CssRuleType::LayerBlock),
|
||||||
|
source_location: start.source_location(),
|
||||||
},
|
},
|
||||||
source_location: start.source_location(),
|
))))
|
||||||
}))))
|
|
||||||
},
|
},
|
||||||
AtRulePrelude::Import(..) | AtRulePrelude::Namespace(..) => {
|
AtRulePrelude::Import(..) | AtRulePrelude::Namespace(..) => {
|
||||||
// These rules don't have blocks.
|
// These rules don't have blocks.
|
||||||
|
@ -654,8 +654,8 @@ impl<'a, 'b, 'i> AtRuleParser<'i> for NestedRuleParser<'a, 'b> {
|
||||||
if names.is_empty() {
|
if names.is_empty() {
|
||||||
return Err(());
|
return Err(());
|
||||||
}
|
}
|
||||||
CssRule::Layer(Arc::new(self.shared_lock.wrap(LayerRule {
|
CssRule::LayerStatement(Arc::new(self.shared_lock.wrap(LayerStatementRule {
|
||||||
kind: LayerRuleKind::Statement { names },
|
names,
|
||||||
source_location: start.source_location(),
|
source_location: start.source_location(),
|
||||||
})))
|
})))
|
||||||
},
|
},
|
||||||
|
|
|
@ -70,6 +70,7 @@ where
|
||||||
CssRule::Keyframes(_) |
|
CssRule::Keyframes(_) |
|
||||||
CssRule::ScrollTimeline(_) |
|
CssRule::ScrollTimeline(_) |
|
||||||
CssRule::Page(_) |
|
CssRule::Page(_) |
|
||||||
|
CssRule::LayerStatement(_) |
|
||||||
CssRule::FontFeatureValues(_) => None,
|
CssRule::FontFeatureValues(_) => None,
|
||||||
CssRule::Import(ref import_rule) => {
|
CssRule::Import(ref import_rule) => {
|
||||||
let import_rule = import_rule.read_with(guard);
|
let import_rule = import_rule.read_with(guard);
|
||||||
|
@ -103,14 +104,9 @@ where
|
||||||
}
|
}
|
||||||
Some(supports_rule.rules.read_with(guard).0.iter())
|
Some(supports_rule.rules.read_with(guard).0.iter())
|
||||||
},
|
},
|
||||||
CssRule::Layer(ref lock) => {
|
CssRule::LayerBlock(ref lock) => {
|
||||||
use crate::stylesheets::layer_rule::LayerRuleKind;
|
|
||||||
|
|
||||||
let layer_rule = lock.read_with(guard);
|
let layer_rule = lock.read_with(guard);
|
||||||
match layer_rule.kind {
|
Some(layer_rule.rules.read_with(guard).0.iter())
|
||||||
LayerRuleKind::Block { ref rules, .. } => Some(rules.read_with(guard).0.iter()),
|
|
||||||
LayerRuleKind::Statement { .. } => None,
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -363,7 +363,8 @@ impl SanitizationKind {
|
||||||
CssRule::Import(..) |
|
CssRule::Import(..) |
|
||||||
// TODO(emilio): Perhaps Layer should not be always sanitized? But
|
// TODO(emilio): Perhaps Layer should not be always sanitized? But
|
||||||
// we sanitize @media and co, so this seems safer for now.
|
// we sanitize @media and co, so this seems safer for now.
|
||||||
CssRule::Layer(..) => false,
|
CssRule::LayerStatement(..) |
|
||||||
|
CssRule::LayerBlock(..) => false,
|
||||||
|
|
||||||
CssRule::FontFace(..) | CssRule::Namespace(..) | CssRule::Style(..) => true,
|
CssRule::FontFace(..) | CssRule::Namespace(..) | CssRule::Style(..) => true,
|
||||||
|
|
||||||
|
|
|
@ -2516,35 +2516,25 @@ impl CascadeData {
|
||||||
self.effective_media_query_results.saw_effective(media_rule);
|
self.effective_media_query_results.saw_effective(media_rule);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
CssRule::Layer(ref lock) => {
|
CssRule::LayerBlock(ref lock) => {
|
||||||
use crate::stylesheets::layer_rule::LayerRuleKind;
|
|
||||||
|
|
||||||
let layer_rule = lock.read_with(guard);
|
let layer_rule = lock.read_with(guard);
|
||||||
match layer_rule.kind {
|
children_layer_id = maybe_register_layers(
|
||||||
LayerRuleKind::Block { ref name, .. } => {
|
self,
|
||||||
children_layer_id = maybe_register_layers(
|
layer_rule.name.as_ref(),
|
||||||
self,
|
&mut current_layer,
|
||||||
name.as_ref(),
|
&mut layer_names_to_pop,
|
||||||
&mut current_layer,
|
);
|
||||||
&mut layer_names_to_pop,
|
},
|
||||||
);
|
CssRule::LayerStatement(ref lock) => {
|
||||||
},
|
let layer_rule = lock.read_with(guard);
|
||||||
LayerRuleKind::Statement { ref names } => {
|
for name in &*layer_rule.names {
|
||||||
for name in &**names {
|
let mut pushed = 0;
|
||||||
let mut pushed = 0;
|
// There are no children, so we can ignore the
|
||||||
// There are no children, so we can ignore the
|
// return value.
|
||||||
// return value.
|
maybe_register_layers(self, Some(name), &mut current_layer, &mut pushed);
|
||||||
maybe_register_layers(
|
for _ in 0..pushed {
|
||||||
self,
|
current_layer.0.pop();
|
||||||
Some(name),
|
}
|
||||||
&mut current_layer,
|
|
||||||
&mut pushed,
|
|
||||||
);
|
|
||||||
for _ in 0..pushed {
|
|
||||||
current_layer.0.pop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
// We don't care about any other rule.
|
// We don't care about any other rule.
|
||||||
|
@ -2660,7 +2650,8 @@ impl CascadeData {
|
||||||
CssRule::Page(..) |
|
CssRule::Page(..) |
|
||||||
CssRule::Viewport(..) |
|
CssRule::Viewport(..) |
|
||||||
CssRule::Document(..) |
|
CssRule::Document(..) |
|
||||||
CssRule::Layer(..) |
|
CssRule::LayerBlock(..) |
|
||||||
|
CssRule::LayerStatement(..) |
|
||||||
CssRule::FontFeatureValues(..) => {
|
CssRule::FontFeatureValues(..) => {
|
||||||
// Not affected by device changes.
|
// Not affected by device changes.
|
||||||
continue;
|
continue;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue