| Index: third_party/WebKit/Source/core/layout/LayoutFieldset.cpp
|
| diff --git a/third_party/WebKit/Source/core/layout/LayoutFieldset.cpp b/third_party/WebKit/Source/core/layout/LayoutFieldset.cpp
|
| index 7845097c726287662a74fdaf43e36272c3b13fa4..1af7515adb104d99aa17dda22498d3289939bd56 100644
|
| --- a/third_party/WebKit/Source/core/layout/LayoutFieldset.cpp
|
| +++ b/third_party/WebKit/Source/core/layout/LayoutFieldset.cpp
|
| @@ -25,7 +25,6 @@
|
|
|
| #include "core/CSSPropertyNames.h"
|
| #include "core/HTMLNames.h"
|
| -#include "core/dom/AXObjectCache.h"
|
| #include "core/html/HTMLLegendElement.h"
|
| #include "core/paint/FieldsetPainter.h"
|
|
|
| @@ -35,79 +34,27 @@
|
|
|
| using namespace HTMLNames;
|
|
|
| -namespace {
|
| -
|
| -void setInnerBlockPadding(bool isHorizontalWritingMode, const LayoutObject* innerBlock, const LayoutUnit& padding)
|
| -{
|
| - if (isHorizontalWritingMode)
|
| - innerBlock->mutableStyleRef().setPaddingTop(Length(padding, Fixed));
|
| - else
|
| - innerBlock->mutableStyleRef().setPaddingLeft(Length(padding, Fixed));
|
| -}
|
| -
|
| -void resetInnerBlockPadding(bool isHorizontalWritingMode, const LayoutObject* innerBlock)
|
| -{
|
| - if (isHorizontalWritingMode)
|
| - innerBlock->mutableStyleRef().setPaddingTop(Length(0, Fixed));
|
| - else
|
| - innerBlock->mutableStyleRef().setPaddingLeft(Length(0, Fixed));
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| LayoutFieldset::LayoutFieldset(Element* element)
|
| - : LayoutFlexibleBox(element)
|
| - , m_innerBlock(nullptr)
|
| + : LayoutBlockFlow(element)
|
| {
|
| }
|
|
|
| -int LayoutFieldset::baselinePosition(FontBaseline baseline, bool firstLine, LineDirectionMode direction, LinePositionMode position) const
|
| +void LayoutFieldset::computePreferredLogicalWidths()
|
| {
|
| - return LayoutBlock::baselinePosition(baseline, firstLine, direction, position);
|
| -}
|
| + LayoutBlockFlow::computePreferredLogicalWidths();
|
| + if (LayoutBox* legend = findInFlowLegend()) {
|
| + int legendMinWidth = legend->minPreferredLogicalWidth();
|
|
|
| -void LayoutFieldset::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const
|
| -{
|
| - if (m_innerBlock)
|
| - computeChildPreferredLogicalWidths(*m_innerBlock, minLogicalWidth, maxLogicalWidth);
|
| + Length legendMarginLeft = legend->style()->marginLeft();
|
| + Length legendMarginRight = legend->style()->marginRight();
|
|
|
| - if (LayoutBox* legend = findInFlowLegend()) {
|
| - LayoutUnit minPreferredLegendLogicalWidth;
|
| - LayoutUnit maxPreferredLegendLogicalWidth;
|
| - computeChildPreferredLogicalWidths(*legend, minPreferredLegendLogicalWidth, maxPreferredLegendLogicalWidth);
|
| - LayoutUnit margin = marginIntrinsicLogicalWidthForChild(*legend);
|
| - minPreferredLegendLogicalWidth += margin;
|
| - maxPreferredLegendLogicalWidth += margin;
|
| - minLogicalWidth = std::max(minLogicalWidth, minPreferredLegendLogicalWidth);
|
| - maxLogicalWidth = std::max(maxLogicalWidth, maxPreferredLegendLogicalWidth);
|
| - }
|
| - maxLogicalWidth = std::max(minLogicalWidth, maxLogicalWidth);
|
| + if (legendMarginLeft.isFixed())
|
| + legendMinWidth += legendMarginLeft.value();
|
|
|
| - // Due to negative margins, it is possible that we calculated a negative intrinsic width. Make sure that we
|
| - // never return a negative width.
|
| - minLogicalWidth = std::max(LayoutUnit(), minLogicalWidth);
|
| - maxLogicalWidth = std::max(LayoutUnit(), maxLogicalWidth);
|
| + if (legendMarginRight.isFixed())
|
| + legendMinWidth += legendMarginRight.value();
|
|
|
| - LayoutUnit scrollbarWidth(scrollbarLogicalWidth());
|
| - maxLogicalWidth += scrollbarWidth;
|
| - minLogicalWidth += scrollbarWidth;
|
| -}
|
| -
|
| -void LayoutFieldset::setLogicalLeftForChild(LayoutBox& child, LayoutUnit logicalLeft)
|
| -{
|
| - if (isHorizontalWritingMode()) {
|
| - child.setX(logicalLeft);
|
| - } else {
|
| - child.setY(logicalLeft);
|
| - }
|
| -}
|
| -
|
| -void LayoutFieldset::setLogicalTopForChild(LayoutBox& child, LayoutUnit logicalTop)
|
| -{
|
| - if (isHorizontalWritingMode()) {
|
| - child.setY(logicalTop);
|
| - } else {
|
| - child.setX(logicalTop);
|
| + m_minPreferredLogicalWidth = max(m_minPreferredLogicalWidth, legendMinWidth + borderAndPaddingWidth());
|
| }
|
| }
|
|
|
| @@ -159,7 +106,6 @@
|
|
|
| LayoutUnit legendLogicalTop;
|
| LayoutUnit collapsedLegendExtent;
|
| - LayoutUnit innerBlockPadding;
|
| // FIXME: We need to account for the legend's margin before too.
|
| if (fieldsetBorderBefore > legendLogicalHeight) {
|
| // The <legend> is smaller than the associated fieldset before border
|
| @@ -168,13 +114,10 @@
|
| // Firefox completely ignores the margins in this case which seems wrong.
|
| legendLogicalTop = (fieldsetBorderBefore - legendLogicalHeight) / 2;
|
| collapsedLegendExtent = max<LayoutUnit>(fieldsetBorderBefore, legendLogicalTop + legendLogicalHeight + marginAfterForChild(*legend));
|
| - innerBlockPadding = marginAfterForChild(*legend) ? marginAfterForChild(*legend) - legendLogicalTop : LayoutUnit();
|
| } else {
|
| collapsedLegendExtent = legendLogicalHeight + marginAfterForChild(*legend);
|
| - innerBlockPadding = legendLogicalHeight - borderAfter() + marginAfterForChild(*legend);
|
| }
|
|
|
| - setInnerBlockPadding(isHorizontalWritingMode(), m_innerBlock, innerBlockPadding);
|
| setLogicalTopForChild(*legend, legendLogicalTop);
|
| setLogicalHeight(paddingBefore() + collapsedLegendExtent);
|
|
|
| @@ -210,71 +153,4 @@
|
| FieldsetPainter(*this).paintMask(paintInfo, paintOffset);
|
| }
|
|
|
| -void LayoutFieldset::styleDidChange(StyleDifference diff, const ComputedStyle* oldStyle)
|
| -{
|
| - LayoutFlexibleBox::styleDidChange(diff, oldStyle);
|
| - adjustInnerStyle();
|
| -}
|
| -
|
| -void LayoutFieldset::addChild(LayoutObject* newChild, LayoutObject* beforeChild)
|
| -{
|
| - if (!m_innerBlock)
|
| - createInnerBlock();
|
| -
|
| - if (isHTMLLegendElement(newChild->node())) {
|
| - // Let legend block to be the 2nd for correct layout positioning.
|
| - newChild->mutableStyle()->setOrder(2);
|
| - LayoutFlexibleBox::addChild(newChild, m_innerBlock);
|
| - } else {
|
| - m_innerBlock->addChild(newChild, beforeChild);
|
| - if (AXObjectCache* cache = document().existingAXObjectCache())
|
| - cache->childrenChanged(this);
|
| - }
|
| -}
|
| -
|
| -void LayoutFieldset::adjustInnerStyle()
|
| -{
|
| - if (!m_innerBlock)
|
| - createInnerBlock();
|
| -
|
| - ComputedStyle& innerStyle = m_innerBlock->mutableStyleRef();
|
| - innerStyle.setFlexShrink(1.0f);
|
| - innerStyle.setFlexGrow(1.0f);
|
| - // min-width: 0; is needed for correct shrinking.
|
| - innerStyle.setMinWidth(Length(0, Fixed));
|
| - innerStyle.setFlexDirection(style()->flexDirection());
|
| - innerStyle.setJustifyContent(style()->justifyContent());
|
| - innerStyle.setFlexWrap(style()->flexWrap());
|
| - innerStyle.setAlignItems(style()->alignItems());
|
| - innerStyle.setAlignContent(style()->alignContent());
|
| - // Let anonymous block to be the 1st for correct layout positioning.
|
| - innerStyle.setOrder(1);
|
| -}
|
| -
|
| -void LayoutFieldset::createInnerBlock()
|
| -{
|
| - if (m_innerBlock) {
|
| - DCHECK(firstChild() == m_innerBlock);
|
| - return;
|
| - }
|
| - m_innerBlock = createAnonymousBlock(style()->display());
|
| - LayoutFlexibleBox::addChild(m_innerBlock);
|
| -}
|
| -
|
| -void LayoutFieldset::removeChild(LayoutObject* oldChild)
|
| -{
|
| - if (isHTMLLegendElement(oldChild->node())) {
|
| - LayoutFlexibleBox::removeChild(oldChild);
|
| - if (m_innerBlock)
|
| - resetInnerBlockPadding(isHorizontalWritingMode(), m_innerBlock);
|
| - } else if (oldChild == m_innerBlock) {
|
| - LayoutFlexibleBox::removeChild(oldChild);
|
| - m_innerBlock = nullptr;
|
| - } else if (oldChild->parent() == this) {
|
| - LayoutFlexibleBox::removeChild(oldChild);
|
| - } else if (m_innerBlock) {
|
| - m_innerBlock->removeChild(oldChild);
|
| - }
|
| -}
|
| -
|
| } // namespace blink
|
|
|