| Index: third_party/WebKit/Source/core/dom/TreeScopeStyleSheetCollection.cpp
|
| diff --git a/third_party/WebKit/Source/core/dom/TreeScopeStyleSheetCollection.cpp b/third_party/WebKit/Source/core/dom/TreeScopeStyleSheetCollection.cpp
|
| index d1a185bbf8b3af07f744df0a7516d64a3bb4c7c7..ab41a6aca6ca3924263a403493c1e49b729336fe 100644
|
| --- a/third_party/WebKit/Source/core/dom/TreeScopeStyleSheetCollection.cpp
|
| +++ b/third_party/WebKit/Source/core/dom/TreeScopeStyleSheetCollection.cpp
|
| @@ -26,10 +26,10 @@
|
|
|
| #include "core/dom/TreeScopeStyleSheetCollection.h"
|
|
|
| +#include "core/css/ActiveStyleSheets.h"
|
| #include "core/css/CSSStyleSheet.h"
|
| #include "core/css/StyleRuleImport.h"
|
| #include "core/css/StyleSheetContents.h"
|
| -#include "core/css/invalidation/StyleSheetInvalidationAnalysis.h"
|
| #include "core/css/resolver/StyleResolver.h"
|
| #include "core/dom/Element.h"
|
| #include "core/dom/StyleEngine.h"
|
| @@ -40,131 +40,32 @@ namespace blink {
|
|
|
| TreeScopeStyleSheetCollection::TreeScopeStyleSheetCollection(TreeScope& treeScope)
|
| : m_treeScope(treeScope)
|
| - , m_hadActiveLoadingStylesheet(false)
|
| {
|
| }
|
|
|
| void TreeScopeStyleSheetCollection::addStyleSheetCandidateNode(Node* node)
|
| {
|
| - if (!node->inShadowIncludingDocument())
|
| - return;
|
| -
|
| - m_styleSheetCandidateNodes.add(node);
|
| -}
|
| -
|
| -TreeScopeStyleSheetCollection::StyleResolverUpdateType TreeScopeStyleSheetCollection::compareStyleSheets(const HeapVector<Member<CSSStyleSheet>>& oldStyleSheets, const HeapVector<Member<CSSStyleSheet>>& newStylesheets, HeapVector<Member<StyleSheetContents>>& addedSheets)
|
| -{
|
| - unsigned newStyleSheetCount = newStylesheets.size();
|
| - unsigned oldStyleSheetCount = oldStyleSheets.size();
|
| - DCHECK_GE(newStyleSheetCount, oldStyleSheetCount);
|
| -
|
| - if (!newStyleSheetCount)
|
| - return Reconstruct;
|
| -
|
| - unsigned newIndex = 0;
|
| - for (unsigned oldIndex = 0; oldIndex < oldStyleSheetCount; ++oldIndex) {
|
| - while (oldStyleSheets[oldIndex] != newStylesheets[newIndex]) {
|
| - addedSheets.append(newStylesheets[newIndex]->contents());
|
| - if (++newIndex == newStyleSheetCount)
|
| - return Reconstruct;
|
| - }
|
| - if (++newIndex == newStyleSheetCount)
|
| - return Reconstruct;
|
| - }
|
| - bool hasInsertions = !addedSheets.isEmpty();
|
| - while (newIndex < newStyleSheetCount) {
|
| - addedSheets.append(newStylesheets[newIndex]->contents());
|
| - ++newIndex;
|
| - }
|
| - // If all new sheets were added at the end of the list we can just add them to existing StyleResolver.
|
| - // If there were insertions we need to re-add all the stylesheets so rules are ordered correctly.
|
| - return hasInsertions ? Reset : Additive;
|
| -}
|
| -
|
| -bool TreeScopeStyleSheetCollection::activeLoadingStyleSheetLoaded(const HeapVector<Member<CSSStyleSheet>>& newStyleSheets)
|
| -{
|
| - // StyleSheets of <style> elements that @import stylesheets are active but loading. We need to trigger a full recalc when such loads are done.
|
| - bool hasActiveLoadingStylesheet = false;
|
| - unsigned newStylesheetCount = newStyleSheets.size();
|
| - for (unsigned i = 0; i < newStylesheetCount; ++i) {
|
| - if (newStyleSheets[i]->isLoading())
|
| - hasActiveLoadingStylesheet = true;
|
| - }
|
| - if (m_hadActiveLoadingStylesheet && !hasActiveLoadingStylesheet) {
|
| - m_hadActiveLoadingStylesheet = false;
|
| - return true;
|
| - }
|
| - m_hadActiveLoadingStylesheet = hasActiveLoadingStylesheet;
|
| - return false;
|
| -}
|
| -
|
| -static bool findFontFaceRulesFromStyleSheetContents(const HeapVector<Member<StyleSheetContents>>& sheets, HeapVector<Member<const StyleRuleFontFace>>& fontFaceRules)
|
| -{
|
| - bool hasFontFaceRule = false;
|
| -
|
| - for (unsigned i = 0; i < sheets.size(); ++i) {
|
| - DCHECK(sheets[i]);
|
| - if (sheets[i]->hasFontFaceRule()) {
|
| - // FIXME: We don't need this for styles in shadow tree.
|
| - sheets[i]->findFontFaceRules(fontFaceRules);
|
| - hasFontFaceRule = true;
|
| - }
|
| - }
|
| - return hasFontFaceRule;
|
| + if (node->inShadowIncludingDocument())
|
| + m_styleSheetCandidateNodes.add(node);
|
| }
|
|
|
| -void TreeScopeStyleSheetCollection::analyzeStyleSheetChange(StyleResolverUpdateMode updateMode, const StyleSheetCollection& newCollection, StyleSheetChange& change)
|
| -{
|
| - if (activeLoadingStyleSheetLoaded(newCollection.activeAuthorStyleSheets()))
|
| - return;
|
| -
|
| - if (updateMode != AnalyzedStyleUpdate)
|
| - return;
|
| -
|
| - // Find out which stylesheets are new.
|
| - HeapVector<Member<StyleSheetContents>> addedSheets;
|
| - if (m_activeAuthorStyleSheets.size() <= newCollection.activeAuthorStyleSheets().size()) {
|
| - change.styleResolverUpdateType = compareStyleSheets(m_activeAuthorStyleSheets, newCollection.activeAuthorStyleSheets(), addedSheets);
|
| - } else {
|
| - StyleResolverUpdateType updateType = compareStyleSheets(newCollection.activeAuthorStyleSheets(), m_activeAuthorStyleSheets, addedSheets);
|
| - if (updateType != Additive) {
|
| - change.styleResolverUpdateType = updateType;
|
| - } else {
|
| - change.styleResolverUpdateType = Reset;
|
| - // If @font-face is removed, needs full style recalc.
|
| - if (findFontFaceRulesFromStyleSheetContents(addedSheets, change.fontFaceRulesToRemove))
|
| - return;
|
| - }
|
| - }
|
| -
|
| - // FIXME: If styleResolverUpdateType is Reconstruct, we should return early here since
|
| - // we need to recalc the whole document. It's wrong to use StyleSheetInvalidationAnalysis since
|
| - // it only looks at the addedSheets.
|
| -
|
| - // No point in doing the analysis work if we're just going to recalc the whole document anyways.
|
| - // This needs to be done after the compareStyleSheets calls above to ensure we don't throw away
|
| - // the StyleResolver if we don't need to.
|
| - if (document().hasPendingForcedStyleRecalc())
|
| - return;
|
| -
|
| - // If we are already parsing the body and so may have significant amount of elements, put some effort into trying to avoid style recalcs.
|
| - if (!document().body() || document().hasNodesWithPlaceholderStyle())
|
| - return;
|
| - StyleSheetInvalidationAnalysis invalidationAnalysis(*m_treeScope, addedSheets);
|
| - if (invalidationAnalysis.dirtiesAllStyle())
|
| - return;
|
| - invalidationAnalysis.invalidateStyle();
|
| - change.requiresFullStyleRecalc = false;
|
| - return;
|
| -}
|
| -
|
| -void TreeScopeStyleSheetCollection::clearMediaQueryRuleSetStyleSheets()
|
| +bool TreeScopeStyleSheetCollection::mediaQueryAffectingValueChanged()
|
| {
|
| + bool needsActiveStyleUpdate = false;
|
| for (size_t i = 0; i < m_activeAuthorStyleSheets.size(); ++i) {
|
| - StyleSheetContents* contents = m_activeAuthorStyleSheets[i]->contents();
|
| + if (m_activeAuthorStyleSheets[i].first->mediaQueries())
|
| + needsActiveStyleUpdate = true;
|
| + StyleSheetContents* contents = m_activeAuthorStyleSheets[i].first->contents();
|
| if (contents->hasMediaQueries())
|
| contents->clearRuleSet();
|
| }
|
| + return needsActiveStyleUpdate;
|
| +}
|
| +
|
| +void TreeScopeStyleSheetCollection::applyActiveStyleSheetChanges(StyleSheetCollection& newCollection)
|
| +{
|
| + applyRuleSetChanges(document().styleEngine(), treeScope(), activeAuthorStyleSheets(), newCollection.activeAuthorStyleSheets());
|
| + newCollection.swap(*this);
|
| }
|
|
|
| DEFINE_TRACE(TreeScopeStyleSheetCollection)
|
|
|