aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout/fragment.rs
diff options
context:
space:
mode:
authorEmilio Cobos Álvarez <ecoal95@gmail.com>2016-09-26 12:10:48 +0200
committerEmilio Cobos Álvarez <ecoal95@gmail.com>2016-10-02 17:57:07 +0200
commitbdf1d179bae0541f53259dc28e5b4bbadaeef47c (patch)
treec68a2907ec0c3e1e1f87b2c69b465815a903d6b9 /components/layout/fragment.rs
parent3dddb70038deb4a4f41ae5aa6dcbbbfc3cb58a7f (diff)
downloadservo-bdf1d179bae0541f53259dc28e5b4bbadaeef47c.tar.gz
servo-bdf1d179bae0541f53259dc28e5b4bbadaeef47c.zip
layout: Use the fragment's writing mode when computing sizes relevant to that fragment.
Otherwise we might mix writing modes. Not totally sure this change is correct in the case we're mixing them, we might need to just not checking that operation.
Diffstat (limited to 'components/layout/fragment.rs')
-rw-r--r--components/layout/fragment.rs20
1 files changed, 14 insertions, 6 deletions
diff --git a/components/layout/fragment.rs b/components/layout/fragment.rs
index f7f46d2fdcc..db5fd265690 100644
--- a/components/layout/fragment.rs
+++ b/components/layout/fragment.rs
@@ -1155,8 +1155,14 @@ impl Fragment {
match self.inline_context {
None => style_border_width,
Some(ref inline_fragment_context) => {
+ // NOTE: We can have nodes with different writing mode inside
+ // the inline fragment context, so we need to overwrite the
+ // writing mode to compute the child logical sizes.
+ let writing_mode = self.style.writing_mode;
+
inline_fragment_context.nodes.iter().fold(style_border_width, |accumulator, node| {
- let mut this_border_width = node.style.logical_border_width();
+ let mut this_border_width =
+ node.style.border_width_for_writing_mode(writing_mode);
if !node.flags.contains(FIRST_FRAGMENT_OF_ELEMENT) {
this_border_width.inline_start = Au(0)
}
@@ -1289,7 +1295,7 @@ impl Fragment {
SpecificFragmentInfo::TableRow |
SpecificFragmentInfo::TableWrapper |
SpecificFragmentInfo::InlineBlock(_) => LogicalMargin::zero(self.style.writing_mode),
- _ => model::padding_from_style(self.style(), containing_block_inline_size),
+ _ => model::padding_from_style(self.style(), containing_block_inline_size, self.style().writing_mode),
};
// Compute padding from the inline fragment context.
@@ -1301,9 +1307,10 @@ impl Fragment {
LogicalMargin::zero(self.style.writing_mode)
}
(_, &Some(ref inline_fragment_context)) => {
- let zero_padding = LogicalMargin::zero(self.style.writing_mode);
+ let writing_mode = self.style.writing_mode;
+ let zero_padding = LogicalMargin::zero(writing_mode);
inline_fragment_context.nodes.iter().fold(zero_padding, |accumulator, node| {
- let mut padding = model::padding_from_style(&*node.style, Au(0));
+ let mut padding = model::padding_from_style(&*node.style, Au(0), writing_mode);
if !node.flags.contains(FIRST_FRAGMENT_OF_ELEMENT) {
padding.inline_start = Au(0)
}
@@ -1529,11 +1536,12 @@ impl Fragment {
// Take borders and padding for parent inline fragments into account, if necessary.
if self.is_primary_fragment() {
+ let writing_mode = self.style.writing_mode;
if let Some(ref context) = self.inline_context {
for node in &context.nodes {
let mut border_width = node.style.logical_border_width();
- let mut padding = model::padding_from_style(&*node.style, Au(0));
- let mut margin = model::specified_margin_from_style(&*node.style);
+ let mut padding = model::padding_from_style(&*node.style, Au(0), writing_mode);
+ let mut margin = model::specified_margin_from_style(&*node.style, writing_mode);
if !node.flags.contains(FIRST_FRAGMENT_OF_ELEMENT) {
border_width.inline_start = Au(0);
padding.inline_start = Au(0);