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

Unified Diff: third_party/WebKit/Source/core/animation/InvalidatableInterpolation.cpp

Issue 2555923003: Make InvalidatableInterpolation's InterpolationTypes decided at effect application time (Closed)
Patch Set: Extended InterpolationTypesMap lifetime scope to fix release crash Created 4 years 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/animation/InvalidatableInterpolation.cpp
diff --git a/third_party/WebKit/Source/core/animation/InvalidatableInterpolation.cpp b/third_party/WebKit/Source/core/animation/InvalidatableInterpolation.cpp
index e480166ee7911ad9307bbc574689bfd142d7af45..ef975f9d998c912529d0cdae04d6a2f0cabd7cfe 100644
--- a/third_party/WebKit/Source/core/animation/InvalidatableInterpolation.cpp
+++ b/third_party/WebKit/Source/core/animation/InvalidatableInterpolation.cpp
@@ -32,7 +32,7 @@ InvalidatableInterpolation::maybeConvertPairwise(
const InterpolationEnvironment& environment,
const UnderlyingValueOwner& underlyingValueOwner) const {
DCHECK(m_currentFraction != 0 && m_currentFraction != 1);
- for (const auto& interpolationType : m_interpolationTypes) {
+ for (const auto& interpolationType : *m_interpolationTypes) {
if ((m_startKeyframe->isNeutral() || m_endKeyframe->isNeutral()) &&
(!underlyingValueOwner ||
underlyingValueOwner.type() != *interpolationType))
@@ -59,7 +59,7 @@ InvalidatableInterpolation::convertSingleKeyframe(
const UnderlyingValueOwner& underlyingValueOwner) const {
if (keyframe.isNeutral() && !underlyingValueOwner)
return nullptr;
- for (const auto& interpolationType : m_interpolationTypes) {
+ for (const auto& interpolationType : *m_interpolationTypes) {
if (keyframe.isNeutral() &&
underlyingValueOwner.type() != *interpolationType)
continue;
@@ -89,7 +89,7 @@ void InvalidatableInterpolation::addConversionCheckers(
std::unique_ptr<TypedInterpolationValue>
InvalidatableInterpolation::maybeConvertUnderlyingValue(
const InterpolationEnvironment& environment) const {
- for (const auto& interpolationType : m_interpolationTypes) {
+ for (const auto& interpolationType : *m_interpolationTypes) {
InterpolationValue result =
interpolationType->maybeConvertUnderlyingValue(environment);
if (result)
@@ -144,6 +144,9 @@ InvalidatableInterpolation::ensureValidConversion(
const InterpolationEnvironment& environment,
const UnderlyingValueOwner& underlyingValueOwner) const {
DCHECK(!std::isnan(m_currentFraction));
+ DCHECK(m_interpolationTypes &&
+ m_interpolationTypesVersion ==
+ environment.interpolationTypesMap().version());
if (isConversionCacheValid(environment, underlyingValueOwner))
return m_cachedValue.get();
clearConversionCache();
@@ -172,6 +175,22 @@ InvalidatableInterpolation::ensureValidConversion(
return m_cachedValue.get();
}
+void InvalidatableInterpolation::ensureValidInterpolationTypes(
+ const InterpolationEnvironment& environment) const {
+ const InterpolationTypesMap& map = environment.interpolationTypesMap();
+ size_t latestVersion = map.version();
+ if (m_interpolationTypes && m_interpolationTypesVersion == latestVersion) {
+ return;
+ }
+ const InterpolationTypes* latestInterpolationTypes = &map.get(m_property);
+ DCHECK(latestInterpolationTypes);
+ if (m_interpolationTypes != latestInterpolationTypes) {
+ clearConversionCache();
+ }
+ m_interpolationTypes = latestInterpolationTypes;
+ m_interpolationTypesVersion = latestVersion;
+}
+
void InvalidatableInterpolation::setFlagIfInheritUsed(
InterpolationEnvironment& environment) const {
if (!m_property.isCSSProperty() && !m_property.isPresentationAttribute())
@@ -208,6 +227,7 @@ void InvalidatableInterpolation::applyStack(
UnderlyingValueOwner underlyingValueOwner;
const InvalidatableInterpolation& firstInterpolation =
toInvalidatableInterpolation(*interpolations.at(startingIndex));
+ firstInterpolation.ensureValidInterpolationTypes(environment);
if (firstInterpolation.dependsOnUnderlyingValue()) {
underlyingValueOwner.set(
firstInterpolation.maybeConvertUnderlyingValue(environment));
@@ -235,6 +255,7 @@ void InvalidatableInterpolation::applyStack(
const InvalidatableInterpolation& currentInterpolation =
toInvalidatableInterpolation(*interpolations.at(i));
DCHECK(currentInterpolation.dependsOnUnderlyingValue());
+ currentInterpolation.ensureValidInterpolationTypes(environment);
const TypedInterpolationValue* currentValue =
currentInterpolation.ensureValidConversion(environment,
underlyingValueOwner);

Powered by Google App Engine
This is Rietveld 408576698