forked from mirrors/gecko-dev
		
	servo: Merge #18652 - style: Fix various issues with XBL rule matching (from emilio:xbl-stuff); r=TYLin
See the commit details. Source-Repo: https://github.com/servo/servo Source-Revision: bad77b6a20ee9bdba27d0af9edd1dd638c73d64b --HG-- extra : subtree_source : https%3A//hg.mozilla.org/projects/converted-servo-linear extra : subtree_revision : e53fb304044c534e968c6d073277dd5958e73afd
This commit is contained in:
		
							parent
							
								
									ff6ff5ab73
								
							
						
					
					
						commit
						35f4533c1d
					
				
					 2 changed files with 21 additions and 75 deletions
				
			
		|  | @ -26,7 +26,6 @@ use selectors::matching::{ElementSelectorFlags, VisitedHandlingMode}; | ||||||
| use selectors::sink::Push; | use selectors::sink::Push; | ||||||
| use servo_arc::{Arc, ArcBorrow}; | use servo_arc::{Arc, ArcBorrow}; | ||||||
| use shared_lock::Locked; | use shared_lock::Locked; | ||||||
| use smallvec::VecLike; |  | ||||||
| use std::fmt; | use std::fmt; | ||||||
| #[cfg(feature = "gecko")] use hash::HashMap; | #[cfg(feature = "gecko")] use hash::HashMap; | ||||||
| use std::fmt::Debug; | use std::fmt::Debug; | ||||||
|  | @ -648,24 +647,6 @@ pub trait TElement : Eq + PartialEq + Debug + Hash + Sized + Copy + Clone + | ||||||
|         false |         false | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// Gets declarations from XBL bindings from the element.
 |  | ||||||
