OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2001 Dirk Mueller (mueller@kde.org) | 4 * (C) 2001 Dirk Mueller (mueller@kde.org) |
5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) | 5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) |
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All r
ights reserved. | 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All r
ights reserved. |
7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) | 7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) |
8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. | 8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. |
9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) | 9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) |
10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved. | 10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved. |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 | 92 |
93 if (m_fontSelector) { | 93 if (m_fontSelector) { |
94 m_fontSelector->clearDocument(); | 94 m_fontSelector->clearDocument(); |
95 m_fontSelector->unregisterForInvalidationCallbacks(this); | 95 m_fontSelector->unregisterForInvalidationCallbacks(this); |
96 } | 96 } |
97 | 97 |
98 // Decrement reference counts for things we could be keeping alive. | 98 // Decrement reference counts for things we could be keeping alive. |
99 m_fontSelector.clear(); | 99 m_fontSelector.clear(); |
100 m_resolver.clear(); | 100 m_resolver.clear(); |
101 m_styleSheetCollectionMap.clear(); | 101 m_styleSheetCollectionMap.clear(); |
102 m_activeTreeScopes.clear(); | |
103 } | 102 } |
104 #endif | 103 #endif |
105 | 104 |
106 inline Document* StyleEngine::master() | 105 inline Document* StyleEngine::master() |
107 { | 106 { |
108 if (isMaster()) | 107 if (isMaster()) |
109 return m_document; | 108 return m_document; |
110 HTMLImportsController* import = document().importsController(); | 109 HTMLImportsController* import = document().importsController(); |
111 if (!import) // Document::import() can return null while executing its destr
uctor. | 110 if (!import) // Document::import() can return null while executing its destr
uctor. |
112 return 0; | 111 return 0; |
113 return import->master(); | 112 return import->master(); |
114 } | 113 } |
115 | 114 |
116 void StyleEngine::OrderedTreeScopeSet::insert(TreeScope* treeScope) | |
117 { | |
118 if (m_treeScopes.isEmpty()) { | |
119 m_treeScopes.append(treeScope); | |
120 m_hash.add(treeScope); | |
121 return; | |
122 } | |
123 if (m_hash.contains(treeScope)) | |
124 return; | |
125 | |
126 int end = m_treeScopes.size() - 1; | |
127 int start = 0; | |
128 int position = 0; | |
129 unsigned result = 0; | |
130 | |
131 while (start <= end) { | |
132 position = (start + end) / 2; | |
133 result = m_treeScopes[position]->comparePosition(*treeScope); | |
134 | |
135 if (result & Node::DOCUMENT_POSITION_PRECEDING) { | |
136 end = position - 1; | |
137 } else { | |
138 ASSERT(result & Node::DOCUMENT_POSITION_FOLLOWING); | |
139 start = position + 1; | |
140 } | |
141 } | |
142 | |
143 if (result & Node::DOCUMENT_POSITION_FOLLOWING) { | |
144 ++position; | |
145 ASSERT(static_cast<size_t>(position) == m_treeScopes.size() || (m_treeSc
opes[position]->comparePosition(*treeScope) & Node::DOCUMENT_POSITION_PRECEDING)
); | |
146 } | |
147 m_treeScopes.insert(position, treeScope); | |
148 m_hash.add(treeScope); | |
149 | |
150 #if ENABLE(ASSERT) | |
151 // Check whether m_treeScopes is sorted in document order or not. | |
152 for (unsigned i = 0; i < m_treeScopes.size() - 1; ++i) { | |
153 unsigned result = m_treeScopes[i]->comparePosition(*m_treeScopes[i + 1])
; | |
154 ASSERT(result & Node::DOCUMENT_POSITION_FOLLOWING); | |
155 } | |
156 #endif | |
157 } | |
158 | |
159 void StyleEngine::OrderedTreeScopeSet::remove(TreeScope* treeScope) | |
160 { | |
161 if (!m_hash.contains(treeScope)) | |
162 return; | |
163 size_t position = m_treeScopes.find(treeScope); | |
164 m_treeScopes.remove(position); | |
165 m_hash.remove(treeScope); | |
166 } | |
167 | |
168 DEFINE_TRACE(StyleEngine::OrderedTreeScopeSet) | |
169 { | |
170 #if ENABLE(OILPAN) | |
171 visitor->trace(m_treeScopes); | |
172 visitor->trace(m_hash); | |
173 #endif | |
174 } | |
175 | |
176 TreeScopeStyleSheetCollection* StyleEngine::ensureStyleSheetCollectionFor(TreeSc
ope& treeScope) | 115 TreeScopeStyleSheetCollection* StyleEngine::ensureStyleSheetCollectionFor(TreeSc
ope& treeScope) |
177 { | 116 { |
178 if (treeScope == m_document) | 117 if (treeScope == m_document) |
179 return documentStyleSheetCollection(); | 118 return documentStyleSheetCollection(); |
180 | 119 |
181 StyleSheetCollectionMap::AddResult result = m_styleSheetCollectionMap.add(&t
reeScope, nullptr); | 120 StyleSheetCollectionMap::AddResult result = m_styleSheetCollectionMap.add(&t
reeScope, nullptr); |
182 if (result.isNewEntry) | 121 if (result.isNewEntry) |
183 result.storedValue->value = adoptPtrWillBeNoop(new ShadowTreeStyleSheetC
ollection(toShadowRoot(treeScope))); | 122 result.storedValue->value = adoptPtrWillBeNoop(new ShadowTreeStyleSheetC
ollection(toShadowRoot(treeScope))); |
184 return result.storedValue->value.get(); | 123 return result.storedValue->value.get(); |
185 } | 124 } |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
279 | 218 |
280 TreeScope& treeScope = isStyleElement(*node) ? node->treeScope() : *m_docume
nt; | 219 TreeScope& treeScope = isStyleElement(*node) ? node->treeScope() : *m_docume
nt; |
281 ASSERT(isStyleElement(*node) || treeScope == m_document); | 220 ASSERT(isStyleElement(*node) || treeScope == m_document); |
282 ASSERT(!isXSLStyleSheet(*node)); | 221 ASSERT(!isXSLStyleSheet(*node)); |
283 TreeScopeStyleSheetCollection* collection = ensureStyleSheetCollectionFor(tr
eeScope); | 222 TreeScopeStyleSheetCollection* collection = ensureStyleSheetCollectionFor(tr
eeScope); |
284 ASSERT(collection); | 223 ASSERT(collection); |
285 collection->addStyleSheetCandidateNode(node, createdByParser); | 224 collection->addStyleSheetCandidateNode(node, createdByParser); |
286 | 225 |
287 markTreeScopeDirty(treeScope); | 226 markTreeScopeDirty(treeScope); |
288 if (treeScope != m_document) | 227 if (treeScope != m_document) |
289 m_activeTreeScopes.insert(&treeScope); | 228 treeScope.setSelfOrDescendantsHaveActiveStyleSheets(); |
290 } | 229 } |
291 | 230 |
292 void StyleEngine::removeStyleSheetCandidateNode(Node* node) | 231 void StyleEngine::removeStyleSheetCandidateNode(Node* node) |
293 { | 232 { |
294 removeStyleSheetCandidateNode(node, *m_document); | 233 removeStyleSheetCandidateNode(node, *m_document); |
295 } | 234 } |
296 | 235 |
297 void StyleEngine::removeStyleSheetCandidateNode(Node* node, TreeScope& treeScope
) | 236 void StyleEngine::removeStyleSheetCandidateNode(Node* node, TreeScope& treeScope
) |
298 { | 237 { |
299 ASSERT(isStyleElement(*node) || treeScope == m_document); | 238 ASSERT(isStyleElement(*node) || treeScope == m_document); |
(...skipping 22 matching lines...) Expand all Loading... |
322 bool StyleEngine::shouldUpdateDocumentStyleSheetCollection(StyleResolverUpdateMo
de updateMode) const | 261 bool StyleEngine::shouldUpdateDocumentStyleSheetCollection(StyleResolverUpdateMo
de updateMode) const |
323 { | 262 { |
324 return m_documentScopeDirty || updateMode == FullStyleUpdate; | 263 return m_documentScopeDirty || updateMode == FullStyleUpdate; |
325 } | 264 } |
326 | 265 |
327 bool StyleEngine::shouldUpdateShadowTreeStyleSheetCollection(StyleResolverUpdate
Mode updateMode) const | 266 bool StyleEngine::shouldUpdateShadowTreeStyleSheetCollection(StyleResolverUpdate
Mode updateMode) const |
328 { | 267 { |
329 return !m_dirtyTreeScopes.isEmpty() || updateMode == FullStyleUpdate; | 268 return !m_dirtyTreeScopes.isEmpty() || updateMode == FullStyleUpdate; |
330 } | 269 } |
331 | 270 |
332 void StyleEngine::clearMediaQueryRuleSetOnTreeScopeStyleSheets(UnorderedTreeScop
eSet::iterator begin, UnorderedTreeScopeSet::iterator end) | 271 void StyleEngine::clearMediaQueryRuleSetStyleSheets() |
333 { | 272 { |
334 for (UnorderedTreeScopeSet::iterator it = begin; it != end; ++it) { | 273 for (TreeScope* treeScope : TreeScope::TreeScopesWithActiveStyleSheetsTraver
sal(document())) { |
335 TreeScope& treeScope = **it; | 274 TreeScopeStyleSheetCollection* collection = styleSheetCollectionFor(*tre
eScope); |
336 ASSERT(treeScope != m_document); | 275 ASSERT(collection); |
337 ShadowTreeStyleSheetCollection* collection = static_cast<ShadowTreeStyle
SheetCollection*>(styleSheetCollectionFor(treeScope)); | 276 collection->clearMediaQueryRuleSetStyleSheets(); |
| 277 } |
| 278 for (TreeScope* treeScope : m_dirtyTreeScopes) { |
| 279 TreeScopeStyleSheetCollection* collection = styleSheetCollectionFor(*tre
eScope); |
338 ASSERT(collection); | 280 ASSERT(collection); |
339 collection->clearMediaQueryRuleSetStyleSheets(); | 281 collection->clearMediaQueryRuleSetStyleSheets(); |
340 } | 282 } |
341 } | 283 } |
342 | 284 |
343 void StyleEngine::clearMediaQueryRuleSetStyleSheets() | |
344 { | |
345 documentStyleSheetCollection()->clearMediaQueryRuleSetStyleSheets(); | |
346 clearMediaQueryRuleSetOnTreeScopeStyleSheets(m_activeTreeScopes.beginUnorder
ed(), m_activeTreeScopes.endUnordered()); | |
347 clearMediaQueryRuleSetOnTreeScopeStyleSheets(m_dirtyTreeScopes.begin(), m_di
rtyTreeScopes.end()); | |
348 } | |
349 | |
350 void StyleEngine::updateStyleSheetsInImport(DocumentStyleSheetCollector& parentC
ollector) | 285 void StyleEngine::updateStyleSheetsInImport(DocumentStyleSheetCollector& parentC
ollector) |
351 { | 286 { |
352 ASSERT(!isMaster()); | 287 ASSERT(!isMaster()); |
353 WillBeHeapVector<RefPtrWillBeMember<StyleSheet>> sheetsForList; | 288 WillBeHeapVector<RefPtrWillBeMember<StyleSheet>> sheetsForList; |
354 ImportedDocumentStyleSheetCollector subcollector(parentCollector, sheetsForL
ist); | 289 ImportedDocumentStyleSheetCollector subcollector(parentCollector, sheetsForL
ist); |
355 documentStyleSheetCollection()->collectStyleSheets(*this, subcollector); | 290 documentStyleSheetCollection()->collectStyleSheets(*this, subcollector); |
356 documentStyleSheetCollection()->swapSheetsForSheetList(sheetsForList); | 291 documentStyleSheetCollection()->swapSheetsForSheetList(sheetsForList); |
357 } | 292 } |
358 | 293 |
359 void StyleEngine::updateActiveStyleSheetsInShadow(StyleResolverUpdateMode update
Mode, TreeScope* treeScope, UnorderedTreeScopeSet& treeScopesRemoved) | 294 void StyleEngine::updateActiveStyleSheetsInShadow(StyleResolverUpdateMode update
Mode, TreeScope* treeScope, TreeScope::UnorderedTreeScopeSet& treeScopesRemoved) |
360 { | 295 { |
361 ASSERT(treeScope != m_document); | 296 ASSERT(treeScope != m_document); |
362 ShadowTreeStyleSheetCollection* collection = static_cast<ShadowTreeStyleShee
tCollection*>(styleSheetCollectionFor(*treeScope)); | 297 ShadowTreeStyleSheetCollection* collection = static_cast<ShadowTreeStyleShee
tCollection*>(styleSheetCollectionFor(*treeScope)); |
363 ASSERT(collection); | 298 ASSERT(collection); |
364 collection->updateActiveStyleSheets(*this, updateMode); | 299 collection->updateActiveStyleSheets(*this, updateMode); |
365 if (!collection->hasStyleSheetCandidateNodes()) { | 300 if (!collection->hasStyleSheetCandidateNodes()) { |
366 treeScopesRemoved.add(treeScope); | 301 if (treeScope->selfOrDescendantsHaveActiveStyleSheets() && !treeScope->h
asChildTreeScopesWithActiveStyleSheets()) |
| 302 treeScopesRemoved.add(treeScope); |
367 // When removing TreeScope from ActiveTreeScopes, | 303 // When removing TreeScope from ActiveTreeScopes, |
368 // its resolver should be destroyed by invoking resetAuthorStyle. | 304 // its resolver should be destroyed by invoking resetAuthorStyle. |
369 ASSERT(!treeScope->scopedStyleResolver()); | 305 ASSERT(!treeScope->scopedStyleResolver()); |
370 } | 306 } |
371 } | 307 } |
372 | 308 |
373 void StyleEngine::updateActiveStyleSheets(StyleResolverUpdateMode updateMode) | 309 void StyleEngine::updateActiveStyleSheets(StyleResolverUpdateMode updateMode) |
374 { | 310 { |
375 ASSERT(isMaster()); | 311 ASSERT(isMaster()); |
376 ASSERT(!document().inStyleRecalc()); | 312 ASSERT(!document().inStyleRecalc()); |
377 | 313 |
378 if (!document().isActive()) | 314 if (!document().isActive()) |
379 return; | 315 return; |
380 | 316 |
381 if (shouldUpdateDocumentStyleSheetCollection(updateMode)) | 317 if (shouldUpdateDocumentStyleSheetCollection(updateMode)) |
382 documentStyleSheetCollection()->updateActiveStyleSheets(*this, updateMod
e); | 318 documentStyleSheetCollection()->updateActiveStyleSheets(*this, updateMod
e); |
383 | 319 |
384 if (shouldUpdateShadowTreeStyleSheetCollection(updateMode)) { | 320 if (shouldUpdateShadowTreeStyleSheetCollection(updateMode)) { |
385 UnorderedTreeScopeSet treeScopesRemoved; | 321 TreeScope::UnorderedTreeScopeSet treeScopesRemoved; |
386 | |
387 if (updateMode == FullStyleUpdate) { | 322 if (updateMode == FullStyleUpdate) { |
388 for (unsigned i = 0; i < m_activeTreeScopes.size(); ++i) | 323 for (TreeScope* treeScope : TreeScope::TreeScopesWithActiveStyleShee
tsTraversal(document().childTreeScopesWithActiveStyleSheets())) |
389 updateActiveStyleSheetsInShadow(updateMode, m_activeTreeScopes[i
], treeScopesRemoved); | 324 updateActiveStyleSheetsInShadow(updateMode, treeScope, treeScope
sRemoved); |
390 } else { | 325 } else { |
391 for (UnorderedTreeScopeSet::iterator it = m_dirtyTreeScopes.begin();
it != m_dirtyTreeScopes.end(); ++it) { | 326 for (TreeScope* treeScope : m_dirtyTreeScopes) { |
392 updateActiveStyleSheetsInShadow(updateMode, *it, treeScopesRemov
ed); | 327 updateActiveStyleSheetsInShadow(updateMode, treeScope, treeScope
sRemoved); |
393 } | 328 } |
394 } | 329 } |
395 for (UnorderedTreeScopeSet::iterator it = treeScopesRemoved.begin(); it
!= treeScopesRemoved.end(); ++it) | 330 for (TreeScope* removed : treeScopesRemoved) |
396 m_activeTreeScopes.remove(*it); | 331 removed->clearSelfOrDescendantsHaveActiveStyleSheets(); |
397 } | 332 } |
398 | 333 |
399 InspectorInstrumentation::activeStyleSheetsUpdated(m_document); | 334 InspectorInstrumentation::activeStyleSheetsUpdated(m_document); |
400 m_usesRemUnits = documentStyleSheetCollection()->usesRemUnits(); | 335 m_usesRemUnits = documentStyleSheetCollection()->usesRemUnits(); |
401 | 336 |
402 m_dirtyTreeScopes.clear(); | 337 m_dirtyTreeScopes.clear(); |
403 m_documentScopeDirty = false; | 338 m_documentScopeDirty = false; |
404 } | 339 } |
405 | 340 |
406 const WillBeHeapVector<RefPtrWillBeMember<CSSStyleSheet>> StyleEngine::activeSty
leSheetsForInspector() const | 341 const WillBeHeapVector<RefPtrWillBeMember<CSSStyleSheet>> StyleEngine::activeSty
leSheetsForInspector() |
407 { | 342 { |
408 if (m_activeTreeScopes.isEmpty()) | 343 if (!document().hasChildTreeScopesWithActiveStyleSheets()) |
409 return documentStyleSheetCollection()->activeAuthorStyleSheets(); | 344 return documentStyleSheetCollection()->activeAuthorStyleSheets(); |
410 | 345 |
411 WillBeHeapVector<RefPtrWillBeMember<CSSStyleSheet>> activeStyleSheets; | 346 WillBeHeapVector<RefPtrWillBeMember<CSSStyleSheet>> activeStyleSheets; |
412 | 347 for (TreeScope* treeScope : TreeScope::TreeScopesWithActiveStyleSheetsTraver
sal(document())) { |
413 activeStyleSheets.appendVector(documentStyleSheetCollection()->activeAuthorS
tyleSheets()); | 348 if (TreeScopeStyleSheetCollection* collection = styleSheetCollectionFor(
*treeScope)) |
414 for (unsigned i = 0; i < m_activeTreeScopes.size(); ++i) { | |
415 TreeScope* treeScope = const_cast<TreeScope*>(m_activeTreeScopes[i]); | |
416 if (TreeScopeStyleSheetCollection* collection = m_styleSheetCollectionMa
p.get(treeScope)) | |
417 activeStyleSheets.appendVector(collection->activeAuthorStyleSheets()
); | 349 activeStyleSheets.appendVector(collection->activeAuthorStyleSheets()
); |
418 } | 350 } |
419 | 351 |
420 // FIXME: Inspector needs a vector which has all active stylesheets. | 352 // FIXME: Inspector needs a vector which has all active stylesheets. |
421 // However, creating such a large vector might cause performance regression. | 353 // However, creating such a large vector might cause performance regression. |
422 // Need to implement some smarter solution. | 354 // Need to implement some smarter solution. |
423 return activeStyleSheets; | 355 return activeStyleSheets; |
424 } | 356 } |
425 | 357 |
426 void StyleEngine::didRemoveShadowRoot(ShadowRoot* shadowRoot) | 358 void StyleEngine::didRemoveShadowRoot(ShadowRoot* shadowRoot) |
427 { | 359 { |
428 m_styleSheetCollectionMap.remove(shadowRoot); | 360 m_styleSheetCollectionMap.remove(shadowRoot); |
429 m_activeTreeScopes.remove(shadowRoot); | |
430 m_dirtyTreeScopes.remove(shadowRoot); | 361 m_dirtyTreeScopes.remove(shadowRoot); |
431 } | 362 } |
432 | 363 |
433 void StyleEngine::shadowRootRemovedFromDocument(ShadowRoot* shadowRoot) | 364 void StyleEngine::shadowRootRemovedFromDocument(ShadowRoot* shadowRoot) |
434 { | 365 { |
435 if (StyleResolver* styleResolver = resolver()) { | 366 if (StyleResolver* styleResolver = resolver()) { |
436 styleResolver->resetAuthorStyle(*shadowRoot); | 367 styleResolver->resetAuthorStyle(*shadowRoot); |
437 | 368 |
438 if (TreeScopeStyleSheetCollection* collection = styleSheetCollectionFor(
*shadowRoot)) | 369 if (TreeScopeStyleSheetCollection* collection = styleSheetCollectionFor(
*shadowRoot)) |
439 styleResolver->removePendingAuthorStyleSheets(collection->activeAuth
orStyleSheets()); | 370 styleResolver->removePendingAuthorStyleSheets(collection->activeAuth
orStyleSheets()); |
440 } | 371 } |
441 m_styleSheetCollectionMap.remove(shadowRoot); | 372 m_styleSheetCollectionMap.remove(shadowRoot); |
442 m_activeTreeScopes.remove(shadowRoot); | |
443 m_dirtyTreeScopes.remove(shadowRoot); | 373 m_dirtyTreeScopes.remove(shadowRoot); |
444 } | 374 } |
445 | 375 |
446 void StyleEngine::appendActiveAuthorStyleSheets() | 376 void StyleEngine::appendActiveAuthorStyleSheets() |
447 { | 377 { |
448 ASSERT(isMaster()); | 378 ASSERT(isMaster()); |
449 | 379 |
450 m_resolver->appendAuthorStyleSheets(documentStyleSheetCollection()->activeAu
thorStyleSheets()); | 380 for (TreeScope* treeScope : TreeScope::TreeScopesWithActiveStyleSheetsTraver
sal(document())) { |
451 for (unsigned i = 0; i < m_activeTreeScopes.size(); ++i) { | 381 if (TreeScopeStyleSheetCollection* collection = styleSheetCollectionFor(
*treeScope)) |
452 if (TreeScopeStyleSheetCollection* collection = m_styleSheetCollectionMa
p.get(m_activeTreeScopes[i])) | |
453 m_resolver->appendAuthorStyleSheets(collection->activeAuthorStyleShe
ets()); | 382 m_resolver->appendAuthorStyleSheets(collection->activeAuthorStyleShe
ets()); |
454 } | 383 } |
455 m_resolver->finishAppendAuthorStyleSheets(); | 384 m_resolver->finishAppendAuthorStyleSheets(); |
456 } | 385 } |
457 | 386 |
458 void StyleEngine::createResolver() | 387 void StyleEngine::createResolver() |
459 { | 388 { |
460 // It is a programming error to attempt to resolve style on a Document | 389 // It is a programming error to attempt to resolve style on a Document |
461 // which is not in a frame. Code which hits this should have checked | 390 // which is not in a frame. Code which hits this should have checked |
462 // Document::isActive() before calling into code which could get here. | 391 // Document::isActive() before calling into code which could get here. |
463 | 392 |
464 ASSERT(document().frame()); | 393 ASSERT(document().frame()); |
465 | 394 |
466 m_resolver = adoptPtrWillBeNoop(new StyleResolver(*m_document)); | 395 m_resolver = adoptPtrWillBeNoop(new StyleResolver(*m_document)); |
467 | 396 |
468 // A scoped style resolver for document will be created during | 397 // A scoped style resolver for document will be created during |
469 // appendActiveAuthorStyleSheets if needed. | 398 // appendActiveAuthorStyleSheets if needed. |
470 appendActiveAuthorStyleSheets(); | 399 appendActiveAuthorStyleSheets(); |
471 combineCSSFeatureFlags(m_resolver->ensureUpdatedRuleFeatureSet()); | 400 combineCSSFeatureFlags(m_resolver->ensureUpdatedRuleFeatureSet()); |
472 } | 401 } |
473 | 402 |
474 void StyleEngine::clearResolver() | 403 void StyleEngine::clearResolver() |
475 { | 404 { |
476 ASSERT(!document().inStyleRecalc()); | 405 ASSERT(!document().inStyleRecalc()); |
477 ASSERT(isMaster() || !m_resolver); | 406 ASSERT(isMaster() || !m_resolver); |
478 | 407 |
479 document().clearScopedStyleResolver(); | |
480 // StyleEngine::shadowRootRemovedFromDocument removes not-in-document | 408 // StyleEngine::shadowRootRemovedFromDocument removes not-in-document |
481 // treescopes from activeTreeScopes. StyleEngine::didRemoveShadowRoot | 409 // treescopes from activeTreeScopes. StyleEngine::didRemoveShadowRoot |
482 // removes treescopes which are being destroyed from activeTreeScopes. | 410 // removes treescopes which are being destroyed from activeTreeScopes. |
483 // So we need to clearScopedStyleResolver for treescopes which have been | 411 // So we need to clearScopedStyleResolver for treescopes which have been |
484 // just removed from document. If document is destroyed before invoking | 412 // just removed from document. If document is destroyed before invoking |
485 // updateActiveStyleSheets, the treescope has a scopedStyleResolver which | 413 // updateActiveStyleSheets, the treescope has a scopedStyleResolver which |
486 // has destroyed StyleSheetContents. | 414 // has destroyed StyleSheetContents. |
487 for (UnorderedTreeScopeSet::iterator it = m_activeTreeScopes.beginUnordered(
); it != m_activeTreeScopes.endUnordered(); ++it) | 415 for (TreeScope* treeScope : TreeScope::TreeScopesWithActiveStyleSheetsTraver
sal(document())) |
488 (*it)->clearScopedStyleResolver(); | 416 treeScope->clearScopedStyleResolver(); |
489 | 417 |
490 m_resolver.clear(); | 418 m_resolver.clear(); |
491 } | 419 } |
492 | 420 |
493 void StyleEngine::clearMasterResolver() | 421 void StyleEngine::clearMasterResolver() |
494 { | 422 { |
495 if (Document* master = this->master()) | 423 if (Document* master = this->master()) |
496 master->styleEngine().clearResolver(); | 424 master->styleEngine().clearResolver(); |
497 } | 425 } |
498 | 426 |
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
645 if (it == m_sheetToTextCache.end()) | 573 if (it == m_sheetToTextCache.end()) |
646 return; | 574 return; |
647 | 575 |
648 m_textToSheetCache.remove(it->value); | 576 m_textToSheetCache.remove(it->value); |
649 m_sheetToTextCache.remove(contents); | 577 m_sheetToTextCache.remove(contents); |
650 } | 578 } |
651 | 579 |
652 void StyleEngine::collectScopedStyleFeaturesTo(RuleFeatureSet& features) const | 580 void StyleEngine::collectScopedStyleFeaturesTo(RuleFeatureSet& features) const |
653 { | 581 { |
654 HashSet<const StyleSheetContents*> visitedSharedStyleSheetContents; | 582 HashSet<const StyleSheetContents*> visitedSharedStyleSheetContents; |
655 if (document().scopedStyleResolver()) | 583 for (TreeScope* treeScope : TreeScope::TreeScopesWithActiveStyleSheetsTraver
sal(document())) { |
656 document().scopedStyleResolver()->collectFeaturesTo(features, visitedSha
redStyleSheetContents); | |
657 for (unsigned i = 0; i < m_activeTreeScopes.size(); ++i) { | |
658 TreeScope* treeScope = const_cast<TreeScope*>(m_activeTreeScopes[i]); | |
659 // When creating StyleResolver, dirty treescopes might not be processed. | 584 // When creating StyleResolver, dirty treescopes might not be processed. |
660 // So some active treescopes might not have a scoped style resolver. | 585 // So some active treescopes might not have a scoped style resolver. |
661 // In this case, we should skip collectFeatures for the treescopes witho
ut | 586 // In this case, we should skip collectFeatures for the treescopes witho
ut |
662 // scoped style resolvers. When invoking updateActiveStyleSheets, | 587 // scoped style resolvers. When invoking updateActiveStyleSheets, |
663 // the treescope's features will be processed. | 588 // the treescope's features will be processed. |
664 if (ScopedStyleResolver* resolver = treeScope->scopedStyleResolver()) | 589 if (ScopedStyleResolver* resolver = treeScope->scopedStyleResolver()) |
665 resolver->collectFeaturesTo(features, visitedSharedStyleSheetContent
s); | 590 resolver->collectFeaturesTo(features, visitedSharedStyleSheetContent
s); |
666 } | 591 } |
667 } | 592 } |
668 | 593 |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
777 DEFINE_TRACE(StyleEngine) | 702 DEFINE_TRACE(StyleEngine) |
778 { | 703 { |
779 #if ENABLE(OILPAN) | 704 #if ENABLE(OILPAN) |
780 visitor->trace(m_document); | 705 visitor->trace(m_document); |
781 visitor->trace(m_authorStyleSheets); | 706 visitor->trace(m_authorStyleSheets); |
782 visitor->trace(m_documentStyleSheetCollection); | 707 visitor->trace(m_documentStyleSheetCollection); |
783 visitor->trace(m_styleSheetCollectionMap); | 708 visitor->trace(m_styleSheetCollectionMap); |
784 visitor->trace(m_resolver); | 709 visitor->trace(m_resolver); |
785 visitor->trace(m_styleInvalidator); | 710 visitor->trace(m_styleInvalidator); |
786 visitor->trace(m_dirtyTreeScopes); | 711 visitor->trace(m_dirtyTreeScopes); |
787 visitor->trace(m_activeTreeScopes); | |
788 visitor->trace(m_fontSelector); | 712 visitor->trace(m_fontSelector); |
789 visitor->trace(m_textToSheetCache); | 713 visitor->trace(m_textToSheetCache); |
790 visitor->trace(m_sheetToTextCache); | 714 visitor->trace(m_sheetToTextCache); |
791 #endif | 715 #endif |
792 CSSFontSelectorClient::trace(visitor); | 716 CSSFontSelectorClient::trace(visitor); |
793 } | 717 } |
794 | 718 |
795 } | 719 } |
OLD | NEW |