diff options
author | Xidorn Quan <me@upsuper.org> | 2017-07-18 08:38:26 +1000 |
---|---|---|
committer | Xidorn Quan <me@upsuper.org> | 2017-07-18 14:13:12 +1000 |
commit | bae59d45204668ef16b646b62fc71eea0559ad9a (patch) | |
tree | 9d0b30ee06926f9b9a221069b924791fde6c8f80 | |
parent | d746abaa9e69e6cf0ad187d2b46be661bbe03a9f (diff) | |
download | servo-bae59d45204668ef16b646b62fc71eea0559ad9a.tar.gz servo-bae59d45204668ef16b646b62fc71eea0559ad9a.zip |
Adjust display value for ::-moz-fieldset-content when parent is flex/grid.
-rw-r--r-- | components/style/gecko/pseudo_element.rs | 6 | ||||
-rw-r--r-- | components/style/properties/properties.mako.rs | 3 | ||||
-rw-r--r-- | components/style/style_adjuster.rs | 26 | ||||
-rw-r--r-- | ports/geckolib/glue.rs | 13 |
4 files changed, 44 insertions, 4 deletions
diff --git a/components/style/gecko/pseudo_element.rs b/components/style/gecko/pseudo_element.rs index 564a288b448..97ce0f4e5a1 100644 --- a/components/style/gecko/pseudo_element.rs +++ b/components/style/gecko/pseudo_element.rs @@ -83,6 +83,12 @@ impl PseudoElement { *self == PseudoElement::FirstLetter } + /// Whether this pseudo-element is ::-moz-fieldset-content. + #[inline] + pub fn is_fieldset_content(&self) -> bool { + *self == PseudoElement::FieldsetContent + } + /// Whether this pseudo-element is lazily-cascaded. #[inline] pub fn is_lazy(&self) -> bool { diff --git a/components/style/properties/properties.mako.rs b/components/style/properties/properties.mako.rs index 43248e0feae..b04f03547a1 100644 --- a/components/style/properties/properties.mako.rs +++ b/components/style/properties/properties.mako.rs @@ -2668,6 +2668,9 @@ bitflags! { /// is used by Gecko to prevent display:contents on generated /// content. const PROHIBIT_DISPLAY_CONTENTS = 0x10, + + /// Whether we're styling the ::-moz-fieldset-content anonymous box. + const IS_FIELDSET_CONTENT = 0x20, } } diff --git a/components/style/style_adjuster.rs b/components/style/style_adjuster.rs index 9b4d8a69551..72c4e675c8b 100644 --- a/components/style/style_adjuster.rs +++ b/components/style/style_adjuster.rs @@ -291,6 +291,31 @@ impl<'a, 'b: 'a> StyleAdjuster<'a, 'b> { self.style.mutate_box().set_display(display::inline); } + /// If a <fieldset> has grid/flex display type, we need to inherit + /// this type into its ::-moz-fieldset-content anonymous box. + #[cfg(feature = "gecko")] + fn adjust_for_fieldset_content(&mut self, + layout_parent_style: &ComputedValuesInner, + flags: CascadeFlags) { + use properties::IS_FIELDSET_CONTENT; + if !flags.contains(IS_FIELDSET_CONTENT) { + return; + } + debug_assert_eq!(self.style.get_box().clone_display(), display::block); + // TODO We actually want style from parent rather than layout + // parent, so that this fixup doesn't happen incorrectly when + // when <fieldset> has "display: contents". + let parent_display = layout_parent_style.get_box().clone_display(); + let new_display = match parent_display { + display::flex | display::inline_flex => Some(display::flex), + display::grid | display::inline_grid => Some(display::grid), + _ => None, + }; + if let Some(new_display) = new_display { + self.style.mutate_box().set_display(new_display); + } + } + /// -moz-center, -moz-left and -moz-right are used for HTML's alignment. /// /// This is covering the <div align="right"><table>...</table></div> case. @@ -412,6 +437,7 @@ impl<'a, 'b: 'a> StyleAdjuster<'a, 'b> { #[cfg(feature = "gecko")] { self.adjust_for_prohibited_display_contents(flags); + self.adjust_for_fieldset_content(layout_parent_style, flags); } self.adjust_for_top_layer(); self.blockify_if_necessary(layout_parent_style, flags); diff --git a/ports/geckolib/glue.rs b/ports/geckolib/glue.rs index be2cf878d80..abfd5abe508 100644 --- a/ports/geckolib/glue.rs +++ b/ports/geckolib/glue.rs @@ -91,9 +91,11 @@ use style::invalidation::element::restyle_hints::{self, RestyleHint}; use style::media_queries::{MediaList, parse_media_query_list}; use style::parallel; use style::parser::ParserContext; -use style::properties::{ComputedValues, ComputedValuesInner, Importance, SourcePropertyDeclaration}; -use style::properties::{LonghandIdSet, PropertyDeclaration, PropertyDeclarationBlock, PropertyId, StyleBuilder}; -use style::properties::{SKIP_ROOT_AND_ITEM_BASED_DISPLAY_FIXUP, PseudoInfo, ParentStyleContextInfo}; +use style::properties::{ComputedValues, ComputedValuesInner, Importance}; +use style::properties::{IS_FIELDSET_CONTENT, LonghandIdSet}; +use style::properties::{ParentStyleContextInfo, PseudoInfo}; +use style::properties::{PropertyDeclaration, PropertyDeclarationBlock, PropertyId}; +use style::properties::{SKIP_ROOT_AND_ITEM_BASED_DISPLAY_FIXUP, SourcePropertyDeclaration, StyleBuilder}; use style::properties::animated_properties::{Animatable, AnimatableLonghand, AnimationValue}; use style::properties::parse_one_declaration_into; use style::rule_tree::StyleSource; @@ -1514,7 +1516,10 @@ pub extern "C" fn Servo_ComputedValues_GetForAnonymousBox(parent_style_or_null: let pseudo = PseudoElement::from_anon_box_atom(&atom) .expect("Not an anon box pseudo?"); - let cascade_flags = SKIP_ROOT_AND_ITEM_BASED_DISPLAY_FIXUP; + let mut cascade_flags = SKIP_ROOT_AND_ITEM_BASED_DISPLAY_FIXUP; + if pseudo.is_fieldset_content() { + cascade_flags.insert(IS_FIELDSET_CONTENT); + } let metrics = get_metrics_provider_for_product(); data.stylist.precomputed_values_for_pseudo(&guards, &pseudo, parent_style_or_null.map(|x| &**x), cascade_flags, &metrics, |