Index: third_party/WebKit/Source/core/html/shadow/MediaControlsTest.cpp |
diff --git a/third_party/WebKit/Source/core/html/shadow/MediaControlsTest.cpp b/third_party/WebKit/Source/core/html/shadow/MediaControlsTest.cpp |
index 7cb310babe3828aff34c2bfdb9cf8f29c2e66f49..2de2a55e3e60428d4c006adb85b9bc162266cad4 100644 |
--- a/third_party/WebKit/Source/core/html/shadow/MediaControlsTest.cpp |
+++ b/third_party/WebKit/Source/core/html/shadow/MediaControlsTest.cpp |
@@ -11,8 +11,12 @@ |
#include "core/dom/StyleEngine.h" |
#include "core/frame/Settings.h" |
#include "core/html/HTMLVideoElement.h" |
+#include "core/loader/EmptyClients.h" |
#include "core/testing/DummyPageHolder.h" |
#include "platform/heap/Handle.h" |
+#include "platform/testing/UnitTestHelpers.h" |
+#include "public/platform/WebMediaPlayer.h" |
+#include "public/platform/WebSize.h" |
#include "testing/gtest/include/gtest/gtest.h" |
#include <memory> |
@@ -20,6 +24,55 @@ namespace blink { |
namespace { |
+class MockVideoWebMediaPlayer : public WebMediaPlayer { |
+ public: |
+ void load(LoadType, const WebMediaPlayerSource&, CORSMode) override{}; |
+ void play() override{}; |
+ void pause() override{}; |
+ bool supportsSave() const override { return false; }; |
+ void seek(double seconds) override{}; |
+ void setRate(double) override{}; |
+ void setVolume(double) override{}; |
+ WebTimeRanges buffered() const override { return WebTimeRanges(); }; |
+ WebTimeRanges seekable() const override { return WebTimeRanges(); }; |
+ void setSinkId(const WebString& sinkId, |
+ const WebSecurityOrigin&, |
+ WebSetSinkIdCallbacks*) override{}; |
+ bool hasVideo() const override { return true; }; |
+ bool hasAudio() const override { return false; }; |
+ WebSize naturalSize() const override { return WebSize(0, 0); }; |
+ bool paused() const override { return false; }; |
+ bool seeking() const override { return false; }; |
+ double duration() const override { return 0.0; }; |
+ double currentTime() const override { return 0.0; }; |
+ NetworkState getNetworkState() const override { return NetworkStateEmpty; }; |
+ ReadyState getReadyState() const override { return ReadyStateHaveNothing; }; |
+ WebString getErrorMessage() override { return WebString(); }; |
+ bool didLoadingProgress() override { return false; }; |
+ bool hasSingleSecurityOrigin() const override { return true; }; |
+ bool didPassCORSAccessCheck() const override { return true; }; |
+ double mediaTimeForTimeValue(double timeValue) const override { |
+ return timeValue; |
+ }; |
+ unsigned decodedFrameCount() const override { return 0; }; |
+ unsigned droppedFrameCount() const override { return 0; }; |
+ size_t audioDecodedByteCount() const override { return 0; }; |
+ size_t videoDecodedByteCount() const override { return 0; }; |
+ void paint(WebCanvas*, const WebRect&, SkPaint&) override{}; |
+}; |
+ |
+class StubFrameLoaderClient : public EmptyFrameLoaderClient { |
+ public: |
+ static StubFrameLoaderClient* create() { return new StubFrameLoaderClient; } |
+ |
+ std::unique_ptr<WebMediaPlayer> createWebMediaPlayer( |
+ HTMLMediaElement&, |
+ const WebMediaPlayerSource&, |
+ WebMediaPlayerClient*) override { |
+ return wrapUnique(new MockVideoWebMediaPlayer); |
+ } |
+}; |
+ |
Element* getElementByShadowPseudoId(Node& rootNode, |
const char* shadowPseudoId) { |
for (Element& element : ElementTraversal::descendantsOf(rootNode)) { |
@@ -39,8 +92,9 @@ bool isElementVisible(Element& element) { |
return false; |
if (inlineStyle->hasProperty(CSSPropertyOpacity) && |
- inlineStyle->getPropertyValue(CSSPropertyOpacity).toDouble() == 0.0) |
+ inlineStyle->getPropertyValue(CSSPropertyOpacity).toDouble() == 0.0) { |
return false; |
+ } |
if (inlineStyle->getPropertyValue(CSSPropertyVisibility) == "hidden") |
return false; |
@@ -53,10 +107,11 @@ bool isElementVisible(Element& element) { |
} // namespace |
-class MediaControlsTest : public testing::Test { |
+class MediaControlsTest : public ::testing::Test { |
protected: |
virtual void SetUp() { |
- m_pageHolder = DummyPageHolder::create(IntSize(800, 600)); |
+ m_pageHolder = DummyPageHolder::create(IntSize(800, 600), nullptr, |
+ StubFrameLoaderClient::create()); |
Document& document = this->document(); |
document.write("<video>"); |
@@ -78,6 +133,10 @@ class MediaControlsTest : public testing::Test { |
m_mediaControls->mediaElement().clientWidth(); |
} |
+ void simulateHideMediaControlsTimerFired() { |
+ m_mediaControls->hideMediaControlsTimerFired(nullptr); |
+ } |
+ |
MediaControls& mediaControls() { return *m_mediaControls; } |
Document& document() { return m_pageHolder->document(); } |
@@ -199,4 +258,26 @@ TEST_F(MediaControlsTest, CastOverlayDisableRemotePlaybackAttr) { |
ASSERT_TRUE(isElementVisible(*castOverlayButton)); |
} |
+TEST_F(MediaControlsTest, KeepControlsVisibleIfOverflowListVisible) { |
+ Element* overflowList = getElementByShadowPseudoId( |
+ mediaControls(), "-internal-media-controls-overflow-menu-list"); |
+ ASSERT_NE(nullptr, overflowList); |
+ |
+ Element* panel = getElementByShadowPseudoId(mediaControls(), |
+ "-webkit-media-controls-panel"); |
+ ASSERT_NE(nullptr, panel); |
+ |
+ mediaControls().mediaElement().setSrc("http://example.com"); |
+ mediaControls().mediaElement().play(); |
+ testing::runPendingTasks(); |
+ |
+ mediaControls().show(); |
+ mediaControls().toggleOverflowMenu(); |
+ EXPECT_TRUE(isElementVisible(*overflowList)); |
+ |
+ simulateHideMediaControlsTimerFired(); |
+ EXPECT_TRUE(isElementVisible(*overflowList)); |
+ EXPECT_TRUE(isElementVisible(*panel)); |
+} |
+ |
} // namespace blink |