| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "core/layout/ng/ng_absolute_utils.h" | 5 #include "core/layout/ng/ng_absolute_utils.h" |
| 6 | 6 |
| 7 #include "core/layout/ng/ng_constraint_space.h" | 7 #include "core/layout/ng/ng_constraint_space.h" |
| 8 #include "core/layout/ng/ng_length_utils.h" | 8 #include "core/layout/ng/ng_length_utils.h" |
| 9 #include "core/style/ComputedStyle.h" | 9 #include "core/style/ComputedStyle.h" |
| 10 #include "platform/LengthFunctions.h" | 10 #include "platform/LengthFunctions.h" |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 50 child_minmax.has_value() ? child_minmax->max_content : LayoutUnit(); | 50 child_minmax.has_value() ? child_minmax->max_content : LayoutUnit(); |
| 51 return ResolveBlockLength(space, style, height, computed_height, | 51 return ResolveBlockLength(space, style, height, computed_height, |
| 52 resolve_type); | 52 resolve_type); |
| 53 } | 53 } |
| 54 | 54 |
| 55 // Implement absolute horizontal size resolution algorithm. | 55 // Implement absolute horizontal size resolution algorithm. |
| 56 // https://www.w3.org/TR/css-position-3/#abs-non-replaced-width | 56 // https://www.w3.org/TR/css-position-3/#abs-non-replaced-width |
| 57 void ComputeAbsoluteHorizontal( | 57 void ComputeAbsoluteHorizontal( |
| 58 const NGConstraintSpace& space, | 58 const NGConstraintSpace& space, |
| 59 const ComputedStyle& style, | 59 const ComputedStyle& style, |
| 60 const Optional<LayoutUnit>& incoming_width, |
| 60 const NGStaticPosition& static_position, | 61 const NGStaticPosition& static_position, |
| 61 const Optional<MinAndMaxContentSizes>& child_minmax, | 62 const Optional<MinAndMaxContentSizes>& child_minmax, |
| 62 NGAbsolutePhysicalPosition* position) { | 63 NGAbsolutePhysicalPosition* position) { |
| 63 NGLogicalSize percentage_logical = space.PercentageResolutionSize(); | 64 NGLogicalSize percentage_logical = space.PercentageResolutionSize(); |
| 64 NGPhysicalSize percentage_physical = | 65 NGPhysicalSize percentage_physical = |
| 65 percentage_logical.ConvertToPhysical(space.WritingMode()); | 66 percentage_logical.ConvertToPhysical(space.WritingMode()); |
| 66 LayoutUnit border_left(style.borderLeftWidth()); | 67 LayoutUnit border_left(style.borderLeftWidth()); |
| 67 LayoutUnit border_right(style.borderRightWidth()); | 68 LayoutUnit border_right(style.borderRightWidth()); |
| 68 LayoutUnit padding_left = | 69 LayoutUnit padding_left = |
| 69 valueForLength(style.paddingLeft(), percentage_logical.inline_size); | 70 valueForLength(style.paddingLeft(), percentage_logical.inline_size); |
| 70 LayoutUnit padding_right = | 71 LayoutUnit padding_right = |
| 71 valueForLength(style.paddingRight(), percentage_logical.inline_size); | 72 valueForLength(style.paddingRight(), percentage_logical.inline_size); |
| 72 Optional<LayoutUnit> margin_left; | 73 Optional<LayoutUnit> margin_left; |
| 73 if (!style.marginLeft().isAuto()) | 74 if (!style.marginLeft().isAuto()) |
| 74 margin_left = | 75 margin_left = |
| 75 valueForLength(style.marginLeft(), percentage_logical.inline_size); | 76 valueForLength(style.marginLeft(), percentage_logical.inline_size); |
| 76 Optional<LayoutUnit> margin_right; | 77 Optional<LayoutUnit> margin_right; |
| 77 if (!style.marginRight().isAuto()) | 78 if (!style.marginRight().isAuto()) |
| 78 margin_right = | 79 margin_right = |
| 79 valueForLength(style.marginRight(), percentage_logical.inline_size); | 80 valueForLength(style.marginRight(), percentage_logical.inline_size); |
| 80 Optional<LayoutUnit> left; | 81 Optional<LayoutUnit> left; |
| 81 if (!style.left().isAuto()) | 82 if (!style.left().isAuto()) |
| 82 left = valueForLength(style.left(), percentage_physical.width); | 83 left = valueForLength(style.left(), percentage_physical.width); |
| 83 Optional<LayoutUnit> right; | 84 Optional<LayoutUnit> right; |
| 84 if (!style.right().isAuto()) | 85 if (!style.right().isAuto()) |
| 85 right = valueForLength(style.right(), percentage_physical.width); | 86 right = valueForLength(style.right(), percentage_physical.width); |
| 86 LayoutUnit border_padding = | 87 LayoutUnit border_padding = |
| 87 border_left + border_right + padding_left + padding_right; | 88 border_left + border_right + padding_left + padding_right; |
| 88 Optional<LayoutUnit> min_width; | 89 Optional<LayoutUnit> width = incoming_width; |
| 89 if (!style.minWidth().isAuto()) | |
| 90 min_width = ResolveWidth(style.minWidth(), space, style, child_minmax, | |
| 91 LengthResolveType::kMinSize); | |
| 92 Optional<LayoutUnit> max_width; | |
| 93 if (!style.maxWidth().isMaxSizeNone()) | |
| 94 max_width = ResolveWidth(style.maxWidth(), space, style, child_minmax, | |
| 95 LengthResolveType::kMaxSize); | |
| 96 Optional<LayoutUnit> width; | |
| 97 if (!style.width().isAuto()) { | |
| 98 width = ResolveWidth(style.width(), space, style, child_minmax, | |
| 99 LengthResolveType::kContentSize); | |
| 100 width = ConstrainByMinMax(*width, min_width, max_width); | |
| 101 } | |
| 102 NGPhysicalSize container_size = | 90 NGPhysicalSize container_size = |
| 103 space.AvailableSize().ConvertToPhysical(space.WritingMode()); | 91 space.AvailableSize().ConvertToPhysical(space.WritingMode()); |
| 104 DCHECK(container_size.width != NGSizeIndefinite); | 92 DCHECK(container_size.width != NGSizeIndefinite); |
| 105 | 93 |
| 106 // Solving the equation: | 94 // Solving the equation: |
| 107 // left + marginLeft + width + marginRight + right = container width | 95 // left + marginLeft + width + marginRight + right = container width |
| 108 if (!left && !right && !width) { | 96 if (!left && !right && !width) { |
| 109 // Standard: "If all three of left, width, and right are auto:" | 97 // Standard: "If all three of left, width, and right are auto:" |
| 110 if (!margin_left) | 98 if (!margin_left) |
| 111 margin_left = LayoutUnit(); | 99 margin_left = LayoutUnit(); |
| 112 if (!margin_right) | 100 if (!margin_right) |
| 113 margin_right = LayoutUnit(); | 101 margin_right = LayoutUnit(); |
| 114 DCHECK(child_minmax.has_value()); | 102 DCHECK(child_minmax.has_value()); |
| 115 width = child_minmax->ShrinkToFit(container_size.width); | 103 width = child_minmax->ShrinkToFit(container_size.width); |
| 116 width = ConstrainByMinMax(*width, min_width, max_width); | |
| 117 if (space.Direction() == TextDirection::kLtr) { | 104 if (space.Direction() == TextDirection::kLtr) { |
| 118 left = static_position.LeftPosition(container_size.width, *width, | 105 left = static_position.LeftPosition(container_size.width, *width, |
| 119 *margin_left, *margin_right); | 106 *margin_left, *margin_right); |
| 120 } else { | 107 } else { |
| 121 right = static_position.RightPosition(container_size.width, *width, | 108 right = static_position.RightPosition(container_size.width, *width, |
| 122 *margin_left, *margin_right); | 109 *margin_left, *margin_right); |
| 123 } | 110 } |
| 124 } else if (left && right && width) { | 111 } else if (left && right && width) { |
| 125 // Standard: "If left, right, and width are not auto:" | 112 // Standard: "If left, right, and width are not auto:" |
| 126 // Compute margins. | 113 // Compute margins. |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 162 margin_left = LayoutUnit(); | 149 margin_left = LayoutUnit(); |
| 163 if (!margin_right) | 150 if (!margin_right) |
| 164 margin_right = LayoutUnit(); | 151 margin_right = LayoutUnit(); |
| 165 | 152 |
| 166 // Rules 1 through 3, 2 out of 3 are unknown. | 153 // Rules 1 through 3, 2 out of 3 are unknown. |
| 167 if (!left && !width) { | 154 if (!left && !width) { |
| 168 // Rule 1: left/width are unknown. | 155 // Rule 1: left/width are unknown. |
| 169 DCHECK(right.has_value()); | 156 DCHECK(right.has_value()); |
| 170 DCHECK(child_minmax.has_value()); | 157 DCHECK(child_minmax.has_value()); |
| 171 width = child_minmax->ShrinkToFit(container_size.width); | 158 width = child_minmax->ShrinkToFit(container_size.width); |
| 172 width = ConstrainByMinMax(*width, min_width, max_width); | |
| 173 } else if (!left && !right) { | 159 } else if (!left && !right) { |
| 174 // Rule 2. | 160 // Rule 2. |
| 175 DCHECK(width.has_value()); | 161 DCHECK(width.has_value()); |
| 176 if (space.Direction() == TextDirection::kLtr) | 162 if (space.Direction() == TextDirection::kLtr) |
| 177 left = static_position.LeftPosition(container_size.width, *width, | 163 left = static_position.LeftPosition(container_size.width, *width, |
| 178 *margin_left, *margin_right); | 164 *margin_left, *margin_right); |
| 179 else | 165 else |
| 180 right = static_position.RightPosition(container_size.width, *width, | 166 right = static_position.RightPosition(container_size.width, *width, |
| 181 *margin_left, *margin_right); | 167 *margin_left, *margin_right); |
| 182 } else if (!width && !right) { | 168 } else if (!width && !right) { |
| 183 // Rule 3. | 169 // Rule 3. |
| 184 DCHECK(child_minmax.has_value()); | 170 DCHECK(child_minmax.has_value()); |
| 185 width = child_minmax->ShrinkToFit(container_size.width); | 171 width = child_minmax->ShrinkToFit(container_size.width); |
| 186 width = ConstrainByMinMax(*width, min_width, max_width); | |
| 187 } | 172 } |
| 188 | 173 |
| 189 // Rules 4 through 6, 1 out of 3 are unknown. | 174 // Rules 4 through 6, 1 out of 3 are unknown. |
| 190 if (!left) { | 175 if (!left) { |
| 191 left = | 176 left = |
| 192 container_size.width - *right - *width - *margin_left - *margin_right; | 177 container_size.width - *right - *width - *margin_left - *margin_right; |
| 193 } else if (!right) { | 178 } else if (!right) { |
| 194 right = | 179 right = |
| 195 container_size.width - *left - *width - *margin_left - *margin_right; | 180 container_size.width - *left - *width - *margin_left - *margin_right; |
| 196 } else if (!width) { | 181 } else if (!width) { |
| 197 width = | 182 width = |
| 198 container_size.width - *left - *right - *margin_left - *margin_right; | 183 container_size.width - *left - *right - *margin_left - *margin_right; |
| 199 } | 184 } |
| 200 DCHECK_EQ(container_size.width, | 185 DCHECK_EQ(container_size.width, |
| 201 *left + *right + *margin_left + *margin_right + *width); | 186 *left + *right + *margin_left + *margin_right + *width); |
| 202 | 187 |
| 203 width = ConstrainByMinMax(*width, min_width, max_width); | 188 // If calculated width is outside of min/max constraints, |
| 189 // rerun the algorithm with constrained width. |
| 190 Optional<LayoutUnit> min_width; |
| 191 if (!style.minWidth().isAuto()) |
| 192 min_width = ResolveWidth(style.minWidth(), space, style, child_minmax, |
| 193 LengthResolveType::kMinSize); |
| 194 Optional<LayoutUnit> max_width; |
| 195 if (!style.maxWidth().isMaxSizeNone()) |
| 196 max_width = ResolveWidth(style.maxWidth(), space, style, child_minmax, |
| 197 LengthResolveType::kMaxSize); |
| 198 if (width != ConstrainByMinMax(*width, min_width, max_width)) { |
| 199 width = ConstrainByMinMax(*width, min_width, max_width); |
| 200 // Because this function only changes "width" when it's not already |
| 201 // set, it is safe to recursively call ourselves here because on the |
| 202 // second call it is guaranteed to be within min..max. |
| 203 ComputeAbsoluteHorizontal(space, style, width, static_position, |
| 204 child_minmax, position); |
| 205 return; |
| 206 } |
| 207 |
| 204 // Negative widths are not allowed. | 208 // Negative widths are not allowed. |
| 205 width = std::max(*width, border_padding); | 209 width = std::max(*width, border_padding); |
| 206 | 210 |
| 207 position->inset.left = *left + *margin_left; | 211 position->inset.left = *left + *margin_left; |
| 208 position->inset.right = *right + *margin_right; | 212 position->inset.right = *right + *margin_right; |
| 209 position->size.width = *width; | 213 position->size.width = *width; |
| 210 } | 214 } |
| 211 | 215 |
| 212 // Implements absolute vertical size resolution algorithm. | 216 // Implements absolute vertical size resolution algorithm. |
| 213 // https://www.w3.org/TR/css-position-3/#abs-non-replaced-height | 217 // https://www.w3.org/TR/css-position-3/#abs-non-replaced-height |
| 214 void ComputeAbsoluteVertical( | 218 void ComputeAbsoluteVertical( |
| 215 const NGConstraintSpace& space, | 219 const NGConstraintSpace& space, |
| 216 const ComputedStyle& style, | 220 const ComputedStyle& style, |
| 221 const Optional<LayoutUnit>& incoming_height, |
| 217 const NGStaticPosition& static_position, | 222 const NGStaticPosition& static_position, |
| 218 const Optional<MinAndMaxContentSizes>& child_minmax, | 223 const Optional<MinAndMaxContentSizes>& child_minmax, |
| 219 NGAbsolutePhysicalPosition* position) { | 224 NGAbsolutePhysicalPosition* position) { |
| 220 NGLogicalSize percentage_logical = space.PercentageResolutionSize(); | 225 NGLogicalSize percentage_logical = space.PercentageResolutionSize(); |
| 221 NGPhysicalSize percentage_physical = | 226 NGPhysicalSize percentage_physical = |
| 222 percentage_logical.ConvertToPhysical(space.WritingMode()); | 227 percentage_logical.ConvertToPhysical(space.WritingMode()); |
| 223 | 228 |
| 224 LayoutUnit border_top(style.borderTopWidth()); | 229 LayoutUnit border_top(style.borderTopWidth()); |
| 225 LayoutUnit border_bottom(style.borderBottomWidth()); | 230 LayoutUnit border_bottom(style.borderBottomWidth()); |
| 226 LayoutUnit padding_top = | 231 LayoutUnit padding_top = |
| 227 valueForLength(style.paddingTop(), percentage_logical.inline_size); | 232 valueForLength(style.paddingTop(), percentage_logical.inline_size); |
| 228 LayoutUnit padding_bottom = | 233 LayoutUnit padding_bottom = |
| 229 valueForLength(style.paddingBottom(), percentage_logical.inline_size); | 234 valueForLength(style.paddingBottom(), percentage_logical.inline_size); |
| 230 Optional<LayoutUnit> margin_top; | 235 Optional<LayoutUnit> margin_top; |
| 231 if (!style.marginTop().isAuto()) | 236 if (!style.marginTop().isAuto()) |
| 232 margin_top = | 237 margin_top = |
| 233 valueForLength(style.marginTop(), percentage_logical.inline_size); | 238 valueForLength(style.marginTop(), percentage_logical.inline_size); |
| 234 Optional<LayoutUnit> margin_bottom; | 239 Optional<LayoutUnit> margin_bottom; |
| 235 if (!style.marginBottom().isAuto()) | 240 if (!style.marginBottom().isAuto()) |
| 236 margin_bottom = | 241 margin_bottom = |
| 237 valueForLength(style.marginBottom(), percentage_logical.inline_size); | 242 valueForLength(style.marginBottom(), percentage_logical.inline_size); |
| 238 Optional<LayoutUnit> top; | 243 Optional<LayoutUnit> top; |
| 239 if (!style.top().isAuto()) | 244 if (!style.top().isAuto()) |
| 240 top = valueForLength(style.top(), percentage_physical.height); | 245 top = valueForLength(style.top(), percentage_physical.height); |
| 241 Optional<LayoutUnit> bottom; | 246 Optional<LayoutUnit> bottom; |
| 242 if (!style.bottom().isAuto()) | 247 if (!style.bottom().isAuto()) |
| 243 bottom = valueForLength(style.bottom(), percentage_physical.height); | 248 bottom = valueForLength(style.bottom(), percentage_physical.height); |
| 244 LayoutUnit border_padding = | 249 LayoutUnit border_padding = |
| 245 border_top + border_bottom + padding_top + padding_bottom; | 250 border_top + border_bottom + padding_top + padding_bottom; |
| 246 | 251 Optional<LayoutUnit> height = incoming_height; |
| 247 Optional<LayoutUnit> min_height; | |
| 248 if (!style.minHeight().isAuto()) | |
| 249 min_height = ResolveHeight(style.minHeight(), space, style, child_minmax, | |
| 250 LengthResolveType::kMinSize); | |
| 251 Optional<LayoutUnit> max_height; | |
| 252 if (!style.maxHeight().isMaxSizeNone()) | |
| 253 max_height = ResolveHeight(style.maxHeight(), space, style, child_minmax, | |
| 254 LengthResolveType::kMaxSize); | |
| 255 Optional<LayoutUnit> height; | |
| 256 if (!style.height().isAuto()) { | |
| 257 height = ResolveHeight(style.height(), space, style, child_minmax, | |
| 258 LengthResolveType::kContentSize); | |
| 259 height = ConstrainByMinMax(*height, min_height, max_height); | |
| 260 } | |
| 261 | 252 |
| 262 NGPhysicalSize container_size = | 253 NGPhysicalSize container_size = |
| 263 space.AvailableSize().ConvertToPhysical(space.WritingMode()); | 254 space.AvailableSize().ConvertToPhysical(space.WritingMode()); |
| 264 DCHECK(container_size.height != NGSizeIndefinite); | 255 DCHECK(container_size.height != NGSizeIndefinite); |
| 265 | 256 |
| 266 // Solving the equation: | 257 // Solving the equation: |
| 267 // top + marginTop + height + marginBottom + bottom | 258 // top + marginTop + height + marginBottom + bottom |
| 268 // + border_padding = container height | 259 // + border_padding = container height |
| 269 if (!top && !bottom && !height) { | 260 if (!top && !bottom && !height) { |
| 270 // Standard: "If all three of top, height, and bottom are auto:" | 261 // Standard: "If all three of top, height, and bottom are auto:" |
| 271 if (!margin_top) | 262 if (!margin_top) |
| 272 margin_top = LayoutUnit(); | 263 margin_top = LayoutUnit(); |
| 273 if (!margin_bottom) | 264 if (!margin_bottom) |
| 274 margin_bottom = LayoutUnit(); | 265 margin_bottom = LayoutUnit(); |
| 275 DCHECK(child_minmax.has_value()); | 266 DCHECK(child_minmax.has_value()); |
| 276 height = child_minmax->ShrinkToFit(container_size.height); | 267 height = child_minmax->ShrinkToFit(container_size.height); |
| 277 height = ConstrainByMinMax(*height, min_height, max_height); | |
| 278 top = static_position.TopPosition(container_size.height, *height, | 268 top = static_position.TopPosition(container_size.height, *height, |
| 279 *margin_top, *margin_bottom); | 269 *margin_top, *margin_bottom); |
| 280 } else if (top && bottom && height) { | 270 } else if (top && bottom && height) { |
| 281 // Standard: "If top, bottom, and height are not auto:" | 271 // Standard: "If top, bottom, and height are not auto:" |
| 282 // Compute margins. | 272 // Compute margins. |
| 283 LayoutUnit margin_space = container_size.height - *top - *bottom - *height; | 273 LayoutUnit margin_space = container_size.height - *top - *bottom - *height; |
| 284 // When both margins are auto. | 274 // When both margins are auto. |
| 285 if (!margin_top && !margin_bottom) { | 275 if (!margin_top && !margin_bottom) { |
| 286 if (margin_space > 0) { | 276 if (margin_space > 0) { |
| 287 margin_top = margin_space / 2; | 277 margin_top = margin_space / 2; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 307 margin_top = LayoutUnit(); | 297 margin_top = LayoutUnit(); |
| 308 if (!margin_bottom) | 298 if (!margin_bottom) |
| 309 margin_bottom = LayoutUnit(); | 299 margin_bottom = LayoutUnit(); |
| 310 | 300 |
| 311 // Rules 1 through 3, 2 out of 3 are unknown, fix 1. | 301 // Rules 1 through 3, 2 out of 3 are unknown, fix 1. |
| 312 if (!top && !height) { | 302 if (!top && !height) { |
| 313 // Rule 1. | 303 // Rule 1. |
| 314 DCHECK(bottom.has_value()); | 304 DCHECK(bottom.has_value()); |
| 315 DCHECK(child_minmax.has_value()); | 305 DCHECK(child_minmax.has_value()); |
| 316 height = child_minmax->ShrinkToFit(container_size.height); | 306 height = child_minmax->ShrinkToFit(container_size.height); |
| 317 height = ConstrainByMinMax(*height, min_height, max_height); | |
| 318 } else if (!top && !bottom) { | 307 } else if (!top && !bottom) { |
| 319 // Rule 2. | 308 // Rule 2. |
| 320 DCHECK(height.has_value()); | 309 DCHECK(height.has_value()); |
| 321 top = static_position.TopPosition(container_size.height, *height, | 310 top = static_position.TopPosition(container_size.height, *height, |
| 322 *margin_top, *margin_bottom); | 311 *margin_top, *margin_bottom); |
| 323 } else if (!height && !bottom) { | 312 } else if (!height && !bottom) { |
| 324 // Rule 3. | 313 // Rule 3. |
| 325 DCHECK(child_minmax.has_value()); | 314 DCHECK(child_minmax.has_value()); |
| 326 height = child_minmax->ShrinkToFit(container_size.height); | 315 height = child_minmax->ShrinkToFit(container_size.height); |
| 327 height = ConstrainByMinMax(*height, min_height, max_height); | |
| 328 } | 316 } |
| 329 | 317 |
| 330 // Rules 4 through 6, 1 out of 3 are unknown. | 318 // Rules 4 through 6, 1 out of 3 are unknown. |
| 331 if (!top) { | 319 if (!top) { |
| 332 top = container_size.height - *bottom - *height - *margin_top - | 320 top = container_size.height - *bottom - *height - *margin_top - |
| 333 *margin_bottom; | 321 *margin_bottom; |
| 334 } else if (!bottom) { | 322 } else if (!bottom) { |
| 335 bottom = | 323 bottom = |
| 336 container_size.height - *top - *height - *margin_top - *margin_bottom; | 324 container_size.height - *top - *height - *margin_top - *margin_bottom; |
| 337 } else if (!height) { | 325 } else if (!height) { |
| 338 height = | 326 height = |
| 339 container_size.height - *top - *bottom - *margin_top - *margin_bottom; | 327 container_size.height - *top - *bottom - *margin_top - *margin_bottom; |
| 340 } | 328 } |
| 341 DCHECK_EQ(container_size.height, | 329 DCHECK_EQ(container_size.height, |
| 342 *top + *bottom + *margin_top + *margin_bottom + *height); | 330 *top + *bottom + *margin_top + *margin_bottom + *height); |
| 343 | 331 |
| 344 height = ConstrainByMinMax(*height, min_height, max_height); | 332 // If calculated height is outside of min/max constraints, |
| 333 // rerun the algorithm with constrained width. |
| 334 Optional<LayoutUnit> min_height; |
| 335 if (!style.minHeight().isAuto()) |
| 336 min_height = ResolveHeight(style.minHeight(), space, style, child_minmax, |
| 337 LengthResolveType::kMinSize); |
| 338 Optional<LayoutUnit> max_height; |
| 339 if (!style.maxHeight().isMaxSizeNone()) |
| 340 max_height = ResolveHeight(style.maxHeight(), space, style, child_minmax, |
| 341 LengthResolveType::kMaxSize); |
| 342 if (height != ConstrainByMinMax(*height, min_height, max_height)) { |
| 343 height = ConstrainByMinMax(*height, min_height, max_height); |
| 344 // Because this function only changes "height" when it's not already |
| 345 // set, it is safe to recursively call ourselves here because on the |
| 346 // second call it is guaranteed to be within min..max. |
| 347 ComputeAbsoluteVertical(space, style, height, static_position, child_minmax, |
| 348 position); |
| 349 return; |
| 350 } |
| 345 // Negative heights are not allowed. | 351 // Negative heights are not allowed. |
| 346 height = std::max(*height, border_padding); | 352 height = std::max(*height, border_padding); |
| 347 | 353 |
| 348 position->inset.top = *top + *margin_top; | 354 position->inset.top = *top + *margin_top; |
| 349 position->inset.bottom = *bottom + *margin_bottom; | 355 position->inset.bottom = *bottom + *margin_bottom; |
| 350 position->size.height = *height; | 356 position->size.height = *height; |
| 351 } | 357 } |
| 352 | 358 |
| 353 } // namespace | 359 } // namespace |
| 354 | 360 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 383 return (contains_absolute && position == AbsolutePosition) || | 389 return (contains_absolute && position == AbsolutePosition) || |
| 384 (contains_fixed && position == FixedPosition); | 390 (contains_fixed && position == FixedPosition); |
| 385 } | 391 } |
| 386 | 392 |
| 387 NGAbsolutePhysicalPosition ComputePartialAbsoluteWithChildInlineSize( | 393 NGAbsolutePhysicalPosition ComputePartialAbsoluteWithChildInlineSize( |
| 388 const NGConstraintSpace& space, | 394 const NGConstraintSpace& space, |
| 389 const ComputedStyle& style, | 395 const ComputedStyle& style, |
| 390 const NGStaticPosition& static_position, | 396 const NGStaticPosition& static_position, |
| 391 const Optional<MinAndMaxContentSizes>& child_minmax) { | 397 const Optional<MinAndMaxContentSizes>& child_minmax) { |
| 392 NGAbsolutePhysicalPosition position; | 398 NGAbsolutePhysicalPosition position; |
| 393 if (style.isHorizontalWritingMode()) | 399 if (style.isHorizontalWritingMode()) { |
| 394 ComputeAbsoluteHorizontal(space, style, static_position, child_minmax, | 400 Optional<LayoutUnit> width; |
| 395 &position); | 401 if (!style.width().isAuto()) { |
| 396 else { | 402 width = ResolveWidth(style.width(), space, style, child_minmax, |
| 397 ComputeAbsoluteVertical(space, style, static_position, child_minmax, | 403 LengthResolveType::kContentSize); |
| 404 } |
| 405 ComputeAbsoluteHorizontal(space, style, width, static_position, |
| 406 child_minmax, &position); |
| 407 } else { |
| 408 Optional<LayoutUnit> height; |
| 409 if (!style.height().isAuto()) { |
| 410 height = ResolveHeight(style.height(), space, style, child_minmax, |
| 411 LengthResolveType::kContentSize); |
| 412 } |
| 413 ComputeAbsoluteVertical(space, style, height, static_position, child_minmax, |
| 398 &position); | 414 &position); |
| 399 } | 415 } |
| 400 return position; | 416 return position; |
| 401 } | 417 } |
| 402 | 418 |
| 403 void ComputeFullAbsoluteWithChildBlockSize( | 419 void ComputeFullAbsoluteWithChildBlockSize( |
| 404 const NGConstraintSpace& space, | 420 const NGConstraintSpace& space, |
| 405 const ComputedStyle& style, | 421 const ComputedStyle& style, |
| 406 const NGStaticPosition& static_position, | 422 const NGStaticPosition& static_position, |
| 407 const Optional<LayoutUnit>& child_block_size, | 423 const Optional<LayoutUnit>& child_block_size, |
| 408 NGAbsolutePhysicalPosition* position) { | 424 NGAbsolutePhysicalPosition* position) { |
| 409 // After partial size has been computed, child block size is either | 425 // After partial size has been computed, child block size is either |
| 410 // unknown, or fully computed, there is no minmax. | 426 // unknown, or fully computed, there is no minmax. |
| 411 // To express this, a 'fixed' minmax is created where | 427 // To express this, a 'fixed' minmax is created where |
| 412 // min and max are the same. | 428 // min and max are the same. |
| 413 Optional<MinAndMaxContentSizes> child_minmax; | 429 Optional<MinAndMaxContentSizes> child_minmax; |
| 414 if (child_block_size.has_value()) { | 430 if (child_block_size.has_value()) { |
| 415 child_minmax = MinAndMaxContentSizes{*child_block_size, *child_block_size}; | 431 child_minmax = MinAndMaxContentSizes{*child_block_size, *child_block_size}; |
| 416 } | 432 } |
| 417 if (style.isHorizontalWritingMode()) | 433 if (style.isHorizontalWritingMode()) { |
| 418 ComputeAbsoluteVertical(space, style, static_position, child_minmax, | 434 Optional<LayoutUnit> height; |
| 435 if (!style.height().isAuto()) { |
| 436 height = ResolveHeight(style.height(), space, style, child_minmax, |
| 437 LengthResolveType::kContentSize); |
| 438 } |
| 439 ComputeAbsoluteVertical(space, style, height, static_position, child_minmax, |
| 419 position); | 440 position); |
| 420 else { | 441 } else { |
| 421 ComputeAbsoluteHorizontal(space, style, static_position, child_minmax, | 442 Optional<LayoutUnit> width; |
| 422 position); | 443 if (!style.width().isAuto()) { |
| 444 width = ResolveWidth(style.width(), space, style, child_minmax, |
| 445 LengthResolveType::kContentSize); |
| 446 } |
| 447 ComputeAbsoluteHorizontal(space, style, width, static_position, |
| 448 child_minmax, position); |
| 423 } | 449 } |
| 424 } | 450 } |
| 425 | 451 |
| 426 } // namespace blink | 452 } // namespace blink |
| OLD | NEW |