Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(291)

Unified Diff: third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp

Issue 2712773003: Fix precedence of relative position in vertical modes. (Closed)
Patch Set: Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp
diff --git a/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp b/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp
index 144633cb36b4defe52d6961fdc5144f94d550701..af961730037c3c25647fa2d6c951ccbbb68b5d1d 100644
--- a/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutBoxModelObject.cpp
@@ -745,19 +745,36 @@ LayoutSize LayoutBoxModelObject::relativePositionOffset() const {
// be resolved using the available width of the containing block. Therefore we
// don't use containingBlockLogicalWidthForContent() here, but instead
// explicitly call availableWidth on our containing block.
- if (!style()->left().isAuto()) {
- if (!style()->right().isAuto() &&
- !containingBlock->style()->isLeftToRightDirection())
- offset.setWidth(
- -valueForLength(style()->right(), containingBlock->availableWidth()));
- else
- offset.expand(
- valueForLength(style()->left(), containingBlock->availableWidth()),
- LayoutUnit());
- } else if (!style()->right().isAuto()) {
- offset.expand(
- -valueForLength(style()->right(), containingBlock->availableWidth()),
- LayoutUnit());
+ // https://drafts.csswg.org/css-position-3/#rel-pos
+ Optional<LayoutUnit> left;
+ Optional<LayoutUnit> right;
+ if (!style()->left().isAuto())
+ left = valueForLength(style()->left(), containingBlock->availableWidth());
+ if (!style()->right().isAuto())
+ right = valueForLength(style()->right(), containingBlock->availableWidth());
+ if (!left && !right) {
+ left = LayoutUnit();
+ right = LayoutUnit();
+ }
+ if (!left)
+ left = -right.value();
+ if (!right)
+ right = -left.value();
+ bool isLtr = containingBlock->style()->isLeftToRightDirection();
+ WritingMode writingMode = containingBlock->style()->getWritingMode();
+ switch (writingMode) {
+ case WritingMode::kHorizontalTb:
+ if (isLtr)
+ offset.expand(left.value(), LayoutUnit());
+ else
+ offset.setWidth(-right.value());
+ break;
+ case WritingMode::kVerticalRl:
+ offset.setWidth(-right.value());
+ break;
+ case WritingMode::kVerticalLr:
+ offset.expand(left.value(), LayoutUnit());
+ break;
}
// If the containing block of a relatively positioned element does not specify
@@ -766,22 +783,47 @@ LayoutSize LayoutBoxModelObject::relativePositionOffset() const {
// <html> and <body> assume the size of the viewport. In this case, calculate
// the percent offset based on this height.
// See <https://bugs.webkit.org/show_bug.cgi?id=26396>.
+
+ Optional<LayoutUnit> top;
+ Optional<LayoutUnit> bottom;
if (!style()->top().isAuto() &&
(!containingBlock->hasAutoHeightOrContainingBlockWithAutoHeight() ||
!style()->top().isPercentOrCalc() ||
- containingBlock->stretchesToViewport()))
- offset.expand(
- LayoutUnit(),
- valueForLength(style()->top(), containingBlock->availableHeight()));
-
- else if (!style()->bottom().isAuto() &&
- (!containingBlock->hasAutoHeightOrContainingBlockWithAutoHeight() ||
- !style()->bottom().isPercentOrCalc() ||
- containingBlock->stretchesToViewport()))
- offset.expand(
- LayoutUnit(),
- -valueForLength(style()->bottom(), containingBlock->availableHeight()));
-
+ containingBlock->stretchesToViewport())) {
+ top = valueForLength(style()->top(), containingBlock->availableHeight());
+ }
+ if (!style()->bottom().isAuto() &&
+ (!containingBlock->hasAutoHeightOrContainingBlockWithAutoHeight() ||
+ !style()->bottom().isPercentOrCalc() ||
+ containingBlock->stretchesToViewport())) {
+ bottom =
+ valueForLength(style()->bottom(), containingBlock->availableHeight());
+ }
+ if (!top && !bottom) {
+ top = LayoutUnit();
+ bottom = LayoutUnit();
+ }
+ if (!top)
+ top = -bottom.value();
+ if (!bottom)
+ bottom = -top.value();
+ switch (writingMode) {
+ case WritingMode::kHorizontalTb:
+ offset.expand(LayoutUnit(), top.value());
+ break;
+ case WritingMode::kVerticalRl:
+ if (isLtr)
+ offset.expand(LayoutUnit(), top.value());
+ else
+ offset.setHeight(-bottom.value());
+ break;
+ case WritingMode::kVerticalLr:
+ if (isLtr)
+ offset.expand(LayoutUnit(), top.value());
+ else
+ offset.setHeight(-bottom.value());
+ break;
+ }
return offset;
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698