From fc6bee8b813054a155ff1412bb638fcd4979f4db Mon Sep 17 00:00:00 2001 From: Tim van der Lippe Date: Thu, 4 Sep 2025 08:21:01 +0200 Subject: [PATCH] Move `Element::matches_environment` to `MediaList` (#39034) It more logically matches `MediaList`, and it allows us to call this method with a document. This is required when parsing Link headers, as they don't have an associated element, but they do have a document. Part of #35035 Signed-off-by: Tim van der Lippe --- components/script/dom/element.rs | 33 ++----------------- .../script/dom/html/htmlimageelement.rs | 3 +- components/script/dom/html/htmllinkelement.rs | 4 +-- components/script/dom/medialist.rs | 26 +++++++++++++++ 4 files changed, 32 insertions(+), 34 deletions(-) diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index 461989a8ab2..eea4b1af7fb 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -12,7 +12,7 @@ use std::rc::Rc; use std::str::FromStr; use std::{fmt, mem}; -use cssparser::{Parser as CssParser, ParserInput as CssParserInput, match_ignore_ascii_case}; +use cssparser::match_ignore_ascii_case; use devtools_traits::AttrInfo; use dom_struct::dom_struct; use embedder_traits::InputMethodType; @@ -38,8 +38,6 @@ use style::attr::{AttrValue, LengthOrPercentageOrAuto}; use style::computed_values::position::T as Position; use style::context::QuirksMode; use style::invalidation::element::restyle_hints::RestyleHint; -use style::media_queries::MediaList; -use style::parser::ParserContext as CssParserContext; use style::properties::longhands::{ self, background_image, border_spacing, font_family, font_size, }; @@ -54,14 +52,13 @@ use style::selector_parser::{ }; use style::shared_lock::Locked; use style::stylesheets::layer_rule::LayerOrder; -use style::stylesheets::{CssRuleType, Origin as CssOrigin, UrlExtraData}; +use style::stylesheets::{CssRuleType, UrlExtraData}; use style::values::computed::Overflow; use style::values::generics::NonNegative; use style::values::generics::position::PreferredRatio; use style::values::generics::ratio::Ratio; use style::values::{AtomIdent, AtomString, CSSFloat, computed, specified}; use style::{ArcSlice, CaseSensitivityExt, dom_apis, thread_state}; -use style_traits::ParsingMode as CssParsingMode; use stylo_atoms::Atom; use stylo_dom::ElementState; use webrender_api::units::LayoutVector2D; @@ -859,32 +856,6 @@ impl Element { .retain(|reg_obs| *reg_obs.observer != *observer) } - /// - pub(crate) fn matches_environment(&self, media_query: &str) -> bool { - let document = self.owner_document(); - let quirks_mode = document.quirks_mode(); - let document_url_data = UrlExtraData(document.url().get_arc()); - // FIXME(emilio): This should do the same that we do for other media - // lists regarding the rule type and such, though it doesn't really - // matter right now... - // - // Also, ParsingMode::all() is wrong, and should be DEFAULT. - let context = CssParserContext::new( - CssOrigin::Author, - &document_url_data, - Some(CssRuleType::Style), - CssParsingMode::all(), - quirks_mode, - /* namespaces = */ Default::default(), - None, - None, - ); - let mut parser_input = CssParserInput::new(media_query); - let mut parser = CssParser::new(&mut parser_input); - let media_list = MediaList::parse(&context, &mut parser); - media_list.evaluate(document.window().layout().device(), quirks_mode) - } - /// fn scroll_into_view_with_options( &self, diff --git a/components/script/dom/html/htmlimageelement.rs b/components/script/dom/html/htmlimageelement.rs index 9e96ba7c95b..2eedcacaaf1 100644 --- a/components/script/dom/html/htmlimageelement.rs +++ b/components/script/dom/html/htmlimageelement.rs @@ -75,6 +75,7 @@ use crate::dom::html::htmlformelement::{FormControl, HTMLFormElement}; use crate::dom::html::htmlmapelement::HTMLMapElement; use crate::dom::html::htmlpictureelement::HTMLPictureElement; use crate::dom::html::htmlsourceelement::HTMLSourceElement; +use crate::dom::medialist::MediaList; use crate::dom::mouseevent::MouseEvent; use crate::dom::node::{BindContext, Node, NodeDamage, NodeTraits, ShadowIncluding, UnbindContext}; use crate::dom::performanceresourcetiming::InitiatorType; @@ -713,7 +714,7 @@ impl HTMLImageElement { // Step 4.6 if let Some(x) = element.get_attribute(&ns!(), &local_name!("media")) { - if !elem.matches_environment(&x.value()) { + if !MediaList::matches_environment(&elem.owner_document(), &x.value()) { continue; } } diff --git a/components/script/dom/html/htmllinkelement.rs b/components/script/dom/html/htmllinkelement.rs index f49b0b6c65c..18bfb43dbc6 100644 --- a/components/script/dom/html/htmllinkelement.rs +++ b/components/script/dom/html/htmllinkelement.rs @@ -339,7 +339,7 @@ impl VirtualMethods for HTMLLinkElement { } let matches_media_environment = - self.upcast::().matches_environment(&attr.value()); + MediaList::matches_environment(&self.owner_document(), &attr.value()); self.previous_media_environment_matched .set(matches_media_environment); }, @@ -573,7 +573,7 @@ impl HTMLLinkElement { None => "", }; - if !element.matches_environment(mq_str) { + if !MediaList::matches_environment(&document, mq_str) { return; } diff --git a/components/script/dom/medialist.rs b/components/script/dom/medialist.rs index 8dc53f6a9fd..4e23af01418 100644 --- a/components/script/dom/medialist.rs +++ b/components/script/dom/medialist.rs @@ -19,6 +19,7 @@ use crate::dom::bindings::reflector::{DomGlobal, Reflector, reflect_dom_object}; use crate::dom::bindings::root::{Dom, DomRoot}; use crate::dom::bindings::str::DOMString; use crate::dom::cssstylesheet::CSSStyleSheet; +use crate::dom::document::Document; use crate::dom::window::Window; use crate::script_runtime::CanGc; @@ -117,6 +118,31 @@ impl MediaList { pub(crate) fn update_media_list(&self, media_queries: Arc>) { *self.media_queries.borrow_mut() = media_queries; } + + /// + pub(crate) fn matches_environment(document: &Document, media_query: &str) -> bool { + let quirks_mode = document.quirks_mode(); + let document_url_data = UrlExtraData(document.url().get_arc()); + // FIXME(emilio): This should do the same that we do for other media + // lists regarding the rule type and such, though it doesn't really + // matter right now... + // + // Also, ParsingMode::all() is wrong, and should be DEFAULT. + let context = ParserContext::new( + Origin::Author, + &document_url_data, + Some(CssRuleType::Style), + ParsingMode::all(), + quirks_mode, + /* namespaces = */ Default::default(), + None, + None, + ); + let mut parser_input = ParserInput::new(media_query); + let mut parser = Parser::new(&mut parser_input); + let media_list = StyleMediaList::parse(&context, &mut parser); + media_list.evaluate(document.window().layout().device(), quirks_mode) + } } impl MediaListMethods for MediaList {