|     fn get_declarations_from_xbl_bindings<V>( |  | ||||||
|         &self, |  | ||||||
|         pseudo_element: Option<&PseudoElement>, |  | ||||||
|         applicable_declarations: &mut V |  | ||||||
|     ) -> bool |  | ||||||
|     where |  | ||||||
|         V: Push<ApplicableDeclarationBlock> + VecLike<ApplicableDeclarationBlock> |  | ||||||
|     { |  | ||||||
|         self.each_xbl_stylist(|stylist| { |  | ||||||
|             stylist.push_applicable_declarations_as_xbl_only_stylist( |  | ||||||
|                 self, |  | ||||||
|                 pseudo_element, |  | ||||||
|                 applicable_declarations |  | ||||||
|             ); |  | ||||||
|         }) |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /// Gets the current existing CSS transitions, by |property, end value| pairs in a HashMap.
 |     /// Gets the current existing CSS transitions, by |property, end value| pairs in a HashMap.
 | ||||||
|     #[cfg(feature = "gecko")] |     #[cfg(feature = "gecko")] | ||||||
|     fn get_css_transitions_info(&self) |     fn get_css_transitions_info(&self) | ||||||
|  |  | ||||||
|  | @ -964,12 +964,6 @@ impl Stylist { | ||||||
|         ) |         ) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn has_rules_for_pseudo(&self, pseudo: &PseudoElement) -> bool { |  | ||||||
|         self.cascade_data |  | ||||||
|             .iter_origins() |  | ||||||
|             .any(|(d, _)| d.has_rules_for_pseudo(pseudo)) |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /// Computes the cascade inputs for a lazily-cascaded pseudo-element.
 |     /// Computes the cascade inputs for a lazily-cascaded pseudo-element.
 | ||||||
|     ///
 |     ///
 | ||||||
|     /// See the documentation on lazy pseudo-elements in
 |     /// See the documentation on lazy pseudo-elements in
 | ||||||
|  | @ -988,10 +982,6 @@ impl Stylist { | ||||||
|         let pseudo = pseudo.canonical(); |         let pseudo = pseudo.canonical(); | ||||||
|         debug_assert!(pseudo.is_lazy()); |         debug_assert!(pseudo.is_lazy()); | ||||||
| 
 | 
 | ||||||
|         if !self.has_rules_for_pseudo(&pseudo) { |  | ||||||
|             return CascadeInputs::default() |  | ||||||
|         } |  | ||||||
| 
 |  | ||||||
|         // Apply the selector flags. We should be in sequential mode
 |         // Apply the selector flags. We should be in sequential mode
 | ||||||
|         // already, so we can directly apply the parent flags.
 |         // already, so we can directly apply the parent flags.
 | ||||||
|         let mut set_selector_flags = |element: &E, flags: ElementSelectorFlags| { |         let mut set_selector_flags = |element: &E, flags: ElementSelectorFlags| { | ||||||
|  | @ -1025,10 +1015,12 @@ impl Stylist { | ||||||
|         let mut inputs = CascadeInputs::default(); |         let mut inputs = CascadeInputs::default(); | ||||||
|         let mut declarations = ApplicableDeclarationList::new(); |         let mut declarations = ApplicableDeclarationList::new(); | ||||||
|         let mut matching_context = |         let mut matching_context = | ||||||
|             MatchingContext::new(MatchingMode::ForStatelessPseudoElement, |             MatchingContext::new( | ||||||
|  |                 MatchingMode::ForStatelessPseudoElement, | ||||||
|                 None, |                 None, | ||||||
|                 None, |                 None, | ||||||
|                                  self.quirks_mode); |                 self.quirks_mode, | ||||||
|  |             ); | ||||||
| 
 | 
 | ||||||
|         self.push_applicable_declarations( |         self.push_applicable_declarations( | ||||||
|             element, |             element, | ||||||
|  | @ -1191,39 +1183,6 @@ impl Stylist { | ||||||
|         self.quirks_mode = quirks_mode; |         self.quirks_mode = quirks_mode; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// Returns the applicable CSS declarations for the given element by
 |  | ||||||
|     /// treating us as an XBL stylesheet-only stylist.
 |  | ||||||
|     pub fn push_applicable_declarations_as_xbl_only_stylist<E, V>( |  | ||||||
|         &self, |  | ||||||
|         element: &E, |  | ||||||
|         pseudo_element: Option<&PseudoElement>, |  | ||||||
|         applicable_declarations: &mut V |  | ||||||
|     ) |  | ||||||
|     where |  | ||||||
|         E: TElement, |  | ||||||
|         V: Push<ApplicableDeclarationBlock> + VecLike<ApplicableDeclarationBlock>, |  | ||||||
|     { |  | ||||||
|         let mut matching_context = |  | ||||||
|             MatchingContext::new(MatchingMode::Normal, None, None, self.quirks_mode); |  | ||||||
|         let mut dummy_flag_setter = |_: &E, _: ElementSelectorFlags| {}; |  | ||||||
| 
 |  | ||||||
|         let rule_hash_target = element.rule_hash_target(); |  | ||||||
| 
 |  | ||||||
|         // nsXBLPrototypeResources::LoadResources() loads Chrome XBL style
 |  | ||||||
|         // sheets under eAuthorSheetFeatures level.
 |  | ||||||
|         if let Some(map) = self.cascade_data.author.borrow_for_pseudo(pseudo_element) { |  | ||||||
|             map.get_all_matching_rules( |  | ||||||
|                 element, |  | ||||||
|                 &rule_hash_target, |  | ||||||
|                 applicable_declarations, |  | ||||||
|                 &mut matching_context, |  | ||||||
|                 self.quirks_mode, |  | ||||||
|                 &mut dummy_flag_setter, |  | ||||||
|                 CascadeLevel::XBL, |  | ||||||
|             ); |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /// Returns the applicable CSS declarations for the given element.
 |     /// Returns the applicable CSS declarations for the given element.
 | ||||||
|     ///
 |     ///
 | ||||||
|     /// This corresponds to `ElementRuleCollector` in WebKit.
 |     /// This corresponds to `ElementRuleCollector` in WebKit.
 | ||||||
|  | @ -1313,11 +1272,21 @@ impl Stylist { | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         // Step 3b: XBL rules.
 |         // Step 3b: XBL rules.
 | ||||||
|         let cut_off_inheritance = |         let cut_off_inheritance = element.each_xbl_stylist(|stylist| { | ||||||
|             element.get_declarations_from_xbl_bindings( |             // ServoStyleSet::CreateXBLServoStyleSet() loads XBL style sheets
 | ||||||
|                 pseudo_element, |             // under eAuthorSheetFeatures level.
 | ||||||
|  |             if let Some(map) = stylist.cascade_data.author.borrow_for_pseudo(pseudo_element) { | ||||||
|  |                 map.get_all_matching_rules( | ||||||
|  |                     element, | ||||||
|  |                     &rule_hash_target, | ||||||
|                     applicable_declarations, |                     applicable_declarations, | ||||||
|  |                     context, | ||||||
|  |                     self.quirks_mode, | ||||||
|  |                     flags_setter, | ||||||
|  |                     CascadeLevel::XBL, | ||||||
|                 ); |                 ); | ||||||
|  |             } | ||||||
|  |         }); | ||||||
| 
 | 
 | ||||||
|         if rule_hash_target.matches_user_and_author_rules() && !only_default_rules { |         if rule_hash_target.matches_user_and_author_rules() && !only_default_rules { | ||||||
|             // Gecko skips author normal rules if cutting off inheritance.
 |             // Gecko skips author normal rules if cutting off inheritance.
 | ||||||
|  | @ -2195,10 +2164,6 @@ impl CascadeData { | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn has_rules_for_pseudo(&self, pseudo: &PseudoElement) -> bool { |  | ||||||
|         self.pseudos_map.get(pseudo).is_some() |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     /// Clears the cascade data, but not the invalidation data.
 |     /// Clears the cascade data, but not the invalidation data.
 | ||||||
|     fn clear_cascade_data(&mut self) { |     fn clear_cascade_data(&mut self) { | ||||||
|         self.element_map.clear(); |         self.element_map.clear(); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Emilio Cobos Álvarez
						Emilio Cobos Álvarez