OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights
reserved. | 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights
reserved. |
3 * | 3 * |
4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. | 4 * Portions are Copyright (C) 1998 Netscape Communications Corporation. |
5 * | 5 * |
6 * Other contributors: | 6 * Other contributors: |
7 * Robert O'Callahan <roc+@cs.cmu.edu> | 7 * Robert O'Callahan <roc+@cs.cmu.edu> |
8 * David Baron <dbaron@fas.harvard.edu> | 8 * David Baron <dbaron@fas.harvard.edu> |
9 * Christian Biesinger <cbiesinger@web.de> | 9 * Christian Biesinger <cbiesinger@web.de> |
10 * Randall Jesup <rjesup@wgate.com> | 10 * Randall Jesup <rjesup@wgate.com> |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
45 | 45 |
46 #include "core/layout/LayoutView.h" | 46 #include "core/layout/LayoutView.h" |
47 #include "core/layout/compositing/PaintLayerCompositor.h" | 47 #include "core/layout/compositing/PaintLayerCompositor.h" |
48 #include "core/paint/PaintLayer.h" | 48 #include "core/paint/PaintLayer.h" |
49 #include "public/platform/Platform.h" | 49 #include "public/platform/Platform.h" |
50 #include <algorithm> | 50 #include <algorithm> |
51 | 51 |
52 namespace blink { | 52 namespace blink { |
53 | 53 |
54 // FIXME: This should not require PaintLayer. There is currently a cycle where | 54 // FIXME: This should not require PaintLayer. There is currently a cycle where |
55 // in order to determine if we shoulBeTreatedAsStackingContext() we have to ask
the paint | 55 // in order to determine if we isStacked() we have to ask the paint |
56 // layer about some of its state. | 56 // layer about some of its state. |
57 PaintLayerStackingNode::PaintLayerStackingNode(PaintLayer* layer) | 57 PaintLayerStackingNode::PaintLayerStackingNode(PaintLayer* layer) |
58 : m_layer(layer) | 58 : m_layer(layer) |
59 #if ENABLE(ASSERT) | 59 #if ENABLE(ASSERT) |
60 , m_layerListMutationAllowed(true) | 60 , m_layerListMutationAllowed(true) |
61 , m_stackingParent(0) | 61 , m_stackingParent(0) |
62 #endif | 62 #endif |
63 { | 63 { |
64 m_isTreatedAsOrStackingContext = shouldBeTreatedAsOrStackingContext(); | 64 m_isStacked = layoutObject()->styleRef().isStacked(); |
65 | 65 |
66 // Non-stacking contexts should have empty z-order lists. As this is already
the case, | 66 // Non-stacking contexts should have empty z-order lists. As this is already
the case, |
67 // there is no need to dirty / recompute these lists. | 67 // there is no need to dirty / recompute these lists. |
68 m_zOrderListsDirty = isStackingContext(); | 68 m_zOrderListsDirty = isStackingContext(); |
69 } | 69 } |
70 | 70 |
71 PaintLayerStackingNode::~PaintLayerStackingNode() | 71 PaintLayerStackingNode::~PaintLayerStackingNode() |
72 { | 72 { |
73 #if ENABLE(ASSERT) | 73 #if ENABLE(ASSERT) |
74 if (!layoutObject()->documentBeingDestroyed()) { | 74 if (!layoutObject()->documentBeingDestroyed()) { |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
154 #endif | 154 #endif |
155 | 155 |
156 m_zOrderListsDirty = false; | 156 m_zOrderListsDirty = false; |
157 } | 157 } |
158 | 158 |
159 void PaintLayerStackingNode::collectLayers(OwnPtr<Vector<PaintLayerStackingNode*
>>& posBuffer, OwnPtr<Vector<PaintLayerStackingNode*>>& negBuffer) | 159 void PaintLayerStackingNode::collectLayers(OwnPtr<Vector<PaintLayerStackingNode*
>>& posBuffer, OwnPtr<Vector<PaintLayerStackingNode*>>& negBuffer) |
160 { | 160 { |
161 if (layer()->isInTopLayer()) | 161 if (layer()->isInTopLayer()) |
162 return; | 162 return; |
163 | 163 |
164 if (isTreatedAsOrStackingContext()) { | 164 if (isStacked()) { |
165 OwnPtr<Vector<PaintLayerStackingNode*>>& buffer = (zIndex() >= 0) ? posB
uffer : negBuffer; | 165 OwnPtr<Vector<PaintLayerStackingNode*>>& buffer = (zIndex() >= 0) ? posB
uffer : negBuffer; |
166 if (!buffer) | 166 if (!buffer) |
167 buffer = adoptPtr(new Vector<PaintLayerStackingNode*>); | 167 buffer = adoptPtr(new Vector<PaintLayerStackingNode*>); |
168 buffer->append(this); | 168 buffer->append(this); |
169 } | 169 } |
170 | 170 |
171 if (!isStackingContext()) { | 171 if (!isStackingContext()) { |
172 for (PaintLayer* child = layer()->firstChild(); child; child = child->ne
xtSibling()) { | 172 for (PaintLayer* child = layer()->firstChild(); child; child = child->ne
xtSibling()) { |
173 if (!layer()->reflectionInfo() || layer()->reflectionInfo()->reflect
ionLayer() != child) | 173 if (!layer()->reflectionInfo() || layer()->reflectionInfo()->reflect
ionLayer() != child) |
174 child->stackingNode()->collectLayers(posBuffer, negBuffer); | 174 child->stackingNode()->collectLayers(posBuffer, negBuffer); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
210 { | 210 { |
211 updateZOrderLists(); | 211 updateZOrderLists(); |
212 | 212 |
213 if (!layer()->reflectionInfo()) | 213 if (!layer()->reflectionInfo()) |
214 return; | 214 return; |
215 | 215 |
216 PaintLayer* reflectionLayer = layer()->reflectionInfo()->reflectionLayer(); | 216 PaintLayer* reflectionLayer = layer()->reflectionInfo()->reflectionLayer(); |
217 reflectionLayer->stackingNode()->updateZOrderLists(); | 217 reflectionLayer->stackingNode()->updateZOrderLists(); |
218 } | 218 } |
219 | 219 |
220 void PaintLayerStackingNode::updateStackingNodesAfterStyleChange(const ComputedS
tyle* oldStyle) | 220 void PaintLayerStackingNode::styleDidChange(const ComputedStyle* oldStyle) |
221 { | 221 { |
222 bool wasStackingContext = oldStyle ? !oldStyle->hasAutoZIndex() : false; | 222 bool wasStackingContext = oldStyle ? oldStyle->isStackingContext() : false; |
223 int oldZIndex = oldStyle ? oldStyle->zIndex() : 0; | 223 int oldZIndex = oldStyle ? oldStyle->zIndex() : 0; |
224 | 224 |
225 bool isStackingContext = this->isStackingContext(); | 225 bool isStackingContext = this->isStackingContext(); |
226 if (isStackingContext == wasStackingContext && oldZIndex == zIndex()) | 226 bool shouldBeStacked = layoutObject()->styleRef().isStacked(); |
| 227 if (isStackingContext == wasStackingContext && m_isStacked == shouldBeStacke
d && oldZIndex == zIndex()) |
227 return; | 228 return; |
228 | 229 |
229 dirtyStackingContextZOrderLists(); | 230 dirtyStackingContextZOrderLists(); |
230 | 231 |
231 if (isStackingContext) | 232 if (isStackingContext) |
232 dirtyZOrderLists(); | 233 dirtyZOrderLists(); |
233 else | 234 else |
234 clearZOrderLists(); | 235 clearZOrderLists(); |
235 } | |
236 | 236 |
237 void PaintLayerStackingNode::updateIsTreatedAsStackingContext() | 237 if (m_isStacked != shouldBeStacked) { |
238 { | 238 m_isStacked = shouldBeStacked; |
239 bool isTreatedAsOrStackingContext = shouldBeTreatedAsOrStackingContext(); | 239 if (!layoutObject()->documentBeingDestroyed() && !layer()->isRootLayer()
) |
240 if (isTreatedAsOrStackingContext == this->isTreatedAsOrStackingContext()) | 240 compositor()->setNeedsCompositingUpdate(CompositingUpdateRebuildTree
); |
241 return; | 241 } |
242 | |
243 m_isTreatedAsOrStackingContext = isTreatedAsOrStackingContext; | |
244 if (!layoutObject()->documentBeingDestroyed() && !layer()->isRootLayer()) | |
245 compositor()->setNeedsCompositingUpdate(CompositingUpdateRebuildTree); | |
246 dirtyStackingContextZOrderLists(); | |
247 } | 242 } |
248 | 243 |
249 PaintLayerStackingNode* PaintLayerStackingNode::ancestorStackingContextNode() co
nst | 244 PaintLayerStackingNode* PaintLayerStackingNode::ancestorStackingContextNode() co
nst |
250 { | 245 { |
251 for (PaintLayer* ancestor = layer()->parent(); ancestor; ancestor = ancestor
->parent()) { | 246 for (PaintLayer* ancestor = layer()->parent(); ancestor; ancestor = ancestor
->parent()) { |
252 PaintLayerStackingNode* stackingNode = ancestor->stackingNode(); | 247 PaintLayerStackingNode* stackingNode = ancestor->stackingNode(); |
253 if (stackingNode->isStackingContext()) | 248 if (stackingNode->isStackingContext()) |
254 return stackingNode; | 249 return stackingNode; |
255 } | 250 } |
256 return 0; | 251 return 0; |
257 } | 252 } |
258 | 253 |
259 LayoutBoxModelObject* PaintLayerStackingNode::layoutObject() const | 254 LayoutBoxModelObject* PaintLayerStackingNode::layoutObject() const |
260 { | 255 { |
261 return m_layer->layoutObject(); | 256 return m_layer->layoutObject(); |
262 } | 257 } |
263 | 258 |
264 } // namespace blink | 259 } // namespace blink |
OLD | NEW |