Chromium Code Reviews| Index: third_party/WebKit/Source/core/layout/LayoutObject.cpp |
| diff --git a/third_party/WebKit/Source/core/layout/LayoutObject.cpp b/third_party/WebKit/Source/core/layout/LayoutObject.cpp |
| index 41f90383bf92e065016237781d3169d6d19ced0a..36c673c1c3303a58e1bcf47ec9f838181be585af 100644 |
| --- a/third_party/WebKit/Source/core/layout/LayoutObject.cpp |
| +++ b/third_party/WebKit/Source/core/layout/LayoutObject.cpp |
| @@ -85,6 +85,7 @@ |
| #include "platform/RuntimeEnabledFeatures.h" |
| #include "platform/geometry/TransformState.h" |
| #include "platform/graphics/GraphicsLayer.h" |
| +#include "platform/graphics/paint/PropertyTreeState.h" |
| #include "platform/instrumentation/tracing/TracedValue.h" |
| #include "wtf/allocator/Partitions.h" |
| #include "wtf/text/StringBuilder.h" |
| @@ -3552,7 +3553,10 @@ void LayoutObject::setIsBackgroundAttachmentFixedObject( |
| frameView()->removeBackgroundAttachmentFixedObject(this); |
| } |
| -LayoutObject::RarePaintData::RarePaintData() : m_paintProperties(nullptr) {} |
| +LayoutObject::RarePaintData::RarePaintData() |
| + : m_paintProperties(nullptr), |
| + m_localBorderBoxProperties(nullptr), |
| + m_contentsProperties(nullptr) {} |
| ObjectPaintProperties& LayoutObject::RarePaintData::ensurePaintProperties() { |
| if (!m_paintProperties) |
| @@ -3560,6 +3564,48 @@ ObjectPaintProperties& LayoutObject::RarePaintData::ensurePaintProperties() { |
| return *m_paintProperties.get(); |
| } |
| +void LayoutObject::RarePaintData::clearLocalBorderBoxProperties() { |
| + m_localBorderBoxProperties = nullptr; |
| + |
| + // The contents properties are based on the border box so we need to clear |
| + // the cached value. |
| + m_contentsProperties = nullptr; |
| +} |
| + |
| +void LayoutObject::RarePaintData::setLocalBorderBoxProperties( |
| + PropertyTreeState& state) { |
| + if (!m_localBorderBoxProperties) |
| + m_localBorderBoxProperties = WTF::makeUnique<PropertyTreeState>(state); |
| + else |
| + *m_localBorderBoxProperties = state; |
| + |
| + // The contents properties are based on the border box so we need to clear |
| + // the cached value. |
| + m_contentsProperties = nullptr; |
| +} |
| + |
| +const PropertyTreeState* LayoutObject::RarePaintData::contentsProperties() |
| + const { |
| + if (!m_contentsProperties) { |
| + if (m_localBorderBoxProperties) { |
| + m_contentsProperties = ObjectPaintProperties::contentsProperties( |
|
pdr.
2017/03/30 00:13:47
I don't like how this patch puts paint logic in La
|
| + m_localBorderBoxProperties.get(), m_paintProperties.get()); |
| + } |
| + } else { |
| +#if DCHECK_IS_ON() |
| + // Check that the cached contents properties are valid by checking that they |
| + // do not change if recalculated. |
| + DCHECK(m_localBorderBoxProperties); |
| + std::unique_ptr<PropertyTreeState> oldProperties = |
| + std::move(m_contentsProperties); |
| + m_contentsProperties = ObjectPaintProperties::contentsProperties( |
| + m_localBorderBoxProperties.get(), m_paintProperties.get()); |
| + DCHECK(*m_contentsProperties == *oldProperties); |
| +#endif |
| + } |
| + return m_contentsProperties.get(); |
| +} |
| + |
| LayoutObject::RarePaintData& LayoutObject::ensureRarePaintData() { |
| if (!m_rarePaintData) |
| m_rarePaintData = WTF::makeUnique<RarePaintData>(); |