InlineFlow should always inherit text-width from base style

Fixes #222.
This commit is contained in:
Daniel Hedlund 2013-12-07 07:59:41 -08:00
parent c168e04fe1
commit 555e04475e
4 changed files with 46 additions and 14 deletions

View file

@ -579,22 +579,10 @@ impl InlineFlow {
}
/// Sets box X positions based on alignment for one line.
fn set_horizontal_box_positions(boxes: &[Box], line: &LineBox) {
fn set_horizontal_box_positions(boxes: &[Box], line: &LineBox, linebox_align: text_align::T) {
// Figure out how much width we have.
let slack_width = Au::max(Au(0), line.green_zone.width - line.bounds.size.width);
// Get the text alignment.
//
// TODO(burg, issue #222): use 'text-align' property from `InlineFlow`'s block container,
// not from the style of the first box child.
let linebox_align = if line.range.begin() < boxes.len() {
let first_box = &boxes[line.range.begin()];
first_box.style().Text.text_align
} else {
// Nothing to lay out, so assume left alignment.
text_align::left
};
// Set the box x positions based on that alignment.
let mut offset_x = line.bounds.origin.x;
offset_x = offset_x + match linebox_align {
@ -712,10 +700,13 @@ impl Flow for InlineFlow {
let mut line_height_offset = Au::new(0);
// All lines use text alignment from base (non-inline) node
let text_align = self.base.node.style().get().Text.text_align;
// Now, go through each line and lay out the boxes inside.
for line in self.lines.mut_iter() {
// Lay out boxes horizontally.
InlineFlow::set_horizontal_box_positions(self.boxes, line);
InlineFlow::set_horizontal_box_positions(self.boxes, line, text_align);
// Set the top y position of the current linebox.
// `line_height_offset` is updated at the end of the previous loop.

View file

@ -18,3 +18,4 @@
== border_style_none_a.html border_style_none_b.html
== acid1_a.html acid1_b.html
== text_decoration_propagation_a.html text_decoration_propagation_b.html
== inline_text_align_a.html inline_text_align_b.html

View file

@ -0,0 +1,24 @@
<html>
<head>
<style>
.right {
text-align: right;
}
.left {
text-align: left;
}
.inline {
display: inline;
}
</style>
</head>
<body>
<div class="right">
<span class="left"> <!-- should ignore 'text-align' of inline elements -->
<div class="inline left"> <!-- ... and those explicitly defined as inline -->
<span>hello, wide world</span>
</span>
</span>
</div>
</body>
</html>

View file

@ -0,0 +1,16 @@
<html>
<head>
<style>
.right {
text-align: right;
}
</style>
</head>
<body>
<div class="right">
<span class="right">
hello, wide world
</span>
</div>
</body>
</html>