| Index: Source/core/dom/StyleEngine.cpp
|
| diff --git a/Source/core/dom/StyleEngine.cpp b/Source/core/dom/StyleEngine.cpp
|
| index ac540ebdadbc4d517b723ac45d3f74ba5a61df43..1b10f9515b89ed5a1ed25c0792b0f968b4eddd73 100644
|
| --- a/Source/core/dom/StyleEngine.cpp
|
| +++ b/Source/core/dom/StyleEngine.cpp
|
| @@ -99,7 +99,6 @@ void StyleEngine::detachFromDocument()
|
| m_fontSelector.clear();
|
| m_resolver.clear();
|
| m_styleSheetCollectionMap.clear();
|
| - m_activeTreeScopes.clear();
|
| }
|
| #endif
|
|
|
| @@ -113,66 +112,6 @@ inline Document* StyleEngine::master()
|
| return import->master();
|
| }
|
|
|
| -void StyleEngine::OrderedTreeScopeSet::insert(TreeScope* treeScope)
|
| -{
|
| - if (m_treeScopes.isEmpty()) {
|
| - m_treeScopes.append(treeScope);
|
| - m_hash.add(treeScope);
|
| - return;
|
| - }
|
| - if (m_hash.contains(treeScope))
|
| - return;
|
| -
|
| - int end = m_treeScopes.size() - 1;
|
| - int start = 0;
|
| - int position = 0;
|
| - unsigned result = 0;
|
| -
|
| - while (start <= end) {
|
| - position = (start + end) / 2;
|
| - result = m_treeScopes[position]->comparePosition(*treeScope);
|
| -
|
| - if (result & Node::DOCUMENT_POSITION_PRECEDING) {
|
| - end = position - 1;
|
| - } else {
|
| - ASSERT(result & Node::DOCUMENT_POSITION_FOLLOWING);
|
| - start = position + 1;
|
| - }
|
| - }
|
| -
|
| - if (result & Node::DOCUMENT_POSITION_FOLLOWING) {
|
| - ++position;
|
| - ASSERT(static_cast<size_t>(position) == m_treeScopes.size() || (m_treeScopes[position]->comparePosition(*treeScope) & Node::DOCUMENT_POSITION_PRECEDING));
|
| - }
|
| - m_treeScopes.insert(position, treeScope);
|
| - m_hash.add(treeScope);
|
| -
|
| -#if ENABLE(ASSERT)
|
| - // Check whether m_treeScopes is sorted in document order or not.
|
| - for (unsigned i = 0; i < m_treeScopes.size() - 1; ++i) {
|
| - unsigned result = m_treeScopes[i]->comparePosition(*m_treeScopes[i + 1]);
|
| - ASSERT(result & Node::DOCUMENT_POSITION_FOLLOWING);
|
| - }
|
| -#endif
|
| -}
|
| -
|
| -void StyleEngine::OrderedTreeScopeSet::remove(TreeScope* treeScope)
|
| -{
|
| - if (!m_hash.contains(treeScope))
|
| - return;
|
| - size_t position = m_treeScopes.find(treeScope);
|
| - m_treeScopes.remove(position);
|
| - m_hash.remove(treeScope);
|
| -}
|
| -
|
| -DEFINE_TRACE(StyleEngine::OrderedTreeScopeSet)
|
| -{
|
| -#if ENABLE(OILPAN)
|
| - visitor->trace(m_treeScopes);
|
| - visitor->trace(m_hash);
|
| -#endif
|
| -}
|
| -
|
| TreeScopeStyleSheetCollection* StyleEngine::ensureStyleSheetCollectionFor(TreeScope& treeScope)
|
| {
|
| if (treeScope == m_document)
|
| @@ -286,7 +225,7 @@ void StyleEngine::addStyleSheetCandidateNode(Node* node, bool createdByParser)
|
|
|
| markTreeScopeDirty(treeScope);
|
| if (treeScope != m_document)
|
| - m_activeTreeScopes.insert(&treeScope);
|
| + treeScope.setSelfOrDescendantsHaveActiveStyleSheets();
|
| }
|
|
|
| void StyleEngine::removeStyleSheetCandidateNode(Node* node)
|
| @@ -329,22 +268,18 @@ bool StyleEngine::shouldUpdateShadowTreeStyleSheetCollection(StyleResolverUpdate
|
| return !m_dirtyTreeScopes.isEmpty() || updateMode == FullStyleUpdate;
|
| }
|
|
|
| -void StyleEngine::clearMediaQueryRuleSetOnTreeScopeStyleSheets(UnorderedTreeScopeSet::iterator begin, UnorderedTreeScopeSet::iterator end)
|
| +void StyleEngine::clearMediaQueryRuleSetStyleSheets()
|
| {
|
| - for (UnorderedTreeScopeSet::iterator it = begin; it != end; ++it) {
|
| - TreeScope& treeScope = **it;
|
| - ASSERT(treeScope != m_document);
|
| - ShadowTreeStyleSheetCollection* collection = static_cast<ShadowTreeStyleSheetCollection*>(styleSheetCollectionFor(treeScope));
|
| + for (TreeScope* treeScope : TreeScope::TreeScopesWithActiveStyleSheetsTraversal(document())) {
|
| + TreeScopeStyleSheetCollection* collection = styleSheetCollectionFor(*treeScope);
|
| + ASSERT(collection);
|
| + collection->clearMediaQueryRuleSetStyleSheets();
|
| + }
|
| + for (TreeScope* treeScope : m_dirtyTreeScopes) {
|
| + TreeScopeStyleSheetCollection* collection = styleSheetCollectionFor(*treeScope);
|
| ASSERT(collection);
|
| collection->clearMediaQueryRuleSetStyleSheets();
|
| }
|
| -}
|
| -
|
| -void StyleEngine::clearMediaQueryRuleSetStyleSheets()
|
| -{
|
| - documentStyleSheetCollection()->clearMediaQueryRuleSetStyleSheets();
|
| - clearMediaQueryRuleSetOnTreeScopeStyleSheets(m_activeTreeScopes.beginUnordered(), m_activeTreeScopes.endUnordered());
|
| - clearMediaQueryRuleSetOnTreeScopeStyleSheets(m_dirtyTreeScopes.begin(), m_dirtyTreeScopes.end());
|
| }
|
|
|
| void StyleEngine::updateStyleSheetsInImport(DocumentStyleSheetCollector& parentCollector)
|
| @@ -356,14 +291,15 @@ void StyleEngine::updateStyleSheetsInImport(DocumentStyleSheetCollector& parentC
|
| documentStyleSheetCollection()->swapSheetsForSheetList(sheetsForList);
|
| }
|
|
|
| -void StyleEngine::updateActiveStyleSheetsInShadow(StyleResolverUpdateMode updateMode, TreeScope* treeScope, UnorderedTreeScopeSet& treeScopesRemoved)
|
| +void StyleEngine::updateActiveStyleSheetsInShadow(StyleResolverUpdateMode updateMode, TreeScope* treeScope, TreeScope::UnorderedTreeScopeSet& treeScopesRemoved)
|
| {
|
| ASSERT(treeScope != m_document);
|
| ShadowTreeStyleSheetCollection* collection = static_cast<ShadowTreeStyleSheetCollection*>(styleSheetCollectionFor(*treeScope));
|
| ASSERT(collection);
|
| collection->updateActiveStyleSheets(*this, updateMode);
|
| if (!collection->hasStyleSheetCandidateNodes()) {
|
| - treeScopesRemoved.add(treeScope);
|
| + if (treeScope->selfOrDescendantsHaveActiveStyleSheets() && !treeScope->hasChildTreeScopesWithActiveStyleSheets())
|
| + treeScopesRemoved.add(treeScope);
|
| // When removing TreeScope from ActiveTreeScopes,
|
| // its resolver should be destroyed by invoking resetAuthorStyle.
|
| ASSERT(!treeScope->scopedStyleResolver());
|
| @@ -382,18 +318,17 @@ void StyleEngine::updateActiveStyleSheets(StyleResolverUpdateMode updateMode)
|
| documentStyleSheetCollection()->updateActiveStyleSheets(*this, updateMode);
|
|
|
| if (shouldUpdateShadowTreeStyleSheetCollection(updateMode)) {
|
| - UnorderedTreeScopeSet treeScopesRemoved;
|
| -
|
| + TreeScope::UnorderedTreeScopeSet treeScopesRemoved;
|
| if (updateMode == FullStyleUpdate) {
|
| - for (unsigned i = 0; i < m_activeTreeScopes.size(); ++i)
|
| - updateActiveStyleSheetsInShadow(updateMode, m_activeTreeScopes[i], treeScopesRemoved);
|
| + for (TreeScope* treeScope : TreeScope::TreeScopesWithActiveStyleSheetsTraversal(document().childTreeScopesWithActiveStyleSheets()))
|
| + updateActiveStyleSheetsInShadow(updateMode, treeScope, treeScopesRemoved);
|
| } else {
|
| - for (UnorderedTreeScopeSet::iterator it = m_dirtyTreeScopes.begin(); it != m_dirtyTreeScopes.end(); ++it) {
|
| - updateActiveStyleSheetsInShadow(updateMode, *it, treeScopesRemoved);
|
| + for (TreeScope* treeScope : m_dirtyTreeScopes) {
|
| + updateActiveStyleSheetsInShadow(updateMode, treeScope, treeScopesRemoved);
|
| }
|
| }
|
| - for (UnorderedTreeScopeSet::iterator it = treeScopesRemoved.begin(); it != treeScopesRemoved.end(); ++it)
|
| - m_activeTreeScopes.remove(*it);
|
| + for (TreeScope* removed : treeScopesRemoved)
|
| + removed->clearSelfOrDescendantsHaveActiveStyleSheets();
|
| }
|
|
|
| InspectorInstrumentation::activeStyleSheetsUpdated(m_document);
|
| @@ -403,17 +338,14 @@ void StyleEngine::updateActiveStyleSheets(StyleResolverUpdateMode updateMode)
|
| m_documentScopeDirty = false;
|
| }
|
|
|
| -const WillBeHeapVector<RefPtrWillBeMember<CSSStyleSheet>> StyleEngine::activeStyleSheetsForInspector() const
|
| +const WillBeHeapVector<RefPtrWillBeMember<CSSStyleSheet>> StyleEngine::activeStyleSheetsForInspector()
|
| {
|
| - if (m_activeTreeScopes.isEmpty())
|
| + if (!document().hasChildTreeScopesWithActiveStyleSheets())
|
| return documentStyleSheetCollection()->activeAuthorStyleSheets();
|
|
|
| WillBeHeapVector<RefPtrWillBeMember<CSSStyleSheet>> activeStyleSheets;
|
| -
|
| - activeStyleSheets.appendVector(documentStyleSheetCollection()->activeAuthorStyleSheets());
|
| - for (unsigned i = 0; i < m_activeTreeScopes.size(); ++i) {
|
| - TreeScope* treeScope = const_cast<TreeScope*>(m_activeTreeScopes[i]);
|
| - if (TreeScopeStyleSheetCollection* collection = m_styleSheetCollectionMap.get(treeScope))
|
| + for (TreeScope* treeScope : TreeScope::TreeScopesWithActiveStyleSheetsTraversal(document())) {
|
| + if (TreeScopeStyleSheetCollection* collection = styleSheetCollectionFor(*treeScope))
|
| activeStyleSheets.appendVector(collection->activeAuthorStyleSheets());
|
| }
|
|
|
| @@ -426,7 +358,6 @@ const WillBeHeapVector<RefPtrWillBeMember<CSSStyleSheet>> StyleEngine::activeSty
|
| void StyleEngine::didRemoveShadowRoot(ShadowRoot* shadowRoot)
|
| {
|
| m_styleSheetCollectionMap.remove(shadowRoot);
|
| - m_activeTreeScopes.remove(shadowRoot);
|
| m_dirtyTreeScopes.remove(shadowRoot);
|
| }
|
|
|
| @@ -439,7 +370,6 @@ void StyleEngine::shadowRootRemovedFromDocument(ShadowRoot* shadowRoot)
|
| styleResolver->removePendingAuthorStyleSheets(collection->activeAuthorStyleSheets());
|
| }
|
| m_styleSheetCollectionMap.remove(shadowRoot);
|
| - m_activeTreeScopes.remove(shadowRoot);
|
| m_dirtyTreeScopes.remove(shadowRoot);
|
| }
|
|
|
| @@ -447,9 +377,8 @@ void StyleEngine::appendActiveAuthorStyleSheets()
|
| {
|
| ASSERT(isMaster());
|
|
|
| - m_resolver->appendAuthorStyleSheets(documentStyleSheetCollection()->activeAuthorStyleSheets());
|
| - for (unsigned i = 0; i < m_activeTreeScopes.size(); ++i) {
|
| - if (TreeScopeStyleSheetCollection* collection = m_styleSheetCollectionMap.get(m_activeTreeScopes[i]))
|
| + for (TreeScope* treeScope : TreeScope::TreeScopesWithActiveStyleSheetsTraversal(document())) {
|
| + if (TreeScopeStyleSheetCollection* collection = styleSheetCollectionFor(*treeScope))
|
| m_resolver->appendAuthorStyleSheets(collection->activeAuthorStyleSheets());
|
| }
|
| m_resolver->finishAppendAuthorStyleSheets();
|
| @@ -476,7 +405,6 @@ void StyleEngine::clearResolver()
|
| ASSERT(!document().inStyleRecalc());
|
| ASSERT(isMaster() || !m_resolver);
|
|
|
| - document().clearScopedStyleResolver();
|
| // StyleEngine::shadowRootRemovedFromDocument removes not-in-document
|
| // treescopes from activeTreeScopes. StyleEngine::didRemoveShadowRoot
|
| // removes treescopes which are being destroyed from activeTreeScopes.
|
| @@ -484,8 +412,8 @@ void StyleEngine::clearResolver()
|
| // just removed from document. If document is destroyed before invoking
|
| // updateActiveStyleSheets, the treescope has a scopedStyleResolver which
|
| // has destroyed StyleSheetContents.
|
| - for (UnorderedTreeScopeSet::iterator it = m_activeTreeScopes.beginUnordered(); it != m_activeTreeScopes.endUnordered(); ++it)
|
| - (*it)->clearScopedStyleResolver();
|
| + for (TreeScope* treeScope : TreeScope::TreeScopesWithActiveStyleSheetsTraversal(document()))
|
| + treeScope->clearScopedStyleResolver();
|
|
|
| m_resolver.clear();
|
| }
|
| @@ -652,10 +580,7 @@ void StyleEngine::removeSheet(StyleSheetContents* contents)
|
| void StyleEngine::collectScopedStyleFeaturesTo(RuleFeatureSet& features) const
|
| {
|
| HashSet<const StyleSheetContents*> visitedSharedStyleSheetContents;
|
| - if (document().scopedStyleResolver())
|
| - document().scopedStyleResolver()->collectFeaturesTo(features, visitedSharedStyleSheetContents);
|
| - for (unsigned i = 0; i < m_activeTreeScopes.size(); ++i) {
|
| - TreeScope* treeScope = const_cast<TreeScope*>(m_activeTreeScopes[i]);
|
| + for (TreeScope* treeScope : TreeScope::TreeScopesWithActiveStyleSheetsTraversal(document())) {
|
| // When creating StyleResolver, dirty treescopes might not be processed.
|
| // So some active treescopes might not have a scoped style resolver.
|
| // In this case, we should skip collectFeatures for the treescopes without
|
| @@ -784,7 +709,6 @@ DEFINE_TRACE(StyleEngine)
|
| visitor->trace(m_resolver);
|
| visitor->trace(m_styleInvalidator);
|
| visitor->trace(m_dirtyTreeScopes);
|
| - visitor->trace(m_activeTreeScopes);
|
| visitor->trace(m_fontSelector);
|
| visitor->trace(m_textToSheetCache);
|
| visitor->trace(m_sheetToTextCache);
|
|
|