Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "core/html/shadow/MediaControls.h" | 5 #include "core/html/shadow/MediaControls.h" |
| 6 | 6 |
| 7 #include <limits> | 7 #include <limits> |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include "core/HTMLNames.h" | 9 #include "core/HTMLNames.h" |
| 10 #include "core/css/StylePropertySet.h" | 10 #include "core/css/StylePropertySet.h" |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 175 | 175 |
| 176 void simulateLoadedMetadata() { m_mediaControls->onLoadedMetadata(); } | 176 void simulateLoadedMetadata() { m_mediaControls->onLoadedMetadata(); } |
| 177 | 177 |
| 178 MediaControls& mediaControls() { return *m_mediaControls; } | 178 MediaControls& mediaControls() { return *m_mediaControls; } |
| 179 MockVideoWebMediaPlayer* webMediaPlayer() { | 179 MockVideoWebMediaPlayer* webMediaPlayer() { |
| 180 return static_cast<MockVideoWebMediaPlayer*>( | 180 return static_cast<MockVideoWebMediaPlayer*>( |
| 181 mediaControls().mediaElement().webMediaPlayer()); | 181 mediaControls().mediaElement().webMediaPlayer()); |
| 182 } | 182 } |
| 183 Document& document() { return m_pageHolder->document(); } | 183 Document& document() { return m_pageHolder->document(); } |
| 184 | 184 |
| 185 void loadMediaWithDuration(double duration) { | |
| 186 mediaControls().mediaElement().setSrc("https://example.com/foo.mp4"); | |
| 187 testing::runPendingTasks(); | |
| 188 | |
| 189 WebTimeRange timeRange(0.0, duration); | |
| 190 webMediaPlayer()->m_seekable.assign(&timeRange, 1); | |
| 191 mediaControls().mediaElement().durationChanged(duration, | |
| 192 false /* requestSeek */); | |
| 193 simulateLoadedMetadata(); | |
| 194 } | |
| 195 | |
| 185 private: | 196 private: |
| 186 std::unique_ptr<DummyPageHolder> m_pageHolder; | 197 std::unique_ptr<DummyPageHolder> m_pageHolder; |
| 187 Persistent<MediaControls> m_mediaControls; | 198 Persistent<MediaControls> m_mediaControls; |
| 188 }; | 199 }; |
| 189 | 200 |
| 190 TEST_F(MediaControlsTest, HideAndShow) { | 201 TEST_F(MediaControlsTest, HideAndShow) { |
| 191 mediaControls().mediaElement().setBooleanAttribute(HTMLNames::controlsAttr, | 202 mediaControls().mediaElement().setBooleanAttribute(HTMLNames::controlsAttr, |
| 192 true); | 203 true); |
| 193 | 204 |
| 194 Element* panel = getElementByShadowPseudoId(mediaControls(), | 205 Element* panel = getElementByShadowPseudoId(mediaControls(), |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 403 } | 414 } |
| 404 | 415 |
| 405 TEST_F(MediaControlsTest, TimelineSeekToRoundedEnd) { | 416 TEST_F(MediaControlsTest, TimelineSeekToRoundedEnd) { |
| 406 ensureLayout(); | 417 ensureLayout(); |
| 407 | 418 |
| 408 MediaControlTimelineElement* timeline = | 419 MediaControlTimelineElement* timeline = |
| 409 static_cast<MediaControlTimelineElement*>(getElementByShadowPseudoId( | 420 static_cast<MediaControlTimelineElement*>(getElementByShadowPseudoId( |
| 410 mediaControls(), "-webkit-media-controls-timeline")); | 421 mediaControls(), "-webkit-media-controls-timeline")); |
| 411 ASSERT_NE(nullptr, timeline); | 422 ASSERT_NE(nullptr, timeline); |
| 412 | 423 |
| 413 mediaControls().mediaElement().setSrc("https://example.com/foo.mp4"); | |
| 414 testing::runPendingTasks(); | |
| 415 | |
| 416 // Tests the case where the real length of the video, |exactDuration|, gets | 424 // Tests the case where the real length of the video, |exactDuration|, gets |
| 417 // rounded up slightly to |roundedUpDuration| when setting the timeline's | 425 // rounded up slightly to |roundedUpDuration| when setting the timeline's |
| 418 // |max| attribute (crbug.com/695065). | 426 // |max| attribute (crbug.com/695065). |
| 419 double exactDuration = 596.586667; | 427 double exactDuration = 596.586667; |
| 420 double roundedUpDuration = 596.587; | 428 double roundedUpDuration = 596.587; |
| 421 | 429 loadMediaWithDuration(exactDuration); |
| 422 WebTimeRange timeRange(0.0, exactDuration); | |
| 423 webMediaPlayer()->m_seekable.assign(&timeRange, 1); | |
| 424 mediaControls().mediaElement().durationChanged(exactDuration, | |
| 425 false /* requestSeek */); | |
| 426 simulateLoadedMetadata(); | |
| 427 | 430 |
| 428 // Simulate a click slightly past the end of the track of the timeline's | 431 // Simulate a click slightly past the end of the track of the timeline's |
| 429 // underlying <input type="range">. This would set the |value| to the |max| | 432 // underlying <input type="range">. This would set the |value| to the |max| |
| 430 // attribute, which can be slightly rounded relative to the duration. | 433 // attribute, which can be slightly rounded relative to the duration. |
| 431 timeline->setValueAsNumber(roundedUpDuration, ASSERT_NO_EXCEPTION); | 434 timeline->setValueAsNumber(roundedUpDuration, ASSERT_NO_EXCEPTION); |
| 432 ASSERT_EQ(roundedUpDuration, timeline->valueAsNumber()); | 435 ASSERT_EQ(roundedUpDuration, timeline->valueAsNumber()); |
| 433 EXPECT_EQ(0.0, mediaControls().mediaElement().currentTime()); | 436 EXPECT_EQ(0.0, mediaControls().mediaElement().currentTime()); |
| 434 timeline->dispatchInputEvent(); | 437 timeline->dispatchInputEvent(); |
| 435 EXPECT_EQ(exactDuration, mediaControls().mediaElement().currentTime()); | 438 EXPECT_EQ(exactDuration, mediaControls().mediaElement().currentTime()); |
| 436 } | 439 } |
| 437 | 440 |
| 441 TEST_F(MediaControlsTest, TimelineImmediatelyUpdatesCurrentTime) { | |
| 442 ensureLayout(); | |
| 443 | |
| 444 MediaControlTimelineElement* timeline = | |
| 445 static_cast<MediaControlTimelineElement*>(getElementByShadowPseudoId( | |
| 446 mediaControls(), "-webkit-media-controls-timeline")); | |
| 447 ASSERT_NE(nullptr, timeline); | |
| 448 MediaControlCurrentTimeDisplayElement* currentTimeDisplay = | |
| 449 static_cast<MediaControlCurrentTimeDisplayElement*>( | |
| 450 getElementByShadowPseudoId( | |
| 451 mediaControls(), "-webkit-media-controls-current-time-display")); | |
| 452 ASSERT_NE(nullptr, currentTimeDisplay); | |
| 453 | |
| 454 double duration = 600; | |
| 455 loadMediaWithDuration(duration); | |
| 456 | |
| 457 // Simulate seeking the underlying range to 50%. Current time display should | |
| 458 // update synchronously (crbug.com/695459). | |
|
mlamouri (slow - plz ping)
2017/03/02 10:37:19
No need to link to the bug, if someone needs to ha
johnme
2017/03/02 13:31:30
Done (though the bug provides useful clarification
| |
| 459 timeline->setValueAsNumber(duration / 2, ASSERT_NO_EXCEPTION); | |
| 460 timeline->dispatchInputEvent(); | |
| 461 EXPECT_EQ(duration / 2, currentTimeDisplay->currentValue()); | |
| 462 } | |
| 463 | |
| 438 } // namespace blink | 464 } // namespace blink |
| OLD | NEW |