diff options
Diffstat (limited to 'components')
-rw-r--r-- | components/layout/construct.rs | 15 | ||||
-rw-r--r-- | components/style/properties.mako.rs | 13 |
2 files changed, 23 insertions, 5 deletions
diff --git a/components/layout/construct.rs b/components/layout/construct.rs index 5976045e740..0e57bd13d1a 100644 --- a/components/layout/construct.rs +++ b/components/layout/construct.rs @@ -673,11 +673,13 @@ impl<'a> FlowConstructor<'a> { fn build_flow_for_block_like(&mut self, flow: FlowRef, node: &ThreadSafeLayoutNode) -> ConstructionResult { let mut initial_fragments = IntermediateInlineFragments::new(); - if node.get_pseudo_element_type() != PseudoElementType::Normal || + let node_is_input_or_text_area = node.type_id() == Some(NodeTypeId::Element(ElementTypeId::HTMLElement( HTMLElementTypeId::HTMLInputElement))) || node.type_id() == Some(NodeTypeId::Element(ElementTypeId::HTMLElement( - HTMLElementTypeId::HTMLTextAreaElement))) { + HTMLElementTypeId::HTMLTextAreaElement))); + if node.get_pseudo_element_type() != PseudoElementType::Normal || + node_is_input_or_text_area { // A TextArea's text contents are displayed through the input text // box, so don't construct them. if node.type_id() == Some(NodeTypeId::Element(ElementTypeId::HTMLElement( @@ -687,9 +689,12 @@ impl<'a> FlowConstructor<'a> { } } - self.create_fragments_for_node_text_content(&mut initial_fragments, - node, - &*node.style()); + let mut style = node.style().clone(); + if node_is_input_or_text_area { + properties::modify_style_for_input_text(&mut style); + } + + self.create_fragments_for_node_text_content(&mut initial_fragments, node, &style) } self.build_flow_for_block_starting_with_fragments(flow, node, initial_fragments) diff --git a/components/style/properties.mako.rs b/components/style/properties.mako.rs index 93b73fecf65..fd22abbaf02 100644 --- a/components/style/properties.mako.rs +++ b/components/style/properties.mako.rs @@ -6518,6 +6518,19 @@ pub fn modify_style_for_text(style: &mut Arc<ComputedValues>) { } } +/// Adjusts the `margin` property as necessary to account for the text of an `input` element. +/// +/// Margins apply to the `input` element itself, so including them in the text will cause them to +/// be double-counted. +pub fn modify_style_for_input_text(style: &mut Arc<ComputedValues>) { + let mut style = Arc::make_unique(style); + let margin_style = Arc::make_unique(&mut style.margin); + margin_style.margin_top = computed::LengthOrPercentageOrAuto::Length(Au(0)); + margin_style.margin_right = computed::LengthOrPercentageOrAuto::Length(Au(0)); + margin_style.margin_bottom = computed::LengthOrPercentageOrAuto::Length(Au(0)); + margin_style.margin_left = computed::LengthOrPercentageOrAuto::Length(Au(0)); +} + pub fn is_supported_property(property: &str) -> bool { match_ignore_ascii_case! { property, % for property in SHORTHANDS + LONGHANDS[:-1]: |