OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2003, 2009, 2012 Apple Inc. All rights reserved. | 2 * Copyright (C) 2003, 2009, 2012 Apple Inc. All rights reserved. |
3 * Copyright (C) 2013 Intel Corporation. All rights reserved. | 3 * Copyright (C) 2013 Intel Corporation. All rights reserved. |
4 * | 4 * |
5 * Portions are Copyright (C) 1998 Netscape Communications Corporation. | 5 * Portions are Copyright (C) 1998 Netscape Communications Corporation. |
6 * | 6 * |
7 * Other contributors: | 7 * Other contributors: |
8 * Robert O'Callahan <roc+@cs.cmu.edu> | 8 * Robert O'Callahan <roc+@cs.cmu.edu> |
9 * David Baron <dbaron@fas.harvard.edu> | 9 * David Baron <dbaron@fas.harvard.edu> |
10 * Christian Biesinger <cbiesinger@web.de> | 10 * Christian Biesinger <cbiesinger@web.de> |
(...skipping 24 matching lines...) Expand all Loading... |
35 * applicable instead of those above. If you wish to allow use of your | 35 * applicable instead of those above. If you wish to allow use of your |
36 * version of this file only under the terms of one of those two | 36 * version of this file only under the terms of one of those two |
37 * licenses (the MPL or the GPL) and not to allow others to use your | 37 * licenses (the MPL or the GPL) and not to allow others to use your |
38 * version of this file under the LGPL, indicate your decision by | 38 * version of this file under the LGPL, indicate your decision by |
39 * deletingthe provisions above and replace them with the notice and | 39 * deletingthe provisions above and replace them with the notice and |
40 * other provisions required by the MPL or the GPL, as the case may be. | 40 * other provisions required by the MPL or the GPL, as the case may be. |
41 * If you do not delete the provisions above, a recipient may use your | 41 * If you do not delete the provisions above, a recipient may use your |
42 * version of this file under any of the LGPL, the MPL or the GPL. | 42 * version of this file under any of the LGPL, the MPL or the GPL. |
43 */ | 43 */ |
44 | 44 |
45 #ifndef RenderLayerStackingNode_h | 45 #ifndef LayerStackingNode_h |
46 #define RenderLayerStackingNode_h | 46 #define LayerStackingNode_h |
47 | 47 |
48 #include "core/rendering/RenderLayerModelObject.h" | 48 #include "core/layout/LayoutLayerModelObject.h" |
49 #include "wtf/Noncopyable.h" | 49 #include "wtf/Noncopyable.h" |
50 #include "wtf/OwnPtr.h" | 50 #include "wtf/OwnPtr.h" |
51 #include "wtf/Vector.h" | 51 #include "wtf/Vector.h" |
52 | 52 |
53 namespace blink { | 53 namespace blink { |
54 | 54 |
55 class RenderLayer; | 55 class Layer; |
56 class RenderLayerCompositor; | 56 class LayerCompositor; |
57 class RenderStyle; | 57 class RenderStyle; |
58 | 58 |
59 class RenderLayerStackingNode { | 59 class LayerStackingNode { |
60 WTF_MAKE_NONCOPYABLE(RenderLayerStackingNode); | 60 WTF_MAKE_NONCOPYABLE(LayerStackingNode); |
61 public: | 61 public: |
62 explicit RenderLayerStackingNode(RenderLayer*); | 62 explicit LayerStackingNode(Layer*); |
63 ~RenderLayerStackingNode(); | 63 ~LayerStackingNode(); |
64 | 64 |
65 int zIndex() const { return renderer()->style()->zIndex(); } | 65 int zIndex() const { return renderer()->style()->zIndex(); } |
66 | 66 |
67 // A stacking context is a layer that has a non-auto z-index. | 67 // A stacking context is a layer that has a non-auto z-index. |
68 bool isStackingContext() const { return !renderer()->style()->hasAutoZIndex(
); } | 68 bool isStackingContext() const { return !renderer()->style()->hasAutoZIndex(
); } |
69 | 69 |
70 // Update our normal and z-index lists. | 70 // Update our normal and z-index lists. |
71 void updateLayerListsIfNeeded(); | 71 void updateLayerListsIfNeeded(); |
72 | 72 |
73 bool zOrderListsDirty() const { return m_zOrderListsDirty; } | 73 bool zOrderListsDirty() const { return m_zOrderListsDirty; } |
74 void dirtyZOrderLists(); | 74 void dirtyZOrderLists(); |
75 void updateZOrderLists(); | 75 void updateZOrderLists(); |
76 void clearZOrderLists(); | 76 void clearZOrderLists(); |
77 void dirtyStackingContextZOrderLists(); | 77 void dirtyStackingContextZOrderLists(); |
78 | 78 |
79 bool hasPositiveZOrderList() const { return posZOrderList() && posZOrderList
()->size(); } | 79 bool hasPositiveZOrderList() const { return posZOrderList() && posZOrderList
()->size(); } |
80 bool hasNegativeZOrderList() const { return negZOrderList() && negZOrderList
()->size(); } | 80 bool hasNegativeZOrderList() const { return negZOrderList() && negZOrderList
()->size(); } |
81 | 81 |
82 // FIXME: should check for dirtiness here? | 82 // FIXME: should check for dirtiness here? |
83 bool isNormalFlowOnly() const { return m_isNormalFlowOnly; } | 83 bool isNormalFlowOnly() const { return m_isNormalFlowOnly; } |
84 void updateIsNormalFlowOnly(); | 84 void updateIsNormalFlowOnly(); |
85 bool normalFlowListDirty() const { return m_normalFlowListDirty; } | 85 bool normalFlowListDirty() const { return m_normalFlowListDirty; } |
86 void dirtyNormalFlowList(); | 86 void dirtyNormalFlowList(); |
87 | 87 |
88 void updateStackingNodesAfterStyleChange(const RenderStyle* oldStyle); | 88 void updateStackingNodesAfterStyleChange(const RenderStyle* oldStyle); |
89 | 89 |
90 RenderLayerStackingNode* ancestorStackingContextNode() const; | 90 LayerStackingNode* ancestorStackingContextNode() const; |
91 | 91 |
92 RenderLayer* layer() const { return m_layer; } | 92 Layer* layer() const { return m_layer; } |
93 | 93 |
94 #if ENABLE(ASSERT) | 94 #if ENABLE(ASSERT) |
95 bool layerListMutationAllowed() const { return m_layerListMutationAllowed; } | 95 bool layerListMutationAllowed() const { return m_layerListMutationAllowed; } |
96 void setLayerListMutationAllowed(bool flag) { m_layerListMutationAllowed = f
lag; } | 96 void setLayerListMutationAllowed(bool flag) { m_layerListMutationAllowed = f
lag; } |
97 #endif | 97 #endif |
98 | 98 |
99 private: | 99 private: |
100 friend class RenderLayerStackingNodeIterator; | 100 friend class LayerStackingNodeIterator; |
101 friend class RenderLayerStackingNodeReverseIterator; | 101 friend class LayerStackingNodeReverseIterator; |
102 friend class LayoutTreeAsText; | 102 friend class LayoutTreeAsText; |
103 | 103 |
104 Vector<RenderLayerStackingNode*>* posZOrderList() const | 104 Vector<LayerStackingNode*>* posZOrderList() const |
105 { | 105 { |
106 ASSERT(!m_zOrderListsDirty); | 106 ASSERT(!m_zOrderListsDirty); |
107 ASSERT(isStackingContext() || !m_posZOrderList); | 107 ASSERT(isStackingContext() || !m_posZOrderList); |
108 return m_posZOrderList.get(); | 108 return m_posZOrderList.get(); |
109 } | 109 } |
110 | 110 |
111 Vector<RenderLayerStackingNode*>* normalFlowList() const | 111 Vector<LayerStackingNode*>* normalFlowList() const |
112 { | 112 { |
113 ASSERT(!m_normalFlowListDirty); | 113 ASSERT(!m_normalFlowListDirty); |
114 return m_normalFlowList.get(); | 114 return m_normalFlowList.get(); |
115 } | 115 } |
116 | 116 |
117 Vector<RenderLayerStackingNode*>* negZOrderList() const | 117 Vector<LayerStackingNode*>* negZOrderList() const |
118 { | 118 { |
119 ASSERT(!m_zOrderListsDirty); | 119 ASSERT(!m_zOrderListsDirty); |
120 ASSERT(isStackingContext() || !m_negZOrderList); | 120 ASSERT(isStackingContext() || !m_negZOrderList); |
121 return m_negZOrderList.get(); | 121 return m_negZOrderList.get(); |
122 } | 122 } |
123 | 123 |
124 void rebuildZOrderLists(); | 124 void rebuildZOrderLists(); |
125 void collectLayers(OwnPtr<Vector<RenderLayerStackingNode*> >& posZOrderList,
OwnPtr<Vector<RenderLayerStackingNode*> >& negZOrderList); | 125 void collectLayers(OwnPtr<Vector<LayerStackingNode*>>& posZOrderList, OwnPtr
<Vector<LayerStackingNode*>>& negZOrderList); |
126 | 126 |
127 #if ENABLE(ASSERT) | 127 #if ENABLE(ASSERT) |
128 bool isInStackingParentZOrderLists() const; | 128 bool isInStackingParentZOrderLists() const; |
129 bool isInStackingParentNormalFlowList() const; | 129 bool isInStackingParentNormalFlowList() const; |
130 void updateStackingParentForZOrderLists(RenderLayerStackingNode* stackingPar
ent); | 130 void updateStackingParentForZOrderLists(LayerStackingNode* stackingParent); |
131 void updateStackingParentForNormalFlowList(RenderLayerStackingNode* stacking
Parent); | 131 void updateStackingParentForNormalFlowList(LayerStackingNode* stackingParent
); |
132 void setStackingParent(RenderLayerStackingNode* stackingParent) { m_stacking
Parent = stackingParent; } | 132 void setStackingParent(LayerStackingNode* stackingParent) { m_stackingParent
= stackingParent; } |
133 #endif | 133 #endif |
134 | 134 |
135 bool shouldBeNormalFlowOnly() const; | 135 bool shouldBeNormalFlowOnly() const; |
136 | 136 |
137 void updateNormalFlowList(); | 137 void updateNormalFlowList(); |
138 | 138 |
139 bool isDirtyStackingContext() const { return m_zOrderListsDirty && isStackin
gContext(); } | 139 bool isDirtyStackingContext() const { return m_zOrderListsDirty && isStackin
gContext(); } |
140 | 140 |
141 RenderLayerCompositor* compositor() const; | 141 LayerCompositor* compositor() const; |
142 // FIXME: Investigate changing this to Renderbox. | 142 // FIXME: Investigate changing this to Renderbox. |
143 RenderLayerModelObject* renderer() const; | 143 LayoutLayerModelObject* renderer() const; |
144 | 144 |
145 RenderLayer* m_layer; | 145 Layer* m_layer; |
146 | 146 |
147 // m_posZOrderList holds a sorted list of all the descendant nodes within | 147 // m_posZOrderList holds a sorted list of all the descendant nodes within |
148 // that have z-indices of 0 or greater (auto will count as 0). | 148 // that have z-indices of 0 or greater (auto will count as 0). |
149 // m_negZOrderList holds descendants within our stacking context with | 149 // m_negZOrderList holds descendants within our stacking context with |
150 // negative z-indices. | 150 // negative z-indices. |
151 OwnPtr<Vector<RenderLayerStackingNode*> > m_posZOrderList; | 151 OwnPtr<Vector<LayerStackingNode*>> m_posZOrderList; |
152 OwnPtr<Vector<RenderLayerStackingNode*> > m_negZOrderList; | 152 OwnPtr<Vector<LayerStackingNode*>> m_negZOrderList; |
153 | 153 |
154 // This list contains child nodes that cannot create stacking contexts. | 154 // This list contains child nodes that cannot create stacking contexts. |
155 OwnPtr<Vector<RenderLayerStackingNode*> > m_normalFlowList; | 155 OwnPtr<Vector<LayerStackingNode*>> m_normalFlowList; |
156 | 156 |
157 unsigned m_zOrderListsDirty : 1; | 157 unsigned m_zOrderListsDirty : 1; |
158 unsigned m_normalFlowListDirty: 1; | 158 unsigned m_normalFlowListDirty: 1; |
159 unsigned m_isNormalFlowOnly : 1; | 159 unsigned m_isNormalFlowOnly : 1; |
160 | 160 |
161 #if ENABLE(ASSERT) | 161 #if ENABLE(ASSERT) |
162 unsigned m_layerListMutationAllowed : 1; | 162 unsigned m_layerListMutationAllowed : 1; |
163 RenderLayerStackingNode* m_stackingParent; | 163 LayerStackingNode* m_stackingParent; |
164 #endif | 164 #endif |
165 }; | 165 }; |
166 | 166 |
167 inline void RenderLayerStackingNode::clearZOrderLists() | 167 inline void LayerStackingNode::clearZOrderLists() |
168 { | 168 { |
169 ASSERT(!isStackingContext()); | 169 ASSERT(!isStackingContext()); |
170 | 170 |
171 #if ENABLE(ASSERT) | 171 #if ENABLE(ASSERT) |
172 updateStackingParentForZOrderLists(0); | 172 updateStackingParentForZOrderLists(0); |
173 #endif | 173 #endif |
174 | 174 |
175 m_posZOrderList.clear(); | 175 m_posZOrderList.clear(); |
176 m_negZOrderList.clear(); | 176 m_negZOrderList.clear(); |
177 } | 177 } |
178 | 178 |
179 inline void RenderLayerStackingNode::updateZOrderLists() | 179 inline void LayerStackingNode::updateZOrderLists() |
180 { | 180 { |
181 if (!m_zOrderListsDirty) | 181 if (!m_zOrderListsDirty) |
182 return; | 182 return; |
183 | 183 |
184 if (!isStackingContext()) { | 184 if (!isStackingContext()) { |
185 clearZOrderLists(); | 185 clearZOrderLists(); |
186 m_zOrderListsDirty = false; | 186 m_zOrderListsDirty = false; |
187 return; | 187 return; |
188 } | 188 } |
189 | 189 |
190 rebuildZOrderLists(); | 190 rebuildZOrderLists(); |
191 } | 191 } |
192 | 192 |
193 #if ENABLE(ASSERT) | 193 #if ENABLE(ASSERT) |
194 class LayerListMutationDetector { | 194 class LayerListMutationDetector { |
195 public: | 195 public: |
196 explicit LayerListMutationDetector(RenderLayerStackingNode* stackingNode) | 196 explicit LayerListMutationDetector(LayerStackingNode* stackingNode) |
197 : m_stackingNode(stackingNode) | 197 : m_stackingNode(stackingNode) |
198 , m_previousMutationAllowedState(stackingNode->layerListMutationAllowed(
)) | 198 , m_previousMutationAllowedState(stackingNode->layerListMutationAllowed(
)) |
199 { | 199 { |
200 m_stackingNode->setLayerListMutationAllowed(false); | 200 m_stackingNode->setLayerListMutationAllowed(false); |
201 } | 201 } |
202 | 202 |
203 ~LayerListMutationDetector() | 203 ~LayerListMutationDetector() |
204 { | 204 { |
205 m_stackingNode->setLayerListMutationAllowed(m_previousMutationAllowedSta
te); | 205 m_stackingNode->setLayerListMutationAllowed(m_previousMutationAllowedSta
te); |
206 } | 206 } |
207 | 207 |
208 private: | 208 private: |
209 RenderLayerStackingNode* m_stackingNode; | 209 LayerStackingNode* m_stackingNode; |
210 bool m_previousMutationAllowedState; | 210 bool m_previousMutationAllowedState; |
211 }; | 211 }; |
212 #endif | 212 #endif |
213 | 213 |
214 } // namespace blink | 214 } // namespace blink |
215 | 215 |
216 #endif // RenderLayerStackingNode_h | 216 #endif // LayerStackingNode_h |
OLD | NEW |