diff options
author | Patrick Walton <pcwalton@mimiga.net> | 2015-08-13 09:49:40 -0700 |
---|---|---|
committer | Patrick Walton <pcwalton@mimiga.net> | 2015-09-03 10:24:59 -0700 |
commit | ee8741b7a8d7313a3ad1ea6ef81cebf7cb262891 (patch) | |
tree | bf12a7adb6f5cfb485a535342601e0c5cbfbed81 /components/layout/inline.rs | |
parent | 3f9b6f8586b60929ccbfe1cf51b84887ef711b77 (diff) | |
download | servo-ee8741b7a8d7313a3ad1ea6ef81cebf7cb262891.tar.gz servo-ee8741b7a8d7313a3ad1ea6ef81cebf7cb262891.zip |
layout: Fix several bugs relating to inline borders, padding, and
margins.
* The code that attempted to strip out borders that span multiple
fragments in the same element could go wrong if fragments were
stripped out due to text clumping or whitespace stripping. This patch
rewrites that code to maintain flags in the inline fragment context
specifying whether the node is the beginning or end of the element.
Not only is this easier to maintain, it's closer in spirit to what roc
originally suggested two years ago: it's isomorphic to "begin element,
end element" markers for inline layout.
* Padding and margins for spans containing inline-blocks are now
properly handled via a division of labor between the `InlineBlock`
fragment and the `BlockFlow` that represents the inline-block.
* Unscanned text fragments may not be joined together into a text run if
borders, padding, or margins separate them.
Because Servo now matches the rendering of Gecko and WebKit on the
`input_button_margins_a` reftest, I had to modify it to add some
vertical alignment.
The combined effect of all of these fixes places "Advertising" on the
right place on google.com.
Diffstat (limited to 'components/layout/inline.rs')
-rw-r--r-- | components/layout/inline.rs | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/components/layout/inline.rs b/components/layout/inline.rs index 51739ede4c8..6066b4a8473 100644 --- a/components/layout/inline.rs +++ b/components/layout/inline.rs @@ -1666,6 +1666,8 @@ impl Flow for InlineFlow { .early_absolute_position_info .relative_containing_block_mode, CoordinateSystem::Parent); + let stacking_relative_content_box = + fragment.stacking_relative_content_box(&stacking_relative_border_box); let clip = fragment.clipping_region_for_children(&self.base.clip, &stacking_relative_border_box, false); @@ -1689,7 +1691,7 @@ impl Flow for InlineFlow { } block_flow.base.stacking_relative_position = - stacking_relative_border_box.origin; + stacking_relative_content_box.origin; block_flow.base.stacking_relative_position_of_display_port = self.base.stacking_relative_position_of_display_port; } @@ -1817,6 +1819,20 @@ pub struct InlineFragmentNodeInfo { pub address: OpaqueNode, pub style: Arc<ComputedValues>, pub pseudo: PseudoElementType<()>, + pub flags: InlineFragmentNodeFlags, +} + +bitflags! { + flags InlineFragmentNodeFlags: u8 { + const FIRST_FRAGMENT_OF_ELEMENT = 0x01, + const LAST_FRAGMENT_OF_ELEMENT = 0x02, + } +} + +impl fmt::Debug for InlineFragmentNodeInfo { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{:?}", self.flags.bits()) + } } #[derive(Clone)] |