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

Side by Side Diff: Source/core/animation/css/CSSAnimations.cpp

Issue 1281493004: Make CSSAnimationUpdate stack-allocated (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 4 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
193 193
194 bool CSSAnimations::isTransitionAnimationForInspector(const Animation& animation ) const 194 bool CSSAnimations::isTransitionAnimationForInspector(const Animation& animation ) const
195 { 195 {
196 for (const auto& it : m_transitions) { 196 for (const auto& it : m_transitions) {
197 if (it.value.animation->sequenceNumber() == animation.sequenceNumber()) 197 if (it.value.animation->sequenceNumber() == animation.sequenceNumber())
198 return true; 198 return true;
199 } 199 }
200 return false; 200 return false;
201 } 201 }
202 202
203 PassOwnPtrWillBeRawPtr<CSSAnimationUpdate> CSSAnimations::calculateUpdate(const Element* animatingElement, Element& element, const ComputedStyle& style, Compute dStyle* parentStyle, StyleResolver* resolver) 203 void CSSAnimations::calculateUpdate(const Element* animatingElement, Element& el ement, StyleResolverState& state, StyleResolver* resolver)
alancutter (OOO until 2018) 2015/08/19 02:46:30 We should avoid passing StyleResolverState around
haraken 2015/08/19 05:46:08 Done.
204 { 204 {
205 OwnPtrWillBeRawPtr<CSSAnimationUpdate> update = adoptPtrWillBeNoop(new CSSAn imationUpdate()); 205 calculateAnimationUpdate(state.animationUpdate(), animatingElement, element, *state.style(), state.parentStyle(), resolver);
206 calculateAnimationUpdate(update.get(), animatingElement, element, style, par entStyle, resolver); 206 calculateAnimationActiveInterpolations(state.animationUpdate(), animatingEle ment, element.document().timeline().currentTimeInternal());
207 calculateAnimationActiveInterpolations(update.get(), animatingElement, eleme nt.document().timeline().currentTimeInternal()); 207 calculateTransitionUpdate(state.animationUpdate(), animatingElement, *state. style());
208 calculateTransitionUpdate(update.get(), animatingElement, style); 208 calculateTransitionActiveInterpolations(state.animationUpdate(), animatingEl ement, element.document().timeline().currentTimeInternal());
209 calculateTransitionActiveInterpolations(update.get(), animatingElement, elem ent.document().timeline().currentTimeInternal());
210 return update->isEmpty() ? nullptr : update.release();
211 } 209 }
212 210
213 void CSSAnimations::calculateAnimationUpdate(CSSAnimationUpdate* update, const E lement* animatingElement, Element& element, const ComputedStyle& style, Computed Style* parentStyle, StyleResolver* resolver) 211 void CSSAnimations::calculateAnimationUpdate(CSSAnimationUpdate& update, const E lement* animatingElement, Element& element, const ComputedStyle& style, Computed Style* parentStyle, StyleResolver* resolver)
214 { 212 {
215 const ElementAnimations* elementAnimations = animatingElement ? animatingEle ment->elementAnimations() : nullptr; 213 const ElementAnimations* elementAnimations = animatingElement ? animatingEle ment->elementAnimations() : nullptr;
216 214
217 bool isAnimationStyleChange = elementAnimations && elementAnimations->isAnim ationStyleChange(); 215 bool isAnimationStyleChange = elementAnimations && elementAnimations->isAnim ationStyleChange();
218 216
219 #if !ENABLE(ASSERT) 217 #if !ENABLE(ASSERT)
220 // If we're in an animation style change, no animations can have started, be en cancelled or changed play state. 218 // If we're in an animation style change, no animations can have started, be en cancelled or changed play state.
221 // When ASSERT is enabled, we verify this optimization. 219 // When ASSERT is enabled, we verify this optimization.
222 if (isAnimationStyleChange) 220 if (isAnimationStyleChange)
223 return; 221 return;
(...skipping 29 matching lines...) Expand all
253 if (cssAnimations) { 251 if (cssAnimations) {
254 AnimationMap::const_iterator existing(cssAnimations->m_animation s.find(animationName)); 252 AnimationMap::const_iterator existing(cssAnimations->m_animation s.find(animationName));
255 if (existing != cssAnimations->m_animations.end()) { 253 if (existing != cssAnimations->m_animations.end()) {
256 inactive.remove(animationName); 254 inactive.remove(animationName);
257 255
258 const RunningAnimation* runningAnimation = existing->value.g et(); 256 const RunningAnimation* runningAnimation = existing->value.g et();
259 Animation* animation = runningAnimation->animation.get(); 257 Animation* animation = runningAnimation->animation.get();
260 258
261 if (keyframesRule != runningAnimation->styleRule || keyframe sRule->version() != runningAnimation->styleRuleVersion || runningAnimation->spec ifiedTiming != specifiedTiming) { 259 if (keyframesRule != runningAnimation->styleRule || keyframe sRule->version() != runningAnimation->styleRuleVersion || runningAnimation->spec ifiedTiming != specifiedTiming) {
262 ASSERT(!isAnimationStyleChange); 260 ASSERT(!isAnimationStyleChange);
263 update->updateAnimation(animationName, animation, InertE ffect::create( 261 update.updateAnimation(animationName, animation, InertEf fect::create(
264 createKeyframeEffectModel(resolver, animatingElement , element, &style, parentStyle, animationName, keyframeTimingFunction.get()), 262 createKeyframeEffectModel(resolver, animatingElement , element, &style, parentStyle, animationName, keyframeTimingFunction.get()),
265 timing, isPaused, animation->unlimitedCurrentTimeInt ernal()), specifiedTiming, keyframesRule); 263 timing, isPaused, animation->unlimitedCurrentTimeInt ernal()), specifiedTiming, keyframesRule);
266 } else if (!isAnimationStyleChange && animation->effect() && animation->effect()->isAnimation()) { 264 } else if (!isAnimationStyleChange && animation->effect() && animation->effect()->isAnimation()) {
267 EffectModel* model = toKeyframeEffect(animation->effect( ))->model(); 265 EffectModel* model = toKeyframeEffect(animation->effect( ))->model();
268 if (model && model->isKeyframeEffectModel()) { 266 if (model && model->isKeyframeEffectModel()) {
269 KeyframeEffectModelBase* keyframeEffect = toKeyframe EffectModelBase(model); 267 KeyframeEffectModelBase* keyframeEffect = toKeyframe EffectModelBase(model);
270 if (keyframeEffect->hasSyntheticKeyframes()) 268 if (keyframeEffect->hasSyntheticKeyframes())
271 update->updateAnimationStyle(animation, keyframe Effect, animatingElement->layoutObject(), style); 269 update.updateAnimationStyle(animation, keyframeE ffect, animatingElement->layoutObject(), style);
272 } 270 }
273 } 271 }
274 272
275 if (isPaused != animation->paused()) { 273 if (isPaused != animation->paused()) {
276 ASSERT(!isAnimationStyleChange); 274 ASSERT(!isAnimationStyleChange);
277 update->toggleAnimationPaused(animationName); 275 update.toggleAnimationPaused(animationName);
278 } 276 }
279 277
280 continue; 278 continue;
281 } 279 }
282 } 280 }
283 281
284 ASSERT(!isAnimationStyleChange); 282 ASSERT(!isAnimationStyleChange);
285 update->startAnimation(animationName, InertEffect::create( 283 update.startAnimation(animationName, InertEffect::create(
286 createKeyframeEffectModel(resolver, animatingElement, element, & style, parentStyle, animationName, keyframeTimingFunction.get()), 284 createKeyframeEffectModel(resolver, animatingElement, element, & style, parentStyle, animationName, keyframeTimingFunction.get()),
287 timing, isPaused, 0), specifiedTiming, keyframesRule); 285 timing, isPaused, 0), specifiedTiming, keyframesRule);
288 } 286 }
289 } 287 }
290 288
291 ASSERT(inactive.isEmpty() || cssAnimations); 289 ASSERT(inactive.isEmpty() || cssAnimations);
292 for (const AtomicString& animationName : inactive) { 290 for (const AtomicString& animationName : inactive) {
293 ASSERT(!isAnimationStyleChange); 291 ASSERT(!isAnimationStyleChange);
294 update->cancelAnimation(animationName, *cssAnimations->m_animations.get( animationName)->animation); 292 update.cancelAnimation(animationName, *cssAnimations->m_animations.get(a nimationName)->animation);
295 } 293 }
296 } 294 }
297 295
298 void CSSAnimations::maybeApplyPendingUpdate(Element* element) 296 void CSSAnimations::maybeApplyPendingUpdate(Element* element)
299 { 297 {
300 if (!m_pendingUpdate) { 298 if (m_pendingUpdate.isEmpty()) {
301 m_previousActiveInterpolationsForAnimations.clear(); 299 m_previousActiveInterpolationsForAnimations.clear();
302 return; 300 return;
303 } 301 }
304 302
305 OwnPtrWillBeRawPtr<CSSAnimationUpdate> update = m_pendingUpdate.release(); 303 m_previousActiveInterpolationsForAnimations.swap(m_pendingUpdate.activeInter polationsForAnimations());
306
307 m_previousActiveInterpolationsForAnimations.swap(update->activeInterpolation sForAnimations());
308 304
309 // FIXME: cancelling, pausing, unpausing animations all query compositingSta te, which is not necessarily up to date here 305 // FIXME: cancelling, pausing, unpausing animations all query compositingSta te, which is not necessarily up to date here
310 // since we call this from recalc style. 306 // since we call this from recalc style.
311 // https://code.google.com/p/chromium/issues/detail?id=339847 307 // https://code.google.com/p/chromium/issues/detail?id=339847
312 DisableCompositingQueryAsserts disabler; 308 DisableCompositingQueryAsserts disabler;
313 309
314 for (const AtomicString& animationName : update->cancelledAnimationNames()) { 310 for (const AtomicString& animationName : m_pendingUpdate.cancelledAnimationN ames()) {
315 RefPtrWillBeRawPtr<Animation> animation = m_animations.take(animationNam e)->animation; 311 RefPtrWillBeRawPtr<Animation> animation = m_animations.take(animationNam e)->animation;
316 animation->cancel(); 312 animation->cancel();
317 animation->update(TimingUpdateOnDemand); 313 animation->update(TimingUpdateOnDemand);
318 } 314 }
319 315
320 for (const AtomicString& animationName : update->animationsWithPauseToggled( )) { 316 for (const AtomicString& animationName : m_pendingUpdate.animationsWithPause Toggled()) {
321 Animation* animation = m_animations.get(animationName)->animation.get(); 317 Animation* animation = m_animations.get(animationName)->animation.get();
322 if (animation->paused()) 318 if (animation->paused())
323 animation->unpause(); 319 animation->unpause();
324 else 320 else
325 animation->pause(); 321 animation->pause();
326 if (animation->outdated()) 322 if (animation->outdated())
327 animation->update(TimingUpdateOnDemand); 323 animation->update(TimingUpdateOnDemand);
328 } 324 }
329 325
330 for (const auto& styleUpdate : update->animationsWithStyleUpdates()) { 326 for (const auto& styleUpdate : m_pendingUpdate.animationsWithStyleUpdates()) {
331 styleUpdate.model->forEachInterpolation([](Interpolation& interpolation) { 327 styleUpdate.model->forEachInterpolation([](Interpolation& interpolation) {
332 if (interpolation.isStyleInterpolation() && toStyleInterpolation(int erpolation).isDeferredLegacyStyleInterpolation()) 328 if (interpolation.isStyleInterpolation() && toStyleInterpolation(int erpolation).isDeferredLegacyStyleInterpolation())
333 toDeferredLegacyStyleInterpolation(toStyleInterpolation(interpol ation)).underlyingStyleChanged(); 329 toDeferredLegacyStyleInterpolation(toStyleInterpolation(interpol ation)).underlyingStyleChanged();
334 }); 330 });
335 331
336 bool updated = false; 332 bool updated = false;
337 if (styleUpdate.snapshot.opacity) 333 if (styleUpdate.snapshot.opacity)
338 updated |= styleUpdate.model->updateNeutralKeyframeAnimatableValues( CSSPropertyOpacity, styleUpdate.snapshot.opacity); 334 updated |= styleUpdate.model->updateNeutralKeyframeAnimatableValues( CSSPropertyOpacity, styleUpdate.snapshot.opacity);
339 if (styleUpdate.snapshot.transform) 335 if (styleUpdate.snapshot.transform)
340 updated |= styleUpdate.model->updateNeutralKeyframeAnimatableValues( CSSPropertyTransform, styleUpdate.snapshot.transform); 336 updated |= styleUpdate.model->updateNeutralKeyframeAnimatableValues( CSSPropertyTransform, styleUpdate.snapshot.transform);
341 if (styleUpdate.snapshot.webkitFilter) 337 if (styleUpdate.snapshot.webkitFilter)
342 updated |= styleUpdate.model->updateNeutralKeyframeAnimatableValues( CSSPropertyWebkitFilter, styleUpdate.snapshot.webkitFilter); 338 updated |= styleUpdate.model->updateNeutralKeyframeAnimatableValues( CSSPropertyWebkitFilter, styleUpdate.snapshot.webkitFilter);
343 if (updated) { 339 if (updated) {
344 styleUpdate.animation->setOutdated(); 340 styleUpdate.animation->setOutdated();
345 styleUpdate.animation->setCompositorPending(true); 341 styleUpdate.animation->setCompositorPending(true);
346 } 342 }
347 } 343 }
348 344
349 for (const auto& entry : update->animationsWithUpdates()) { 345 for (const auto& entry : m_pendingUpdate.animationsWithUpdates()) {
350 KeyframeEffect* effect = toKeyframeEffect(entry.animation->effect()); 346 KeyframeEffect* effect = toKeyframeEffect(entry.animation->effect());
351 347
352 effect->setModel(entry.effect->model()); 348 effect->setModel(entry.effect->model());
353 effect->updateSpecifiedTiming(entry.effect->specifiedTiming()); 349 effect->updateSpecifiedTiming(entry.effect->specifiedTiming());
354 350
355 m_animations.find(entry.name)->value->update(entry); 351 m_animations.find(entry.name)->value->update(entry);
356 } 352 }
357 353
358 for (const auto& entry : update->newAnimations()) { 354 for (const auto& entry : m_pendingUpdate.newAnimations()) {
359 const InertEffect* inertAnimation = entry.effect.get(); 355 const InertEffect* inertAnimation = entry.effect.get();
360 OwnPtrWillBeRawPtr<AnimationEventDelegate> eventDelegate = adoptPtrWillB eNoop(new AnimationEventDelegate(element, entry.name)); 356 OwnPtrWillBeRawPtr<AnimationEventDelegate> eventDelegate = adoptPtrWillB eNoop(new AnimationEventDelegate(element, entry.name));
361 RefPtrWillBeRawPtr<KeyframeEffect> effect = KeyframeEffect::create(eleme nt, inertAnimation->model(), inertAnimation->specifiedTiming(), KeyframeEffect:: DefaultPriority, eventDelegate.release()); 357 RefPtrWillBeRawPtr<KeyframeEffect> effect = KeyframeEffect::create(eleme nt, inertAnimation->model(), inertAnimation->specifiedTiming(), KeyframeEffect:: DefaultPriority, eventDelegate.release());
362 effect->setName(inertAnimation->name()); 358 effect->setName(inertAnimation->name());
363 RefPtrWillBeRawPtr<Animation> animation = element->document().timeline() .play(effect.get()); 359 RefPtrWillBeRawPtr<Animation> animation = element->document().timeline() .play(effect.get());
364 if (inertAnimation->paused()) 360 if (inertAnimation->paused())
365 animation->pause(); 361 animation->pause();
366 animation->update(TimingUpdateOnDemand); 362 animation->update(TimingUpdateOnDemand);
367 363
368 m_animations.set(entry.name, adoptRefWillBeNoop(new RunningAnimation(ani mation, entry))); 364 m_animations.set(entry.name, adoptRefWillBeNoop(new RunningAnimation(ani mation, entry)));
369 } 365 }
370 366
371 // Transitions that are run on the compositor only update main-thread state 367 // Transitions that are run on the compositor only update main-thread state
372 // lazily. However, we need the new state to know what the from state shoud 368 // lazily. However, we need the new state to know what the from state shoud
373 // be when transitions are retargeted. Instead of triggering complete style 369 // be when transitions are retargeted. Instead of triggering complete style
374 // recalculation, we find these cases by searching for new transitions that 370 // recalculation, we find these cases by searching for new transitions that
375 // have matching cancelled animation property IDs on the compositor. 371 // have matching cancelled animation property IDs on the compositor.
376 WillBeHeapHashMap<CSSPropertyID, std::pair<RefPtrWillBeMember<KeyframeEffect >, double>> retargetedCompositorTransitions; 372 WillBeHeapHashMap<CSSPropertyID, std::pair<RefPtrWillBeMember<KeyframeEffect >, double>> retargetedCompositorTransitions;
377 for (CSSPropertyID id : update->cancelledTransitions()) { 373 for (CSSPropertyID id : m_pendingUpdate.cancelledTransitions()) {
378 ASSERT(m_transitions.contains(id)); 374 ASSERT(m_transitions.contains(id));
379 375
380 RefPtrWillBeRawPtr<Animation> animation = m_transitions.take(id).animati on; 376 RefPtrWillBeRawPtr<Animation> animation = m_transitions.take(id).animati on;
381 KeyframeEffect* effect = toKeyframeEffect(animation->effect()); 377 KeyframeEffect* effect = toKeyframeEffect(animation->effect());
382 if (effect->hasActiveAnimationsOnCompositor(id) && update->newTransition s().find(id) != update->newTransitions().end() && !animation->limited()) 378 if (effect->hasActiveAnimationsOnCompositor(id) && m_pendingUpdate.newTr ansitions().find(id) != m_pendingUpdate.newTransitions().end() && !animation->li mited())
383 retargetedCompositorTransitions.add(id, std::pair<RefPtrWillBeMember <KeyframeEffect>, double>(effect, animation->startTimeInternal())); 379 retargetedCompositorTransitions.add(id, std::pair<RefPtrWillBeMember <KeyframeEffect>, double>(effect, animation->startTimeInternal()));
384 animation->cancel(); 380 animation->cancel();
385 // after cancelation, transitions must be downgraded or they'll fail 381 // after cancelation, transitions must be downgraded or they'll fail
386 // to be considered when retriggering themselves. This can happen if 382 // to be considered when retriggering themselves. This can happen if
387 // the transition is captured through getAnimations then played. 383 // the transition is captured through getAnimations then played.
388 if (animation->effect() && animation->effect()->isAnimation()) 384 if (animation->effect() && animation->effect()->isAnimation())
389 toKeyframeEffect(animation->effect())->downgradeToNormal(); 385 toKeyframeEffect(animation->effect())->downgradeToNormal();
390 animation->update(TimingUpdateOnDemand); 386 animation->update(TimingUpdateOnDemand);
391 } 387 }
392 388
393 for (CSSPropertyID id : update->finishedTransitions()) { 389 for (CSSPropertyID id : m_pendingUpdate.finishedTransitions()) {
394 // This transition can also be cancelled and finished at the same time 390 // This transition can also be cancelled and finished at the same time
395 if (m_transitions.contains(id)) { 391 if (m_transitions.contains(id)) {
396 RefPtrWillBeRawPtr<Animation> animation = m_transitions.take(id).ani mation; 392 RefPtrWillBeRawPtr<Animation> animation = m_transitions.take(id).ani mation;
397 // Transition must be downgraded 393 // Transition must be downgraded
398 if (animation->effect() && animation->effect()->isAnimation()) 394 if (animation->effect() && animation->effect()->isAnimation())
399 toKeyframeEffect(animation->effect())->downgradeToNormal(); 395 toKeyframeEffect(animation->effect())->downgradeToNormal();
400 } 396 }
401 } 397 }
402 398
403 for (const auto& entry : update->newTransitions()) { 399 for (const auto& entry : m_pendingUpdate.newTransitions()) {
404 const CSSAnimationUpdate::NewTransition& newTransition = entry.value; 400 const CSSAnimationUpdate::NewTransition& newTransition = entry.value;
405 401
406 RunningTransition runningTransition; 402 RunningTransition runningTransition;
407 runningTransition.from = newTransition.from; 403 runningTransition.from = newTransition.from;
408 runningTransition.to = newTransition.to; 404 runningTransition.to = newTransition.to;
409 405
410 CSSPropertyID id = newTransition.id; 406 CSSPropertyID id = newTransition.id;
411 InertEffect* inertAnimation = newTransition.effect.get(); 407 InertEffect* inertAnimation = newTransition.effect.get();
412 OwnPtrWillBeRawPtr<TransitionEventDelegate> eventDelegate = adoptPtrWill BeNoop(new TransitionEventDelegate(element, id)); 408 OwnPtrWillBeRawPtr<TransitionEventDelegate> eventDelegate = adoptPtrWill BeNoop(new TransitionEventDelegate(element, id));
413 409
(...skipping 30 matching lines...) Expand all
444 RefPtrWillBeRawPtr<Animation> animation = element->document().timeline() .play(transition.get()); 440 RefPtrWillBeRawPtr<Animation> animation = element->document().timeline() .play(transition.get());
445 // Set the current time as the start time for retargeted transitions 441 // Set the current time as the start time for retargeted transitions
446 if (retargetedCompositorTransitions.contains(id)) 442 if (retargetedCompositorTransitions.contains(id))
447 animation->setStartTime(element->document().timeline().currentTime() ); 443 animation->setStartTime(element->document().timeline().currentTime() );
448 animation->update(TimingUpdateOnDemand); 444 animation->update(TimingUpdateOnDemand);
449 runningTransition.animation = animation; 445 runningTransition.animation = animation;
450 m_transitions.set(id, runningTransition); 446 m_transitions.set(id, runningTransition);
451 ASSERT(id != CSSPropertyInvalid); 447 ASSERT(id != CSSPropertyInvalid);
452 Platform::current()->histogramSparse("WebCore.Animation.CSSProperties", UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(id)); 448 Platform::current()->histogramSparse("WebCore.Animation.CSSProperties", UseCounter::mapCSSPropertyIdToCSSSampleIdForHistogram(id));
453 } 449 }
450
451 clearPendingUpdate();
454 } 452 }
455 453
456 void CSSAnimations::calculateTransitionUpdateForProperty(CSSPropertyID id, const CSSTransitionData& transitionData, size_t transitionIndex, const ComputedStyle& oldStyle, const ComputedStyle& style, const TransitionMap* activeTransitions, C SSAnimationUpdate* update, const Element* element) 454 void CSSAnimations::calculateTransitionUpdateForProperty(CSSPropertyID id, const CSSTransitionData& transitionData, size_t transitionIndex, const ComputedStyle& oldStyle, const ComputedStyle& style, const TransitionMap* activeTransitions, C SSAnimationUpdate& update, const Element* element)
457 { 455 {
458 RefPtrWillBeRawPtr<AnimatableValue> to = nullptr; 456 RefPtrWillBeRawPtr<AnimatableValue> to = nullptr;
459 if (activeTransitions) { 457 if (activeTransitions) {
460 TransitionMap::const_iterator activeTransitionIter = activeTransitions-> find(id); 458 TransitionMap::const_iterator activeTransitionIter = activeTransitions-> find(id);
461 if (activeTransitionIter != activeTransitions->end()) { 459 if (activeTransitionIter != activeTransitions->end()) {
462 to = CSSAnimatableValueFactory::create(id, style); 460 to = CSSAnimatableValueFactory::create(id, style);
463 const AnimatableValue* activeTo = activeTransitionIter->value.to; 461 const AnimatableValue* activeTo = activeTransitionIter->value.to;
464 if (to->equals(activeTo)) 462 if (to->equals(activeTo))
465 return; 463 return;
466 update->cancelTransition(id); 464 update.cancelTransition(id);
467 ASSERT(!element->elementAnimations() || !element->elementAnimations( )->isAnimationStyleChange()); 465 ASSERT(!element->elementAnimations() || !element->elementAnimations( )->isAnimationStyleChange());
468 } 466 }
469 } 467 }
470 468
471 if (CSSPropertyEquality::propertiesEqual(id, oldStyle, style)) 469 if (CSSPropertyEquality::propertiesEqual(id, oldStyle, style))
472 return; 470 return;
473 if (!to) 471 if (!to)
474 to = CSSAnimatableValueFactory::create(id, style); 472 to = CSSAnimatableValueFactory::create(id, style);
475 473
476 RefPtrWillBeRawPtr<AnimatableValue> from = CSSAnimatableValueFactory::create (id, oldStyle); 474 RefPtrWillBeRawPtr<AnimatableValue> from = CSSAnimatableValueFactory::create (id, oldStyle);
(...skipping 26 matching lines...) Expand all
503 startKeyframe->setEasing(timing.timingFunction.release()); 501 startKeyframe->setEasing(timing.timingFunction.release());
504 timing.timingFunction = LinearTimingFunction::shared(); 502 timing.timingFunction = LinearTimingFunction::shared();
505 keyframes.append(startKeyframe); 503 keyframes.append(startKeyframe);
506 504
507 RefPtrWillBeRawPtr<AnimatableValueKeyframe> endKeyframe = AnimatableValueKey frame::create(); 505 RefPtrWillBeRawPtr<AnimatableValueKeyframe> endKeyframe = AnimatableValueKey frame::create();
508 endKeyframe->setPropertyValue(id, to.get()); 506 endKeyframe->setPropertyValue(id, to.get());
509 endKeyframe->setOffset(1); 507 endKeyframe->setOffset(1);
510 keyframes.append(endKeyframe); 508 keyframes.append(endKeyframe);
511 509
512 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> model = AnimatableVal ueKeyframeEffectModel::create(keyframes); 510 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> model = AnimatableVal ueKeyframeEffectModel::create(keyframes);
513 update->startTransition(id, from.get(), to.get(), InertEffect::create(model, timing, false, 0)); 511 update.startTransition(id, from.get(), to.get(), InertEffect::create(model, timing, false, 0));
514 ASSERT(!element->elementAnimations() || !element->elementAnimations()->isAni mationStyleChange()); 512 ASSERT(!element->elementAnimations() || !element->elementAnimations()->isAni mationStyleChange());
515 } 513 }
516 514
517 void CSSAnimations::calculateTransitionUpdate(CSSAnimationUpdate* update, const Element* animatingElement, const ComputedStyle& style) 515 void CSSAnimations::calculateTransitionUpdate(CSSAnimationUpdate& update, const Element* animatingElement, const ComputedStyle& style)
518 { 516 {
519 if (!animatingElement) 517 if (!animatingElement)
520 return; 518 return;
521 519
522 ElementAnimations* elementAnimations = animatingElement->elementAnimations() ; 520 ElementAnimations* elementAnimations = animatingElement->elementAnimations() ;
523 const TransitionMap* activeTransitions = elementAnimations ? &elementAnimati ons->cssAnimations().m_transitions : nullptr; 521 const TransitionMap* activeTransitions = elementAnimations ? &elementAnimati ons->cssAnimations().m_transitions : nullptr;
524 const CSSTransitionData* transitionData = style.transitions(); 522 const CSSTransitionData* transitionData = style.transitions();
525 523
526 #if ENABLE(ASSERT) 524 #if ENABLE(ASSERT)
527 // In debug builds we verify that it would have been safe to avoid populatin g and testing listedProperties if the style recalc is due to animation. 525 // In debug builds we verify that it would have been safe to avoid populatin g and testing listedProperties if the style recalc is due to animation.
(...skipping 28 matching lines...) Expand all
556 if (!animateAll) { 554 if (!animateAll) {
557 if (CSSPropertyMetadata::isInterpolableProperty(id)) 555 if (CSSPropertyMetadata::isInterpolableProperty(id))
558 listedProperties.set(id); 556 listedProperties.set(id);
559 else 557 else
560 continue; 558 continue;
561 } 559 }
562 560
563 // FIXME: We should transition if an !important property changes even when an animation is running, 561 // FIXME: We should transition if an !important property changes even when an animation is running,
564 // but this is a bit hard to do with the current applyMatchedPro perties system. 562 // but this is a bit hard to do with the current applyMatchedPro perties system.
565 PropertyHandle property = PropertyHandle(id); 563 PropertyHandle property = PropertyHandle(id);
566 if (!update->activeInterpolationsForAnimations().contains(proper ty) 564 if (!update.activeInterpolationsForAnimations().contains(propert y)
567 && (!elementAnimations || !elementAnimations->cssAnimations( ).m_previousActiveInterpolationsForAnimations.contains(property))) { 565 && (!elementAnimations || !elementAnimations->cssAnimations( ).m_previousActiveInterpolationsForAnimations.contains(property))) {
568 calculateTransitionUpdateForProperty(id, *transitionData, i, oldStyle, style, activeTransitions, update, animatingElement); 566 calculateTransitionUpdateForProperty(id, *transitionData, i, oldStyle, style, activeTransitions, update, animatingElement);
569 } 567 }
570 } 568 }
571 } 569 }
572 } 570 }
573 571
574 if (activeTransitions) { 572 if (activeTransitions) {
575 for (const auto& entry : *activeTransitions) { 573 for (const auto& entry : *activeTransitions) {
576 CSSPropertyID id = entry.key; 574 CSSPropertyID id = entry.key;
577 if (!anyTransitionHadTransitionAll && !animationStyleRecalc && !list edProperties.get(id)) { 575 if (!anyTransitionHadTransitionAll && !animationStyleRecalc && !list edProperties.get(id)) {
578 // TODO: Figure out why this fails on Chrome OS login page. crbu g.com/365507 576 // TODO: Figure out why this fails on Chrome OS login page. crbu g.com/365507
579 // ASSERT(animation.playStateInternal() == Animation::Finished | | !(elementAnimations && elementAnimations->isAnimationStyleChange())); 577 // ASSERT(animation.playStateInternal() == Animation::Finished | | !(elementAnimations && elementAnimations->isAnimationStyleChange()));
580 update->cancelTransition(id); 578 update.cancelTransition(id);
581 } else if (entry.value.animation->finishedInternal()) { 579 } else if (entry.value.animation->finishedInternal()) {
582 update->finishTransition(id); 580 update.finishTransition(id);
583 } 581 }
584 } 582 }
585 } 583 }
586 } 584 }
587 585
588 void CSSAnimations::cancel() 586 void CSSAnimations::cancel()
589 { 587 {
590 for (const auto& entry : m_animations) { 588 for (const auto& entry : m_animations) {
591 entry.value->animation->cancel(); 589 entry.value->animation->cancel();
592 entry.value->animation->update(TimingUpdateOnDemand); 590 entry.value->animation->update(TimingUpdateOnDemand);
593 } 591 }
594 592
595 for (const auto& entry : m_transitions) { 593 for (const auto& entry : m_transitions) {
596 entry.value.animation->cancel(); 594 entry.value.animation->cancel();
597 entry.value.animation->update(TimingUpdateOnDemand); 595 entry.value.animation->update(TimingUpdateOnDemand);
598 } 596 }
599 597
600 m_animations.clear(); 598 m_animations.clear();
601 m_transitions.clear(); 599 clearPendingUpdate();
602 m_pendingUpdate = nullptr;
603 } 600 }
604 601
605 void CSSAnimations::calculateAnimationActiveInterpolations(CSSAnimationUpdate* u pdate, const Element* animatingElement, double timelineCurrentTime) 602 void CSSAnimations::calculateAnimationActiveInterpolations(CSSAnimationUpdate& u pdate, const Element* animatingElement, double timelineCurrentTime)
606 { 603 {
607 ElementAnimations* elementAnimations = animatingElement ? animatingElement-> elementAnimations() : nullptr; 604 ElementAnimations* elementAnimations = animatingElement ? animatingElement-> elementAnimations() : nullptr;
608 AnimationStack* animationStack = elementAnimations ? &elementAnimations->def aultStack() : nullptr; 605 AnimationStack* animationStack = elementAnimations ? &elementAnimations->def aultStack() : nullptr;
609 606
610 if (update->newAnimations().isEmpty() && update->suppressedAnimations().isEm pty()) { 607 if (update.newAnimations().isEmpty() && update.suppressedAnimations().isEmpt y()) {
611 ActiveInterpolationMap activeInterpolationsForAnimations(AnimationStack: :activeInterpolations(animationStack, 0, 0, KeyframeEffect::DefaultPriority, tim elineCurrentTime)); 608 ActiveInterpolationMap activeInterpolationsForAnimations(AnimationStack: :activeInterpolations(animationStack, 0, 0, KeyframeEffect::DefaultPriority, tim elineCurrentTime));
612 update->adoptActiveInterpolationsForAnimations(activeInterpolationsForAn imations); 609 update.adoptActiveInterpolationsForAnimations(activeInterpolationsForAni mations);
613 return; 610 return;
614 } 611 }
615 612
616 WillBeHeapVector<RawPtrWillBeMember<InertEffect>> newEffects; 613 WillBeHeapVector<RawPtrWillBeMember<InertEffect>> newEffects;
617 for (const auto& newAnimation : update->newAnimations()) 614 for (const auto& newAnimation : update.newAnimations())
618 newEffects.append(newAnimation.effect.get()); 615 newEffects.append(newAnimation.effect.get());
619 for (const auto& updatedAnimation : update->animationsWithUpdates()) 616 for (const auto& updatedAnimation : update.animationsWithUpdates())
620 newEffects.append(updatedAnimation.effect.get()); // Animations with upd ates use a temporary InertEffect for the current frame. 617 newEffects.append(updatedAnimation.effect.get()); // Animations with upd ates use a temporary InertEffect for the current frame.
621 618
622 ActiveInterpolationMap activeInterpolationsForAnimations(AnimationStack::act iveInterpolations(animationStack, &newEffects, &update->suppressedAnimations(), KeyframeEffect::DefaultPriority, timelineCurrentTime)); 619 ActiveInterpolationMap activeInterpolationsForAnimations(AnimationStack::act iveInterpolations(animationStack, &newEffects, &update.suppressedAnimations(), K eyframeEffect::DefaultPriority, timelineCurrentTime));
623 update->adoptActiveInterpolationsForAnimations(activeInterpolationsForAnimat ions); 620 update.adoptActiveInterpolationsForAnimations(activeInterpolationsForAnimati ons);
624 } 621 }
625 622
626 void CSSAnimations::calculateTransitionActiveInterpolations(CSSAnimationUpdate* update, const Element* animatingElement, double timelineCurrentTime) 623 void CSSAnimations::calculateTransitionActiveInterpolations(CSSAnimationUpdate& update, const Element* animatingElement, double timelineCurrentTime)
627 { 624 {
628 ElementAnimations* elementAnimations = animatingElement ? animatingElement-> elementAnimations() : nullptr; 625 ElementAnimations* elementAnimations = animatingElement ? animatingElement-> elementAnimations() : nullptr;
629 AnimationStack* animationStack = elementAnimations ? &elementAnimations->def aultStack() : nullptr; 626 AnimationStack* animationStack = elementAnimations ? &elementAnimations->def aultStack() : nullptr;
630 627
631 ActiveInterpolationMap activeInterpolationsForTransitions; 628 ActiveInterpolationMap activeInterpolationsForTransitions;
632 if (update->newTransitions().isEmpty() && update->cancelledTransitions().isE mpty()) { 629 if (update.newTransitions().isEmpty() && update.cancelledTransitions().isEmp ty()) {
633 activeInterpolationsForTransitions = AnimationStack::activeInterpolation s(animationStack, 0, 0, KeyframeEffect::TransitionPriority, timelineCurrentTime) ; 630 activeInterpolationsForTransitions = AnimationStack::activeInterpolation s(animationStack, 0, 0, KeyframeEffect::TransitionPriority, timelineCurrentTime) ;
634 } else { 631 } else {
635 WillBeHeapVector<RawPtrWillBeMember<InertEffect>> newTransitions; 632 WillBeHeapVector<RawPtrWillBeMember<InertEffect>> newTransitions;
636 for (const auto& entry : update->newTransitions()) 633 for (const auto& entry : update.newTransitions())
637 newTransitions.append(entry.value.effect.get()); 634 newTransitions.append(entry.value.effect.get());
638 635
639 WillBeHeapHashSet<RawPtrWillBeMember<const Animation>> cancelledAnimatio ns; 636 WillBeHeapHashSet<RawPtrWillBeMember<const Animation>> cancelledAnimatio ns;
640 if (!update->cancelledTransitions().isEmpty()) { 637 if (!update.cancelledTransitions().isEmpty()) {
641 ASSERT(elementAnimations); 638 ASSERT(elementAnimations);
642 const TransitionMap& transitionMap = elementAnimations->cssAnimation s().m_transitions; 639 const TransitionMap& transitionMap = elementAnimations->cssAnimation s().m_transitions;
643 for (CSSPropertyID id : update->cancelledTransitions()) { 640 for (CSSPropertyID id : update.cancelledTransitions()) {
644 ASSERT(transitionMap.contains(id)); 641 ASSERT(transitionMap.contains(id));
645 cancelledAnimations.add(transitionMap.get(id).animation.get()); 642 cancelledAnimations.add(transitionMap.get(id).animation.get());
646 } 643 }
647 } 644 }
648 645
649 activeInterpolationsForTransitions = AnimationStack::activeInterpolation s(animationStack, &newTransitions, &cancelledAnimations, KeyframeEffect::Transit ionPriority, timelineCurrentTime); 646 activeInterpolationsForTransitions = AnimationStack::activeInterpolation s(animationStack, &newTransitions, &cancelledAnimations, KeyframeEffect::Transit ionPriority, timelineCurrentTime);
650 } 647 }
651 648
652 // Properties being animated by animations don't get values from transitions applied. 649 // Properties being animated by animations don't get values from transitions applied.
653 if (!update->activeInterpolationsForAnimations().isEmpty() && !activeInterpo lationsForTransitions.isEmpty()) { 650 if (!update.activeInterpolationsForAnimations().isEmpty() && !activeInterpol ationsForTransitions.isEmpty()) {
654 for (const auto& entry : update->activeInterpolationsForAnimations()) 651 for (const auto& entry : update.activeInterpolationsForAnimations())
655 activeInterpolationsForTransitions.remove(entry.key); 652 activeInterpolationsForTransitions.remove(entry.key);
656 } 653 }
657 update->adoptActiveInterpolationsForTransitions(activeInterpolationsForTrans itions); 654 update.adoptActiveInterpolationsForTransitions(activeInterpolationsForTransi tions);
658 } 655 }
659 656
660 EventTarget* CSSAnimations::AnimationEventDelegate::eventTarget() const 657 EventTarget* CSSAnimations::AnimationEventDelegate::eventTarget() const
661 { 658 {
662 return EventPath::eventTargetRespectingTargetRules(*m_animationTarget); 659 return EventPath::eventTargetRespectingTargetRules(*m_animationTarget);
663 } 660 }
664 661
665 void CSSAnimations::AnimationEventDelegate::maybeDispatch(Document::ListenerType listenerType, const AtomicString& eventName, double elapsedTime) 662 void CSSAnimations::AnimationEventDelegate::maybeDispatch(Document::ListenerType listenerType, const AtomicString& eventName, double elapsedTime)
666 { 663 {
667 if (m_animationTarget->document().hasListenerType(listenerType)) { 664 if (m_animationTarget->document().hasListenerType(listenerType)) {
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
791 DEFINE_TRACE(CSSAnimations) 788 DEFINE_TRACE(CSSAnimations)
792 { 789 {
793 #if ENABLE(OILPAN) 790 #if ENABLE(OILPAN)
794 visitor->trace(m_transitions); 791 visitor->trace(m_transitions);
795 visitor->trace(m_pendingUpdate); 792 visitor->trace(m_pendingUpdate);
796 visitor->trace(m_animations); 793 visitor->trace(m_animations);
797 visitor->trace(m_previousActiveInterpolationsForAnimations); 794 visitor->trace(m_previousActiveInterpolationsForAnimations);
798 #endif 795 #endif
799 } 796 }
800 797
801 DEFINE_TRACE(CSSAnimationUpdate)
802 {
803 #if ENABLE(OILPAN)
804 visitor->trace(m_newTransitions);
805 visitor->trace(m_activeInterpolationsForAnimations);
806 visitor->trace(m_activeInterpolationsForTransitions);
807 visitor->trace(m_newAnimations);
808 visitor->trace(m_suppressedAnimations);
809 visitor->trace(m_animationsWithUpdates);
810 visitor->trace(m_animationsWithStyleUpdates);
811 #endif
812 }
813
814 } // namespace blink 798 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698