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

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

Powered by Google App Engine
This is Rietveld 408576698