OLD | NEW |
---|---|
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 16 matching lines...) Expand all Loading... | |
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
29 */ | 29 */ |
30 | 30 |
31 #include "core/animation/Animation.h" | 31 #include "core/animation/Animation.h" |
32 | 32 |
33 #include "core/animation/AnimationTimeline.h" | 33 #include "core/animation/AnimationTimeline.h" |
34 #include "core/animation/CompositorPendingAnimations.h" | 34 #include "core/animation/CompositorPendingAnimations.h" |
35 #include "core/animation/DocumentTimeline.h" | 35 #include "core/animation/DocumentTimeline.h" |
36 #include "core/animation/KeyframeEffectReadOnly.h" | 36 #include "core/animation/KeyframeEffectReadOnly.h" |
37 #include "core/animation/SuperAnimationTimeline.h" | |
37 #include "core/animation/css/CSSAnimations.h" | 38 #include "core/animation/css/CSSAnimations.h" |
38 #include "core/dom/DOMNodeIds.h" | 39 #include "core/dom/DOMNodeIds.h" |
39 #include "core/dom/Document.h" | 40 #include "core/dom/Document.h" |
40 #include "core/dom/ExceptionCode.h" | 41 #include "core/dom/ExceptionCode.h" |
41 #include "core/dom/ExecutionContext.h" | 42 #include "core/dom/ExecutionContext.h" |
42 #include "core/dom/StyleChangeReason.h" | 43 #include "core/dom/StyleChangeReason.h" |
43 #include "core/dom/TaskRunnerHelper.h" | 44 #include "core/dom/TaskRunnerHelper.h" |
44 #include "core/events/AnimationPlaybackEvent.h" | 45 #include "core/events/AnimationPlaybackEvent.h" |
45 #include "core/frame/UseCounter.h" | 46 #include "core/frame/UseCounter.h" |
46 #include "core/inspector/InspectorTraceEvents.h" | 47 #include "core/inspector/InspectorTraceEvents.h" |
(...skipping 14 matching lines...) Expand all Loading... | |
61 | 62 |
62 namespace { | 63 namespace { |
63 | 64 |
64 static unsigned NextSequenceNumber() { | 65 static unsigned NextSequenceNumber() { |
65 static unsigned next = 0; | 66 static unsigned next = 0; |
66 return ++next; | 67 return ++next; |
67 } | 68 } |
68 } | 69 } |
69 | 70 |
70 Animation* Animation::Create(AnimationEffectReadOnly* effect, | 71 Animation* Animation::Create(AnimationEffectReadOnly* effect, |
71 AnimationTimeline* timeline) { | 72 SuperAnimationTimeline* timeline) { |
72 if (!timeline) { | 73 if (!timeline || !timeline->IsAnimationTimeline()) { |
73 // FIXME: Support creating animations without a timeline. | 74 // FIXME: Support creating animations without a timeline. |
74 NOTREACHED(); | 75 NOTREACHED(); |
75 return nullptr; | 76 return nullptr; |
76 } | 77 } |
77 | 78 |
79 AnimationTimeline* subtimeline = ToAnimationTimeline(timeline); | |
alancutter (OOO until 2018)
2017/06/21 05:36:17
Add TODO to remove the dependency on (future) Docu
| |
80 | |
78 Animation* animation = new Animation( | 81 Animation* animation = new Animation( |
79 timeline->GetDocument()->ContextDocument(), *timeline, effect); | 82 subtimeline->GetDocument()->ContextDocument(), *subtimeline, effect); |
80 | 83 |
81 if (timeline) { | 84 if (subtimeline) { |
82 timeline->AnimationAttached(*animation); | 85 subtimeline->AnimationAttached(*animation); |
83 animation->AttachCompositorTimeline(); | 86 animation->AttachCompositorTimeline(); |
84 } | 87 } |
85 | 88 |
86 return animation; | 89 return animation; |
87 } | 90 } |
88 | 91 |
89 Animation* Animation::Create(ExecutionContext* execution_context, | 92 Animation* Animation::Create(ExecutionContext* execution_context, |
90 AnimationEffectReadOnly* effect, | 93 AnimationEffectReadOnly* effect, |
91 ExceptionState& exception_state) { | 94 ExceptionState& exception_state) { |
92 DCHECK(RuntimeEnabledFeatures::WebAnimationsAPIEnabled()); | 95 DCHECK(RuntimeEnabledFeatures::WebAnimationsAPIEnabled()); |
93 | 96 |
94 Document* document = ToDocument(execution_context); | 97 Document* document = ToDocument(execution_context); |
95 return Create(effect, &document->Timeline()); | 98 return Create(effect, &document->Timeline()); |
96 } | 99 } |
97 | 100 |
98 Animation* Animation::Create(ExecutionContext* execution_context, | 101 Animation* Animation::Create(ExecutionContext* execution_context, |
99 AnimationEffectReadOnly* effect, | 102 AnimationEffectReadOnly* effect, |
100 AnimationTimeline* timeline, | 103 SuperAnimationTimeline* timeline, |
101 ExceptionState& exception_state) { | 104 ExceptionState& exception_state) { |
102 DCHECK(RuntimeEnabledFeatures::WebAnimationsAPIEnabled()); | 105 DCHECK(RuntimeEnabledFeatures::WebAnimationsAPIEnabled()); |
103 | 106 |
104 if (!timeline) { | 107 if (!timeline) { |
105 return Create(execution_context, effect, exception_state); | 108 return Create(execution_context, effect, exception_state); |
106 } | 109 } |
107 | 110 |
108 return Create(effect, timeline); | 111 return Create(effect, timeline); |
109 } | 112 } |
110 | 113 |
(...skipping 651 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
762 ->CanStartAnimationOnCompositor(playback_rate_); | 765 ->CanStartAnimationOnCompositor(playback_rate_); |
763 } | 766 } |
764 | 767 |
765 bool Animation::CanStartAnimationOnCompositorInternal( | 768 bool Animation::CanStartAnimationOnCompositorInternal( |
766 const Optional<CompositorElementIdSet>& composited_element_ids) const { | 769 const Optional<CompositorElementIdSet>& composited_element_ids) const { |
767 if (is_composited_animation_disabled_for_testing_ || EffectSuppressed()) | 770 if (is_composited_animation_disabled_for_testing_ || EffectSuppressed()) |
768 return false; | 771 return false; |
769 | 772 |
770 // FIXME: Timeline playback rates should be compositable | 773 // FIXME: Timeline playback rates should be compositable |
771 if (playback_rate_ == 0 || (std::isinf(EffectEnd()) && playback_rate_ < 0) || | 774 if (playback_rate_ == 0 || (std::isinf(EffectEnd()) && playback_rate_ < 0) || |
772 (timeline() && timeline()->PlaybackRate() != 1)) | 775 (TimelineInternal() && TimelineInternal()->PlaybackRate() != 1)) |
773 return false; | 776 return false; |
774 | 777 |
775 if (!timeline_ || !content_ || !content_->IsKeyframeEffectReadOnly()) | 778 if (!timeline_ || !content_ || !content_->IsKeyframeEffectReadOnly()) |
776 return false; | 779 return false; |
777 | 780 |
778 // If the optional element id set has no value we must be in SPv1 mode in | 781 // If the optional element id set has no value we must be in SPv1 mode in |
779 // which case we trust the compositing logic will create a layer if needed. | 782 // which case we trust the compositing logic will create a layer if needed. |
780 if (composited_element_ids.has_value()) { | 783 if (composited_element_ids.has_value()) { |
781 DCHECK(RuntimeEnabledFeatures::SlimmingPaintV2Enabled()); | 784 DCHECK(RuntimeEnabledFeatures::SlimmingPaintV2Enabled()); |
782 Element* target_element = | 785 Element* target_element = |
(...skipping 21 matching lines...) Expand all Loading... | |
804 | 807 |
805 return true; | 808 return true; |
806 } | 809 } |
807 | 810 |
808 void Animation::StartAnimationOnCompositor( | 811 void Animation::StartAnimationOnCompositor( |
809 const Optional<CompositorElementIdSet>& composited_element_ids) { | 812 const Optional<CompositorElementIdSet>& composited_element_ids) { |
810 DCHECK(CanStartAnimationOnCompositor(composited_element_ids)); | 813 DCHECK(CanStartAnimationOnCompositor(composited_element_ids)); |
811 | 814 |
812 bool reversed = playback_rate_ < 0; | 815 bool reversed = playback_rate_ < 0; |
813 | 816 |
814 double start_time = timeline()->ZeroTime() + StartTimeInternal(); | 817 double start_time = TimelineInternal()->ZeroTime() + StartTimeInternal(); |
815 if (reversed) { | 818 if (reversed) { |
816 start_time -= EffectEnd() / fabs(playback_rate_); | 819 start_time -= EffectEnd() / fabs(playback_rate_); |
817 } | 820 } |
818 | 821 |
819 double time_offset = 0; | 822 double time_offset = 0; |
820 if (std::isnan(start_time)) { | 823 if (std::isnan(start_time)) { |
821 time_offset = | 824 time_offset = |
822 reversed ? EffectEnd() - CurrentTimeInternal() : CurrentTimeInternal(); | 825 reversed ? EffectEnd() - CurrentTimeInternal() : CurrentTimeInternal(); |
823 time_offset = time_offset / fabs(playback_rate_); | 826 time_offset = time_offset / fabs(playback_rate_); |
824 } | 827 } |
(...skipping 12 matching lines...) Expand all Loading... | |
837 if (effect_changed && compositor_state_) { | 840 if (effect_changed && compositor_state_) { |
838 compositor_state_->effect_changed = true; | 841 compositor_state_->effect_changed = true; |
839 } | 842 } |
840 if (compositor_pending_ || is_paused_for_testing_) { | 843 if (compositor_pending_ || is_paused_for_testing_) { |
841 return; | 844 return; |
842 } | 845 } |
843 if (!compositor_state_ || compositor_state_->effect_changed || | 846 if (!compositor_state_ || compositor_state_->effect_changed || |
844 compositor_state_->playback_rate != playback_rate_ || | 847 compositor_state_->playback_rate != playback_rate_ || |
845 compositor_state_->start_time != start_time_) { | 848 compositor_state_->start_time != start_time_) { |
846 compositor_pending_ = true; | 849 compositor_pending_ = true; |
847 timeline()->GetDocument()->GetCompositorPendingAnimations().Add(this); | 850 TimelineInternal()->GetDocument()->GetCompositorPendingAnimations().Add( |
851 this); | |
848 } | 852 } |
849 } | 853 } |
850 | 854 |
851 void Animation::CancelAnimationOnCompositor() { | 855 void Animation::CancelAnimationOnCompositor() { |
852 if (HasActiveAnimationsOnCompositor()) | 856 if (HasActiveAnimationsOnCompositor()) |
853 ToKeyframeEffectReadOnly(content_.Get())->CancelAnimationOnCompositor(); | 857 ToKeyframeEffectReadOnly(content_.Get())->CancelAnimationOnCompositor(); |
854 | 858 |
855 DestroyCompositorPlayer(); | 859 DestroyCompositorPlayer(); |
856 } | 860 } |
857 | 861 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
893 inherited_time = -1; | 897 inherited_time = -1; |
894 content_->UpdateInheritedTime(inherited_time, reason); | 898 content_->UpdateInheritedTime(inherited_time, reason); |
895 } | 899 } |
896 | 900 |
897 if ((idle || Limited()) && !finished_) { | 901 if ((idle || Limited()) && !finished_) { |
898 if (reason == kTimingUpdateForAnimationFrame && (idle || HasStartTime())) { | 902 if (reason == kTimingUpdateForAnimationFrame && (idle || HasStartTime())) { |
899 if (idle) { | 903 if (idle) { |
900 const AtomicString& event_type = EventTypeNames::cancel; | 904 const AtomicString& event_type = EventTypeNames::cancel; |
901 if (GetExecutionContext() && HasEventListeners(event_type)) { | 905 if (GetExecutionContext() && HasEventListeners(event_type)) { |
902 double event_current_time = NullValue(); | 906 double event_current_time = NullValue(); |
903 pending_cancelled_event_ = AnimationPlaybackEvent::Create( | 907 pending_cancelled_event_ = |
904 event_type, event_current_time, timeline()->currentTime()); | 908 AnimationPlaybackEvent::Create(event_type, event_current_time, |
909 TimelineInternal()->currentTime()); | |
905 pending_cancelled_event_->SetTarget(this); | 910 pending_cancelled_event_->SetTarget(this); |
906 pending_cancelled_event_->SetCurrentTarget(this); | 911 pending_cancelled_event_->SetCurrentTarget(this); |
907 timeline_->GetDocument()->EnqueueAnimationFrameEvent( | 912 timeline_->GetDocument()->EnqueueAnimationFrameEvent( |
908 pending_cancelled_event_); | 913 pending_cancelled_event_); |
909 } | 914 } |
910 } else { | 915 } else { |
911 const AtomicString& event_type = EventTypeNames::finish; | 916 const AtomicString& event_type = EventTypeNames::finish; |
912 if (GetExecutionContext() && HasEventListeners(event_type)) { | 917 if (GetExecutionContext() && HasEventListeners(event_type)) { |
913 double event_current_time = CurrentTimeInternal() * 1000; | 918 double event_current_time = CurrentTimeInternal() * 1000; |
914 pending_finished_event_ = AnimationPlaybackEvent::Create( | 919 pending_finished_event_ = |
915 event_type, event_current_time, timeline()->currentTime()); | 920 AnimationPlaybackEvent::Create(event_type, event_current_time, |
921 TimelineInternal()->currentTime()); | |
916 pending_finished_event_->SetTarget(this); | 922 pending_finished_event_->SetTarget(this); |
917 pending_finished_event_->SetCurrentTarget(this); | 923 pending_finished_event_->SetCurrentTarget(this); |
918 timeline_->GetDocument()->EnqueueAnimationFrameEvent( | 924 timeline_->GetDocument()->EnqueueAnimationFrameEvent( |
919 pending_finished_event_); | 925 pending_finished_event_); |
920 } | 926 } |
921 } | 927 } |
922 finished_ = true; | 928 finished_ = true; |
923 } | 929 } |
924 } | 930 } |
925 DCHECK(!outdated_); | 931 DCHECK(!outdated_); |
(...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1017 | 1023 |
1018 ToKeyframeEffectReadOnly(content_.Get())->AttachCompositedLayers(); | 1024 ToKeyframeEffectReadOnly(content_.Get())->AttachCompositedLayers(); |
1019 } | 1025 } |
1020 | 1026 |
1021 void Animation::DetachCompositedLayers() { | 1027 void Animation::DetachCompositedLayers() { |
1022 if (compositor_player_ && compositor_player_->Player()->IsElementAttached()) | 1028 if (compositor_player_ && compositor_player_->Player()->IsElementAttached()) |
1023 compositor_player_->Player()->DetachElement(); | 1029 compositor_player_->Player()->DetachElement(); |
1024 } | 1030 } |
1025 | 1031 |
1026 void Animation::NotifyAnimationStarted(double monotonic_time, int group) { | 1032 void Animation::NotifyAnimationStarted(double monotonic_time, int group) { |
1027 timeline() | 1033 TimelineInternal() |
1028 ->GetDocument() | 1034 ->GetDocument() |
1029 ->GetCompositorPendingAnimations() | 1035 ->GetCompositorPendingAnimations() |
1030 .NotifyCompositorAnimationStarted(monotonic_time, group); | 1036 .NotifyCompositorAnimationStarted(monotonic_time, group); |
1031 } | 1037 } |
1032 | 1038 |
1033 Animation::PlayStateUpdateScope::PlayStateUpdateScope( | 1039 Animation::PlayStateUpdateScope::PlayStateUpdateScope( |
1034 Animation& animation, | 1040 Animation& animation, |
1035 TimingUpdateReason reason, | 1041 TimingUpdateReason reason, |
1036 CompositorPendingChange compositor_pending_change) | 1042 CompositorPendingChange compositor_pending_change) |
1037 : animation_(animation), | 1043 : animation_(animation), |
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1121 break; | 1127 break; |
1122 case kDoNotSetCompositorPending: | 1128 case kDoNotSetCompositorPending: |
1123 break; | 1129 break; |
1124 default: | 1130 default: |
1125 NOTREACHED(); | 1131 NOTREACHED(); |
1126 break; | 1132 break; |
1127 } | 1133 } |
1128 animation_->EndUpdatingState(); | 1134 animation_->EndUpdatingState(); |
1129 | 1135 |
1130 if (old_play_state != new_play_state) { | 1136 if (old_play_state != new_play_state) { |
1131 probe::animationPlayStateChanged(animation_->timeline()->GetDocument(), | 1137 probe::animationPlayStateChanged( |
1132 animation_, old_play_state, | 1138 animation_->TimelineInternal()->GetDocument(), animation_, |
1133 new_play_state); | 1139 old_play_state, new_play_state); |
1134 } | 1140 } |
1135 } | 1141 } |
1136 | 1142 |
1137 void Animation::AddedEventListener( | 1143 void Animation::AddedEventListener( |
1138 const AtomicString& event_type, | 1144 const AtomicString& event_type, |
1139 RegisteredEventListener& registered_listener) { | 1145 RegisteredEventListener& registered_listener) { |
1140 EventTargetWithInlineData::AddedEventListener(event_type, | 1146 EventTargetWithInlineData::AddedEventListener(event_type, |
1141 registered_listener); | 1147 registered_listener); |
1142 if (event_type == EventTypeNames::finish) | 1148 if (event_type == EventTypeNames::finish) |
1143 UseCounter::Count(GetExecutionContext(), WebFeature::kAnimationFinishEvent); | 1149 UseCounter::Count(GetExecutionContext(), WebFeature::kAnimationFinishEvent); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1234 DCHECK(!compositor_player_); | 1240 DCHECK(!compositor_player_); |
1235 } | 1241 } |
1236 | 1242 |
1237 void Animation::CompositorAnimationPlayerHolder::Detach() { | 1243 void Animation::CompositorAnimationPlayerHolder::Detach() { |
1238 DCHECK(compositor_player_); | 1244 DCHECK(compositor_player_); |
1239 compositor_player_->SetAnimationDelegate(nullptr); | 1245 compositor_player_->SetAnimationDelegate(nullptr); |
1240 animation_ = nullptr; | 1246 animation_ = nullptr; |
1241 compositor_player_.reset(); | 1247 compositor_player_.reset(); |
1242 } | 1248 } |
1243 } // namespace blink | 1249 } // namespace blink |
OLD | NEW |