| Index: third_party/WebKit/Source/core/dom/ShadowTreeStyleSheetCollection.cpp
|
| diff --git a/third_party/WebKit/Source/core/dom/ShadowTreeStyleSheetCollection.cpp b/third_party/WebKit/Source/core/dom/ShadowTreeStyleSheetCollection.cpp
|
| index 7f735dd5d9bb6c537f8375d32dcbf24e20def2b5..29dad5ffed2e06abdc62cbe4e4216c7898605a2f 100644
|
| --- a/third_party/WebKit/Source/core/dom/ShadowTreeStyleSheetCollection.cpp
|
| +++ b/third_party/WebKit/Source/core/dom/ShadowTreeStyleSheetCollection.cpp
|
| @@ -47,6 +47,7 @@
|
| : TreeScopeStyleSheetCollection(shadowRoot) {}
|
|
|
| void ShadowTreeStyleSheetCollection::collectStyleSheets(
|
| + StyleEngine& engine,
|
| StyleSheetCollection& collection) {
|
| for (Node* n : m_styleSheetCandidateNodes) {
|
| StyleSheetCandidate candidate(*n);
|
| @@ -57,19 +58,46 @@
|
| continue;
|
|
|
| collection.appendSheetForList(sheet);
|
| - if (candidate.canBeActivated(nullAtom)) {
|
| - CSSStyleSheet* cssSheet = toCSSStyleSheet(sheet);
|
| - collection.appendActiveStyleSheet(std::make_pair(
|
| - cssSheet, document().styleEngine().ruleSetForSheet(*cssSheet)));
|
| - }
|
| + if (candidate.canBeActivated(nullAtom))
|
| + collection.appendActiveStyleSheet(toCSSStyleSheet(sheet));
|
| }
|
| }
|
|
|
| -void ShadowTreeStyleSheetCollection::updateActiveStyleSheets() {
|
| +void ShadowTreeStyleSheetCollection::updateActiveStyleSheets(
|
| + StyleEngine& engine,
|
| + StyleResolverUpdateMode updateMode) {
|
| // StyleSheetCollection is GarbageCollected<>, allocate it on the heap.
|
| StyleSheetCollection* collection = StyleSheetCollection::create();
|
| - collectStyleSheets(*collection);
|
| - applyActiveStyleSheetChanges(*collection);
|
| + collectStyleSheets(engine, *collection);
|
| +
|
| + StyleSheetChange change;
|
| + analyzeStyleSheetChange(updateMode, collection->activeAuthorStyleSheets(),
|
| + change);
|
| +
|
| + if (StyleResolver* styleResolver = engine.resolver()) {
|
| + if (change.styleResolverUpdateType != Additive) {
|
| + // We should not destroy StyleResolver when we find any stylesheet update
|
| + // in a shadow tree. In this case, we will reset rulesets created from
|
| + // style elements in the shadow tree.
|
| + engine.resetAuthorStyle(treeScope());
|
| + styleResolver->removePendingAuthorStyleSheets(m_activeAuthorStyleSheets);
|
| + styleResolver->lazyAppendAuthorStyleSheets(
|
| + 0, collection->activeAuthorStyleSheets());
|
| + } else {
|
| + styleResolver->lazyAppendAuthorStyleSheets(
|
| + m_activeAuthorStyleSheets.size(),
|
| + collection->activeAuthorStyleSheets());
|
| + }
|
| + }
|
| + if (change.requiresFullStyleRecalc)
|
| + toShadowRoot(treeScope().rootNode())
|
| + .host()
|
| + .setNeedsStyleRecalc(SubtreeStyleChange,
|
| + StyleChangeReasonForTracing::create(
|
| + StyleChangeReason::ActiveStylesheetsUpdate));
|
| +
|
| + collection->swap(*this);
|
| + collection->dispose();
|
| }
|
|
|
| } // namespace blink
|
|
|