Commit a0fb4d02 authored by Nicolas Pena's avatar Nicolas Pena Committed by Commit Bot

More TimeTicks in DocumentTimeline

This CL changes the |origin_time_| and |zero_time_| of DocumentTimeline
to TimeTicks.

Change-Id: Idd51311085539cf5ed4c8a5b2e1b9bb21187be65
Reviewed-on: https://chromium-review.googlesource.com/1110956Reviewed-by: default avatarJeremy Roman <jbroman@chromium.org>
Commit-Queue: Nicolás Peña Moreno <npm@chromium.org>
Cr-Commit-Position: refs/heads/master@{#570095}
parent 0d90406f
...@@ -895,7 +895,8 @@ void Animation::StartAnimationOnCompositor( ...@@ -895,7 +895,8 @@ void Animation::StartAnimationOnCompositor(
base::Optional<double> start_time = base::nullopt; base::Optional<double> start_time = base::nullopt;
double time_offset = 0; double time_offset = 0;
if (start_time_) { if (start_time_) {
start_time = TimelineInternal()->ZeroTime() + start_time_.value(); start_time = TimeTicksInSeconds(TimelineInternal()->ZeroTime()) +
start_time_.value();
if (reversed) if (reversed)
start_time = start_time.value() - (EffectEnd() / fabs(playback_rate_)); start_time = start_time.value() - (EffectEnd() / fabs(playback_rate_));
} else { } else {
......
...@@ -43,6 +43,7 @@ ...@@ -43,6 +43,7 @@
#include "third_party/blink/renderer/core/page/page.h" #include "third_party/blink/renderer/core/page/page.h"
#include "third_party/blink/renderer/platform/animation/compositor_animation_timeline.h" #include "third_party/blink/renderer/platform/animation/compositor_animation_timeline.h"
#include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h" #include "third_party/blink/renderer/platform/instrumentation/tracing/trace_event.h"
#include "third_party/blink/renderer/platform/wtf/time.h"
namespace blink { namespace blink {
...@@ -59,24 +60,25 @@ bool CompareAnimations(const Member<Animation>& left, ...@@ -59,24 +60,25 @@ bool CompareAnimations(const Member<Animation>& left,
const double DocumentTimeline::kMinimumDelay = 0.04; const double DocumentTimeline::kMinimumDelay = 0.04;
DocumentTimeline* DocumentTimeline::Create(Document* document, DocumentTimeline* DocumentTimeline::Create(Document* document,
double origin_time_in_milliseconds, TimeDelta origin_time,
PlatformTiming* timing) { PlatformTiming* timing) {
return new DocumentTimeline(document, origin_time_in_milliseconds, timing); return new DocumentTimeline(document, origin_time, timing);
} }
DocumentTimeline* DocumentTimeline::Create( DocumentTimeline* DocumentTimeline::Create(
ExecutionContext* execution_context, ExecutionContext* execution_context,
const DocumentTimelineOptions& options) { const DocumentTimelineOptions& options) {
Document* document = ToDocument(execution_context); Document* document = ToDocument(execution_context);
return new DocumentTimeline(document, options.originTime(), nullptr); return new DocumentTimeline(
document, TimeDelta::FromMillisecondsD(options.originTime()), nullptr);
} }
DocumentTimeline::DocumentTimeline(Document* document, DocumentTimeline::DocumentTimeline(Document* document,
double origin_time_in_milliseconds, TimeDelta origin_time,
PlatformTiming* timing) PlatformTiming* timing)
: document_(document), : document_(document),
origin_time_(origin_time_in_milliseconds / 1000), origin_time_(origin_time),
zero_time_(origin_time_), zero_time_(TimeTicks() + origin_time_),
zero_time_initialized_(false), zero_time_initialized_(false),
outdated_animation_count_(0), outdated_animation_count_(0),
playback_rate_(1), playback_rate_(1),
...@@ -203,19 +205,17 @@ void DocumentTimeline::DocumentTimelineTiming::Trace(blink::Visitor* visitor) { ...@@ -203,19 +205,17 @@ void DocumentTimeline::DocumentTimelineTiming::Trace(blink::Visitor* visitor) {
DocumentTimeline::PlatformTiming::Trace(visitor); DocumentTimeline::PlatformTiming::Trace(visitor);
} }
double DocumentTimeline::ZeroTime() { TimeTicks DocumentTimeline::ZeroTime() {
if (!zero_time_initialized_ && document_ && document_->Loader()) { if (!zero_time_initialized_ && document_ && document_->Loader()) {
zero_time_ = zero_time_ = document_->Loader()->GetTiming().ReferenceMonotonicTime() +
TimeTicksInSeconds( origin_time_;
document_->Loader()->GetTiming().ReferenceMonotonicTime()) +
origin_time_;
zero_time_initialized_ = true; zero_time_initialized_ = true;
} }
return zero_time_; return zero_time_;
} }
void DocumentTimeline::ResetForTesting() { void DocumentTimeline::ResetForTesting() {
zero_time_ = origin_time_; zero_time_ = TimeTicks() + origin_time_;
zero_time_initialized_ = true; zero_time_initialized_ = true;
playback_rate_ = 1; playback_rate_ = 1;
last_current_time_internal_ = 0; last_current_time_internal_ = 0;
...@@ -225,17 +225,20 @@ double DocumentTimeline::currentTime(bool& is_null) { ...@@ -225,17 +225,20 @@ double DocumentTimeline::currentTime(bool& is_null) {
return CurrentTimeInternal(is_null) * 1000; return CurrentTimeInternal(is_null) * 1000;
} }
// TODO(npm): change the return type to base::Optional<TimeTicks>.
double DocumentTimeline::CurrentTimeInternal(bool& is_null) { double DocumentTimeline::CurrentTimeInternal(bool& is_null) {
if (!IsActive()) { if (!IsActive()) {
is_null = true; is_null = true;
return std::numeric_limits<double>::quiet_NaN(); return std::numeric_limits<double>::quiet_NaN();
} }
double result = double result = playback_rate_ == 0
playback_rate_ == 0 ? TimeTicksInSeconds(ZeroTime())
? ZeroTime() : (GetDocument()->GetAnimationClock().CurrentTime() -
: (GetDocument()->GetAnimationClock().CurrentTime() - ZeroTime()) * TimeTicksInSeconds(ZeroTime())) *
playback_rate_; playback_rate_;
is_null = std::isnan(result); is_null = std::isnan(result);
// This looks like it could never be NaN here.
DCHECK(!is_null);
return result; return result;
} }
...@@ -294,10 +297,10 @@ void DocumentTimeline::SetPlaybackRate(double playback_rate) { ...@@ -294,10 +297,10 @@ void DocumentTimeline::SetPlaybackRate(double playback_rate) {
return; return;
double current_time = CurrentTimeInternal(); double current_time = CurrentTimeInternal();
playback_rate_ = playback_rate; playback_rate_ = playback_rate;
zero_time_ = playback_rate == 0 zero_time_ = TimeTicksFromSeconds(
? current_time playback_rate == 0 ? current_time
: GetDocument()->GetAnimationClock().CurrentTime() - : GetDocument()->GetAnimationClock().CurrentTime() -
current_time / playback_rate; current_time / playback_rate);
zero_time_initialized_ = true; zero_time_initialized_ = true;
// Corresponding compositor animation may need to be restarted to pick up // Corresponding compositor animation may need to be restarted to pick up
......
...@@ -69,7 +69,7 @@ class CORE_EXPORT DocumentTimeline : public AnimationTimeline { ...@@ -69,7 +69,7 @@ class CORE_EXPORT DocumentTimeline : public AnimationTimeline {
}; };
static DocumentTimeline* Create(Document*, static DocumentTimeline* Create(Document*,
double origin_time_in_milliseconds = 0.0, TimeDelta origin_time = TimeDelta(),
PlatformTiming* = nullptr); PlatformTiming* = nullptr);
// Web Animations API IDL constructor // Web Animations API IDL constructor
...@@ -95,7 +95,7 @@ class CORE_EXPORT DocumentTimeline : public AnimationTimeline { ...@@ -95,7 +95,7 @@ class CORE_EXPORT DocumentTimeline : public AnimationTimeline {
size_t PendingAnimationsCount() const { size_t PendingAnimationsCount() const {
return animations_needing_update_.size(); return animations_needing_update_.size();
} }
double ZeroTime(); TimeTicks ZeroTime();
double currentTime(bool& is_null) override; double currentTime(bool& is_null) override;
double currentTime(); double currentTime();
double CurrentTimeInternal(bool& is_null); double CurrentTimeInternal(bool& is_null);
...@@ -125,13 +125,16 @@ class CORE_EXPORT DocumentTimeline : public AnimationTimeline { ...@@ -125,13 +125,16 @@ class CORE_EXPORT DocumentTimeline : public AnimationTimeline {
void Trace(blink::Visitor*) override; void Trace(blink::Visitor*) override;
private: private:
DocumentTimeline(Document*, DocumentTimeline(Document*, TimeDelta origin_time, PlatformTiming*);
double origin_time_in_milliseconds,
PlatformTiming*);
Member<Document> document_; Member<Document> document_;
double origin_time_; // Origin time for the timeline relative to the time origin of the document.
double zero_time_; // Provided when the timeline is constructed. See
// https://drafts.csswg.org/web-animations/#dom-documenttimelineoptions-origintime.
TimeDelta origin_time_;
// The origin time. This is computed by adding |origin_time_| to the time
// origin of the document.
TimeTicks zero_time_;
bool zero_time_initialized_; bool zero_time_initialized_;
unsigned outdated_animation_count_; unsigned outdated_animation_count_;
// Animations which will be updated on the next frame // Animations which will be updated on the next frame
......
...@@ -35,10 +35,9 @@ class AnimationEffectStackTest : public PageTestBase { ...@@ -35,10 +35,9 @@ class AnimationEffectStackTest : public PageTestBase {
return animation; return animation;
} }
void UpdateTimeline(double time) { void UpdateTimeline(TimeDelta time) {
GetDocument().GetAnimationClock().UpdateTime( GetDocument().GetAnimationClock().UpdateTime(
base::TimeTicks() + base::TimeDelta::FromSecondsD( GetDocument().Timeline().ZeroTime() + time);
GetDocument().Timeline().ZeroTime() + time));
timeline->ServiceAnimations(kTimingUpdateForAnimationFrame); timeline->ServiceAnimations(kTimingUpdateForAnimationFrame);
} }
...@@ -175,7 +174,7 @@ TEST_F(AnimationEffectStackTest, ForwardsFillDiscarding) { ...@@ -175,7 +174,7 @@ TEST_F(AnimationEffectStackTest, ForwardsFillDiscarding) {
base::Optional<CompositorElementIdSet>()); base::Optional<CompositorElementIdSet>());
ActiveInterpolationsMap interpolations; ActiveInterpolationsMap interpolations;
UpdateTimeline(11); UpdateTimeline(TimeDelta::FromSeconds(11));
ThreadState::Current()->CollectAllGarbage(); ThreadState::Current()->CollectAllGarbage();
interpolations = EffectStack::ActiveInterpolations( interpolations = EffectStack::ActiveInterpolations(
&element->GetElementAnimations()->GetEffectStack(), nullptr, nullptr, &element->GetElementAnimations()->GetEffectStack(), nullptr, nullptr,
...@@ -184,7 +183,7 @@ TEST_F(AnimationEffectStackTest, ForwardsFillDiscarding) { ...@@ -184,7 +183,7 @@ TEST_F(AnimationEffectStackTest, ForwardsFillDiscarding) {
EXPECT_EQ(GetFontSizeValue(interpolations), 3); EXPECT_EQ(GetFontSizeValue(interpolations), 3);
EXPECT_EQ(3u, SampledEffectCount()); EXPECT_EQ(3u, SampledEffectCount());
UpdateTimeline(13); UpdateTimeline(TimeDelta::FromSeconds(13));
ThreadState::Current()->CollectAllGarbage(); ThreadState::Current()->CollectAllGarbage();
interpolations = EffectStack::ActiveInterpolations( interpolations = EffectStack::ActiveInterpolations(
&element->GetElementAnimations()->GetEffectStack(), nullptr, nullptr, &element->GetElementAnimations()->GetEffectStack(), nullptr, nullptr,
...@@ -193,7 +192,7 @@ TEST_F(AnimationEffectStackTest, ForwardsFillDiscarding) { ...@@ -193,7 +192,7 @@ TEST_F(AnimationEffectStackTest, ForwardsFillDiscarding) {
EXPECT_EQ(GetFontSizeValue(interpolations), 3); EXPECT_EQ(GetFontSizeValue(interpolations), 3);
EXPECT_EQ(3u, SampledEffectCount()); EXPECT_EQ(3u, SampledEffectCount());
UpdateTimeline(15); UpdateTimeline(TimeDelta::FromSeconds(15));
ThreadState::Current()->CollectAllGarbage(); ThreadState::Current()->CollectAllGarbage();
interpolations = EffectStack::ActiveInterpolations( interpolations = EffectStack::ActiveInterpolations(
&element->GetElementAnimations()->GetEffectStack(), nullptr, nullptr, &element->GetElementAnimations()->GetEffectStack(), nullptr, nullptr,
...@@ -202,7 +201,7 @@ TEST_F(AnimationEffectStackTest, ForwardsFillDiscarding) { ...@@ -202,7 +201,7 @@ TEST_F(AnimationEffectStackTest, ForwardsFillDiscarding) {
EXPECT_EQ(GetFontSizeValue(interpolations), 3); EXPECT_EQ(GetFontSizeValue(interpolations), 3);
EXPECT_EQ(2u, SampledEffectCount()); EXPECT_EQ(2u, SampledEffectCount());
UpdateTimeline(17); UpdateTimeline(TimeDelta::FromSeconds(17));
ThreadState::Current()->CollectAllGarbage(); ThreadState::Current()->CollectAllGarbage();
interpolations = EffectStack::ActiveInterpolations( interpolations = EffectStack::ActiveInterpolations(
&element->GetElementAnimations()->GetEffectStack(), nullptr, nullptr, &element->GetElementAnimations()->GetEffectStack(), nullptr, nullptr,
......
...@@ -162,7 +162,7 @@ void PendingAnimations::NotifyCompositorAnimationStarted( ...@@ -162,7 +162,7 @@ void PendingAnimations::NotifyCompositorAnimationStarted(
} }
animation->NotifyCompositorStartTime( animation->NotifyCompositorStartTime(
monotonic_animation_start_time - monotonic_animation_start_time -
animation->TimelineInternal()->ZeroTime()); TimeTicksInSeconds(animation->TimelineInternal()->ZeroTime()));
} }
} }
......
...@@ -554,8 +554,9 @@ double InspectorAnimationAgent::NormalizedStartTime( ...@@ -554,8 +554,9 @@ double InspectorAnimationAgent::NormalizedStartTime(
} }
return animation.startTime().value_or(NullValue()) + return animation.startTime().value_or(NullValue()) +
(animation.TimelineInternal()->ZeroTime() - (animation.TimelineInternal()->ZeroTime() -
ReferenceTimeline().ZeroTime()) * ReferenceTimeline().ZeroTime())
1000 * ReferenceTimeline().PlaybackRate(); .InMillisecondsF() *
ReferenceTimeline().PlaybackRate();
} }
void InspectorAnimationAgent::Trace(blink::Visitor* visitor) { void InspectorAnimationAgent::Trace(blink::Visitor* visitor) {
......
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