diff --git a/servo/components/style/stylesheets/import_rule.rs b/servo/components/style/stylesheets/import_rule.rs index dc528a3720f6..ebc4867bfff7 100644 --- a/servo/components/style/stylesheets/import_rule.rs +++ b/servo/components/style/stylesheets/import_rule.rs @@ -138,11 +138,17 @@ impl DeepCloneWithLock for ImportSheet { } } -/// The layer keyword or function in an import rule. +/// The layer specified in an import rule (can be none, anonymous, or named). #[derive(Debug, Clone)] -pub struct ImportLayer { - /// The layer name, or None for an anonymous layer. - pub name: Option, +pub enum ImportLayer { + /// No layer specified + None, + + /// Anonymous layer (`layer`) + Anonymous, + + /// Named layer (`layer(name)`) + Named(LayerName), } /// The supports condition in an import rule. @@ -160,9 +166,10 @@ impl ToCss for ImportLayer { where W: Write, { - match self.name { - None => dest.write_str("layer"), - Some(ref name) => { + match *self { + ImportLayer::None => Ok(()), + ImportLayer::Anonymous => dest.write_str("layer"), + ImportLayer::Named(ref name) => { dest.write_str("layer(")?; name.to_css(dest)?; dest.write_char(')') @@ -188,7 +195,7 @@ pub struct ImportRule { pub supports: Option, /// A `layer()` function name. - pub layer: Option, + pub layer: ImportLayer, /// The line and column of the rule's source code. pub source_location: SourceLocation, @@ -207,21 +214,21 @@ impl ImportRule { input: &mut Parser<'i, 't>, context: &ParserContext, namespaces: &Namespaces, - ) -> (Option, Option) { + ) -> (ImportLayer, Option) { let layer = if input .try_parse(|input| input.expect_ident_matching("layer")) .is_ok() { - Some(ImportLayer { name: None }) + ImportLayer::Anonymous } else { input .try_parse(|input| { input.expect_function_matching("layer")?; input .parse_nested_block(|input| LayerName::parse(context, input)) - .map(|name| ImportLayer { name: Some(name) }) + .map(|name| ImportLayer::Named(name)) }) - .ok() + .ok().unwrap_or(ImportLayer::None) }; let supports = if !static_prefs::pref!("layout.css.import-supports.enabled") { @@ -272,9 +279,9 @@ impl ToCssWithGuard for ImportRule { dest.write_str("@import ")?; self.url.to_css(&mut CssWriter::new(dest))?; - if let Some(ref layer) = self.layer { + if !matches!(self.layer, ImportLayer::None) { dest.write_char(' ')?; - layer.to_css(&mut CssWriter::new(dest))?; + self.layer.to_css(&mut CssWriter::new(dest))?; } if let Some(ref supports) = self.supports { diff --git a/servo/components/style/stylesheets/loader.rs b/servo/components/style/stylesheets/loader.rs index a8d569ad7a47..9515e2bc62ef 100644 --- a/servo/components/style/stylesheets/loader.rs +++ b/servo/components/style/stylesheets/loader.rs @@ -26,6 +26,6 @@ pub trait StylesheetLoader { lock: &SharedRwLock, media: Arc>, supports: Option, - layer: Option, + layer: ImportLayer, ) -> Arc>; } diff --git a/servo/components/style/stylesheets/rule_parser.rs b/servo/components/style/stylesheets/rule_parser.rs index 855fb68d3a82..8284475dfa9a 100644 --- a/servo/components/style/stylesheets/rule_parser.rs +++ b/servo/components/style/stylesheets/rule_parser.rs @@ -204,7 +204,7 @@ pub enum AtRulePrelude { /// A @document rule, with its conditional. Document(DocumentCondition), /// A @import rule prelude. - Import(CssUrl, Arc>, Option, Option), + Import(CssUrl, Arc>, Option, ImportLayer), /// A @namespace rule prelude. Namespace(Option, Namespace), /// A @layer rule prelude. diff --git a/servo/components/style/stylist.rs b/servo/components/style/stylist.rs index d721f46802a1..11b461d85968 100644 --- a/servo/components/style/stylist.rs +++ b/servo/components/style/stylist.rs @@ -28,6 +28,7 @@ use crate::shared_lock::{Locked, SharedRwLockReadGuard, StylesheetGuards}; use crate::stylesheet_set::{DataValidity, DocumentStylesheetSet, SheetRebuildKind}; use crate::stylesheet_set::{DocumentStylesheetFlusher, SheetCollectionFlusher}; use crate::stylesheets::container_rule::ContainerCondition; +use crate::stylesheets::import_rule::ImportLayer; use crate::stylesheets::keyframes_rule::KeyframesAnimation; use crate::stylesheets::layer_rule::{LayerName, LayerOrder}; use crate::stylesheets::viewport_rule::{self, MaybeNew, ViewportRule}; @@ -2936,8 +2937,10 @@ impl CascadeData { self.effective_media_query_results .saw_effective(import_rule); } - if let Some(ref layer) = import_rule.layer { - maybe_register_layers(self, layer.name.as_ref(), containing_rule_state); + match import_rule.layer { + ImportLayer::Named(ref name) => maybe_register_layers(self, Some(name), containing_rule_state), + ImportLayer::Anonymous => maybe_register_layers(self, None, containing_rule_state), + ImportLayer::None => {}, } }, CssRule::Media(ref lock) => { diff --git a/servo/ports/geckolib/glue.rs b/servo/ports/geckolib/glue.rs index a889129b481a..ec06ea16de15 100644 --- a/servo/ports/geckolib/glue.rs +++ b/servo/ports/geckolib/glue.rs @@ -120,7 +120,7 @@ use style::shared_lock::{ use style::string_cache::{Atom, WeakAtom}; use style::style_adjuster::StyleAdjuster; use style::stylesheets::container_rule::ContainerSizeQuery; -use style::stylesheets::import_rule::ImportSheet; +use style::stylesheets::import_rule::{ImportSheet, ImportLayer}; use style::stylesheets::keyframes_rule::{Keyframe, KeyframeSelector, KeyframesStepValue}; use style::stylesheets::layer_rule::LayerOrder; use style::stylesheets::supports_rule::parse_condition_or_declaration; @@ -2711,8 +2711,8 @@ pub extern "C" fn Servo_ImportRule_GetLayerName( result: &mut nsACString, ) { read_locked_arc(rule, |rule: &ImportRule| match rule.layer { - Some(ref layer) => layer.name.to_css(&mut CssWriter::new(result)).unwrap(), - None => result.set_is_void(true), + ImportLayer::None => result.set_is_void(true), + _ => rule.layer.to_css(&mut CssWriter::new(result)).unwrap(), }) } diff --git a/servo/ports/geckolib/stylesheet_loader.rs b/servo/ports/geckolib/stylesheet_loader.rs index 0d410a43d51c..760cafe9b432 100644 --- a/servo/ports/geckolib/stylesheet_loader.rs +++ b/servo/ports/geckolib/stylesheet_loader.rs @@ -53,7 +53,7 @@ impl StyleStylesheetLoader for StylesheetLoader { lock: &SharedRwLock, media: Arc>, supports: Option, - layer: Option, + layer: ImportLayer, ) -> Arc> { // Ensure the supports conditions for this @import are true, if not, refuse to load if !supports.as_ref().map_or(true, |s| s.enabled) { @@ -175,7 +175,7 @@ impl StyleStylesheetLoader for AsyncStylesheetParser { lock: &SharedRwLock, media: Arc>, supports: Option, - layer: Option, + layer: ImportLayer, ) -> Arc> { // Ensure the supports conditions for this @import are true, if not, refuse to load if !supports.as_ref().map_or(true, |s| s.enabled) {