@@ -18,6 +18,8 @@ use cursor_icon::CursorIcon;
1818use markup5ever:: local_name;
1919use parley:: FontContext ;
2020use peniko:: { Blob , kurbo} ;
21+ use style_traits:: ParsingMode ;
22+ // use quadtree_rs::Quadtree;
2123use selectors:: { Element , matching:: QuirksMode } ;
2224use slab:: Slab ;
2325use std:: any:: Any ;
@@ -40,9 +42,12 @@ use style::values::computed::Overflow;
4042use style:: {
4143 dom:: { TDocument , TNode } ,
4244 media_queries:: { Device , MediaList } ,
45+ parser:: ParserContext ,
4346 selector_parser:: SnapshotMap ,
4447 shared_lock:: { SharedRwLock , StylesheetGuards } ,
45- stylesheets:: { AllowImportRules , DocumentStyleSheet , Origin , Stylesheet , UrlExtraData } ,
48+ stylesheets:: {
49+ AllowImportRules , CssRuleType , DocumentStyleSheet , Origin , Stylesheet , UrlExtraData ,
50+ } ,
4651 stylist:: Stylist ,
4752} ;
4853use taffy:: AvailableSpace ;
@@ -153,6 +158,9 @@ pub struct BaseDocument {
153158
154159 pub changed : HashSet < usize > ,
155160
161+ // All image nodes.
162+ image_nodes : HashSet < usize > ,
163+
156164 /// A map from control node ID's to their associated forms node ID's
157165 pub controls_to_form : HashMap < usize , usize > ,
158166
@@ -246,6 +254,7 @@ impl BaseDocument {
246254 mousedown_node_id : None ,
247255 is_animating : false ,
248256 changed : HashSet :: new ( ) ,
257+ image_nodes : HashSet :: new ( ) ,
249258 controls_to_form : HashMap :: new ( ) ,
250259 net_provider : Arc :: new ( DummyNetProvider ) ,
251260 navigation_provider : Arc :: new ( DummyNavigationProvider ) ,
@@ -414,6 +423,11 @@ impl BaseDocument {
414423
415424 // Mark the new node as changed.
416425 self . changed . insert ( id) ;
426+
427+ if self . is_img_node ( id) {
428+ self . image_nodes . insert ( id) ;
429+ }
430+
417431 id
418432 }
419433
@@ -569,10 +583,13 @@ impl BaseDocument {
569583
570584 match kind {
571585 ImageType :: Image => {
572- node. element_data_mut ( ) . unwrap ( ) . special_data =
573- SpecialElementData :: Image ( Box :: new ( ImageData :: Raster (
574- RasterImageData :: new ( width, height, image_data) ,
586+ if let SpecialElementData :: Image ( context) =
587+ & mut node. element_data_mut ( ) . unwrap ( ) . special_data
588+ {
589+ context. data = Some ( ImageData :: Raster ( RasterImageData :: new (
590+ width, height, image_data,
575591 ) ) ) ;
592+ }
576593
577594 // Clear layout cache
578595 node. cache . clear ( ) ;
@@ -595,8 +612,11 @@ impl BaseDocument {
595612
596613 match kind {
597614 ImageType :: Image => {
598- node. element_data_mut ( ) . unwrap ( ) . special_data =
599- SpecialElementData :: Image ( Box :: new ( ImageData :: Svg ( tree) ) ) ;
615+ if let SpecialElementData :: Image ( context) =
616+ & mut node. element_data_mut ( ) . unwrap ( ) . special_data
617+ {
618+ context. data = Some ( ImageData :: Svg ( tree) ) ;
619+ }
600620
601621 // Clear layout cache
602622 node. cache . clear ( ) ;
@@ -892,6 +912,7 @@ impl BaseDocument {
892912 self . stylist . set_device ( device, & guards)
893913 } ;
894914 self . stylist . force_stylesheet_origins_dirty ( origins) ;
915+ self . environment_changes ( ) ;
895916 }
896917
897918 pub fn stylist_device ( & mut self ) -> & Device {
@@ -1092,6 +1113,42 @@ impl BaseDocument {
10921113 false
10931114 } )
10941115 }
1116+
1117+ /// Used to determine whether a document matches a media query string,
1118+ /// and to monitor a document to detect when it matches (or stops matching) that media query.
1119+ ///
1120+ /// https://developer.mozilla.org/en-US/docs/Web/API/Window/matchMedia
1121+ pub fn match_media ( & self , media_query_string : & str ) -> bool {
1122+ let mut input = cssparser:: ParserInput :: new ( media_query_string) ;
1123+ let mut parser = cssparser:: Parser :: new ( & mut input) ;
1124+
1125+ let url_data = UrlExtraData :: from (
1126+ self . base_url
1127+ . clone ( )
1128+ . unwrap_or_else ( || "about:blank" . parse :: < Url > ( ) . unwrap ( ) ) ,
1129+ ) ;
1130+ let quirks_mode = self . stylist . quirks_mode ( ) ;
1131+ let context = ParserContext :: new (
1132+ Origin :: Author ,
1133+ & url_data,
1134+ Some ( CssRuleType :: Style ) ,
1135+ ParsingMode :: all ( ) ,
1136+ quirks_mode,
1137+ Default :: default ( ) ,
1138+ None ,
1139+ None ,
1140+ ) ;
1141+
1142+ let media_list = MediaList :: parse ( & context, & mut parser) ;
1143+ media_list. evaluate ( self . stylist . device ( ) , quirks_mode)
1144+ }
1145+
1146+ fn environment_changes ( & mut self ) {
1147+ let image_nodes = self . image_nodes . clone ( ) ;
1148+ for node_id in image_nodes. into_iter ( ) {
1149+ self . environment_changes_with_image ( node_id) ;
1150+ }
1151+ }
10951152}
10961153
10971154impl AsRef < BaseDocument > for BaseDocument {
0 commit comments