| 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 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 | 96 |
| 97 if (m_fontSelector) { | 97 if (m_fontSelector) { |
| 98 m_fontSelector->clearDocument(); | 98 m_fontSelector->clearDocument(); |
| 99 m_fontSelector->unregisterForInvalidationCallbacks(this); | 99 m_fontSelector->unregisterForInvalidationCallbacks(this); |
| 100 } | 100 } |
| 101 | 101 |
| 102 // Decrement reference counts for things we could be keeping alive. | 102 // Decrement reference counts for things we could be keeping alive. |
| 103 m_fontSelector.clear(); | 103 m_fontSelector.clear(); |
| 104 m_resolver.clear(); | 104 m_resolver.clear(); |
| 105 m_styleSheetCollectionMap.clear(); | 105 m_styleSheetCollectionMap.clear(); |
| 106 for (const auto& resolver : m_scopedStyleResolvers) | 106 m_activeTreeScopes.clear(); |
| 107 const_cast<TreeScope&>(resolver->treeScope()).clearScopedStyleResolver()
; | |
| 108 m_scopedStyleResolvers.clear(); | |
| 109 } | 107 } |
| 110 #endif | 108 #endif |
| 111 | 109 |
| 112 inline Document* StyleEngine::master() | 110 inline Document* StyleEngine::master() |
| 113 { | 111 { |
| 114 if (isMaster()) | 112 if (isMaster()) |
| 115 return m_document; | 113 return m_document; |
| 116 HTMLImportsController* import = document().importsController(); | 114 HTMLImportsController* import = document().importsController(); |
| 117 if (!import) // Document::import() can return null while executing its destr
uctor. | 115 if (!import) // Document::import() can return null while executing its destr
uctor. |
| 118 return 0; | 116 return 0; |
| (...skipping 193 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 312 void StyleEngine::removeStyleSheetCandidateNode(Node* node, TreeScope& treeScope
) | 310 void StyleEngine::removeStyleSheetCandidateNode(Node* node, TreeScope& treeScope
) |
| 313 { | 311 { |
| 314 ASSERT(isStyleElement(*node) || treeScope == m_document); | 312 ASSERT(isStyleElement(*node) || treeScope == m_document); |
| 315 ASSERT(!isXSLStyleSheet(*node)); | 313 ASSERT(!isXSLStyleSheet(*node)); |
| 316 | 314 |
| 317 TreeScopeStyleSheetCollection* collection = styleSheetCollectionFor(treeScop
e); | 315 TreeScopeStyleSheetCollection* collection = styleSheetCollectionFor(treeScop
e); |
| 318 ASSERT(collection); | 316 ASSERT(collection); |
| 319 collection->removeStyleSheetCandidateNode(node); | 317 collection->removeStyleSheetCandidateNode(node); |
| 320 | 318 |
| 321 markTreeScopeDirty(treeScope); | 319 markTreeScopeDirty(treeScope); |
| 322 m_activeTreeScopes.remove(&treeScope); | |
| 323 } | 320 } |
| 324 | 321 |
| 325 void StyleEngine::modifiedStyleSheetCandidateNode(Node* node) | 322 void StyleEngine::modifiedStyleSheetCandidateNode(Node* node) |
| 326 { | 323 { |
| 327 if (!node->inDocument()) | 324 if (!node->inDocument()) |
| 328 return; | 325 return; |
| 329 | 326 |
| 330 TreeScope& treeScope = isStyleElement(*node) ? node->treeScope() : *m_docume
nt; | 327 TreeScope& treeScope = isStyleElement(*node) ? node->treeScope() : *m_docume
nt; |
| 331 ASSERT(isStyleElement(*node) || treeScope == m_document); | 328 ASSERT(isStyleElement(*node) || treeScope == m_document); |
| 332 markTreeScopeDirty(treeScope); | 329 markTreeScopeDirty(treeScope); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 389 if (shouldUpdateShadowTreeStyleSheetCollection(updateMode)) { | 386 if (shouldUpdateShadowTreeStyleSheetCollection(updateMode)) { |
| 390 TreeScopeSet treeScopes = updateMode == FullStyleUpdate ? m_activeTreeSc
opes : m_dirtyTreeScopes; | 387 TreeScopeSet treeScopes = updateMode == FullStyleUpdate ? m_activeTreeSc
opes : m_dirtyTreeScopes; |
| 391 HashSet<TreeScope*> treeScopesRemoved; | 388 HashSet<TreeScope*> treeScopesRemoved; |
| 392 | 389 |
| 393 for (TreeScopeSet::iterator it = treeScopes.begin(); it != treeScopes.en
d(); ++it) { | 390 for (TreeScopeSet::iterator it = treeScopes.begin(); it != treeScopes.en
d(); ++it) { |
| 394 TreeScope* treeScope = *it; | 391 TreeScope* treeScope = *it; |
| 395 ASSERT(treeScope != m_document); | 392 ASSERT(treeScope != m_document); |
| 396 ShadowTreeStyleSheetCollection* collection = static_cast<ShadowTreeS
tyleSheetCollection*>(styleSheetCollectionFor(*treeScope)); | 393 ShadowTreeStyleSheetCollection* collection = static_cast<ShadowTreeS
tyleSheetCollection*>(styleSheetCollectionFor(*treeScope)); |
| 397 ASSERT(collection); | 394 ASSERT(collection); |
| 398 collection->updateActiveStyleSheets(this, updateMode); | 395 collection->updateActiveStyleSheets(this, updateMode); |
| 399 if (!collection->hasStyleSheetCandidateNodes()) | 396 if (!collection->hasStyleSheetCandidateNodes()) { |
| 400 treeScopesRemoved.add(treeScope); | 397 treeScopesRemoved.add(treeScope); |
| 398 // When removing TreeScope from ActiveTreeScopes, |
| 399 // its resolver should be destroyed by invoking resetAuthorStyle
. |
| 400 ASSERT(!treeScope->scopedStyleResolver()); |
| 401 } |
| 401 } | 402 } |
| 402 m_activeTreeScopes.removeAll(treeScopesRemoved); | 403 m_activeTreeScopes.removeAll(treeScopesRemoved); |
| 403 } | 404 } |
| 404 | 405 |
| 405 InspectorInstrumentation::activeStyleSheetsUpdated(m_document); | 406 InspectorInstrumentation::activeStyleSheetsUpdated(m_document); |
| 406 m_usesRemUnits = documentStyleSheetCollection()->usesRemUnits(); | 407 m_usesRemUnits = documentStyleSheetCollection()->usesRemUnits(); |
| 407 | 408 |
| 408 m_dirtyTreeScopes.clear(); | 409 m_dirtyTreeScopes.clear(); |
| 409 m_documentScopeDirty = false; | 410 m_documentScopeDirty = false; |
| 410 } | 411 } |
| (...skipping 15 matching lines...) Expand all Loading... |
| 426 } | 427 } |
| 427 | 428 |
| 428 // FIXME: Inspector needs a vector which has all active stylesheets. | 429 // FIXME: Inspector needs a vector which has all active stylesheets. |
| 429 // However, creating such a large vector might cause performance regression. | 430 // However, creating such a large vector might cause performance regression. |
| 430 // Need to implement some smarter solution. | 431 // Need to implement some smarter solution. |
| 431 return activeStyleSheets; | 432 return activeStyleSheets; |
| 432 } | 433 } |
| 433 | 434 |
| 434 void StyleEngine::didRemoveShadowRoot(ShadowRoot* shadowRoot) | 435 void StyleEngine::didRemoveShadowRoot(ShadowRoot* shadowRoot) |
| 435 { | 436 { |
| 436 if (shadowRoot->scopedStyleResolver()) | |
| 437 removeScopedStyleResolver(shadowRoot->scopedStyleResolver()); | |
| 438 m_styleSheetCollectionMap.remove(shadowRoot); | 437 m_styleSheetCollectionMap.remove(shadowRoot); |
| 439 } | 438 } |
| 440 | 439 |
| 441 void StyleEngine::appendActiveAuthorStyleSheets() | 440 void StyleEngine::appendActiveAuthorStyleSheets() |
| 442 { | 441 { |
| 443 ASSERT(isMaster()); | 442 ASSERT(isMaster()); |
| 444 | 443 |
| 445 m_resolver->appendAuthorStyleSheets(documentStyleSheetCollection()->activeAu
thorStyleSheets()); | 444 m_resolver->appendAuthorStyleSheets(documentStyleSheetCollection()->activeAu
thorStyleSheets()); |
| 446 | 445 |
| 447 TreeScopeSet::iterator begin = m_activeTreeScopes.begin(); | 446 TreeScopeSet::iterator begin = m_activeTreeScopes.begin(); |
| 448 TreeScopeSet::iterator end = m_activeTreeScopes.end(); | 447 TreeScopeSet::iterator end = m_activeTreeScopes.end(); |
| 449 for (TreeScopeSet::iterator it = begin; it != end; ++it) { | 448 for (TreeScopeSet::iterator it = begin; it != end; ++it) { |
| 450 if (TreeScopeStyleSheetCollection* collection = m_styleSheetCollectionMa
p.get(*it)) | 449 if (TreeScopeStyleSheetCollection* collection = m_styleSheetCollectionMa
p.get(*it)) |
| 451 m_resolver->appendAuthorStyleSheets(collection->activeAuthorStyleShe
ets()); | 450 m_resolver->appendAuthorStyleSheets(collection->activeAuthorStyleShe
ets()); |
| 452 } | 451 } |
| 453 m_resolver->finishAppendAuthorStyleSheets(); | 452 m_resolver->finishAppendAuthorStyleSheets(); |
| 454 } | 453 } |
| 455 | 454 |
| 456 void StyleEngine::createResolver() | 455 void StyleEngine::createResolver() |
| 457 { | 456 { |
| 458 // It is a programming error to attempt to resolve style on a Document | 457 // It is a programming error to attempt to resolve style on a Document |
| 459 // which is not in a frame. Code which hits this should have checked | 458 // which is not in a frame. Code which hits this should have checked |
| 460 // Document::isActive() before calling into code which could get here. | 459 // Document::isActive() before calling into code which could get here. |
| 461 | 460 |
| 462 ASSERT(document().frame()); | 461 ASSERT(document().frame()); |
| 463 | 462 |
| 464 m_resolver = adoptPtrWillBeNoop(new StyleResolver(*m_document)); | 463 m_resolver = adoptPtrWillBeNoop(new StyleResolver(*m_document)); |
| 465 addScopedStyleResolver(&m_document->ensureScopedStyleResolver()); | |
| 466 | 464 |
| 465 // A scoped style resolver for document will be created during |
| 466 // appendActiveAuthorStyleSheets if needed. |
| 467 appendActiveAuthorStyleSheets(); | 467 appendActiveAuthorStyleSheets(); |
| 468 combineCSSFeatureFlags(m_resolver->ensureUpdatedRuleFeatureSet()); | 468 combineCSSFeatureFlags(m_resolver->ensureUpdatedRuleFeatureSet()); |
| 469 } | 469 } |
| 470 | 470 |
| 471 void StyleEngine::clearResolver() | 471 void StyleEngine::clearResolver() |
| 472 { | 472 { |
| 473 ASSERT(!document().inStyleRecalc()); | 473 ASSERT(!document().inStyleRecalc()); |
| 474 ASSERT(isMaster() || !m_resolver); | 474 ASSERT(isMaster() || !m_resolver); |
| 475 | 475 |
| 476 for (const auto& resolver: m_scopedStyleResolvers) | 476 document().clearScopedStyleResolver(); |
| 477 const_cast<TreeScope&>(resolver->treeScope()).clearScopedStyleResolver()
; | 477 // clearResolver might be invoked while destryoing document. In this case, |
| 478 m_scopedStyleResolvers.clear(); | 478 // treescopes in m_activeTreeScopes might have already been destoryed, |
| 479 // because m_activeTreeScopes are updated in updateActiveStyleSheets, not |
| 480 // in removeStyleSheetCandidateNode. So we should not invoke |
| 481 // treeScope->clearScopedStyleResolver when document is not active. |
| 482 if (document().isActive()) { |
| 483 for (auto& treeScope: m_activeTreeScopes) |
| 484 treeScope->clearScopedStyleResolver(); |
| 485 } |
| 479 | 486 |
| 480 if (m_resolver) | 487 if (m_resolver) |
| 481 document().updateStyleInvalidationIfNeeded(); | 488 document().updateStyleInvalidationIfNeeded(); |
| 482 m_resolver.clear(); | 489 m_resolver.clear(); |
| 483 } | 490 } |
| 484 | 491 |
| 485 void StyleEngine::clearMasterResolver() | 492 void StyleEngine::clearMasterResolver() |
| 486 { | 493 { |
| 487 if (Document* master = this->master()) | 494 if (Document* master = this->master()) |
| 488 master->styleEngine()->clearResolver(); | 495 master->styleEngine()->clearResolver(); |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 635 if (it == m_sheetToTextCache.end()) | 642 if (it == m_sheetToTextCache.end()) |
| 636 return; | 643 return; |
| 637 | 644 |
| 638 m_textToSheetCache.remove(it->value); | 645 m_textToSheetCache.remove(it->value); |
| 639 m_sheetToTextCache.remove(contents); | 646 m_sheetToTextCache.remove(contents); |
| 640 } | 647 } |
| 641 | 648 |
| 642 void StyleEngine::collectScopedStyleFeaturesTo(RuleFeatureSet& features) const | 649 void StyleEngine::collectScopedStyleFeaturesTo(RuleFeatureSet& features) const |
| 643 { | 650 { |
| 644 HashSet<const StyleSheetContents*> visitedSharedStyleSheetContents; | 651 HashSet<const StyleSheetContents*> visitedSharedStyleSheetContents; |
| 645 for (const auto& resolver : m_scopedStyleResolvers) | 652 if (document().scopedStyleResolver()) |
| 646 resolver->collectFeaturesTo(features, visitedSharedStyleSheetContents); | 653 document().scopedStyleResolver()->collectFeaturesTo(features, visitedSha
redStyleSheetContents); |
| 654 for (auto& treeScope: m_activeTreeScopes) { |
| 655 ASSERT(treeScope->scopedStyleResolver()); |
| 656 treeScope->scopedStyleResolver()->collectFeaturesTo(features, visitedSha
redStyleSheetContents); |
| 657 } |
| 647 } | 658 } |
| 648 | 659 |
| 649 void StyleEngine::fontsNeedUpdate(CSSFontSelector*) | 660 void StyleEngine::fontsNeedUpdate(CSSFontSelector*) |
| 650 { | 661 { |
| 651 if (!document().isActive()) | 662 if (!document().isActive()) |
| 652 return; | 663 return; |
| 653 | 664 |
| 654 if (m_resolver) | 665 if (m_resolver) |
| 655 m_resolver->invalidateMatchedPropertiesCache(); | 666 m_resolver->invalidateMatchedPropertiesCache(); |
| 656 document().setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTraci
ng::create(StyleChangeReason::Fonts)); | 667 document().setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTraci
ng::create(StyleChangeReason::Fonts)); |
| 657 } | 668 } |
| 658 | 669 |
| 659 void StyleEngine::trace(Visitor* visitor) | 670 void StyleEngine::trace(Visitor* visitor) |
| 660 { | 671 { |
| 661 #if ENABLE(OILPAN) | 672 #if ENABLE(OILPAN) |
| 662 visitor->trace(m_document); | 673 visitor->trace(m_document); |
| 663 visitor->trace(m_injectedAuthorStyleSheets); | 674 visitor->trace(m_injectedAuthorStyleSheets); |
| 664 visitor->trace(m_authorStyleSheets); | 675 visitor->trace(m_authorStyleSheets); |
| 665 visitor->trace(m_documentStyleSheetCollection); | 676 visitor->trace(m_documentStyleSheetCollection); |
| 666 visitor->trace(m_styleSheetCollectionMap); | 677 visitor->trace(m_styleSheetCollectionMap); |
| 667 visitor->trace(m_scopedStyleResolvers); | |
| 668 visitor->trace(m_resolver); | 678 visitor->trace(m_resolver); |
| 669 visitor->trace(m_fontSelector); | 679 visitor->trace(m_fontSelector); |
| 670 visitor->trace(m_textToSheetCache); | 680 visitor->trace(m_textToSheetCache); |
| 671 visitor->trace(m_sheetToTextCache); | 681 visitor->trace(m_sheetToTextCache); |
| 672 #endif | 682 #endif |
| 673 CSSFontSelectorClient::trace(visitor); | 683 CSSFontSelectorClient::trace(visitor); |
| 674 } | 684 } |
| 675 | 685 |
| 676 } | 686 } |
| OLD | NEW |