OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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/layout/compositing/CompositingInputsUpdater.h" | 5 #include "core/layout/compositing/CompositingInputsUpdater.h" |
6 | 6 |
7 #include "core/dom/Document.h" | 7 #include "core/dom/Document.h" |
8 #include "core/frame/FrameHost.h" | 8 #include "core/frame/FrameHost.h" |
9 #include "core/frame/FrameView.h" | 9 #include "core/frame/FrameView.h" |
10 #include "core/layout/LayoutBlock.h" | 10 #include "core/layout/LayoutBlock.h" |
(...skipping 10 matching lines...) Expand all Loading... |
21 | 21 |
22 CompositingInputsUpdater::~CompositingInputsUpdater() {} | 22 CompositingInputsUpdater::~CompositingInputsUpdater() {} |
23 | 23 |
24 void CompositingInputsUpdater::update() { | 24 void CompositingInputsUpdater::update() { |
25 TRACE_EVENT0("blink", "CompositingInputsUpdater::update"); | 25 TRACE_EVENT0("blink", "CompositingInputsUpdater::update"); |
26 updateRecursive(m_rootLayer, DoNotForceUpdate, AncestorInfo()); | 26 updateRecursive(m_rootLayer, DoNotForceUpdate, AncestorInfo()); |
27 } | 27 } |
28 | 28 |
29 static const PaintLayer* findParentLayerOnClippingContainerChain( | 29 static const PaintLayer* findParentLayerOnClippingContainerChain( |
30 const PaintLayer* layer) { | 30 const PaintLayer* layer) { |
31 LayoutObject* current = layer->layoutObject(); | 31 LayoutObject* current = &layer->layoutObject(); |
32 while (current) { | 32 while (current) { |
33 if (current->style()->position() == EPosition::kFixed) { | 33 if (current->style()->position() == EPosition::kFixed) { |
34 for (current = current->parent(); | 34 for (current = current->parent(); |
35 current && !current->canContainFixedPositionObjects(); | 35 current && !current->canContainFixedPositionObjects(); |
36 current = current->parent()) { | 36 current = current->parent()) { |
37 // CSS clip applies to fixed position elements even for ancestors that | 37 // CSS clip applies to fixed position elements even for ancestors that |
38 // are not what the fixed element is positioned with respect to. | 38 // are not what the fixed element is positioned with respect to. |
39 if (current->hasClip()) { | 39 if (current->hasClip()) { |
40 DCHECK(current->hasLayer()); | 40 DCHECK(current->hasLayer()); |
41 return static_cast<const LayoutBoxModelObject*>(current)->layer(); | 41 return static_cast<const LayoutBoxModelObject*>(current)->layer(); |
(...skipping 24 matching lines...) Expand all Loading... |
66 } | 66 } |
67 ASSERT_NOT_REACHED(); | 67 ASSERT_NOT_REACHED(); |
68 return nullptr; | 68 return nullptr; |
69 } | 69 } |
70 | 70 |
71 static bool hasClippedStackingAncestor(const PaintLayer* layer, | 71 static bool hasClippedStackingAncestor(const PaintLayer* layer, |
72 const PaintLayer* clippingLayer) { | 72 const PaintLayer* clippingLayer) { |
73 if (layer == clippingLayer) | 73 if (layer == clippingLayer) |
74 return false; | 74 return false; |
75 bool foundInterveningClip = false; | 75 bool foundInterveningClip = false; |
76 const LayoutObject* clippingLayoutObject = clippingLayer->layoutObject(); | 76 const LayoutObject& clippingLayoutObject = clippingLayer->layoutObject(); |
77 for (const PaintLayer* current = layer->compositingContainer(); current; | 77 for (const PaintLayer* current = layer->compositingContainer(); current; |
78 current = current->compositingContainer()) { | 78 current = current->compositingContainer()) { |
79 if (current == clippingLayer) | 79 if (current == clippingLayer) |
80 return foundInterveningClip; | 80 return foundInterveningClip; |
81 | 81 |
82 if (current->layoutObject()->hasClipRelatedProperty() && | 82 if (current->layoutObject().hasClipRelatedProperty() && |
83 !clippingLayoutObject->isDescendantOf(current->layoutObject())) | 83 !clippingLayoutObject.isDescendantOf(¤t->layoutObject())) |
84 foundInterveningClip = true; | 84 foundInterveningClip = true; |
85 | 85 |
86 if (const LayoutObject* container = current->clippingContainer()) { | 86 if (const LayoutObject* container = current->clippingContainer()) { |
87 if (clippingLayoutObject != container && | 87 if (&clippingLayoutObject != container && |
88 !clippingLayoutObject->isDescendantOf(container)) | 88 !clippingLayoutObject.isDescendantOf(container)) |
89 foundInterveningClip = true; | 89 foundInterveningClip = true; |
90 } | 90 } |
91 } | 91 } |
92 return false; | 92 return false; |
93 } | 93 } |
94 | 94 |
95 void CompositingInputsUpdater::updateRecursive(PaintLayer* layer, | 95 void CompositingInputsUpdater::updateRecursive(PaintLayer* layer, |
96 UpdateType updateType, | 96 UpdateType updateType, |
97 AncestorInfo info) { | 97 AncestorInfo info) { |
98 if (!layer->childNeedsCompositingInputsUpdate() && updateType != ForceUpdate) | 98 if (!layer->childNeedsCompositingInputsUpdate() && updateType != ForceUpdate) |
99 return; | 99 return; |
100 | 100 |
101 const PaintLayer* previousOverflowLayer = layer->ancestorOverflowLayer(); | 101 const PaintLayer* previousOverflowLayer = layer->ancestorOverflowLayer(); |
102 layer->updateAncestorOverflowLayer(info.lastOverflowClipLayer); | 102 layer->updateAncestorOverflowLayer(info.lastOverflowClipLayer); |
103 if (info.lastOverflowClipLayer && layer->needsCompositingInputsUpdate() && | 103 if (info.lastOverflowClipLayer && layer->needsCompositingInputsUpdate() && |
104 layer->layoutObject()->style()->position() == EPosition::kSticky) { | 104 layer->layoutObject().style()->position() == EPosition::kSticky) { |
105 if (info.lastOverflowClipLayer != previousOverflowLayer && | 105 if (info.lastOverflowClipLayer != previousOverflowLayer && |
106 !RuntimeEnabledFeatures::rootLayerScrollingEnabled()) { | 106 !RuntimeEnabledFeatures::rootLayerScrollingEnabled()) { |
107 // Old ancestor scroller should no longer have these constraints. | 107 // Old ancestor scroller should no longer have these constraints. |
108 ASSERT(!previousOverflowLayer || | 108 ASSERT(!previousOverflowLayer || |
109 !previousOverflowLayer->getScrollableArea() | 109 !previousOverflowLayer->getScrollableArea() |
110 ->stickyConstraintsMap() | 110 ->stickyConstraintsMap() |
111 .contains(layer)); | 111 .contains(layer)); |
112 | 112 |
113 if (info.lastOverflowClipLayer->isRootLayer()) | 113 if (info.lastOverflowClipLayer->isRootLayer()) { |
| 114 layer->layoutObject().view()->frameView()->addViewportConstrainedObject( |
| 115 layer->layoutObject()); |
| 116 } else if (previousOverflowLayer && |
| 117 previousOverflowLayer->isRootLayer()) { |
114 layer->layoutObject() | 118 layer->layoutObject() |
115 ->view() | 119 .view() |
116 ->frameView() | |
117 ->addViewportConstrainedObject(layer->layoutObject()); | |
118 else if (previousOverflowLayer && previousOverflowLayer->isRootLayer()) | |
119 layer->layoutObject() | |
120 ->view() | |
121 ->frameView() | 120 ->frameView() |
122 ->removeViewportConstrainedObject(layer->layoutObject()); | 121 ->removeViewportConstrainedObject(layer->layoutObject()); |
| 122 } |
123 } | 123 } |
124 layer->layoutObject()->updateStickyPositionConstraints(); | 124 layer->layoutObject().updateStickyPositionConstraints(); |
125 | 125 |
126 // Sticky position constraints and ancestor overflow scroller affect | 126 // Sticky position constraints and ancestor overflow scroller affect |
127 // the sticky layer position, so we need to update it again here. | 127 // the sticky layer position, so we need to update it again here. |
128 // TODO(flackr): This should be refactored in the future to be clearer | 128 // TODO(flackr): This should be refactored in the future to be clearer |
129 // (i.e. update layer position and ancestor inputs updates in the | 129 // (i.e. update layer position and ancestor inputs updates in the |
130 // same walk) | 130 // same walk) |
131 layer->updateLayerPosition(); | 131 layer->updateLayerPosition(); |
132 } | 132 } |
133 | 133 |
134 m_geometryMap.pushMappingsToAncestor(layer, layer->parent()); | 134 m_geometryMap.pushMappingsToAncestor(layer, layer->parent()); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
169 | 169 |
170 const PaintLayer* parent = layer->parent(); | 170 const PaintLayer* parent = layer->parent(); |
171 properties.opacityAncestor = | 171 properties.opacityAncestor = |
172 parent->isTransparent() ? parent : parent->opacityAncestor(); | 172 parent->isTransparent() ? parent : parent->opacityAncestor(); |
173 properties.transformAncestor = | 173 properties.transformAncestor = |
174 parent->transform() ? parent : parent->transformAncestor(); | 174 parent->transform() ? parent : parent->transformAncestor(); |
175 properties.filterAncestor = parent->hasFilterInducingProperty() | 175 properties.filterAncestor = parent->hasFilterInducingProperty() |
176 ? parent | 176 ? parent |
177 : parent->filterAncestor(); | 177 : parent->filterAncestor(); |
178 bool layerIsFixedPosition = | 178 bool layerIsFixedPosition = |
179 layer->layoutObject()->style()->position() == EPosition::kFixed; | 179 layer->layoutObject().style()->position() == EPosition::kFixed; |
180 properties.nearestFixedPositionLayer = | 180 properties.nearestFixedPositionLayer = |
181 layerIsFixedPosition ? layer : parent->nearestFixedPositionLayer(); | 181 layerIsFixedPosition ? layer : parent->nearestFixedPositionLayer(); |
182 | 182 |
183 if (info.hasAncestorWithClipRelatedProperty) { | 183 if (info.hasAncestorWithClipRelatedProperty) { |
184 const PaintLayer* parentLayerOnClippingContainerChain = | 184 const PaintLayer* parentLayerOnClippingContainerChain = |
185 findParentLayerOnClippingContainerChain(layer); | 185 findParentLayerOnClippingContainerChain(layer); |
186 const bool parentHasClipRelatedProperty = | 186 const bool parentHasClipRelatedProperty = |
187 parentLayerOnClippingContainerChain->layoutObject() | 187 parentLayerOnClippingContainerChain->layoutObject() |
188 ->hasClipRelatedProperty(); | 188 .hasClipRelatedProperty(); |
189 properties.clippingContainer = | 189 properties.clippingContainer = |
190 parentHasClipRelatedProperty | 190 parentHasClipRelatedProperty |
191 ? parentLayerOnClippingContainerChain->layoutObject() | 191 ? &parentLayerOnClippingContainerChain->layoutObject() |
192 : parentLayerOnClippingContainerChain->clippingContainer(); | 192 : parentLayerOnClippingContainerChain->clippingContainer(); |
193 | 193 |
194 if (layer->layoutObject()->isOutOfFlowPositioned() && | 194 if (layer->layoutObject().isOutOfFlowPositioned() && |
195 !layer->subtreeIsInvisible()) { | 195 !layer->subtreeIsInvisible()) { |
196 const PaintLayer* clippingLayer = | 196 const PaintLayer* clippingLayer = |
197 properties.clippingContainer | 197 properties.clippingContainer |
198 ? properties.clippingContainer->enclosingLayer() | 198 ? properties.clippingContainer->enclosingLayer() |
199 : layer->compositor()->rootLayer(); | 199 : layer->compositor()->rootLayer(); |
200 if (hasClippedStackingAncestor(layer, clippingLayer)) | 200 if (hasClippedStackingAncestor(layer, clippingLayer)) |
201 properties.clipParent = clippingLayer; | 201 properties.clipParent = clippingLayer; |
202 } | 202 } |
203 } | 203 } |
204 | 204 |
205 if (info.lastScrollingAncestor) { | 205 if (info.lastScrollingAncestor) { |
206 const LayoutObject* containingBlock = | 206 const LayoutObject* containingBlock = |
207 layer->layoutObject()->containingBlock(); | 207 layer->layoutObject().containingBlock(); |
208 const PaintLayer* parentLayerOnContainingBlockChain = | 208 const PaintLayer* parentLayerOnContainingBlockChain = |
209 findParentLayerOnContainingBlockChain(containingBlock); | 209 findParentLayerOnContainingBlockChain(containingBlock); |
210 | 210 |
211 properties.ancestorScrollingLayer = | 211 properties.ancestorScrollingLayer = |
212 parentLayerOnContainingBlockChain->ancestorScrollingLayer(); | 212 parentLayerOnContainingBlockChain->ancestorScrollingLayer(); |
213 if (parentLayerOnContainingBlockChain->scrollsOverflow()) | 213 if (parentLayerOnContainingBlockChain->scrollsOverflow()) |
214 properties.ancestorScrollingLayer = parentLayerOnContainingBlockChain; | 214 properties.ancestorScrollingLayer = parentLayerOnContainingBlockChain; |
215 | 215 |
216 if (layer->stackingNode()->isStacked() && | 216 if (layer->stackingNode()->isStacked() && |
217 properties.ancestorScrollingLayer && | 217 properties.ancestorScrollingLayer && |
218 !info.ancestorStackingContext->layoutObject()->isDescendantOf( | 218 !info.ancestorStackingContext->layoutObject().isDescendantOf( |
219 properties.ancestorScrollingLayer->layoutObject())) | 219 &properties.ancestorScrollingLayer->layoutObject())) |
220 properties.scrollParent = properties.ancestorScrollingLayer; | 220 properties.scrollParent = properties.ancestorScrollingLayer; |
221 } | 221 } |
222 } | 222 } |
223 | 223 |
224 layer->updateAncestorDependentCompositingInputs( | 224 layer->updateAncestorDependentCompositingInputs( |
225 properties, info.hasAncestorWithClipPath); | 225 properties, info.hasAncestorWithClipPath); |
226 } | 226 } |
227 | 227 |
228 if (layer->stackingNode()->isStackingContext()) | 228 if (layer->stackingNode()->isStackingContext()) |
229 info.ancestorStackingContext = layer; | 229 info.ancestorStackingContext = layer; |
230 | 230 |
231 if (layer->isRootLayer() || layer->layoutObject()->hasOverflowClip()) | 231 if (layer->isRootLayer() || layer->layoutObject().hasOverflowClip()) |
232 info.lastOverflowClipLayer = layer; | 232 info.lastOverflowClipLayer = layer; |
233 | 233 |
234 if (layer->scrollsOverflow()) | 234 if (layer->scrollsOverflow()) |
235 info.lastScrollingAncestor = layer; | 235 info.lastScrollingAncestor = layer; |
236 | 236 |
237 if (layer->layoutObject()->hasClipRelatedProperty()) | 237 if (layer->layoutObject().hasClipRelatedProperty()) |
238 info.hasAncestorWithClipRelatedProperty = true; | 238 info.hasAncestorWithClipRelatedProperty = true; |
239 | 239 |
240 if (layer->layoutObject()->hasClipPath()) | 240 if (layer->layoutObject().hasClipPath()) |
241 info.hasAncestorWithClipPath = true; | 241 info.hasAncestorWithClipPath = true; |
242 | 242 |
243 for (PaintLayer* child = layer->firstChild(); child; | 243 for (PaintLayer* child = layer->firstChild(); child; |
244 child = child->nextSibling()) | 244 child = child->nextSibling()) |
245 updateRecursive(child, updateType, info); | 245 updateRecursive(child, updateType, info); |
246 | 246 |
247 layer->didUpdateCompositingInputs(); | 247 layer->didUpdateCompositingInputs(); |
248 | 248 |
249 m_geometryMap.popMappingsToAncestor(layer->parent()); | 249 m_geometryMap.popMappingsToAncestor(layer->parent()); |
250 | 250 |
251 if (layer->selfPaintingStatusChanged()) { | 251 if (layer->selfPaintingStatusChanged()) { |
252 layer->clearSelfPaintingStatusChanged(); | 252 layer->clearSelfPaintingStatusChanged(); |
253 // If the floating object becomes non-self-painting, so some ancestor should | 253 // If the floating object becomes non-self-painting, so some ancestor should |
254 // paint it; if it becomes self-painting, it should paint itself and no | 254 // paint it; if it becomes self-painting, it should paint itself and no |
255 // ancestor should paint it. | 255 // ancestor should paint it. |
256 if (layer->layoutObject()->isFloating()) { | 256 if (layer->layoutObject().isFloating()) { |
257 LayoutBlockFlow::updateAncestorShouldPaintFloatingObject( | 257 LayoutBlockFlow::updateAncestorShouldPaintFloatingObject( |
258 *layer->layoutBox()); | 258 *layer->layoutBox()); |
259 } | 259 } |
260 } | 260 } |
261 } | 261 } |
262 | 262 |
263 #if DCHECK_IS_ON() | 263 #if DCHECK_IS_ON() |
264 | 264 |
265 void CompositingInputsUpdater::assertNeedsCompositingInputsUpdateBitsCleared( | 265 void CompositingInputsUpdater::assertNeedsCompositingInputsUpdateBitsCleared( |
266 PaintLayer* layer) { | 266 PaintLayer* layer) { |
267 ASSERT(!layer->childNeedsCompositingInputsUpdate()); | 267 ASSERT(!layer->childNeedsCompositingInputsUpdate()); |
268 ASSERT(!layer->needsCompositingInputsUpdate()); | 268 ASSERT(!layer->needsCompositingInputsUpdate()); |
269 | 269 |
270 for (PaintLayer* child = layer->firstChild(); child; | 270 for (PaintLayer* child = layer->firstChild(); child; |
271 child = child->nextSibling()) | 271 child = child->nextSibling()) |
272 assertNeedsCompositingInputsUpdateBitsCleared(child); | 272 assertNeedsCompositingInputsUpdateBitsCleared(child); |
273 } | 273 } |
274 | 274 |
275 #endif | 275 #endif |
276 | 276 |
277 } // namespace blink | 277 } // namespace blink |
OLD | NEW |