Commit cbf4dacf authored by Kevin Ellis's avatar Kevin Ellis Committed by Commit Bot

Fix DCHECK in ComvertTimngForCompositor

When CovertTimingForCompositor was updated to use TimeDeltas instead of
doubles, a DCHECK(!infinity) was changed to a DCHECK that the scaled
time offset had an unsaturated value.  As large as the value is, it is
not infinite and legitimate values for animation arguments can trigger
a numeric overflow.  Instead, simply reject the animation on the
compositor.

Bug: 1054853
Change-Id: I941735b2ca098e111b39b2b99fbd32924b5d877b
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2080455Reviewed-by: default avatarMajid Valipour <majidvp@chromium.org>
Commit-Queue: Kevin Ellis <kevers@chromium.org>
Cr-Commit-Position: refs/heads/master@{#746012}
parent a2543e0a
......@@ -556,15 +556,20 @@ bool CompositorAnimations::ConvertTimingForCompositor(
timing.iteration_duration->is_zero())
return false;
out.adjusted_iteration_count =
std::isfinite(timing.iteration_count) ? timing.iteration_count : -1;
out.scaled_duration = timing.iteration_duration.value();
out.direction = timing.direction;
// Compositor's time offset is positive for seeking into the animation.
DCHECK(animation_playback_rate);
out.scaled_time_offset = -base::TimeDelta::FromSecondsD(
timing.start_delay / animation_playback_rate) +
time_offset;
// Start delay is effectively +/- infinity.
if (out.scaled_time_offset.is_max() || out.scaled_time_offset.is_min())
return false;
out.adjusted_iteration_count =
std::isfinite(timing.iteration_count) ? timing.iteration_count : -1;
out.scaled_duration = timing.iteration_duration.value();
out.direction = timing.direction;
out.playback_rate = animation_playback_rate;
out.fill_mode = timing.fill_mode == Timing::FillMode::AUTO
? Timing::FillMode::NONE
......@@ -572,7 +577,6 @@ bool CompositorAnimations::ConvertTimingForCompositor(
out.iteration_start = timing.iteration_start;
DCHECK_GT(out.scaled_duration, AnimationTimeDelta());
DCHECK(!out.scaled_time_offset.is_max() && !out.scaled_time_offset.is_min());
DCHECK(out.adjusted_iteration_count > 0 ||
out.adjusted_iteration_count == -1);
DCHECK(std::isfinite(out.playback_rate) && out.playback_rate);
......
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