Index: Source/core/layout/LayoutMediaControls.cpp |
diff --git a/Source/core/layout/LayoutMediaControls.cpp b/Source/core/layout/LayoutMediaControls.cpp |
index 4c1a2c4faa321772a3456c4801fb9f5e4ec918e5..f3c51a6c9502044bc9060ba05048fd4618bae1ce 100644 |
--- a/Source/core/layout/LayoutMediaControls.cpp |
+++ b/Source/core/layout/LayoutMediaControls.cpp |
@@ -207,24 +207,31 @@ static bool paintMediaSlider(LayoutObject* object, const PaintInfo& paintInfo, c |
// Draw the buffered range. Since the element may have multiple buffered ranges and it'd be |
// distracting/'busy' to show all of them, show only the buffered range containing the current play head. |
RefPtrWillBeRawPtr<TimeRanges> bufferedTimeRanges = mediaElement->buffered(); |
- float duration = mediaElement->duration(); |
- float currentTime = mediaElement->currentTime(); |
- if (std::isnan(duration) || std::isinf(duration) || !duration || std::isnan(currentTime)) |
+ double duration = mediaElement->duration(); |
+ double currentTime = mediaElement->currentTime(); |
+ if (std::isnan(duration) || std::isinf(duration) || !duration || std::isnan(currentTime) |
+ || bufferedTimeRanges->length() == 0) |
return true; |
- for (unsigned i = 0; i < bufferedTimeRanges->length(); ++i) { |
- float start = bufferedTimeRanges->start(i, ASSERT_NO_EXCEPTION); |
- float end = bufferedTimeRanges->end(i, ASSERT_NO_EXCEPTION); |
- if (std::isnan(start) || std::isnan(end) || start > currentTime || end < currentTime) |
philipj_slow
2015/03/06 03:16:17
Could we fix the whole problem by tweaking this to
landell
2015/03/06 13:49:06
I can look at such a solution. Don't know if the s
|
- continue; |
- int startPosition = int(start * rect.width() / duration); |
- int currentPosition = int(currentTime * rect.width() / duration); |
- int endPosition = int(end * rect.width() / duration); |
+ unsigned nearestIdx = bufferedTimeRanges->nearestRange(currentTime); |
philipj_slow
2015/03/06 03:16:17
So I was thinking that we could have a getter for
landell
2015/03/06 13:49:06
I agree. To me the problem is that the TimeRanges
|
+ double start = bufferedTimeRanges->start(nearestIdx, ASSERT_NO_EXCEPTION); |
+ double end = bufferedTimeRanges->end(nearestIdx, ASSERT_NO_EXCEPTION); |
+ if (std::isnan(start) || std::isnan(end)) { |
+ return true; |
+ } |
+ |
+ int startPosition = int(start * rect.width() / duration); |
+ int currentPosition = int(currentTime * rect.width() / duration); |
+ int endPosition = int(end * rect.width() / duration); |
- // Add half the thumb width proportionally adjusted to the current painting position. |
- int thumbCenter = mediaSliderThumbWidth / 2; |
- int addWidth = thumbCenter * (1.0 - 2.0 * currentPosition / rect.width()); |
- currentPosition += addWidth; |
+ // Add half the thumb width proportionally adjusted to the current painting position. |
+ int thumbCenter = mediaSliderThumbWidth / 2; |
+ int addWidth = thumbCenter * (1.0 - 2.0 * currentPosition / rect.width()); |
+ currentPosition += addWidth; |
+ |
+ // Only paint ranges that will intersect with the slider thumb |
philipj_slow
2015/03/06 03:16:17
I see no explicit delta, so I guess the resolution
landell
2015/03/06 13:49:06
My thinking was that it made sense to make the del
|
+ if (currentPosition <= endPosition + thumbCenter |
+ || currentPosition >= startPosition - thumbCenter) { |
// Draw white-ish highlight before current time. |
Color startColor = Color(195, 195, 195); |
@@ -238,8 +245,6 @@ static bool paintMediaSlider(LayoutObject* object, const PaintInfo& paintInfo, c |
if (endPosition > currentPosition) |
paintSliderRangeHighlight(rect, style, context, currentPosition, endPosition, startColor, endColor); |
- |
- return true; |
} |
return true; |