| Index: Source/core/html/TimeRanges.cpp
|
| diff --git a/Source/core/html/TimeRanges.cpp b/Source/core/html/TimeRanges.cpp
|
| index 943eb93468f6899f8510f24fee18dce0a1abbc79..fe8910ce569206363e1d1f475a4cbb566db8db8b 100644
|
| --- a/Source/core/html/TimeRanges.cpp
|
| +++ b/Source/core/html/TimeRanges.cpp
|
| @@ -182,21 +182,33 @@ bool TimeRanges::contain(double time) const
|
| return false;
|
| }
|
|
|
| -double TimeRanges::nearest(double time) const
|
| +double TimeRanges::nearest(double newPlaybackPosition, double currentPlaybackPosition) const
|
| {
|
| - double closest = 0;
|
| unsigned count = length();
|
| + double bestMatch = 0;
|
| + double bestDelta = std::numeric_limits<double>::infinity();
|
| for (unsigned ndx = 0; ndx < count; ndx++) {
|
| double startTime = start(ndx, IGNORE_EXCEPTION);
|
| double endTime = end(ndx, IGNORE_EXCEPTION);
|
| - if (time >= startTime && time <= endTime)
|
| - return time;
|
| - if (fabs(startTime - time) < closest)
|
| - closest = fabs(startTime - time);
|
| - else if (fabs(endTime - time) < closest)
|
| - closest = fabs(endTime - time);
|
| + if (newPlaybackPosition >= startTime && newPlaybackPosition <= endTime)
|
| + return newPlaybackPosition;
|
| +
|
| + double delta, match;
|
| + if (newPlaybackPosition < startTime) {
|
| + delta = startTime - newPlaybackPosition;
|
| + match = startTime;
|
| + } else {
|
| + delta = newPlaybackPosition - endTime;
|
| + match = endTime;
|
| + }
|
| +
|
| + if (delta < bestDelta || (delta == bestDelta
|
| + && std::abs(currentPlaybackPosition - match) < std::abs(currentPlaybackPosition - bestMatch))) {
|
| + bestDelta = delta;
|
| + bestMatch = match;
|
| + }
|
| }
|
| - return closest;
|
| + return bestMatch;
|
| }
|
|
|
| void TimeRanges::trace(Visitor* visitor)
|
|
|