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(
base::Optional<double> start_time = base::nullopt;
double time_offset = 0;
if (start_time_) {
start_time = TimelineInternal()->ZeroTime() + start_time_.value();
start_time = TimeTicksInSeconds(TimelineInternal()->ZeroTime()) +
start_time_.value();
if (reversed)
start_time = start_time.value() - (EffectEnd() / fabs(playback_rate_));
} else {
......
......@@ -43,6 +43,7 @@
#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/instrumentation/tracing/trace_event.h"
#include "third_party/blink/renderer/platform/wtf/time.h"
namespace blink {
......@@ -59,24 +60,25 @@ bool CompareAnimations(const Member<Animation>& left,
const double DocumentTimeline::kMinimumDelay = 0.04;
DocumentTimeline* DocumentTimeline::Create(Document* document,
double origin_time_in_milliseconds,
TimeDelta origin_time,
PlatformTiming* timing) {
return new DocumentTimeline(document, origin_time_in_milliseconds, timing);
return new DocumentTimeline(document, origin_time, timing);
}
DocumentTimeline* DocumentTimeline::Create(
ExecutionContext* execution_context,
const DocumentTimelineOptions& options) {
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,
double origin_time_in_milliseconds,
TimeDelta origin_time,
PlatformTiming* timing)
: document_(document),
origin_time_(origin_time_in_milliseconds / 1000),
zero_time_(origin_time_),
origin_time_(origin_time),
zero_time_(TimeTicks() + origin_time_),
zero_time_initialized_(false),
outdated_animation_count_(0),
playback_rate_(1),
......@@ -203,19 +205,17 @@ void DocumentTimeline::DocumentTimelineTiming::Trace(blink::Visitor* visitor) {
DocumentTimeline::PlatformTiming::Trace(visitor);
}
double DocumentTimeline::ZeroTime() {
TimeTicks DocumentTimeline::ZeroTime() {
if (!zero_time_initialized_ && document_ && document_->Loader()) {
zero_time_ =
TimeTicksInSeconds(
document_->Loader()->GetTiming().ReferenceMonotonicTime()) +
origin_time_;
zero_time_ = document_->Loader()->GetTiming().ReferenceMonotonicTime() +
origin_time_;
zero_time_initialized_ = true;
}
return zero_time_;
}
void DocumentTimeline::ResetForTesting() {
zero_time_ = origin_time_;
zero_time_ = TimeTicks() + origin_time_;
zero_time_initialized_ = true;
playback_rate_ = 1;
last_current_time_internal_ = 0;
......@@ -225,17 +225,20 @@ double DocumentTimeline::currentTime(bool& is_null) {
return CurrentTimeInternal(is_null) * 1000;
}
// TODO(npm): change the return type to base::Optional<TimeTicks>.
double DocumentTimeline::CurrentTimeInternal(bool& is_null) {
if (!IsActive()) {
is_null = true;
return std::numeric_limits<double>::quiet_NaN();
}
double result =
playback_rate_ == 0
? ZeroTime()
: (GetDocument()->GetAnimationClock().CurrentTime() - ZeroTime()) *
playback_rate_;
double result = playback_rate_ == 0
? TimeTicksInSeconds(ZeroTime())
: (GetDocument()->GetAnimationClock().CurrentTime() -
TimeTicksInSeconds(ZeroTime())) *
playback_rate_;
is_null = std::isnan(result);
// This looks like it could never be NaN here.
DCHECK(!is_null);
return result;
}
......@@ -294,10 +297,10 @@ void DocumentTimeline::SetPlaybackRate(double playback_rate) {
return;
double current_time = CurrentTimeInternal();
playback_rate_ = playback_rate;
zero_time_ = playback_rate == 0
? current_time
: GetDocument()->GetAnimationClock().CurrentTime() -
current_time / playback_rate;
zero_time_ = TimeTicksFromSeconds(
playback_rate == 0 ? current_time
: GetDocument()->GetAnimationClock().CurrentTime() -
current_time / playback_rate);
zero_time_initialized_ = true;
// Corresponding compositor animation may need to be restarted to pick up
......
......@@ -69,7 +69,7 @@ class CORE_EXPORT DocumentTimeline : public AnimationTimeline {
};
static DocumentTimeline* Create(Document*,
double origin_time_in_milliseconds = 0.0,
TimeDelta origin_time = TimeDelta(),
PlatformTiming* = nullptr);
// Web Animations API IDL constructor
......@@ -95,7 +95,7 @@ class CORE_EXPORT DocumentTimeline : public AnimationTimeline {
size_t PendingAnimationsCount() const {
return animations_needing_update_.size();
}
double ZeroTime();
TimeTicks ZeroTime();
double currentTime(bool& is_null) override;
double currentTime();
double CurrentTimeInternal(bool& is_null);
......@@ -125,13 +125,16 @@ class CORE_EXPORT DocumentTimeline : public AnimationTimeline {
void Trace(blink::Visitor*) override;
private:
DocumentTimeline(Document*,
double origin_time_in_milliseconds,
PlatformTiming*);
DocumentTimeline(Document*, TimeDelta origin_time, PlatformTiming*);
Member<Document> document_;
double origin_time_;
double zero_time_;
// Origin time for the timeline relative to the time origin of the document.
// 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_;
unsigned outdated_animation_count_;
// Animations which will be updated on the next frame
......
......@@ -64,7 +64,8 @@ class AnimationDocumentTimelineTest : public PageTestBase {
GetAnimationClock().ResetTimeForTesting();
element = Element::Create(QualifiedName::Null(), document.Get());
platform_timing = new MockPlatformTiming;
timeline = DocumentTimeline::Create(document.Get(), 0.0, platform_timing);
timeline =
DocumentTimeline::Create(document.Get(), TimeDelta(), platform_timing);
timeline->ResetForTesting();
ASSERT_EQ(0, timeline->CurrentTimeInternal());
}
......@@ -150,7 +151,7 @@ TEST_F(AnimationDocumentTimelineTest, ZeroTime) {
}
TEST_F(AnimationDocumentTimelineTest, PlaybackRateNormal) {
double zero_time = timeline->ZeroTime();
TimeTicks zero_time = timeline->ZeroTime();
bool is_null;
timeline->SetPlaybackRate(1.0);
......@@ -171,29 +172,29 @@ TEST_F(AnimationDocumentTimelineTest, PlaybackRateNormal) {
}
TEST_F(AnimationDocumentTimelineTest, PlaybackRateNormalWithOriginTime) {
double origin_time_in_ms = -1000000.0;
timeline = DocumentTimeline::Create(document.Get(), origin_time_in_ms,
platform_timing);
TimeDelta origin_time = TimeDelta::FromSeconds(-1000);
timeline =
DocumentTimeline::Create(document.Get(), origin_time, platform_timing);
timeline->ResetForTesting();
bool is_null;
EXPECT_EQ(1.0, timeline->PlaybackRate());
EXPECT_EQ(-1000, timeline->ZeroTime());
EXPECT_EQ(TimeTicks() + origin_time, timeline->ZeroTime());
EXPECT_EQ(1000, timeline->CurrentTimeInternal());
EXPECT_EQ(1000, timeline->CurrentTimeInternal(is_null));
EXPECT_FALSE(is_null);
GetAnimationClock().UpdateTime(base::TimeTicks() +
base::TimeDelta::FromSecondsD(100));
EXPECT_EQ(-1000, timeline->ZeroTime());
EXPECT_EQ(TimeTicks() + origin_time, timeline->ZeroTime());
EXPECT_EQ(1100, timeline->CurrentTimeInternal());
EXPECT_EQ(1100, timeline->CurrentTimeInternal(is_null));
EXPECT_FALSE(is_null);
GetAnimationClock().UpdateTime(base::TimeTicks() +
base::TimeDelta::FromSecondsD(200));
EXPECT_EQ(-1000, timeline->ZeroTime());
EXPECT_EQ(TimeTicks() + origin_time, timeline->ZeroTime());
EXPECT_EQ(1200, timeline->CurrentTimeInternal());
EXPECT_EQ(1200, timeline->CurrentTimeInternal(is_null));
EXPECT_FALSE(is_null);
......@@ -204,7 +205,7 @@ TEST_F(AnimationDocumentTimelineTest, PlaybackRatePause) {
GetAnimationClock().UpdateTime(base::TimeTicks() +
base::TimeDelta::FromSecondsD(100));
EXPECT_EQ(0, timeline->ZeroTime());
EXPECT_EQ(TimeTicks(), timeline->ZeroTime());
EXPECT_EQ(100, timeline->CurrentTimeInternal());
EXPECT_EQ(100, timeline->CurrentTimeInternal(is_null));
EXPECT_FALSE(is_null);
......@@ -213,7 +214,7 @@ TEST_F(AnimationDocumentTimelineTest, PlaybackRatePause) {
EXPECT_EQ(0.0, timeline->PlaybackRate());
GetAnimationClock().UpdateTime(base::TimeTicks() +
base::TimeDelta::FromSecondsD(200));
EXPECT_EQ(100, timeline->ZeroTime());
EXPECT_EQ(TimeTicksFromSeconds(100), timeline->ZeroTime());
EXPECT_EQ(100, timeline->CurrentTimeInternal());
EXPECT_EQ(100, timeline->CurrentTimeInternal(is_null));
......@@ -221,7 +222,7 @@ TEST_F(AnimationDocumentTimelineTest, PlaybackRatePause) {
EXPECT_EQ(1.0, timeline->PlaybackRate());
GetAnimationClock().UpdateTime(base::TimeTicks() +
base::TimeDelta::FromSecondsD(400));
EXPECT_EQ(100, timeline->ZeroTime());
EXPECT_EQ(TimeTicksFromSeconds(100), timeline->ZeroTime());
EXPECT_EQ(300, timeline->CurrentTimeInternal());
EXPECT_EQ(300, timeline->CurrentTimeInternal(is_null));
......@@ -231,19 +232,19 @@ TEST_F(AnimationDocumentTimelineTest, PlaybackRatePause) {
TEST_F(AnimationDocumentTimelineTest, PlaybackRatePauseWithOriginTime) {
bool is_null;
double origin_time_in_ms = -1000000.0;
timeline = DocumentTimeline::Create(document.Get(), origin_time_in_ms,
platform_timing);
TimeDelta origin_time = TimeDelta::FromSeconds(-1000);
timeline =
DocumentTimeline::Create(document.Get(), origin_time, platform_timing);
timeline->ResetForTesting();
EXPECT_EQ(-1000, timeline->ZeroTime());
EXPECT_EQ(TimeTicks() + origin_time, timeline->ZeroTime());
EXPECT_EQ(1000, timeline->CurrentTimeInternal());
EXPECT_EQ(1000, timeline->CurrentTimeInternal(is_null));
EXPECT_FALSE(is_null);
GetAnimationClock().UpdateTime(base::TimeTicks() +
base::TimeDelta::FromSecondsD(100));
EXPECT_EQ(-1000, timeline->ZeroTime());
EXPECT_EQ(TimeTicks() + origin_time, timeline->ZeroTime());
EXPECT_EQ(1100, timeline->CurrentTimeInternal());
EXPECT_EQ(1100, timeline->CurrentTimeInternal(is_null));
EXPECT_FALSE(is_null);
......@@ -252,19 +253,19 @@ TEST_F(AnimationDocumentTimelineTest, PlaybackRatePauseWithOriginTime) {
EXPECT_EQ(0.0, timeline->PlaybackRate());
GetAnimationClock().UpdateTime(base::TimeTicks() +
base::TimeDelta::FromSecondsD(200));
EXPECT_EQ(1100, timeline->ZeroTime());
EXPECT_EQ(TimeTicksFromSeconds(1100), timeline->ZeroTime());
EXPECT_EQ(1100, timeline->CurrentTimeInternal());
EXPECT_EQ(1100, timeline->CurrentTimeInternal(is_null));
timeline->SetPlaybackRate(1.0);
EXPECT_EQ(1.0, timeline->PlaybackRate());
EXPECT_EQ(-900, timeline->ZeroTime());
EXPECT_EQ(TimeTicksFromSeconds(-900), timeline->ZeroTime());
EXPECT_EQ(1100, timeline->CurrentTimeInternal());
EXPECT_EQ(1100, timeline->CurrentTimeInternal(is_null));
GetAnimationClock().UpdateTime(base::TimeTicks() +
base::TimeDelta::FromSecondsD(400));
EXPECT_EQ(-900, timeline->ZeroTime());
EXPECT_EQ(TimeTicksFromSeconds(-900), timeline->ZeroTime());
EXPECT_EQ(1300, timeline->CurrentTimeInternal());
EXPECT_EQ(1300, timeline->CurrentTimeInternal(is_null));
......@@ -276,7 +277,7 @@ TEST_F(AnimationDocumentTimelineTest, PlaybackRateSlow) {
GetAnimationClock().UpdateTime(base::TimeTicks() +
base::TimeDelta::FromSecondsD(100));
EXPECT_EQ(0, timeline->ZeroTime());
EXPECT_EQ(TimeTicks(), timeline->ZeroTime());
EXPECT_EQ(100, timeline->CurrentTimeInternal());
EXPECT_EQ(100, timeline->CurrentTimeInternal(is_null));
EXPECT_FALSE(is_null);
......@@ -285,7 +286,7 @@ TEST_F(AnimationDocumentTimelineTest, PlaybackRateSlow) {
EXPECT_EQ(0.5, timeline->PlaybackRate());
GetAnimationClock().UpdateTime(base::TimeTicks() +
base::TimeDelta::FromSecondsD(300));
EXPECT_EQ(-100, timeline->ZeroTime());
EXPECT_EQ(TimeTicksFromSeconds(-100), timeline->ZeroTime());
EXPECT_EQ(200, timeline->CurrentTimeInternal());
EXPECT_EQ(200, timeline->CurrentTimeInternal(is_null));
......@@ -293,7 +294,7 @@ TEST_F(AnimationDocumentTimelineTest, PlaybackRateSlow) {
EXPECT_EQ(1.0, timeline->PlaybackRate());
GetAnimationClock().UpdateTime(base::TimeTicks() +
base::TimeDelta::FromSecondsD(400));
EXPECT_EQ(100, timeline->ZeroTime());
EXPECT_EQ(TimeTicksFromSeconds(100), timeline->ZeroTime());
EXPECT_EQ(300, timeline->CurrentTimeInternal());
EXPECT_EQ(300, timeline->CurrentTimeInternal(is_null));
......@@ -305,7 +306,7 @@ TEST_F(AnimationDocumentTimelineTest, PlaybackRateFast) {
GetAnimationClock().UpdateTime(base::TimeTicks() +
base::TimeDelta::FromSecondsD(100));
EXPECT_EQ(0, timeline->ZeroTime());
EXPECT_EQ(TimeTicks(), timeline->ZeroTime());
EXPECT_EQ(100, timeline->CurrentTimeInternal());
EXPECT_EQ(100, timeline->CurrentTimeInternal(is_null));
EXPECT_FALSE(is_null);
......@@ -314,7 +315,7 @@ TEST_F(AnimationDocumentTimelineTest, PlaybackRateFast) {
EXPECT_EQ(2.0, timeline->PlaybackRate());
GetAnimationClock().UpdateTime(base::TimeTicks() +
base::TimeDelta::FromSecondsD(300));
EXPECT_EQ(50, timeline->ZeroTime());
EXPECT_EQ(TimeTicksFromSeconds(50), timeline->ZeroTime());
EXPECT_EQ(500, timeline->CurrentTimeInternal());
EXPECT_EQ(500, timeline->CurrentTimeInternal(is_null));
......@@ -322,7 +323,7 @@ TEST_F(AnimationDocumentTimelineTest, PlaybackRateFast) {
EXPECT_EQ(1.0, timeline->PlaybackRate());
GetAnimationClock().UpdateTime(base::TimeTicks() +
base::TimeDelta::FromSecondsD(400));
EXPECT_EQ(-200, timeline->ZeroTime());
EXPECT_EQ(TimeTicksFromSeconds(-200), timeline->ZeroTime());
EXPECT_EQ(600, timeline->CurrentTimeInternal());
EXPECT_EQ(600, timeline->CurrentTimeInternal(is_null));
......@@ -332,39 +333,38 @@ TEST_F(AnimationDocumentTimelineTest, PlaybackRateFast) {
TEST_F(AnimationDocumentTimelineTest, PlaybackRateFastWithOriginTime) {
bool is_null;
double origin_time_in_ms = -1000000.0;
timeline = DocumentTimeline::Create(document.Get(), origin_time_in_ms,
platform_timing);
timeline = DocumentTimeline::Create(
document.Get(), TimeDelta::FromSeconds(-1000), platform_timing);
timeline->ResetForTesting();
GetAnimationClock().UpdateTime(base::TimeTicks() +
base::TimeDelta::FromSecondsD(100));
EXPECT_EQ(-1000, timeline->ZeroTime());
EXPECT_EQ(TimeTicksFromSeconds(-1000), timeline->ZeroTime());
EXPECT_EQ(1100, timeline->CurrentTimeInternal());
EXPECT_EQ(1100, timeline->CurrentTimeInternal(is_null));
EXPECT_FALSE(is_null);
timeline->SetPlaybackRate(2.0);
EXPECT_EQ(2.0, timeline->PlaybackRate());
EXPECT_EQ(-450, timeline->ZeroTime());
EXPECT_EQ(TimeTicksFromSeconds(-450), timeline->ZeroTime());
EXPECT_EQ(1100, timeline->CurrentTimeInternal());
EXPECT_EQ(1100, timeline->CurrentTimeInternal(is_null));
GetAnimationClock().UpdateTime(base::TimeTicks() +
base::TimeDelta::FromSecondsD(300));
EXPECT_EQ(-450, timeline->ZeroTime());
EXPECT_EQ(TimeTicksFromSeconds(-450), timeline->ZeroTime());
EXPECT_EQ(1500, timeline->CurrentTimeInternal());
EXPECT_EQ(1500, timeline->CurrentTimeInternal(is_null));
timeline->SetPlaybackRate(1.0);
EXPECT_EQ(1.0, timeline->PlaybackRate());
EXPECT_EQ(-1200, timeline->ZeroTime());
EXPECT_EQ(TimeTicksFromSeconds(-1200), timeline->ZeroTime());
EXPECT_EQ(1500, timeline->CurrentTimeInternal());
EXPECT_EQ(1500, timeline->CurrentTimeInternal(is_null));
GetAnimationClock().UpdateTime(base::TimeTicks() +
base::TimeDelta::FromSecondsD(400));
EXPECT_EQ(-1200, timeline->ZeroTime());
EXPECT_EQ(TimeTicksFromSeconds(-1200), timeline->ZeroTime());
EXPECT_EQ(1600, timeline->CurrentTimeInternal());
EXPECT_EQ(1600, timeline->CurrentTimeInternal(is_null));
......
......@@ -35,10 +35,9 @@ class AnimationEffectStackTest : public PageTestBase {
return animation;
}
void UpdateTimeline(double time) {
void UpdateTimeline(TimeDelta time) {
GetDocument().GetAnimationClock().UpdateTime(
base::TimeTicks() + base::TimeDelta::FromSecondsD(
GetDocument().Timeline().ZeroTime() + time));
GetDocument().Timeline().ZeroTime() + time);
timeline->ServiceAnimations(kTimingUpdateForAnimationFrame);
}
......@@ -175,7 +174,7 @@ TEST_F(AnimationEffectStackTest, ForwardsFillDiscarding) {
base::Optional<CompositorElementIdSet>());
ActiveInterpolationsMap interpolations;
UpdateTimeline(11);
UpdateTimeline(TimeDelta::FromSeconds(11));
ThreadState::Current()->CollectAllGarbage();
interpolations = EffectStack::ActiveInterpolations(
&element->GetElementAnimations()->GetEffectStack(), nullptr, nullptr,
......@@ -184,7 +183,7 @@ TEST_F(AnimationEffectStackTest, ForwardsFillDiscarding) {
EXPECT_EQ(GetFontSizeValue(interpolations), 3);
EXPECT_EQ(3u, SampledEffectCount());
UpdateTimeline(13);
UpdateTimeline(TimeDelta::FromSeconds(13));
ThreadState::Current()->CollectAllGarbage();
interpolations = EffectStack::ActiveInterpolations(
&element->GetElementAnimations()->GetEffectStack(), nullptr, nullptr,
......@@ -193,7 +192,7 @@ TEST_F(AnimationEffectStackTest, ForwardsFillDiscarding) {
EXPECT_EQ(GetFontSizeValue(interpolations), 3);
EXPECT_EQ(3u, SampledEffectCount());
UpdateTimeline(15);
UpdateTimeline(TimeDelta::FromSeconds(15));
ThreadState::Current()->CollectAllGarbage();
interpolations = EffectStack::ActiveInterpolations(
&element->GetElementAnimations()->GetEffectStack(), nullptr, nullptr,
......@@ -202,7 +201,7 @@ TEST_F(AnimationEffectStackTest, ForwardsFillDiscarding) {
EXPECT_EQ(GetFontSizeValue(interpolations), 3);
EXPECT_EQ(2u, SampledEffectCount());
UpdateTimeline(17);
UpdateTimeline(TimeDelta::FromSeconds(17));
ThreadState::Current()->CollectAllGarbage();
interpolations = EffectStack::ActiveInterpolations(
&element->GetElementAnimations()->GetEffectStack(), nullptr, nullptr,
......
......@@ -162,7 +162,7 @@ void PendingAnimations::NotifyCompositorAnimationStarted(
}
animation->NotifyCompositorStartTime(
monotonic_animation_start_time -
animation->TimelineInternal()->ZeroTime());
TimeTicksInSeconds(animation->TimelineInternal()->ZeroTime()));
}
}
......
......@@ -554,8 +554,9 @@ double InspectorAnimationAgent::NormalizedStartTime(
}
return animation.startTime().value_or(NullValue()) +
(animation.TimelineInternal()->ZeroTime() -
ReferenceTimeline().ZeroTime()) *
1000 * ReferenceTimeline().PlaybackRate();
ReferenceTimeline().ZeroTime())
.InMillisecondsF() *
ReferenceTimeline().PlaybackRate();
}
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