Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(164)

Unified Diff: third_party/WebKit/Source/core/css/resolver/ScopedStyleResolver.cpp

Issue 2361733004: Adding @keyframes rules only affects TreeScope plus host. (Closed)
Patch Set: Moved scope check to CSSAnimations Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/css/resolver/ScopedStyleResolver.cpp
diff --git a/third_party/WebKit/Source/core/css/resolver/ScopedStyleResolver.cpp b/third_party/WebKit/Source/core/css/resolver/ScopedStyleResolver.cpp
index ede3e41e6aab4baeb3d18af774d92350d35fd7fb..62938aad7228e6751c982301c2e2721604071301 100644
--- a/third_party/WebKit/Source/core/css/resolver/ScopedStyleResolver.cpp
+++ b/third_party/WebKit/Source/core/css/resolver/ScopedStyleResolver.cpp
@@ -27,6 +27,7 @@
#include "core/css/resolver/ScopedStyleResolver.h"
#include "core/HTMLNames.h"
+#include "core/animation/DocumentTimeline.h"
#include "core/css/CSSFontSelector.h"
#include "core/css/CSSStyleSheet.h"
#include "core/css/FontFace.h"
@@ -37,6 +38,7 @@
#include "core/css/resolver/MatchRequest.h"
#include "core/css/resolver/ViewportStyleResolver.h"
#include "core/dom/Document.h"
+#include "core/dom/StyleChangeReason.h"
#include "core/dom/StyleEngine.h"
#include "core/dom/shadow/ElementShadow.h"
#include "core/dom/shadow/ShadowRoot.h"
@@ -144,6 +146,46 @@ void ScopedStyleResolver::addKeyframeStyle(StyleRuleKeyframes* rule)
}
}
+static Node& invalidationRootFor(const TreeScope& treeScope)
+{
+ if (treeScope.rootNode() == treeScope.document())
+ return treeScope.document();
+ return toShadowRoot(treeScope.rootNode()).host();
+}
+
+void ScopedStyleResolver::keyframesRulesAdded(const TreeScope& treeScope)
+{
+ // Called when @keyframes rules are about to be added/removed from a
+ // TreeScope. @keyframes rules may apply to animations on elements in the
+ // same TreeScope as the stylesheet, or the host element in the parent
+ // TreeScope if the TreeScope is a shadow tree.
+
+ ScopedStyleResolver* resolver = treeScope.scopedStyleResolver();
+ ScopedStyleResolver* parentResolver = treeScope.parentTreeScope() ? treeScope.parentTreeScope()->scopedStyleResolver() : nullptr;
+
+ bool hadUnresolvedKeyframes = false;
+ if (resolver && resolver->m_hasUnresolvedKeyframesRule) {
+ resolver->m_hasUnresolvedKeyframesRule = false;
+ hadUnresolvedKeyframes = true;
+ }
+ if (parentResolver && parentResolver->m_hasUnresolvedKeyframesRule) {
+ parentResolver->m_hasUnresolvedKeyframesRule = false;
+ hadUnresolvedKeyframes = true;
+ }
+
+ if (hadUnresolvedKeyframes) {
+ // If an animation ended up not being started because no @keyframes
+ // rules were found for the animation-name, we need to recalculate style
+ // for the elements in the scope, including its shadow host if
+ // applicable.
+ invalidationRootFor(treeScope).setNeedsStyleRecalc(SubtreeStyleChange, StyleChangeReasonForTracing::create(StyleChangeReason::StyleSheetChange));
+ return;
+ }
+
+ // If we have animations running, added/removed @keyframes may affect these.
+ treeScope.document().timeline().invalidateKeyframeEffects(treeScope);
+}
+
void ScopedStyleResolver::collectMatchingAuthorRules(ElementRuleCollector& collector, CascadeOrder cascadeOrder)
{
for (size_t i = 0; i < m_authorStyleSheets.size(); ++i) {

Powered by Google App Engine
This is Rietveld 408576698