Diff
Modified: trunk/Source/WebCore/ChangeLog (159033 => 159034)
--- trunk/Source/WebCore/ChangeLog 2013-11-11 00:13:11 UTC (rev 159033)
+++ trunk/Source/WebCore/ChangeLog 2013-11-11 00:22:38 UTC (rev 159034)
@@ -1,3 +1,17 @@
+2013-11-10 Sam Weinig <s...@webkit.org>
+
+ Reduce the size of RenderBlockFlow by making its rare data inherit from RenderBlockRareData
+ https://bugs.webkit.org/show_bug.cgi?id=124124
+
+ Reviewed by Anders Carlsson.
+
+ Reduce RenderBlockFlow by one word.
+
+ * rendering/RenderBlock.cpp:
+ * rendering/RenderBlock.h:
+ * rendering/RenderBlockFlow.cpp:
+ * rendering/RenderBlockFlow.h:
+
2013-11-10 Antti Koivisto <an...@apple.com>
Use start/end instead of textOffset/textLength for simple text runs
Modified: trunk/Source/WebCore/rendering/RenderBlock.cpp (159033 => 159034)
--- trunk/Source/WebCore/rendering/RenderBlock.cpp 2013-11-11 00:13:11 UTC (rev 159033)
+++ trunk/Source/WebCore/rendering/RenderBlock.cpp 2013-11-11 00:22:38 UTC (rev 159034)
@@ -46,6 +46,7 @@
#include "OverflowEvent.h"
#include "Page.h"
#include "PaintInfo.h"
+#include "RenderBlockFlow.h"
#include "RenderBoxRegionInfo.h"
#include "RenderCombineText.h"
#include "RenderDeprecatedFlexibleBox.h"
@@ -4918,22 +4919,24 @@
void RenderBlock::setPaginationStrut(LayoutUnit strut)
{
- if (!m_rareData) {
+ if (!hasRareData()) {
if (!strut)
return;
- m_rareData = adoptPtr(new RenderBlockRareData());
+ materializeRareData();
}
- m_rareData->m_paginationStrut = strut;
+
+ rareData()->m_paginationStrut = strut;
}
void RenderBlock::setPageLogicalOffset(LayoutUnit logicalOffset)
{
- if (!m_rareData) {
+ if (!hasRareData()) {
if (!logicalOffset)
return;
- m_rareData = adoptPtr(new RenderBlockRareData());
+ materializeRareData();
}
- m_rareData->m_pageLogicalOffset = logicalOffset;
+
+ rareData()->m_pageLogicalOffset = logicalOffset;
}
void RenderBlock::absoluteRects(Vector<IntRect>& rects, const LayoutPoint& accumulatedOffset) const
@@ -5540,4 +5543,23 @@
}
#endif // ENABLE(IOS_TEXT_AUTOSIZING)
+RenderBlock::RenderBlockRareData& RenderBlock::ensureRareData()
+{
+ if (hasRareData())
+ return *m_rareData;
+
+ materializeRareData();
+ return *m_rareData;
+}
+
+void RenderBlock::materializeRareData()
+{
+ ASSERT(!hasRareData());
+
+ if (isRenderBlockFlow())
+ m_rareData = std::make_unique<RenderBlockFlow::RenderBlockFlowRareData>(toRenderBlockFlow(*this));
+ else
+ m_rareData = std::make_unique<RenderBlock::RenderBlockRareData>();
+}
+
} // namespace WebCore
Modified: trunk/Source/WebCore/rendering/RenderBlock.h (159033 => 159034)
--- trunk/Source/WebCore/rendering/RenderBlock.h 2013-11-11 00:13:11 UTC (rev 159033)
+++ trunk/Source/WebCore/rendering/RenderBlock.h 2013-11-11 00:22:38 UTC (rev 159034)
@@ -299,12 +299,12 @@
unsigned columnCount(ColumnInfo*) const;
LayoutRect columnRectAt(ColumnInfo*, unsigned) const;
- LayoutUnit paginationStrut() const { return m_rareData ? m_rareData->m_paginationStrut : LayoutUnit(); }
+ LayoutUnit paginationStrut() const { return hasRareData() ? rareData()->m_paginationStrut : LayoutUnit(); }
void setPaginationStrut(LayoutUnit);
// The page logical offset is the object's offset from the top of the page in the page progression
// direction (so an x-offset in vertical text and a y-offset for horizontal text).
- LayoutUnit pageLogicalOffset() const { return m_rareData ? m_rareData->m_pageLogicalOffset : LayoutUnit(); }
+ LayoutUnit pageLogicalOffset() const { return hasRareData() ? rareData()->m_pageLogicalOffset : LayoutUnit(); }
void setPageLogicalOffset(LayoutUnit);
// Accessors for logical width/height and margins in the containing block's block-flow direction.
@@ -393,22 +393,20 @@
#if ENABLE(CSS_SHAPES)
ShapeInsideInfo* ensureShapeInsideInfo()
{
- if (!m_rareData || !m_rareData->m_shapeInsideInfo)
+ if (!hasRareData() || !rareData()->m_shapeInsideInfo)
setShapeInsideInfo(ShapeInsideInfo::createInfo(this));
- return m_rareData->m_shapeInsideInfo.get();
+ return rareData()->m_shapeInsideInfo.get();
}
ShapeInsideInfo* shapeInsideInfo() const
{
- if (!m_rareData || !m_rareData->m_shapeInsideInfo)
- return 0;
- return ShapeInsideInfo::isEnabledFor(this) ? m_rareData->m_shapeInsideInfo.get() : 0;
+ if (!hasRareData() || !rareData()->m_shapeInsideInfo)
+ return nullptr;
+ return ShapeInsideInfo::isEnabledFor(this) ? rareData()->m_shapeInsideInfo.get() : nullptr;
}
void setShapeInsideInfo(PassOwnPtr<ShapeInsideInfo> value)
{
- if (!m_rareData)
- m_rareData = adoptPtr(new RenderBlockRareData());
- m_rareData->m_shapeInsideInfo = value;
+ ensureRareData().m_shapeInsideInfo = value;
}
void markShapeInsideDescendantsForLayout();
ShapeInsideInfo* layoutShapeInsideInfo() const;
@@ -674,16 +672,25 @@
{
}
+ virtual ~RenderBlockRareData()
+ {
+ }
+
LayoutUnit m_paginationStrut;
LayoutUnit m_pageLogicalOffset;
#if ENABLE(CSS_SHAPES)
OwnPtr<ShapeInsideInfo> m_shapeInsideInfo;
#endif
- };
+ };
+ bool hasRareData() const { return m_rareData.get(); }
+ RenderBlockRareData* rareData() const { ASSERT_WITH_SECURITY_IMPLICATION(hasRareData()); return m_rareData.get(); }
+ RenderBlockRareData& ensureRareData();
+ void materializeRareData();
+
protected:
- OwnPtr<RenderBlockRareData> m_rareData;
+ std::unique_ptr<RenderBlockRareData> m_rareData;
mutable signed m_lineHeight : 25;
unsigned m_hasMarginBeforeQuirk : 1; // Note these quirk values can't be put in RenderBlockRareData since they are set too frequently.
Modified: trunk/Source/WebCore/rendering/RenderBlockFlow.cpp (159033 => 159034)
--- trunk/Source/WebCore/rendering/RenderBlockFlow.cpp 2013-11-11 00:13:11 UTC (rev 159033)
+++ trunk/Source/WebCore/rendering/RenderBlockFlow.cpp 2013-11-11 00:22:38 UTC (rev 159034)
@@ -1172,24 +1172,26 @@
void RenderBlockFlow::setMaxMarginBeforeValues(LayoutUnit pos, LayoutUnit neg)
{
- if (!m_rareData) {
+ if (!hasRareData()) {
if (pos == RenderBlockFlowRareData::positiveMarginBeforeDefault(*this) && neg == RenderBlockFlowRareData::negativeMarginBeforeDefault(*this))
return;
- m_rareData = adoptPtr(new RenderBlockFlowRareData(*this));
+ materializeRareData();
}
- m_rareData->m_margins.setPositiveMarginBefore(pos);
- m_rareData->m_margins.setNegativeMarginBefore(neg);
+
+ rareData()->m_margins.setPositiveMarginBefore(pos);
+ rareData()->m_margins.setNegativeMarginBefore(neg);
}
void RenderBlockFlow::setMaxMarginAfterValues(LayoutUnit pos, LayoutUnit neg)
{
- if (!m_rareData) {
+ if (!hasRareData()) {
if (pos == RenderBlockFlowRareData::positiveMarginAfterDefault(*this) && neg == RenderBlockFlowRareData::negativeMarginAfterDefault(*this))
return;
- m_rareData = adoptPtr(new RenderBlockFlowRareData(*this));
+ materializeRareData();
}
- m_rareData->m_margins.setPositiveMarginAfter(pos);
- m_rareData->m_margins.setNegativeMarginAfter(neg);
+
+ rareData()->m_margins.setPositiveMarginAfter(pos);
+ rareData()->m_margins.setNegativeMarginAfter(neg);
}
void RenderBlockFlow::setMustDiscardMarginBefore(bool value)
@@ -1198,14 +1200,14 @@
ASSERT(value);
return;
}
-
- if (!m_rareData && !value)
- return;
- if (!m_rareData)
- m_rareData = adoptPtr(new RenderBlockFlowRareData(*this));
+ if (!hasRareData()) {
+ if (!value)
+ return;
+ materializeRareData();
+ }
- m_rareData->m_discardMarginBefore = value;
+ rareData()->m_discardMarginBefore = value;
}
void RenderBlockFlow::setMustDiscardMarginAfter(bool value)
@@ -1215,23 +1217,23 @@
return;
}
- if (!m_rareData && !value)
- return;
+ if (!hasRareData()) {
+ if (!value)
+ return;
+ materializeRareData();
+ }
- if (!m_rareData)
- m_rareData = adoptPtr(new RenderBlockFlowRareData(*this));
-
- m_rareData->m_discardMarginAfter = value;
+ rareData()->m_discardMarginAfter = value;
}
bool RenderBlockFlow::mustDiscardMarginBefore() const
{
- return style().marginBeforeCollapse() == MDISCARD || (m_rareData && m_rareData->m_discardMarginBefore);
+ return style().marginBeforeCollapse() == MDISCARD || (hasRareData() && rareData()->m_discardMarginBefore);
}
bool RenderBlockFlow::mustDiscardMarginAfter() const
{
- return style().marginAfterCollapse() == MDISCARD || (m_rareData && m_rareData->m_discardMarginAfter);
+ return style().marginAfterCollapse() == MDISCARD || (hasRareData() && rareData()->m_discardMarginAfter);
}
bool RenderBlockFlow::mustDiscardMarginBeforeForChild(const RenderBox& child) const
@@ -1517,37 +1519,34 @@
void RenderBlockFlow::setBreakAtLineToAvoidWidow(int lineToBreak)
{
ASSERT(lineToBreak >= 0);
- if (!m_rareData)
- m_rareData = adoptPtr(new RenderBlockFlowRareData(*this));
-
- ASSERT(!m_rareData->m_didBreakAtLineToAvoidWidow);
- m_rareData->m_lineBreakToAvoidWidow = lineToBreak;
+ ASSERT(!ensureRareData().m_didBreakAtLineToAvoidWidow);
+ ensureRareData().m_lineBreakToAvoidWidow = lineToBreak;
}
void RenderBlockFlow::setDidBreakAtLineToAvoidWidow()
{
ASSERT(!shouldBreakAtLineToAvoidWidow());
- if (!m_rareData)
+ if (!hasRareData())
return;
- m_rareData->m_didBreakAtLineToAvoidWidow = true;
+ rareData()->m_didBreakAtLineToAvoidWidow = true;
}
void RenderBlockFlow::clearDidBreakAtLineToAvoidWidow()
{
- if (!m_rareData)
+ if (!hasRareData())
return;
- m_rareData->m_didBreakAtLineToAvoidWidow = false;
+ rareData()->m_didBreakAtLineToAvoidWidow = false;
}
void RenderBlockFlow::clearShouldBreakAtLineToAvoidWidow() const
{
ASSERT(shouldBreakAtLineToAvoidWidow());
- if (!m_rareData)
+ if (!hasRareData())
return;
- m_rareData->m_lineBreakToAvoidWidow = -1;
+ rareData()->m_lineBreakToAvoidWidow = -1;
}
bool RenderBlockFlow::relayoutToAvoidWidows(LayoutStateMaintainer& statePusher)
@@ -2823,16 +2822,6 @@
rareData.m_renderNamedFlowFragment = flowFragment;
}
-// FIXME: Use this function in more places.
-RenderBlockFlow::RenderBlockFlowRareData& RenderBlockFlow::ensureRareData()
-{
- if (m_rareData)
- return *m_rareData;
-
- m_rareData = adoptPtr(new RenderBlockFlowRareData(*this));
- return *m_rareData;
-}
-
static bool shouldCheckLines(RenderObject& obj)
{
return !obj.isFloatingOrOutOfFlowPositioned() && !obj.isRunIn() && obj.isRenderBlockFlow() && obj.style().height().isAuto() && (!obj.isDeprecatedFlexibleBox() || obj.style().boxOrient() == VERTICAL);
Modified: trunk/Source/WebCore/rendering/RenderBlockFlow.h (159033 => 159034)
--- trunk/Source/WebCore/rendering/RenderBlockFlow.h 2013-11-11 00:13:11 UTC (rev 159033)
+++ trunk/Source/WebCore/rendering/RenderBlockFlow.h 2013-11-11 00:22:38 UTC (rev 159034)
@@ -71,7 +71,8 @@
, m_negativeMarginBefore(beforeNeg)
, m_positiveMarginAfter(afterPos)
, m_negativeMarginAfter(afterNeg)
- { }
+ {
+ }
LayoutUnit positiveMarginBefore() const { return m_positiveMarginBefore; }
LayoutUnit negativeMarginBefore() const { return m_negativeMarginBefore; }
@@ -92,7 +93,7 @@
MarginValues marginValuesForChild(RenderBox& child) const;
// Allocated only when some of these fields have non-default values
- struct RenderBlockFlowRareData {
+ struct RenderBlockFlowRareData : public RenderBlockRareData {
WTF_MAKE_NONCOPYABLE(RenderBlockFlowRareData); WTF_MAKE_FAST_ALLOCATED;
public:
RenderBlockFlowRareData(const RenderBlockFlow& block)
@@ -105,6 +106,10 @@
{
}
+ virtual ~RenderBlockFlowRareData()
+ {
+ }
+
static LayoutUnit positiveMarginBeforeDefault(const RenderBlock& block)
{
return std::max<LayoutUnit>(block.marginBefore(), 0);
@@ -132,6 +137,9 @@
bool m_didBreakAtLineToAvoidWidow : 1;
};
+ RenderBlockFlowRareData* rareData() const { return static_cast<RenderBlockFlowRareData*>(RenderBlock::rareData()); }
+ RenderBlockFlowRareData& ensureRareData() { return static_cast<RenderBlockFlowRareData&>(RenderBlock::ensureRareData()); }
+
class MarginInfo {
// Collapsing flags for whether we can collapse our margins with our children's margins.
bool m_canCollapseWithChildren : 1;
@@ -225,27 +233,25 @@
void handleAfterSideOfBlock(LayoutUnit top, LayoutUnit bottom, MarginInfo&);
void setCollapsedBottomMargin(const MarginInfo&);
- bool shouldBreakAtLineToAvoidWidow() const { return m_rareData && m_rareData->m_lineBreakToAvoidWidow >= 0; }
+ bool shouldBreakAtLineToAvoidWidow() const { return hasRareData() && rareData()->m_lineBreakToAvoidWidow >= 0; }
void clearShouldBreakAtLineToAvoidWidow() const;
- int lineBreakToAvoidWidow() const { return m_rareData ? m_rareData->m_lineBreakToAvoidWidow : -1; }
+ int lineBreakToAvoidWidow() const { return hasRareData() ? rareData()->m_lineBreakToAvoidWidow : -1; }
void setBreakAtLineToAvoidWidow(int);
void clearDidBreakAtLineToAvoidWidow();
void setDidBreakAtLineToAvoidWidow();
- bool didBreakAtLineToAvoidWidow() const { return m_rareData && m_rareData->m_didBreakAtLineToAvoidWidow; }
+ bool didBreakAtLineToAvoidWidow() const { return hasRareData() && rareData()->m_didBreakAtLineToAvoidWidow; }
bool relayoutToAvoidWidows(LayoutStateMaintainer&);
virtual bool canHaveGeneratedChildren() const OVERRIDE;
- RootInlineBox* lineGridBox() const { return m_rareData ? m_rareData->m_lineGridBox.get() : nullptr; }
+ RootInlineBox* lineGridBox() const { return hasRareData() ? rareData()->m_lineGridBox.get() : nullptr; }
void setLineGridBox(std::unique_ptr<RootInlineBox> box)
{
- if (!m_rareData)
- m_rareData = adoptPtr(new RenderBlockFlowRareData(*this));
- m_rareData->m_lineGridBox = std::move(box);
+ ensureRareData().m_lineGridBox = std::move(box);
}
void layoutLineGridBox();
- RenderNamedFlowFragment* renderNamedFlowFragment() const { return m_rareData ? m_rareData->m_renderNamedFlowFragment : 0; }
+ RenderNamedFlowFragment* renderNamedFlowFragment() const { return hasRareData() ? rareData()->m_renderNamedFlowFragment : nullptr; }
void setRenderNamedFlowFragment(RenderNamedFlowFragment*);
bool containsFloats() const OVERRIDE { return m_floatingObjects && !m_floatingObjects->set().isEmpty(); }
@@ -360,19 +366,20 @@
LayoutUnit applyBeforeBreak(RenderBox& child, LayoutUnit logicalOffset); // If the child has a before break, then return a new yPos that shifts to the top of the next page/column.
LayoutUnit applyAfterBreak(RenderBox& child, LayoutUnit logicalOffset, MarginInfo&); // If the child has an after break, then return a new offset that shifts to the top of the next page/column.
- LayoutUnit maxPositiveMarginBefore() const { return m_rareData ? m_rareData->m_margins.positiveMarginBefore() : RenderBlockFlowRareData::positiveMarginBeforeDefault(*this); }
- LayoutUnit maxNegativeMarginBefore() const { return m_rareData ? m_rareData->m_margins.negativeMarginBefore() : RenderBlockFlowRareData::negativeMarginBeforeDefault(*this); }
- LayoutUnit maxPositiveMarginAfter() const { return m_rareData ? m_rareData->m_margins.positiveMarginAfter() : RenderBlockFlowRareData::positiveMarginAfterDefault(*this); }
- LayoutUnit maxNegativeMarginAfter() const { return m_rareData ? m_rareData->m_margins.negativeMarginAfter() : RenderBlockFlowRareData::negativeMarginAfterDefault(*this); }
+ LayoutUnit maxPositiveMarginBefore() const { return hasRareData() ? rareData()->m_margins.positiveMarginBefore() : RenderBlockFlowRareData::positiveMarginBeforeDefault(*this); }
+ LayoutUnit maxNegativeMarginBefore() const { return hasRareData() ? rareData()->m_margins.negativeMarginBefore() : RenderBlockFlowRareData::negativeMarginBeforeDefault(*this); }
+ LayoutUnit maxPositiveMarginAfter() const { return hasRareData() ? rareData()->m_margins.positiveMarginAfter() : RenderBlockFlowRareData::positiveMarginAfterDefault(*this); }
+ LayoutUnit maxNegativeMarginAfter() const { return hasRareData() ? rareData()->m_margins.negativeMarginAfter() : RenderBlockFlowRareData::negativeMarginAfterDefault(*this); }
void initMaxMarginValues()
{
- if (!m_rareData)
+ if (!hasRareData())
return;
- m_rareData->m_margins = MarginValues(RenderBlockFlowRareData::positiveMarginBeforeDefault(*this) , RenderBlockFlowRareData::negativeMarginBeforeDefault(*this),
+
+ rareData()->m_margins = MarginValues(RenderBlockFlowRareData::positiveMarginBeforeDefault(*this) , RenderBlockFlowRareData::negativeMarginBeforeDefault(*this),
RenderBlockFlowRareData::positiveMarginAfterDefault(*this), RenderBlockFlowRareData::negativeMarginAfterDefault(*this));
- m_rareData->m_discardMarginBefore = false;
- m_rareData->m_discardMarginAfter = false;
+ rareData()->m_discardMarginBefore = false;
+ rareData()->m_discardMarginAfter = false;
}
void setMaxMarginBeforeValues(LayoutUnit pos, LayoutUnit neg);
@@ -448,7 +455,6 @@
Position positionForBox(InlineBox*, bool start = true) const;
virtual VisiblePosition positionForPointWithInlineChildren(const LayoutPoint& pointInLogicalContents) OVERRIDE;
- RenderBlockFlowRareData& ensureRareData();
virtual void addFocusRingRectsForInlineChildren(Vector<IntRect>& rects, const LayoutPoint& additionalOffset, const RenderLayerModelObject*) OVERRIDE;
// FIXME-BLOCKFLOW: These methods have implementations in
@@ -516,7 +522,6 @@
protected:
OwnPtr<FloatingObjects> m_floatingObjects;
- OwnPtr<RenderBlockFlowRareData> m_rareData;
RenderLineBoxList m_lineBoxes;
std::unique_ptr<SimpleLineLayout::Layout> m_simpleLineLayout;