aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/components/main/layout/block.rs33
-rw-r--r--src/components/main/layout/model.rs20
2 files changed, 45 insertions, 8 deletions
diff --git a/src/components/main/layout/block.rs b/src/components/main/layout/block.rs
index 7a852dbf117..b0745e1050f 100644
--- a/src/components/main/layout/block.rs
+++ b/src/components/main/layout/block.rs
@@ -9,7 +9,7 @@ use layout::context::LayoutContext;
use layout::display_list_builder::{DisplayListBuilder, ExtraDisplayListData};
use layout::flow::{BlockFlowClass, FlowClass, FlowContext, FlowData, ImmutableFlowUtils};
use layout::flow;
-use layout::model::{MaybeAuto, Specified, Auto};
+use layout::model::{MaybeAuto, Specified, Auto, specified_or_none, specified};
use layout::float_context::{FloatContext, Invalid};
use std::cell::Cell;
@@ -391,16 +391,41 @@ impl FlowContext for BlockFlow {
let margin_bottom = MaybeAuto::from_style(style.Margin.margin_bottom,
remaining_width).specified_or_zero();
- let (width, margin_left, margin_right) =
+ let (width, maybe_margin_left, maybe_margin_right) =
(MaybeAuto::from_style(style.Box.width, remaining_width),
MaybeAuto::from_style(style.Margin.margin_left, remaining_width),
MaybeAuto::from_style(style.Margin.margin_right, remaining_width));
let (width, margin_left, margin_right) = self.compute_horiz(width,
- margin_left,
- margin_right,
+ maybe_margin_left,
+ maybe_margin_right,
available_width);
+ // If the tentative used width is greater than 'max-width', width should be recalculated,
+ // but this time using the computed value of 'max-width' as the computed value for 'width'.
+ let (width, margin_left, margin_right) = {
+ match specified_or_none(style.Box.max_width, remaining_width) {
+ Some(value) if value < width => self.compute_horiz(Specified(value),
+ maybe_margin_left,
+ maybe_margin_right,
+ available_width),
+ _ => (width, margin_left, margin_right)
+ }
+ };
+ // If the resulting width is smaller than 'min-width', width should be recalculated,
+ // but this time using the value of 'min-width' as the computed value for 'width'.
+ let (width, margin_left, margin_right) = {
+ let computed_min_width = specified(style.Box.min_width, remaining_width);
+ if computed_min_width > width {
+ self.compute_horiz(Specified(computed_min_width),
+ maybe_margin_left,
+ maybe_margin_right,
+ available_width)
+ } else {
+ (width, margin_left, margin_right)
+ }
+ };
+
model.margin.top = margin_top;
model.margin.right = margin_right;
model.margin.bottom = margin_bottom;
diff --git a/src/components/main/layout/model.rs b/src/components/main/layout/model.rs
index 1569442f63a..f44c2ce0db0 100644
--- a/src/components/main/layout/model.rs
+++ b/src/components/main/layout/model.rs
@@ -104,9 +104,21 @@ impl BoxModel {
}
pub fn compute_padding_length(&self, padding: computed::LengthOrPercentage, content_box_width: Au) -> Au {
- match padding {
- computed::LP_Length(length) => length,
- computed::LP_Percentage(p) => content_box_width.scale_by(p)
- }
+ specified(padding, content_box_width)
+ }
+}
+
+pub fn specified_or_none(length: computed::LengthOrPercentageOrNone, containing_length: Au) -> Option<Au> {
+ match length {
+ computed::LPN_None => None,
+ computed::LPN_Percentage(percent) => Some(containing_length.scale_by(percent)),
+ computed::LPN_Length(length) => Some(length),
+ }
+}
+
+pub fn specified(length: computed::LengthOrPercentage, containing_length: Au) -> Au {
+ match length {
+ computed::LP_Length(length) => length,
+ computed::LP_Percentage(p) => containing_length.scale_by(p)
}
}