OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef FindPropertiesNeedingUpdate_h | 5 #ifndef FindPropertiesNeedingUpdate_h |
6 #define FindPropertiesNeedingUpdate_h | 6 #define FindPropertiesNeedingUpdate_h |
7 | 7 |
8 #if DCHECK_IS_ON() | 8 #if DCHECK_IS_ON() |
9 namespace blink { | 9 namespace blink { |
10 | 10 |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
103 CHECK_PROPERTY_EQ("the layout object (" << object.debugName() << ")", \ | 103 CHECK_PROPERTY_EQ("the layout object (" << object.debugName() << ")", \ |
104 original, updated) | 104 original, updated) |
105 | 105 |
106 class FindObjectPropertiesNeedingUpdateScope { | 106 class FindObjectPropertiesNeedingUpdateScope { |
107 public: | 107 public: |
108 FindObjectPropertiesNeedingUpdateScope( | 108 FindObjectPropertiesNeedingUpdateScope( |
109 const LayoutObject& object, | 109 const LayoutObject& object, |
110 PaintPropertyTreeBuilderContext& context) | 110 PaintPropertyTreeBuilderContext& context) |
111 : m_object(object), | 111 : m_object(object), |
112 m_neededPaintPropertyUpdate(object.needsPaintPropertyUpdate()), | 112 m_neededPaintPropertyUpdate(object.needsPaintPropertyUpdate()), |
113 m_neededForcedSubtreeUpdate(context.forceSubtreeUpdate) { | 113 m_neededForcedSubtreeUpdate(context.forceSubtreeUpdate), |
| 114 m_originalPaintOffset(object.paintOffset()) { |
114 // No need to check if an update was already needed. | 115 // No need to check if an update was already needed. |
115 if (m_neededPaintPropertyUpdate || m_neededForcedSubtreeUpdate) | 116 if (m_neededPaintPropertyUpdate || m_neededForcedSubtreeUpdate) |
116 return; | 117 return; |
117 | 118 |
118 // Mark the properties as needing an update to ensure they are rebuilt. | 119 // Mark the properties as needing an update to ensure they are rebuilt. |
119 m_object.getMutableForPainting() | 120 m_object.getMutableForPainting() |
120 .setOnlyThisNeedsPaintPropertyUpdateForTesting(); | 121 .setOnlyThisNeedsPaintPropertyUpdateForTesting(); |
121 | 122 |
122 if (const auto* properties = m_object.paintProperties()) | 123 if (const auto* properties = m_object.paintProperties()) |
123 m_originalProperties = properties->clone(); | 124 m_originalProperties = properties->clone(); |
124 } | 125 } |
125 | 126 |
126 ~FindObjectPropertiesNeedingUpdateScope() { | 127 ~FindObjectPropertiesNeedingUpdateScope() { |
127 // No need to check if an update was already needed. | 128 // No need to check if an update was already needed. |
128 if (m_neededPaintPropertyUpdate || m_neededForcedSubtreeUpdate) | 129 if (m_neededPaintPropertyUpdate || m_neededForcedSubtreeUpdate) |
129 return; | 130 return; |
130 | 131 |
131 // If these checks fail, the paint properties changed unexpectedly. This is | 132 // If these checks fail, the paint properties changed unexpectedly. This is |
132 // due to missing one of these paint property invalidations: | 133 // due to missing one of these paint property invalidations: |
133 // 1) The LayoutObject should have been marked as needing an update with | 134 // 1) The LayoutObject should have been marked as needing an update with |
134 // LayoutObject::setNeedsPaintPropertyUpdate(). | 135 // LayoutObject::setNeedsPaintPropertyUpdate(). |
135 // 2) The PrePaintTreeWalk should have had a forced subtree update (see: | 136 // 2) The PrePaintTreeWalk should have had a forced subtree update (see: |
136 // PaintPropertyTreeBuilderContext::forceSubtreeUpdate). | 137 // PaintPropertyTreeBuilderContext::forceSubtreeUpdate). |
| 138 DCHECK_OBJECT_PROPERTY_EQ(m_object, &m_originalPaintOffset, |
| 139 &m_object.paintOffset()); |
137 const auto* objectProperties = m_object.paintProperties(); | 140 const auto* objectProperties = m_object.paintProperties(); |
138 if (m_originalProperties && objectProperties) { | 141 if (m_originalProperties && objectProperties) { |
139 DCHECK_OBJECT_PROPERTY_EQ(m_object, | 142 DCHECK_OBJECT_PROPERTY_EQ(m_object, |
140 m_originalProperties->paintOffsetTranslation(), | 143 m_originalProperties->paintOffsetTranslation(), |
141 objectProperties->paintOffsetTranslation()); | 144 objectProperties->paintOffsetTranslation()); |
142 DCHECK_OBJECT_PROPERTY_EQ(m_object, m_originalProperties->transform(), | 145 DCHECK_OBJECT_PROPERTY_EQ(m_object, m_originalProperties->transform(), |
143 objectProperties->transform()); | 146 objectProperties->transform()); |
144 DCHECK_OBJECT_PROPERTY_EQ(m_object, m_originalProperties->effect(), | 147 DCHECK_OBJECT_PROPERTY_EQ(m_object, m_originalProperties->effect(), |
145 objectProperties->effect()); | 148 objectProperties->effect()); |
146 DCHECK_OBJECT_PROPERTY_EQ(m_object, m_originalProperties->cssClip(), | 149 DCHECK_OBJECT_PROPERTY_EQ(m_object, m_originalProperties->cssClip(), |
(...skipping 18 matching lines...) Expand all Loading... |
165 m_originalProperties->scrollTranslation(), | 168 m_originalProperties->scrollTranslation(), |
166 objectProperties->scrollTranslation()); | 169 objectProperties->scrollTranslation()); |
167 DCHECK_OBJECT_PROPERTY_EQ(m_object, | 170 DCHECK_OBJECT_PROPERTY_EQ(m_object, |
168 m_originalProperties->scrollbarPaintOffset(), | 171 m_originalProperties->scrollbarPaintOffset(), |
169 objectProperties->scrollbarPaintOffset()); | 172 objectProperties->scrollbarPaintOffset()); |
170 const auto* originalBorderBox = | 173 const auto* originalBorderBox = |
171 m_originalProperties->localBorderBoxProperties(); | 174 m_originalProperties->localBorderBoxProperties(); |
172 const auto* objectBorderBox = | 175 const auto* objectBorderBox = |
173 objectProperties->localBorderBoxProperties(); | 176 objectProperties->localBorderBoxProperties(); |
174 if (originalBorderBox && objectBorderBox) { | 177 if (originalBorderBox && objectBorderBox) { |
175 DCHECK_OBJECT_PROPERTY_EQ(m_object, &originalBorderBox->paintOffset, | 178 DCHECK_OBJECT_PROPERTY_EQ(m_object, originalBorderBox->transform(), |
176 &objectBorderBox->paintOffset); | 179 objectBorderBox->transform()); |
177 DCHECK_OBJECT_PROPERTY_EQ( | 180 DCHECK_OBJECT_PROPERTY_EQ(m_object, originalBorderBox->clip(), |
178 m_object, originalBorderBox->propertyTreeState.transform(), | 181 objectBorderBox->clip()); |
179 objectBorderBox->propertyTreeState.transform()); | 182 DCHECK_OBJECT_PROPERTY_EQ(m_object, originalBorderBox->effect(), |
180 DCHECK_OBJECT_PROPERTY_EQ(m_object, | 183 objectBorderBox->effect()); |
181 originalBorderBox->propertyTreeState.clip(), | 184 DCHECK_OBJECT_PROPERTY_EQ(m_object, originalBorderBox->scroll(), |
182 objectBorderBox->propertyTreeState.clip()); | 185 objectBorderBox->scroll()); |
183 DCHECK_OBJECT_PROPERTY_EQ(m_object, | |
184 originalBorderBox->propertyTreeState.effect(), | |
185 objectBorderBox->propertyTreeState.effect()); | |
186 DCHECK_OBJECT_PROPERTY_EQ(m_object, | |
187 originalBorderBox->propertyTreeState.scroll(), | |
188 objectBorderBox->propertyTreeState.scroll()); | |
189 } else { | 186 } else { |
190 DCHECK_EQ(!!originalBorderBox, !!objectBorderBox) | 187 DCHECK_EQ(!!originalBorderBox, !!objectBorderBox) |
191 << " Object: " << m_object.debugName(); | 188 << " Object: " << m_object.debugName(); |
192 } | 189 } |
193 } else { | 190 } else { |
194 DCHECK_EQ(!!m_originalProperties, !!objectProperties) | 191 DCHECK_EQ(!!m_originalProperties, !!objectProperties) |
195 << " Object: " << m_object.debugName(); | 192 << " Object: " << m_object.debugName(); |
196 } | 193 } |
197 // Restore original clean bit. | 194 // Restore original clean bit. |
198 m_object.getMutableForPainting().clearNeedsPaintPropertyUpdateForTesting(); | 195 m_object.getMutableForPainting().clearNeedsPaintPropertyUpdateForTesting(); |
199 } | 196 } |
200 | 197 |
201 private: | 198 private: |
202 const LayoutObject& m_object; | 199 const LayoutObject& m_object; |
203 bool m_neededPaintPropertyUpdate; | 200 bool m_neededPaintPropertyUpdate; |
204 bool m_neededForcedSubtreeUpdate; | 201 bool m_neededForcedSubtreeUpdate; |
| 202 LayoutPoint m_originalPaintOffset; |
205 std::unique_ptr<const ObjectPaintProperties> m_originalProperties; | 203 std::unique_ptr<const ObjectPaintProperties> m_originalProperties; |
206 }; | 204 }; |
207 | 205 |
208 } // namespace blink | 206 } // namespace blink |
209 #endif // DCHECK_IS_ON() | 207 #endif // DCHECK_IS_ON() |
210 | 208 |
211 #endif // FindPropertiesNeedingUpdate_h | 209 #endif // FindPropertiesNeedingUpdate_h |
OLD | NEW |