Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(54)

Side by Side Diff: third_party/WebKit/Source/core/paint/PrePaintTreeWalk.cpp

Issue 2854493002: Store previous painting clip rects on FragmentData. (Closed)
Patch Set: none Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 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 #include "core/paint/PrePaintTreeWalk.h" 5 #include "core/paint/PrePaintTreeWalk.h"
6 6
7 #include "core/dom/DocumentLifecycle.h" 7 #include "core/dom/DocumentLifecycle.h"
8 #include "core/frame/FrameView.h" 8 #include "core/frame/FrameView.h"
9 #include "core/frame/LocalFrame.h" 9 #include "core/frame/LocalFrame.h"
10 #include "core/layout/LayoutMultiColumnSpannerPlaceholder.h" 10 #include "core/layout/LayoutMultiColumnSpannerPlaceholder.h"
11 #include "core/layout/LayoutPart.h" 11 #include "core/layout/LayoutPart.h"
12 #include "core/layout/LayoutView.h" 12 #include "core/layout/LayoutView.h"
13 #include "core/paint/PaintLayer.h" 13 #include "core/paint/PaintLayer.h"
14 #include "platform/graphics/paint/GeometryMapper.h" 14 #include "platform/graphics/paint/GeometryMapper.h"
15 15
16 namespace blink { 16 namespace blink {
17 17
18 struct PrePaintTreeWalkContext { 18 struct PrePaintTreeWalkContext {
19 PrePaintTreeWalkContext() 19 PrePaintTreeWalkContext()
20 : tree_builder_context( 20 : tree_builder_context(
21 WTF::WrapUnique(new PaintPropertyTreeBuilderContext)), 21 WTF::WrapUnique(new PaintPropertyTreeBuilderContext)),
22 paint_invalidator_context(tree_builder_context.get()), 22 paint_invalidator_context(tree_builder_context.get()),
23 ancestor_overflow_paint_layer(nullptr),
24 ancestor_transformed_or_root_paint_layer(nullptr) {} 23 ancestor_transformed_or_root_paint_layer(nullptr) {}
25 24
26 PrePaintTreeWalkContext(const PrePaintTreeWalkContext& parent_context, 25 PrePaintTreeWalkContext(const PrePaintTreeWalkContext& parent_context,
27 bool needs_tree_builder_context) 26 bool needs_tree_builder_context)
28 : tree_builder_context( 27 : tree_builder_context(
29 WTF::WrapUnique(needs_tree_builder_context || DCHECK_IS_ON() 28 WTF::WrapUnique(needs_tree_builder_context || DCHECK_IS_ON()
30 ? new PaintPropertyTreeBuilderContext( 29 ? new PaintPropertyTreeBuilderContext(
31 *parent_context.tree_builder_context) 30 *parent_context.tree_builder_context)
32 : nullptr)), 31 : nullptr)),
33 paint_invalidator_context(tree_builder_context.get(), 32 paint_invalidator_context(tree_builder_context.get(),
34 parent_context.paint_invalidator_context), 33 parent_context.paint_invalidator_context),
35 ancestor_overflow_paint_layer(
36 parent_context.ancestor_overflow_paint_layer),
37 ancestor_transformed_or_root_paint_layer( 34 ancestor_transformed_or_root_paint_layer(
38 parent_context.ancestor_transformed_or_root_paint_layer) { 35 parent_context.ancestor_transformed_or_root_paint_layer) {
39 #if DCHECK_IS_ON() 36 #if DCHECK_IS_ON()
40 if (needs_tree_builder_context) 37 if (needs_tree_builder_context)
41 DCHECK(parent_context.tree_builder_context->is_actually_needed); 38 DCHECK(parent_context.tree_builder_context->is_actually_needed);
42 tree_builder_context->is_actually_needed = needs_tree_builder_context; 39 tree_builder_context->is_actually_needed = needs_tree_builder_context;
43 #endif 40 #endif
44 } 41 }
45 42
46 // PaintPropertyTreeBuilderContext is large and can lead to stack overflows 43 // PaintPropertyTreeBuilderContext is large and can lead to stack overflows
47 // when recursion is deep so this context object is allocated on the heap. 44 // when recursion is deep so this context object is allocated on the heap.
48 // See: https://crbug.com/698653. 45 // See: https://crbug.com/698653.
49 std::unique_ptr<PaintPropertyTreeBuilderContext> tree_builder_context; 46 std::unique_ptr<PaintPropertyTreeBuilderContext> tree_builder_context;
50 47
51 PaintInvalidatorContext paint_invalidator_context; 48 PaintInvalidatorContext paint_invalidator_context;
52 49
53 // The ancestor in the PaintLayer tree which has overflow clip, or 50 // The ancestor in the PaintLayer tree which hasa transform or is a root
wkorman 2017/05/01 21:58:09 has a
chrishtr 2017/05/01 22:40:07 Done.
54 // is the root layer. Note that it is tree ancestor, not containing 51 // layer for painting (i.e. a paint invalidation container).
55 // block or stacking ancestor.
56 PaintLayer* ancestor_overflow_paint_layer;
57 PaintLayer* ancestor_transformed_or_root_paint_layer; 52 PaintLayer* ancestor_transformed_or_root_paint_layer;
58 }; 53 };
59 54
60 void PrePaintTreeWalk::Walk(FrameView& root_frame) { 55 void PrePaintTreeWalk::Walk(FrameView& root_frame) {
61 DCHECK(root_frame.GetFrame().GetDocument()->Lifecycle().GetState() == 56 DCHECK(root_frame.GetFrame().GetDocument()->Lifecycle().GetState() ==
62 DocumentLifecycle::kInPrePaint); 57 DocumentLifecycle::kInPrePaint);
63 58
64 PrePaintTreeWalkContext initial_context; 59 PrePaintTreeWalkContext initial_context;
65 initial_context.ancestor_transformed_or_root_paint_layer = 60 initial_context.ancestor_transformed_or_root_paint_layer =
66 root_frame.GetLayoutView()->Layer(); 61 root_frame.GetLayoutView()->Layer();
(...skipping 10 matching lines...) Expand all
77 const PrePaintTreeWalkContext& parent_context) { 72 const PrePaintTreeWalkContext& parent_context) {
78 if (frame_view.ShouldThrottleRendering()) { 73 if (frame_view.ShouldThrottleRendering()) {
79 // Skip the throttled frame. Will update it when it becomes unthrottled. 74 // Skip the throttled frame. Will update it when it becomes unthrottled.
80 return; 75 return;
81 } 76 }
82 77
83 bool needs_tree_builder_context_update = 78 bool needs_tree_builder_context_update =
84 this->NeedsTreeBuilderContextUpdate(frame_view, parent_context); 79 this->NeedsTreeBuilderContextUpdate(frame_view, parent_context);
85 PrePaintTreeWalkContext context(parent_context, 80 PrePaintTreeWalkContext context(parent_context,
86 needs_tree_builder_context_update); 81 needs_tree_builder_context_update);
87 // ancestorOverflowLayer does not cross frame boundaries.
88 context.ancestor_overflow_paint_layer = nullptr;
89 if (context.tree_builder_context) { 82 if (context.tree_builder_context) {
90 property_tree_builder_.UpdateProperties(frame_view, 83 property_tree_builder_.UpdateProperties(frame_view,
91 *context.tree_builder_context); 84 *context.tree_builder_context);
92 } 85 }
93 paint_invalidator_.InvalidatePaint(frame_view, 86 paint_invalidator_.InvalidatePaint(frame_view,
94 context.paint_invalidator_context); 87 context.paint_invalidator_context);
95 88
96 if (LayoutView* view = frame_view.GetLayoutView()) { 89 if (LayoutView* view = frame_view.GetLayoutView()) {
97 Walk(*view, context); 90 Walk(*view, context);
98 #if DCHECK_IS_ON() 91 #if DCHECK_IS_ON()
99 view->AssertSubtreeClearedPaintInvalidationFlags(); 92 view->AssertSubtreeClearedPaintInvalidationFlags();
100 #endif 93 #endif
101 } 94 }
102 frame_view.ClearNeedsPaintPropertyUpdate(); 95 frame_view.ClearNeedsPaintPropertyUpdate();
103 } 96 }
104 97
105 static void UpdateAuxiliaryObjectProperties(const LayoutObject& object, 98 static void UpdateAuxiliaryObjectProperties(const LayoutObject& object,
106 PrePaintTreeWalkContext& context) { 99 PrePaintTreeWalkContext& context) {
107 if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled()) 100 if (!RuntimeEnabledFeatures::slimmingPaintV2Enabled())
108 return; 101 return;
109 102
110 if (!object.HasLayer()) 103 if (!object.HasLayer())
111 return; 104 return;
112 105
113 PaintLayer* paint_layer = object.EnclosingLayer(); 106 PaintLayer* paint_layer = object.EnclosingLayer();
114 paint_layer->UpdateAncestorOverflowLayer(
115 context.ancestor_overflow_paint_layer);
116 107
117 if (object.StyleRef().GetPosition() == EPosition::kSticky) { 108 if (object.StyleRef().GetPosition() == EPosition::kSticky) {
118 paint_layer->GetLayoutObject().UpdateStickyPositionConstraints(); 109 paint_layer->GetLayoutObject().UpdateStickyPositionConstraints();
119 110
120 // Sticky position constraints and ancestor overflow scroller affect the 111 // Sticky position constraints and ancestor overflow scroller affect the
121 // sticky layer position, so we need to update it again here. 112 // sticky layer position, so we need to update it again here.
122 // TODO(flackr): This should be refactored in the future to be clearer (i.e. 113 // TODO(flackr): This should be refactored in the future to be clearer (i.e.
123 // update layer position and ancestor inputs updates in the same walk). 114 // update layer position and ancestor inputs updates in the same walk).
124 paint_layer->UpdateLayerPosition(); 115 paint_layer->UpdateLayerPosition();
125 } 116 }
126
127 if (paint_layer->IsRootLayer() || object.HasOverflowClip())
128 context.ancestor_overflow_paint_layer = paint_layer;
129 } 117 }
130 118
131 LayoutRect PrePaintTreeWalk::ComputeClipRectForContext( 119 LayoutRect PrePaintTreeWalk::ComputeClipRectForContext(
132 const PaintPropertyTreeBuilderFragmentContext::ContainingBlockContext& 120 const PaintPropertyTreeBuilderFragmentContext::ContainingBlockContext&
133 context, 121 context,
134 const EffectPaintPropertyNode* effect, 122 const EffectPaintPropertyNode* effect,
135 const PropertyTreeState& ancestor_state, 123 const PropertyTreeState& ancestor_state,
136 const LayoutPoint& ancestor_paint_offset) { 124 const LayoutPoint& ancestor_paint_offset) {
137 PropertyTreeState local_state(context.transform, context.clip, effect); 125 PropertyTreeState local_state(context.transform, context.clip, effect);
138 126
(...skipping 20 matching lines...) Expand all
159 } 147 }
160 148
161 // This code below checks whether any clips have changed that might: 149 // This code below checks whether any clips have changed that might:
162 // (a) invalidate optimizations made for a PaintLayer that supports 150 // (a) invalidate optimizations made for a PaintLayer that supports
163 // subsequence caching, or 151 // subsequence caching, or
164 // (b) impact clipping of descendant visual rects. 152 // (b) impact clipping of descendant visual rects.
165 if (!paint_layer.SupportsSubsequenceCaching() && 153 if (!paint_layer.SupportsSubsequenceCaching() &&
166 !paint_layer.GetLayoutObject().HasClipRelatedProperty()) 154 !paint_layer.GetLayoutObject().HasClipRelatedProperty())
167 return; 155 return;
168 156
157 FragmentData* fragment_data =
158 &object.GetMutableForPainting().EnsureFirstFragment();
159 for (auto& fragment : context.tree_builder_context->fragments) {
160 DCHECK(fragment_data);
161 if (InvalidatePaintLayerOptimizationsForFragment(
162 object, context.ancestor_transformed_or_root_paint_layer, fragment,
163 *fragment_data)) {
164 context.paint_invalidator_context.forced_subtree_invalidation_flags |=
165 PaintInvalidatorContext::kForcedSubtreeVisualRectUpdate;
166 }
167 fragment_data = fragment_data->NextFragment();
168 }
169 }
170
171 bool PrePaintTreeWalk::InvalidatePaintLayerOptimizationsForFragment(
172 const LayoutObject& object,
173 const PaintLayer* ancestor_transformed_or_root_paint_layer,
174 const PaintPropertyTreeBuilderFragmentContext& context,
175 FragmentData& fragment_data) {
176 PaintLayer& paint_layer = *ToLayoutBoxModelObject(object).Layer();
177
169 const auto& ancestor = 178 const auto& ancestor =
170 context.ancestor_transformed_or_root_paint_layer->GetLayoutObject(); 179 ancestor_transformed_or_root_paint_layer->GetLayoutObject();
171 PropertyTreeState ancestor_state = *ancestor.LocalBorderBoxProperties(); 180 PropertyTreeState ancestor_state = *ancestor.LocalBorderBoxProperties();
172 181
173 #ifdef CHECK_CLIP_RECTS 182 #ifdef CHECK_CLIP_RECTS
174 auto respect_overflow_clip = kRespectOverflowClip; 183 auto respect_overflow_clip = kRespectOverflowClip;
175 #endif 184 #endif
176 if (context.ancestor_transformed_or_root_paint_layer->GetCompositingState() == 185 if (ancestor_transformed_or_root_paint_layer->GetCompositingState() ==
177 kPaintsIntoOwnBacking) { 186 kPaintsIntoOwnBacking) {
178 const auto* ancestor_properties = ancestor.PaintProperties(); 187 const auto* ancestor_properties = ancestor.PaintProperties();
179 if (ancestor_properties && ancestor_properties->OverflowClip()) { 188 if (ancestor_properties && ancestor_properties->OverflowClip()) {
180 ancestor_state.SetClip(ancestor_properties->OverflowClip()); 189 ancestor_state.SetClip(ancestor_properties->OverflowClip());
181 #ifdef CHECK_CLIP_RECTS 190 #ifdef CHECK_CLIP_RECTS
182 respect_overflow_clip = kIgnoreOverflowClip; 191 respect_overflow_clip = kIgnoreOverflowClip;
183 #endif 192 #endif
184 } 193 }
185 } 194 }
186 195
187 #ifdef CHECK_CLIP_RECTS 196 #ifdef CHECK_CLIP_RECTS
188 const auto& old_clip_rects = 197 const auto& old_clip_rects =
189 paint_layer.Clipper(PaintLayer::kDoNotUseGeometryMapper) 198 paint_layer.Clipper(PaintLayer::kDoNotUseGeometryMapper)
190 .PaintingClipRects(context.ancestor_transformed_or_root_paint_layer, 199 .PaintingClipRects(ancestor_transformed_or_root_paint_layer,
191 respect_overflow_clip, LayoutSize()); 200 respect_overflow_clip, LayoutSize());
192 #endif 201 #endif
193 202
194 const LayoutPoint& ancestor_paint_offset = 203 const LayoutPoint& ancestor_paint_offset =
195 context.ancestor_transformed_or_root_paint_layer->GetLayoutObject() 204 ancestor_transformed_or_root_paint_layer->GetLayoutObject().PaintOffset();
196 .PaintOffset();
197 205
198 // TODO(chrishtr): generalize this for multicol. 206 // TODO(chrishtr): generalize this for multicol.
199 const auto* effect = 207 const auto* effect = context.current_effect;
200 context.tree_builder_context->fragments[0].current_effect;
201 auto overflow_clip_rect = ComputeClipRectForContext( 208 auto overflow_clip_rect = ComputeClipRectForContext(
202 context.tree_builder_context->fragments[0].current, effect, 209 context.current, effect, ancestor_state, ancestor_paint_offset);
203 ancestor_state, ancestor_paint_offset);
204 #ifdef CHECK_CLIP_RECTS 210 #ifdef CHECK_CLIP_RECTS
205 CHECK(overflow_clip_rect == old_clip_rects.OverflowClipRect().Rect()) 211 CHECK(overflow_clip_rect == old_clip_rects.OverflowClipRect().Rect())
206 << " new=" << overflow_clip_rect.ToString() 212 << " new=" << overflow_clip_rect.ToString()
207 << " old=" << old_clip_rects.OverflowClipRect().Rect().ToString(); 213 << " old=" << old_clip_rects.OverflowClipRect().Rect().ToString();
208 #endif 214 #endif
209 215
210 auto fixed_clip_rect = ComputeClipRectForContext( 216 auto fixed_clip_rect = ComputeClipRectForContext(
211 context.tree_builder_context->fragments[0].fixed_position, effect, 217 context.fixed_position, effect, ancestor_state, ancestor_paint_offset);
212 ancestor_state, ancestor_paint_offset);
213 #ifdef CHECK_CLIP_RECTS 218 #ifdef CHECK_CLIP_RECTS
214 CHECK(fixed_clip_rect == old_clip_rects.FixedClipRect().Rect()) 219 CHECK(fixed_clip_rect == old_clip_rects.FixedClipRect().Rect())
215 << " new=" << fixed_clip_rect.ToString() 220 << " new=" << fixed_clip_rect.ToString()
216 << " old=" << old_clip_rects.FixedClipRect().Rect().ToString(); 221 << " old=" << old_clip_rects.FixedClipRect().Rect().ToString();
217 #endif 222 #endif
218 223
219 auto pos_clip_rect = ComputeClipRectForContext( 224 auto pos_clip_rect = ComputeClipRectForContext(
220 context.tree_builder_context->fragments[0].absolute_position, effect, 225 context.absolute_position, effect, ancestor_state, ancestor_paint_offset);
221 ancestor_state, ancestor_paint_offset);
222 #ifdef CHECK_CLIP_RECTS 226 #ifdef CHECK_CLIP_RECTS
223 CHECK(pos_clip_rect == old_clip_rects.PosClipRect().Rect()) 227 CHECK(pos_clip_rect == old_clip_rects.PosClipRect().Rect())
224 << " new=" << pos_clip_rect.ToString() 228 << " new=" << pos_clip_rect.ToString()
225 << " old=" << old_clip_rects.PosClipRect().Rect().ToString(); 229 << " old=" << old_clip_rects.PosClipRect().Rect().ToString();
226 #endif 230 #endif
227 231
228 const auto* previous_clip_rects = paint_layer.PreviousPaintingClipRects(); 232 const auto* previous_clip_rects = fragment_data.PreviousClipRects();
229 if (!previous_clip_rects || 233 if (!previous_clip_rects ||
230 overflow_clip_rect != previous_clip_rects->OverflowClipRect().Rect() || 234 overflow_clip_rect != previous_clip_rects->OverflowClipRect().Rect() ||
231 fixed_clip_rect != previous_clip_rects->FixedClipRect().Rect() || 235 fixed_clip_rect != previous_clip_rects->FixedClipRect().Rect() ||
232 pos_clip_rect != previous_clip_rects->PosClipRect().Rect()) { 236 pos_clip_rect != previous_clip_rects->PosClipRect().Rect()) {
233 RefPtr<ClipRects> clip_rects = ClipRects::Create(); 237 RefPtr<ClipRects> clip_rects = ClipRects::Create();
234 clip_rects->SetOverflowClipRect(overflow_clip_rect); 238 clip_rects->SetOverflowClipRect(overflow_clip_rect);
235 clip_rects->SetFixedClipRect(fixed_clip_rect); 239 clip_rects->SetFixedClipRect(fixed_clip_rect);
236 clip_rects->SetPosClipRect(pos_clip_rect); 240 clip_rects->SetPosClipRect(pos_clip_rect);
237 paint_layer.SetPreviousPaintingClipRects(*clip_rects); 241 fragment_data.SetPreviousClipRects(*clip_rects);
238 242
239 paint_layer.SetNeedsRepaint(); 243 paint_layer.SetNeedsRepaint();
240 paint_layer.SetPreviousPaintPhaseDescendantOutlinesEmpty(false); 244 paint_layer.SetPreviousPaintPhaseDescendantOutlinesEmpty(false);
241 paint_layer.SetPreviousPaintPhaseFloatEmpty(false); 245 paint_layer.SetPreviousPaintPhaseFloatEmpty(false);
242 paint_layer.SetPreviousPaintPhaseDescendantBlockBackgroundsEmpty(false); 246 paint_layer.SetPreviousPaintPhaseDescendantBlockBackgroundsEmpty(false);
243 // All subsequences which are contained below this paintLayer must also 247 // All subsequences which are contained below this paintLayer must also
244 // be checked. 248 // be checked.
245 context.paint_invalidator_context.forced_subtree_invalidation_flags |= 249 return true;
246 PaintInvalidatorContext::kForcedSubtreeVisualRectUpdate;
247 } 250 }
251 return false;
248 } 252 }
249 253
250 bool PrePaintTreeWalk::NeedsTreeBuilderContextUpdate( 254 bool PrePaintTreeWalk::NeedsTreeBuilderContextUpdate(
251 const FrameView& frame_view, 255 const FrameView& frame_view,
252 const PrePaintTreeWalkContext& context) { 256 const PrePaintTreeWalkContext& context) {
253 return frame_view.NeedsPaintPropertyUpdate() || 257 return frame_view.NeedsPaintPropertyUpdate() ||
254 (frame_view.GetLayoutView() && 258 (frame_view.GetLayoutView() &&
255 NeedsTreeBuilderContextUpdate(*frame_view.GetLayoutView(), context)); 259 NeedsTreeBuilderContextUpdate(*frame_view.GetLayoutView(), context));
256 } 260 }
257 261
258 bool PrePaintTreeWalk::NeedsTreeBuilderContextUpdate( 262 bool PrePaintTreeWalk::NeedsTreeBuilderContextUpdate(
259 const LayoutObject& object, 263 const LayoutObject& object,
260 const PrePaintTreeWalkContext& parent_context) { 264 const PrePaintTreeWalkContext& parent_context) {
261 return object.NeedsPaintPropertyUpdate() || 265 return object.NeedsPaintPropertyUpdate() ||
262 object.DescendantNeedsPaintPropertyUpdate() || 266 object.DescendantNeedsPaintPropertyUpdate() ||
263 (parent_context.tree_builder_context && 267 (parent_context.tree_builder_context &&
264 parent_context.tree_builder_context->force_subtree_update) || 268 parent_context.tree_builder_context->force_subtree_update) ||
265 // If the object needs visual rect update, we should update tree 269 // If the object needs visual rect update, we should update tree
266 // builder context which is needed by visual rect update. 270 // builder context which is needed by visual rect update.
267 parent_context.paint_invalidator_context.NeedsVisualRectUpdate(object); 271 parent_context.paint_invalidator_context.NeedsVisualRectUpdate(object);
268 } 272 }
269 273
274 void PrePaintTreeWalk::ClearPreviousClipRectsForTesting(
275 const LayoutObject& object) {
276 object.GetMutableForPainting().FirstFragment()->ClearPreviousClipRects();
277 }
278
270 void PrePaintTreeWalk::Walk(const LayoutObject& object, 279 void PrePaintTreeWalk::Walk(const LayoutObject& object,
271 const PrePaintTreeWalkContext& parent_context) { 280 const PrePaintTreeWalkContext& parent_context) {
272 // Early out from the tree walk if possible. 281 // Early out from the tree walk if possible.
273 bool needs_tree_builder_context_update = 282 bool needs_tree_builder_context_update =
274 this->NeedsTreeBuilderContextUpdate(object, parent_context); 283 this->NeedsTreeBuilderContextUpdate(object, parent_context);
275 if (!needs_tree_builder_context_update && 284 if (!needs_tree_builder_context_update &&
276 !object.ShouldCheckForPaintInvalidation()) 285 !object.ShouldCheckForPaintInvalidation())
277 return; 286 return;
278 287
279 PrePaintTreeWalkContext context(parent_context, 288 PrePaintTreeWalkContext context(parent_context,
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
320 } 329 }
321 Walk(*frame_view, context); 330 Walk(*frame_view, context);
322 } 331 }
323 // TODO(pdr): Investigate RemoteFrameView (crbug.com/579281). 332 // TODO(pdr): Investigate RemoteFrameView (crbug.com/579281).
324 } 333 }
325 334
326 object.GetMutableForPainting().ClearPaintFlags(); 335 object.GetMutableForPainting().ClearPaintFlags();
327 } 336 }
328 337
329 } // namespace blink 338 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698