OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2012 Google Inc. All rights reserved. | 2 * Copyright (C) 2012 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * * Neither the name of Google Inc. nor the names of its | 10 * * Neither the name of Google Inc. nor the names of its |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 m_nodes[i]->lazyReattachIfAttached(); | 122 m_nodes[i]->lazyReattachIfAttached(); |
123 } | 123 } |
124 } | 124 } |
125 | 125 |
126 PassOwnPtr<ElementShadow> ElementShadow::create() | 126 PassOwnPtr<ElementShadow> ElementShadow::create() |
127 { | 127 { |
128 return adoptPtr(new ElementShadow()); | 128 return adoptPtr(new ElementShadow()); |
129 } | 129 } |
130 | 130 |
131 ElementShadow::ElementShadow() | 131 ElementShadow::ElementShadow() |
132 : m_needsDistributionRecalc(false) | 132 : m_shadowRoot(0) |
| 133 , m_needsDistributionRecalc(false) |
133 , m_needsSelectFeatureSet(false) | 134 , m_needsSelectFeatureSet(false) |
134 { | 135 { |
135 } | 136 } |
136 | 137 |
137 ElementShadow::~ElementShadow() | 138 ElementShadow::~ElementShadow() |
138 { | 139 { |
139 #if !ENABLE(OILPAN) | 140 removeDetachedShadowRoot(); |
140 removeDetachedShadowRoots(); | |
141 #endif | |
142 } | 141 } |
143 | 142 |
144 ShadowRoot& ElementShadow::addShadowRoot(Element& shadowHost) | 143 ShadowRoot& ElementShadow::addShadowRoot(Element& shadowHost) |
145 { | 144 { |
146 EventDispatchForbiddenScope assertNoEventDispatch; | 145 EventDispatchForbiddenScope assertNoEventDispatch; |
147 ScriptForbiddenScope forbidScript; | 146 ScriptForbiddenScope forbidScript; |
148 | 147 |
149 for (ShadowRoot* root = youngestShadowRoot(); root; root = root->olderShadow
Root()) | 148 ASSERT(!m_shadowRoot); |
150 root->lazyReattachIfAttached(); | |
151 | 149 |
152 RefPtr<ShadowRoot> shadowRoot = ShadowRoot::create(shadowHost.document()); | 150 RefPtr<ShadowRoot> shadowRoot = ShadowRoot::create(shadowHost.document()); |
153 shadowRoot->setParentOrShadowHostNode(&shadowHost); | 151 shadowRoot->setParentOrShadowHostNode(&shadowHost); |
154 shadowRoot->setParentTreeScope(shadowHost.treeScope()); | 152 shadowRoot->setParentTreeScope(shadowHost.treeScope()); |
155 m_shadowRoots.push(shadowRoot.get()); | 153 m_shadowRoot = shadowRoot.get(); |
| 154 |
156 setNeedsDistributionRecalc(); | 155 setNeedsDistributionRecalc(); |
157 | 156 |
158 shadowRoot->insertedInto(&shadowHost); | 157 shadowRoot->insertedInto(&shadowHost); |
159 | 158 |
160 return *shadowRoot; | 159 return *shadowRoot; |
161 } | 160 } |
162 | 161 |
163 #if !ENABLE(OILPAN) | 162 void ElementShadow::removeDetachedShadowRoot() |
164 void ElementShadow::removeDetachedShadowRoots() | |
165 { | 163 { |
166 // Dont protect this ref count. | 164 // Dont protect this ref count. |
167 Element* shadowHost = host(); | 165 Element* shadowHost = host(); |
168 ASSERT(shadowHost); | 166 ASSERT(shadowHost); |
169 | 167 |
170 while (RefPtr<ShadowRoot> oldRoot = m_shadowRoots.head()) { | 168 if (RefPtr<ShadowRoot> oldRoot = m_shadowRoot) { |
171 shadowHost->document().removeFocusedElementOfSubtree(oldRoot.get()); | 169 shadowHost->document().removeFocusedElementOfSubtree(oldRoot.get()); |
172 m_shadowRoots.removeHead(); | 170 m_shadowRoot = 0; |
173 oldRoot->setParentOrShadowHostNode(0); | 171 oldRoot->setParentOrShadowHostNode(0); |
174 oldRoot->setParentTreeScope(shadowHost->document()); | 172 oldRoot->setParentTreeScope(shadowHost->document()); |
175 oldRoot->setPrev(0); | |
176 oldRoot->setNext(0); | |
177 } | 173 } |
178 } | 174 } |
179 #endif | |
180 | 175 |
181 void ElementShadow::attach(const Node::AttachContext& context) | 176 void ElementShadow::attach(const Node::AttachContext& context) |
182 { | 177 { |
| 178 if (!m_shadowRoot) |
| 179 return; |
| 180 |
| 181 ASSERT(m_shadowRoot->needsAttach()); |
| 182 |
183 Node::AttachContext childrenContext(context); | 183 Node::AttachContext childrenContext(context); |
184 childrenContext.resolvedStyle = 0; | 184 childrenContext.resolvedStyle = 0; |
185 | 185 m_shadowRoot->attach(childrenContext); |
186 for (ShadowRoot* root = youngestShadowRoot(); root; root = root->olderShadow
Root()) { | |
187 if (root->needsAttach()) | |
188 root->attach(childrenContext); | |
189 } | |
190 } | 186 } |
191 | 187 |
192 void ElementShadow::detach(const Node::AttachContext& context) | 188 void ElementShadow::detach(const Node::AttachContext& context) |
193 { | 189 { |
| 190 if (!m_shadowRoot) |
| 191 return; |
| 192 |
194 Node::AttachContext childrenContext(context); | 193 Node::AttachContext childrenContext(context); |
195 childrenContext.resolvedStyle = 0; | 194 childrenContext.resolvedStyle = 0; |
196 | 195 m_shadowRoot->detach(childrenContext); |
197 for (ShadowRoot* root = youngestShadowRoot(); root; root = root->olderShadow
Root()) | |
198 root->detach(childrenContext); | |
199 } | 196 } |
200 | 197 |
201 void ElementShadow::setNeedsDistributionRecalc() | 198 void ElementShadow::setNeedsDistributionRecalc() |
202 { | 199 { |
203 if (m_needsDistributionRecalc) | 200 if (m_needsDistributionRecalc) |
204 return; | 201 return; |
205 m_needsDistributionRecalc = true; | 202 m_needsDistributionRecalc = true; |
206 host()->markAncestorsWithChildNeedsDistributionRecalc(); | 203 host()->markAncestorsWithChildNeedsDistributionRecalc(); |
207 clearDistribution(); | 204 clearDistribution(); |
208 } | 205 } |
209 | 206 |
210 bool ElementShadow::hasSameStyles(const ElementShadow* other) const | 207 bool ElementShadow::hasSameStyles(const ElementShadow* other) const |
211 { | 208 { |
212 ShadowRoot* root = youngestShadowRoot(); | 209 ShadowRoot* root = m_shadowRoot; |
213 ShadowRoot* otherRoot = other->youngestShadowRoot(); | 210 ShadowRoot* otherRoot = other->shadowRoot(); |
214 while (root || otherRoot) { | 211 if (root || otherRoot) { |
215 if (!root || !otherRoot) | 212 if (!root || !otherRoot) |
216 return false; | 213 return false; |
217 | 214 |
218 StyleSheetList* list = root->styleSheets(); | 215 StyleSheetList* list = root->styleSheets(); |
219 StyleSheetList* otherList = otherRoot->styleSheets(); | 216 StyleSheetList* otherList = otherRoot->styleSheets(); |
220 | 217 |
221 if (list->length() != otherList->length()) | 218 if (list->length() != otherList->length()) |
222 return false; | 219 return false; |
223 | 220 |
224 for (size_t i = 0; i < list->length(); i++) { | 221 for (size_t i = 0; i < list->length(); i++) { |
225 if (toCSSStyleSheet(list->item(i))->contents() != toCSSStyleSheet(ot
herList->item(i))->contents()) | 222 if (toCSSStyleSheet(list->item(i))->contents() != toCSSStyleSheet(ot
herList->item(i))->contents()) |
226 return false; | 223 return false; |
227 } | 224 } |
228 root = root->olderShadowRoot(); | |
229 otherRoot = otherRoot->olderShadowRoot(); | |
230 } | 225 } |
231 | 226 |
232 return true; | 227 return true; |
233 } | 228 } |
234 | 229 |
235 const InsertionPoint* ElementShadow::finalDestinationInsertionPointFor(const Nod
e* key) const | 230 const InsertionPoint* ElementShadow::finalDestinationInsertionPointFor(const Nod
e* key) const |
236 { | 231 { |
237 ASSERT(key && !key->document().childNeedsDistributionRecalc()); | 232 ASSERT(key && !key->document().childNeedsDistributionRecalc()); |
238 NodeToDestinationInsertionPoints::const_iterator it = m_nodeToInsertionPoint
s.find(key); | 233 NodeToDestinationInsertionPoints::const_iterator it = m_nodeToInsertionPoint
s.find(key); |
239 return it == m_nodeToInsertionPoints.end() ? 0: it->value.last().get(); | 234 return it == m_nodeToInsertionPoints.end() ? 0: it->value.last().get(); |
240 } | 235 } |
241 | 236 |
242 const DestinationInsertionPoints* ElementShadow::destinationInsertionPointsFor(c
onst Node* key) const | 237 const DestinationInsertionPoints* ElementShadow::destinationInsertionPointsFor(c
onst Node* key) const |
243 { | 238 { |
244 ASSERT(key && !key->document().childNeedsDistributionRecalc()); | 239 ASSERT(key && !key->document().childNeedsDistributionRecalc()); |
245 NodeToDestinationInsertionPoints::const_iterator it = m_nodeToInsertionPoint
s.find(key); | 240 NodeToDestinationInsertionPoints::const_iterator it = m_nodeToInsertionPoint
s.find(key); |
246 return it == m_nodeToInsertionPoints.end() ? 0: &it->value; | 241 return it == m_nodeToInsertionPoints.end() ? 0: &it->value; |
247 } | 242 } |
248 | 243 |
249 void ElementShadow::distribute() | 244 void ElementShadow::distribute() |
250 { | 245 { |
251 host()->setNeedsStyleRecalc(SubtreeStyleChange); | 246 host()->setNeedsStyleRecalc(SubtreeStyleChange); |
252 DistributionPool pool(*host()); | 247 DistributionPool pool(*host()); |
253 | 248 |
254 for (ShadowRoot* root = youngestShadowRoot(); root; root = root->olderShadow
Root()) { | 249 if (ShadowRoot* root = shadowRoot()) { |
255 const Vector<RefPtr<InsertionPoint> >& insertionPoints = root->descendan
tInsertionPoints(); | 250 const Vector<RefPtr<InsertionPoint> >& insertionPoints = root->descendan
tInsertionPoints(); |
256 for (size_t i = 0; i < insertionPoints.size(); ++i) { | 251 for (size_t i = 0; i < insertionPoints.size(); ++i) { |
257 InsertionPoint* point = insertionPoints[i].get(); | 252 InsertionPoint* point = insertionPoints[i].get(); |
258 if (!point->isActive()) | 253 if (!point->isActive()) |
259 continue; | 254 continue; |
260 pool.distributeTo(point, this); | 255 pool.distributeTo(point, this); |
261 if (ElementShadow* shadow = shadowWhereNodeCanBeDistributed(*point)) | 256 if (ElementShadow* shadow = shadowWhereNodeCanBeDistributed(*point)) |
262 shadow->setNeedsDistributionRecalc(); | 257 shadow->setNeedsDistributionRecalc(); |
263 } | 258 } |
264 } | 259 } |
265 } | 260 } |
266 | 261 |
267 void ElementShadow::didDistributeNode(const Node* node, InsertionPoint* insertio
nPoint) | 262 void ElementShadow::didDistributeNode(const Node* node, InsertionPoint* insertio
nPoint) |
268 { | 263 { |
269 NodeToDestinationInsertionPoints::AddResult result = m_nodeToInsertionPoints
.add(node, DestinationInsertionPoints()); | 264 NodeToDestinationInsertionPoints::AddResult result = m_nodeToInsertionPoints
.add(node, DestinationInsertionPoints()); |
270 result.storedValue->value.append(insertionPoint); | 265 result.storedValue->value.append(insertionPoint); |
271 } | 266 } |
272 | 267 |
273 const SelectRuleFeatureSet& ElementShadow::ensureSelectFeatureSet() | 268 const SelectRuleFeatureSet& ElementShadow::ensureSelectFeatureSet() |
274 { | 269 { |
275 if (!m_needsSelectFeatureSet) | 270 if (!m_needsSelectFeatureSet) |
276 return m_selectFeatures; | 271 return m_selectFeatures; |
277 | 272 |
278 m_selectFeatures.clear(); | 273 m_selectFeatures.clear(); |
279 for (ShadowRoot* root = oldestShadowRoot(); root; root = root->youngerShadow
Root()) | 274 if (ShadowRoot* root = shadowRoot()) |
280 collectSelectFeatureSetFrom(*root); | 275 collectSelectFeatureSetFrom(*root); |
281 m_needsSelectFeatureSet = false; | 276 m_needsSelectFeatureSet = false; |
282 return m_selectFeatures; | 277 return m_selectFeatures; |
283 } | 278 } |
284 | 279 |
285 void ElementShadow::collectSelectFeatureSetFrom(ShadowRoot& root) | 280 void ElementShadow::collectSelectFeatureSetFrom(ShadowRoot& root) |
286 { | 281 { |
287 if (!root.containsShadowRoots() && !root.containsContentElements()) | 282 if (!root.containsShadowRoots() && !root.containsContentElements()) |
288 return; | 283 return; |
289 | 284 |
(...skipping 19 matching lines...) Expand all Loading... |
309 } | 304 } |
310 setNeedsDistributionRecalc(); | 305 setNeedsDistributionRecalc(); |
311 } | 306 } |
312 | 307 |
313 void ElementShadow::clearDistribution() | 308 void ElementShadow::clearDistribution() |
314 { | 309 { |
315 m_nodeToInsertionPoints.clear(); | 310 m_nodeToInsertionPoints.clear(); |
316 } | 311 } |
317 | 312 |
318 } // namespace | 313 } // namespace |
OLD | NEW |