Commit 98310e5b authored by Jordan Taylor's avatar Jordan Taylor Committed by Commit Bot

Moved InitialCurrentTime() to AnimationTimeline classes

This is part of an effort to remove any knowledge of
what kind of timeline has been supplied to Animation
and WorkletAnimation.

This change eliminates a call to IsScrollTimeline() in
WorkletAnimation.

Bug: 1012073
Change-Id: Ia8d41cb22bea377230bb3c10e1d5a4d9fc19d30c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1846247
Commit-Queue: Jordan Taylor <jortaylo@microsoft.com>
Reviewed-by: default avatarMajid Valipour <majidvp@chromium.org>
Cr-Commit-Position: refs/heads/master@{#708091}
parent ad26778e
......@@ -37,6 +37,15 @@ class CORE_EXPORT AnimationTimeline : public ScriptWrappable {
virtual bool IsDocumentTimeline() const { return false; }
virtual bool IsScrollTimeline() const { return false; }
virtual bool IsActive() const = 0;
// Returns the initial start time for animations that are linked to this
// timeline. This method gets invoked when initializing the start time of an
// animation on this timeline for the first time. It exists because the
// initial start time for scroll-linked and time-linked animations are
// different.
//
// Changing scroll-linked animation start_time initialization is under
// consideration here: https://github.com/w3c/csswg-drafts/issues/2075.
virtual base::Optional<base::TimeDelta> InitialStartTimeForAnimations() = 0;
virtual Document* GetDocument() = 0;
virtual void AnimationAttached(Animation*) = 0;
virtual void AnimationDetached(Animation*) = 0;
......
......@@ -114,6 +114,17 @@ bool DocumentTimeline::IsActive() const {
return document_->GetPage();
}
// Document-linked animations are initialized with start time of the document
// timeline current time.
base::Optional<base::TimeDelta>
DocumentTimeline::InitialStartTimeForAnimations() {
base::Optional<double> current_time_ms = CurrentTime();
if (current_time_ms.has_value()) {
return base::TimeDelta::FromMillisecondsD(current_time_ms.value());
}
return base::nullopt;
}
void DocumentTimeline::AnimationAttached(Animation* animation) {
DCHECK_EQ(&animation->GetDocument()->Timeline(), this);
DCHECK(!animations_.Contains(animation));
......
......@@ -94,6 +94,7 @@ class CORE_EXPORT DocumentTimeline : public AnimationTimeline {
void AnimationDetached(Animation*) override {}
bool IsActive() const override;
base::Optional<base::TimeDelta> InitialStartTimeForAnimations() override;
bool HasPendingUpdates() const {
return !animations_needing_update_.IsEmpty();
}
......
......@@ -136,6 +136,12 @@ bool ScrollTimeline::IsActive() const {
return layout_box && layout_box->HasOverflowClip();
}
// Scroll-linked animations are initialized with the start time of zero.
base::Optional<base::TimeDelta>
ScrollTimeline::InitialStartTimeForAnimations() {
return base::TimeDelta();
}
double ScrollTimeline::currentTime(bool& is_null) {
is_null = true;
......
......@@ -56,6 +56,7 @@ class CORE_EXPORT ScrollTimeline final : public AnimationTimeline {
// have a CSS layout box, or if its layout box is not a scroll container.
// https://github.com/WICG/scroll-animations/issues/31
bool IsActive() const override;
base::Optional<base::TimeDelta> InitialStartTimeForAnimations() override;
// IDL API implementation.
Element* scrollSource();
......
......@@ -161,12 +161,9 @@ base::Optional<base::TimeDelta> CalculateStartTime(
base::TimeDelta current_time,
double playback_rate,
AnimationTimeline& timeline) {
bool is_null;
double time_ms = timeline.currentTime(is_null);
DCHECK(!is_null);
auto timeline_time = base::TimeDelta::FromMillisecondsD(time_ms);
return timeline_time - (current_time / playback_rate);
base::Optional<double> timeline_current_time_ms = timeline.CurrentTime();
return base::TimeDelta::FromMillisecondsD(timeline_current_time_ms.value()) -
(current_time / playback_rate);
}
} // namespace
......@@ -711,8 +708,7 @@ bool WorkletAnimation::IsCurrentTimeInitialized() const {
// zero (i.e., scroll origin) and the current time corresponding to the current
// scroll position adjusted by the playback rate.
//
// Changing scroll-linked animation start_time initialization is under
// consideration here: https://github.com/w3c/csswg-drafts/issues/2075.
// More information at AnimationTimeline::InitialStartTimeForAnimations
//
// TODO(https://crbug.com/986925): The playback rate should be taken into
// consideration when calculating the initial current time.
......@@ -722,16 +718,17 @@ base::Optional<base::TimeDelta> WorkletAnimation::InitialCurrentTime() const {
!IsTimelineActive())
return base::nullopt;
if (timeline_->IsScrollTimeline()) {
bool is_null;
double timeline_time_ms = timeline_->currentTime(is_null);
if (is_null)
return base::nullopt;
base::Optional<base::TimeDelta> starting_time =
timeline_->InitialStartTimeForAnimations();
base::Optional<double> current_time = timeline_->CurrentTime();
return base::TimeDelta::FromMillisecondsD(timeline_time_ms) *
playback_rate_;
if (!starting_time || !current_time) {
return base::nullopt;
}
return base::TimeDelta();
return (base::TimeDelta::FromMillisecondsD(current_time.value()) -
starting_time.value()) *
playback_rate_;
}
void WorkletAnimation::UpdateCurrentTimeIfNeeded() {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment