Index: third_party/WebKit/Source/core/layout/LayoutMenuList.cpp |
diff --git a/third_party/WebKit/Source/core/layout/LayoutMenuList.cpp b/third_party/WebKit/Source/core/layout/LayoutMenuList.cpp |
index 7638c263e6adbf7391ce3099e7506b5619687518..2ac6a02cab55f1961cf548de77efea9222c5cdb3 100644 |
--- a/third_party/WebKit/Source/core/layout/LayoutMenuList.cpp |
+++ b/third_party/WebKit/Source/core/layout/LayoutMenuList.cpp |
@@ -153,11 +153,14 @@ void LayoutMenuList::styleDidChange(StyleDifference diff, const ComputedStyle* o |
bool fontChanged = !oldStyle || oldStyle->font() != style()->font(); |
if (fontChanged) |
- updateOptionsHeightWidth(); |
+ m_optionsChanged = true; |
} |
-void LayoutMenuList::updateOptionsHeightWidth() |
+void LayoutMenuList::updateOptionsHeightWidth() const |
{ |
+ if (!m_optionsChanged) |
+ return; |
+ |
float maxOptionHeight = 0; |
float maxOptionWidth = 0; |
const HeapVector<Member<HTMLElement>>& listItems = selectElement()->listItems(); |
@@ -191,24 +194,16 @@ void LayoutMenuList::updateOptionsHeightWidth() |
} |
} |
- int height = static_cast<int>(ceilf(maxOptionHeight)); |
- int width = static_cast<int>(ceilf(maxOptionWidth)); |
- if (m_optionsWidth == width && m_optionsHeight == height) |
- return; |
- |
- auto invalidationReason = LayoutInvalidationReason::Unknown; |
- if (m_optionsWidth != width) { |
- m_optionsWidth = width; |
- invalidationReason = LayoutInvalidationReason::MenuWidthChanged; |
- } |
- |
- if (m_optionsHeight != height) { |
- m_optionsHeight = height; |
- invalidationReason = LayoutInvalidationReason::MenuHeightChanged; |
- } |
+ m_optionsWidth = static_cast<int>(ceilf(maxOptionWidth)); |
+ m_optionsHeight = static_cast<int>(ceilf(maxOptionHeight)); |
+ m_optionsChanged = false; |
+} |
- if (parent()) |
- setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(invalidationReason); |
+void LayoutMenuList::setOptionsChanged(bool changed) |
+{ |
+ m_optionsChanged = changed; |
+ if (changed && parent()) |
+ setNeedsLayoutAndPrefWidthsRecalcAndFullPaintInvalidation(LayoutInvalidationReason::MenuOptionsChanged); |
} |
float LayoutMenuList::computeTextHeight(const TextRun& textRun, const ComputedStyle& computedStyle) const |
@@ -225,16 +220,6 @@ float LayoutMenuList::computeTextWidth(const TextRun& textRun, const ComputedSty |
void LayoutMenuList::updateFromElement() |
{ |
- if (m_optionsChanged) { |
- updateOptionsHeightWidth(); |
- m_optionsChanged = false; |
- } |
- |
- updateText(); |
-} |
- |
-void LayoutMenuList::updateText() |
-{ |
setTextFromOption(selectElement()->optionIndexToBeShown()); |
} |
@@ -329,6 +314,7 @@ LayoutRect LayoutMenuList::controlClipRect(const LayoutPoint& additionalOffset) |
void LayoutMenuList::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, LayoutUnit& maxLogicalWidth) const |
{ |
+ updateOptionsHeightWidth(); |
maxLogicalWidth = std::max(m_optionsWidth, LayoutTheme::theme().minimumMenuListSize(styleRef())) + m_innerBlock->paddingLeft() + m_innerBlock->paddingRight(); |
if (!style()->width().hasPercent()) |
minLogicalWidth = maxLogicalWidth; |
@@ -337,6 +323,7 @@ void LayoutMenuList::computeIntrinsicLogicalWidths(LayoutUnit& minLogicalWidth, |
void LayoutMenuList::computeLogicalHeight(LayoutUnit logicalHeight, LayoutUnit logicalTop, |
LogicalExtentComputedValues& computedValues) const |
{ |
+ updateOptionsHeightWidth(); |
logicalHeight = LayoutUnit(m_optionsHeight) + borderAndPaddingHeight() |
+ LayoutUnit(cInnerBlockVerticalPaddingEm * style()->computedFontSize()); |
LayoutBox::computeLogicalHeight(logicalHeight, logicalTop, computedValues); |