Commit bb6df297 authored by mlamouri's avatar mlamouri Committed by Commit bot

Keep the media controls panel visible if the overflow menu is visible.

Otherwise, the overflow menu stays visible while the controls are hidden
which is fairly odd. Hiding the overflow menu would not be a good
experience either because the timer to hide is fairly short.

BUG=None
R=zqzhang@chromium.org

Review-Url: https://codereview.chromium.org/2386273003
Cr-Commit-Position: refs/heads/master@{#422764}
parent 83ff6fed
......@@ -395,8 +395,8 @@ bool MediaControls::shouldHideMediaControls(unsigned behaviorFlags) const {
if (!ignoreFocus &&
(mediaElement().focused() || contains(document().focusedElement())))
return false;
// Don't hide the media controls when the text track list is showing.
if (m_textTrackList->isWanted())
// Don't hide the media controls when a panel is showing.
if (m_textTrackList->isWanted() || m_overflowList->isWanted())
return false;
return true;
}
......
......@@ -94,6 +94,8 @@ class CORE_EXPORT MediaControls final : public HTMLDivElement {
DECLARE_VIRTUAL_TRACE();
private:
friend class MediaControlsTest;
void invalidate(Element*);
class BatchedControlUpdate;
......
......@@ -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
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