@@ -40,11 +40,15 @@ use style::values::computed::Overflow;
4040use style:: {
4141 dom:: { TDocument , TNode } ,
4242 media_queries:: { Device , MediaList } ,
43+ parser:: ParserContext ,
4344 selector_parser:: SnapshotMap ,
4445 shared_lock:: { SharedRwLock , StylesheetGuards } ,
45- stylesheets:: { AllowImportRules , DocumentStyleSheet , Origin , Stylesheet , UrlExtraData } ,
46+ stylesheets:: {
47+ AllowImportRules , CssRuleType , DocumentStyleSheet , Origin , Stylesheet , UrlExtraData ,
48+ } ,
4649 stylist:: Stylist ,
4750} ;
51+ use style_traits:: ParsingMode ;
4852use taffy:: AvailableSpace ;
4953use url:: Url ;
5054
@@ -153,6 +157,9 @@ pub struct BaseDocument {
153157
154158 pub changed : HashSet < usize > ,
155159
160+ // All image nodes.
161+ image_nodes : HashSet < usize > ,
162+
156163 /// A map from control node ID's to their associated forms node ID's
157164 pub controls_to_form : HashMap < usize , usize > ,
158165
@@ -246,6 +253,7 @@ impl BaseDocument {
246253 mousedown_node_id : None ,
247254 is_animating : false ,
248255 changed : HashSet :: new ( ) ,
256+ image_nodes : HashSet :: new ( ) ,
249257 controls_to_form : HashMap :: new ( ) ,
250258 net_provider : Arc :: new ( DummyNetProvider ) ,
251259 navigation_provider : Arc :: new ( DummyNavigationProvider ) ,
@@ -414,6 +422,11 @@ impl BaseDocument {
414422
415423 // Mark the new node as changed.
416424 self . changed . insert ( id) ;
425+
426+ if self . is_img_node ( id) {
427+ self . image_nodes . insert ( id) ;
428+ }
429+
417430 id
418431 }
419432
@@ -569,10 +582,13 @@ impl BaseDocument {
569582
570583 match kind {
571584 ImageType :: Image => {
572- node. element_data_mut ( ) . unwrap ( ) . special_data =
573- SpecialElementData :: Image ( Box :: new ( ImageData :: Raster (
574- RasterImageData :: new ( width, height, image_data) ,
585+ if let SpecialElementData :: Image ( context) =
586+ & mut node. element_data_mut ( ) . unwrap ( ) . special_data
587+ {
588+ context. data = Some ( ImageData :: Raster ( RasterImageData :: new (
589+ width, height, image_data,
575590 ) ) ) ;
591+ }
576592
577593 // Clear layout cache
578594 node. cache . clear ( ) ;
@@ -595,8 +611,11 @@ impl BaseDocument {
595611
596612 match kind {
597613 ImageType :: Image => {
598- node. element_data_mut ( ) . unwrap ( ) . special_data =
599- SpecialElementData :: Image ( Box :: new ( ImageData :: Svg ( tree) ) ) ;
614+ if let SpecialElementData :: Image ( context) =
615+ & mut node. element_data_mut ( ) . unwrap ( ) . special_data
616+ {
617+ context. data = Some ( ImageData :: Svg ( tree) ) ;
618+ }
600619
601620 // Clear layout cache
602621 node. cache . clear ( ) ;
@@ -892,6 +911,7 @@ impl BaseDocument {
892911 self . stylist . set_device ( device, & guards)
893912 } ;
894913 self . stylist . force_stylesheet_origins_dirty ( origins) ;
914+ self . environment_changes ( ) ;
895915 }
896916
897917 pub fn stylist_device ( & mut self ) -> & Device {
@@ -1092,6 +1112,42 @@ impl BaseDocument {
10921112 false
10931113 } )
10941114 }
1115+
1116+ /// Used to determine whether a document matches a media query string,
1117+ /// and to monitor a document to detect when it matches (or stops matching) that media query.
1118+ ///
1119+ /// https://developer.mozilla.org/en-US/docs/Web/API/Window/matchMedia
1120+ pub fn match_media ( & self , media_query_string : & str ) -> bool {
1121+ let mut input = cssparser:: ParserInput :: new ( media_query_string) ;
1122+ let mut parser = cssparser:: Parser :: new ( & mut input) ;
1123+
1124+ let url_data = UrlExtraData :: from (
1125+ self . base_url
1126+ . clone ( )
1127+ . unwrap_or_else ( || "about:blank" . parse :: < Url > ( ) . unwrap ( ) ) ,
1128+ ) ;
1129+ let quirks_mode = self . stylist . quirks_mode ( ) ;
1130+ let context = ParserContext :: new (
1131+ Origin :: Author ,
1132+ & url_data,
1133+ Some ( CssRuleType :: Style ) ,
1134+ ParsingMode :: all ( ) ,
1135+ quirks_mode,
1136+ Default :: default ( ) ,
1137+ None ,
1138+ None ,
1139+ ) ;
1140+
1141+ let media_list = MediaList :: parse ( & context, & mut parser) ;
1142+ media_list. evaluate ( self . stylist . device ( ) , quirks_mode)
1143+ }
1144+
1145+ fn environment_changes ( & mut self ) {
1146+ let image_nodes = self . image_nodes . clone ( ) ;
1147+ for node_id in image_nodes. into_iter ( ) {
1148+ self . environment_changes_with_image ( node_id) ;
1149+ }
1150+ }
10951151}
10961152
10971153impl AsRef < BaseDocument > for BaseDocument {
0 commit comments