/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ use cssparser::{Parser, ParserInput, serialize_identifier}; use dom_struct::dom_struct; use js::context::JSContext; use script_bindings::codegen::GenericBindings::CSSBinding::PropertyDefinition; use style::stylesheets::supports_rule::{Declaration, parse_condition_or_declaration}; use style::stylesheets::{CssRuleType, UrlExtraData}; use style::stylist::RegisterCustomPropertyResult; use style_traits::ParsingMode; use crate::css::parser_context_for_anonymous_content; use crate::dom::bindings::codegen::Bindings::CSSBinding::CSSMethods; use crate::dom::bindings::codegen::Bindings::WindowBinding::Window_Binding::WindowMethods; use crate::dom::bindings::error::{Error, Fallible}; use crate::dom::bindings::reflector::Reflector; use crate::dom::bindings::root::DomRoot; use crate::dom::bindings::str::DOMString; use crate::dom::window::Window; use crate::dom::worklet::Worklet; #[dom_struct] #[expect(clippy::upper_case_acronyms)] pub(crate) struct CSS { reflector_: Reflector, } impl CSSMethods for CSS { /// fn Escape(_: &Window, ident: DOMString) -> Fallible { let mut escaped = String::new(); serialize_identifier(&ident.str(), &mut escaped).unwrap(); Ok(DOMString::from(escaped)) } /// fn Supports(win: &Window, property: DOMString, value: DOMString) -> bool { let mut decl = String::new(); serialize_identifier(&property.str(), &mut decl).unwrap(); decl.push_str(": "); decl.push_str(&value.str()); let decl = Declaration(decl); let url_data = UrlExtraData(win.Document().url().get_arc()); let context = parser_context_for_anonymous_content( CssRuleType::Style, ParsingMode::DEFAULT, &url_data, ); decl.eval(&context) } /// fn Supports_(win: &Window, condition: DOMString) -> bool { let condition = condition.str(); let mut input = ParserInput::new(&condition); let mut input = Parser::new(&mut input); let cond = match parse_condition_or_declaration(&mut input) { Ok(c) => c, Err(..) => return false, }; let url_data = UrlExtraData(win.Document().url().get_arc()); let context = parser_context_for_anonymous_content( CssRuleType::Style, ParsingMode::DEFAULT, &url_data, ); cond.eval(&context) } /// fn PaintWorklet(cx: &mut JSContext, win: &Window) -> DomRoot { win.paint_worklet(cx) } /// fn RegisterProperty(window: &Window, property_definition: &PropertyDefinition) -> Fallible<()> { use RegisterCustomPropertyResult::*; let result = window.layout_mut().stylist_mut().register_custom_property( &UrlExtraData(window.get_url().get_arc()), &property_definition.name.str(), &property_definition.syntax.str(), property_definition.inherits, property_definition .initialValue .as_ref() .map(|value| value.str()) .as_deref(), ); Err(match result { SuccessfullyRegistered => return Ok(()), InvalidName | InvalidSyntax | InvalidInitialValue | NoInitialValue | InitialValueNotComputationallyIndependent => Error::Syntax(None), AlreadyRegistered => Error::InvalidModification(None), }) } }