Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(525)

Unified Diff: third_party/WebKit/Source/modules/media_controls/MediaControlsRotateToFullscreenDelegateTest.cpp

Issue 2830713003: [Media controls] Add rotate-to-fullscreen gesture behind flag (Closed)
Patch Set: Use __func__ instead per styleguide Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/modules/media_controls/MediaControlsRotateToFullscreenDelegateTest.cpp
diff --git a/third_party/WebKit/Source/modules/media_controls/MediaControlsRotateToFullscreenDelegateTest.cpp b/third_party/WebKit/Source/modules/media_controls/MediaControlsRotateToFullscreenDelegateTest.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..3e831ea97dae1ff90b2ef0580a3474f1a1abbeae
--- /dev/null
+++ b/third_party/WebKit/Source/modules/media_controls/MediaControlsRotateToFullscreenDelegateTest.cpp
@@ -0,0 +1,663 @@
+// Copyright 2017 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "modules/media_controls/MediaControlsRotateToFullscreenDelegate.h"
+
+#include "core/HTMLNames.h"
+#include "core/css/CSSStyleDeclaration.h"
+#include "core/dom/Document.h"
+#include "core/dom/DocumentUserGestureToken.h"
+#include "core/dom/Fullscreen.h"
+#include "core/frame/FrameView.h"
+#include "core/frame/LocalDOMWindow.h"
+#include "core/frame/Settings.h"
+#include "core/html/HTMLAudioElement.h"
+#include "core/html/HTMLVideoElement.h"
+#include "core/loader/EmptyClients.h"
+#include "core/testing/DummyPageHolder.h"
+#include "modules/media_controls/MediaControlsImpl.h"
+#include "platform/UserGestureIndicator.h"
+#include "platform/testing/EmptyWebMediaPlayer.h"
+#include "platform/testing/UnitTestHelpers.h"
+#include "platform/wtf/text/AtomicString.h"
+#include "public/platform/WebSize.h"
+#include "public/platform/modules/screen_orientation/WebScreenOrientationType.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+using ::testing::Return;
+
+namespace blink {
+
+using namespace HTMLNames;
+
+namespace {
+
+class MockVideoWebMediaPlayer : public EmptyWebMediaPlayer {
+ public:
+ // ChromeClient overrides:
+ bool HasVideo() const override { return true; }
+
+ MOCK_CONST_METHOD0(NaturalSize, WebSize());
+};
+
+class MockChromeClient : public EmptyChromeClient {
+ public:
+ // ChromeClient overrides:
+ void EnterFullscreen(LocalFrame& frame) override {
+ Fullscreen::From(*frame.GetDocument()).DidEnterFullscreen();
+ }
+ void ExitFullscreen(LocalFrame& frame) override {
+ Fullscreen::From(*frame.GetDocument()).DidExitFullscreen();
+ }
+
+ MOCK_CONST_METHOD0(GetScreenInfo, WebScreenInfo());
+};
+
+class StubLocalFrameClient : public EmptyLocalFrameClient {
+ public:
+ static StubLocalFrameClient* Create() { return new StubLocalFrameClient; }
+
+ std::unique_ptr<WebMediaPlayer> CreateWebMediaPlayer(
+ HTMLMediaElement&,
+ const WebMediaPlayerSource&,
+ WebMediaPlayerClient*) override {
+ return WTF::MakeUnique<MockVideoWebMediaPlayer>();
+ }
+};
+
+} // anonymous namespace
+
+class MediaControlsRotateToFullscreenDelegateTest : public ::testing::Test {
+ protected:
+ using SimpleOrientation =
+ MediaControlsRotateToFullscreenDelegate::SimpleOrientation;
+
+ void SetUp() override {
+ previous_video_rotate_to_fullscreen_value_ =
+ RuntimeEnabledFeatures::videoRotateToFullscreenEnabled();
+ RuntimeEnabledFeatures::setVideoRotateToFullscreenEnabled(true);
+
+ chrome_client_ = new MockChromeClient();
+
+ Page::PageClients clients;
+ FillWithEmptyClients(clients);
+ clients.chrome_client = chrome_client_.Get();
+
+ page_holder_ = DummyPageHolder::Create(IntSize(800, 600), &clients,
+ StubLocalFrameClient::Create());
+
+ video_ = HTMLVideoElement::Create(GetDocument());
+ GetVideo().setAttribute(controlsAttr, g_empty_atom);
+ // Most tests should call GetDocument().body()->AppendChild(&GetVideo());
+ // This is not done automatically, so that tests control timing of `Attach`.
+ }
+
+ void TearDown() override {
+ RuntimeEnabledFeatures::setVideoRotateToFullscreenEnabled(
+ previous_video_rotate_to_fullscreen_value_);
+ }
+
+ static bool HasDelegate(const MediaControls& media_controls) {
+ return !!static_cast<const MediaControlsImpl*>(&media_controls)
+ ->rotate_to_fullscreen_delegate_;
+ }
+
+ static bool HasOrientationLockDelegate(const MediaControls& media_controls) {
+ return !!static_cast<const MediaControlsImpl*>(&media_controls)
+ ->orientation_lock_delegate_;
+ }
+
+ void SimulateVideoReadyState(HTMLMediaElement::ReadyState state) {
+ GetVideo().SetReadyState(state);
+ }
+
+ SimpleOrientation ObservedScreenOrientation() const {
+ return GetMediaControls()
+ .rotate_to_fullscreen_delegate_->current_screen_orientation_;
+ }
+
+ SimpleOrientation ComputeVideoOrientation() const {
+ return GetMediaControls()
+ .rotate_to_fullscreen_delegate_->ComputeVideoOrientation();
+ }
+
+ bool IsObservingVisibility() const {
+ return GetMediaControls()
+ .rotate_to_fullscreen_delegate_->visibility_observer_;
+ }
+
+ bool ObservedVisibility() const {
+ return GetMediaControls().rotate_to_fullscreen_delegate_->is_visible_;
+ }
+
+ void DisableControls() {
+ // If scripts are not enabled, controls will always be shown.
+ page_holder_->GetFrame().GetSettings()->SetScriptEnabled(true);
+
+ GetVideo().removeAttribute(controlsAttr);
+ }
+
+ void DispatchEvent(EventTarget& target, const AtomicString& type) {
+ target.DispatchEvent(Event::Create(type));
+ }
+
+ void InitScreenAndVideo(WebScreenOrientationType initial_screen_orientation,
+ WebSize video_size);
+
+ void PlayVideo();
+
+ void UpdateVisibilityObserver() {
+ // Let IntersectionObserver update.
+ GetDocument().View()->UpdateAllLifecyclePhases();
+ testing::RunPendingTasks();
+ }
+
+ void RotateTo(WebScreenOrientationType new_screen_orientation);
+
+ MockChromeClient& GetChromeClient() const { return *chrome_client_; }
+ LocalDOMWindow& GetWindow() const { return *GetDocument().domWindow(); }
+ Document& GetDocument() const { return page_holder_->GetDocument(); }
+ HTMLVideoElement& GetVideo() const { return *video_; }
+ MediaControlsImpl& GetMediaControls() const {
+ return *static_cast<MediaControlsImpl*>(GetVideo().GetMediaControls());
+ }
+ MockVideoWebMediaPlayer& GetWebMediaPlayer() const {
+ return *static_cast<MockVideoWebMediaPlayer*>(
+ GetVideo().GetWebMediaPlayer());
+ }
+
+ private:
+ bool previous_video_rotate_to_fullscreen_value_;
+ Persistent<MockChromeClient> chrome_client_;
+ std::unique_ptr<DummyPageHolder> page_holder_;
+ Persistent<HTMLVideoElement> video_;
+};
+
+void MediaControlsRotateToFullscreenDelegateTest::InitScreenAndVideo(
+ WebScreenOrientationType initial_screen_orientation,
+ WebSize video_size) {
+ // Set initial screen orientation (called by `Attach` during `AppendChild`).
+ WebScreenInfo screen_info;
+ screen_info.orientation_type = initial_screen_orientation;
+ EXPECT_CALL(GetChromeClient(), GetScreenInfo())
+ .Times(1)
+ .WillOnce(Return(screen_info));
+
+ // Set up the WebMediaPlayer instance.
+ GetDocument().body()->AppendChild(&GetVideo());
+ GetVideo().SetSrc("https://example.com");
+ testing::RunPendingTasks();
+ SimulateVideoReadyState(HTMLMediaElement::kHaveMetadata);
+
+ // Set video size.
+ EXPECT_CALL(GetWebMediaPlayer(), NaturalSize())
+ .WillRepeatedly(Return(video_size));
+}
+
+void MediaControlsRotateToFullscreenDelegateTest::PlayVideo() {
+ {
+ UserGestureIndicator gesture(
+ DocumentUserGestureToken::Create(&GetDocument()));
+ GetVideo().Play();
+ }
+ testing::RunPendingTasks();
+}
+
+void MediaControlsRotateToFullscreenDelegateTest::RotateTo(
+ WebScreenOrientationType new_screen_orientation) {
+ WebScreenInfo screen_info;
+ screen_info.orientation_type = new_screen_orientation;
+ EXPECT_CALL(GetChromeClient(), GetScreenInfo())
+ .Times(1)
+ .WillOnce(Return(screen_info));
+ DispatchEvent(GetWindow(), EventTypeNames::orientationchange);
+ testing::RunPendingTasks();
+}
+
+TEST_F(MediaControlsRotateToFullscreenDelegateTest, DelegateRequiresFlag) {
+ // SetUp turns the flag on by default.
+ GetDocument().body()->AppendChild(&GetVideo());
+ EXPECT_TRUE(HasDelegate(GetMediaControls()));
+
+ // No delegate when flag is off.
+ RuntimeEnabledFeatures::setVideoRotateToFullscreenEnabled(false);
+ HTMLVideoElement* video = HTMLVideoElement::Create(GetDocument());
+ GetDocument().body()->AppendChild(video);
+ EXPECT_FALSE(HasDelegate(*video->GetMediaControls()));
+}
+
+TEST_F(MediaControlsRotateToFullscreenDelegateTest, DelegateRequiresVideo) {
+ HTMLAudioElement* audio = HTMLAudioElement::Create(GetDocument());
+ GetDocument().body()->AppendChild(audio);
+ EXPECT_FALSE(HasDelegate(*audio->GetMediaControls()));
+}
+
+TEST_F(MediaControlsRotateToFullscreenDelegateTest,
+ OrientationLockIsMutuallyExclusive) {
+ // Rotate to fullscreen and fullscreen orientation lock are currently
+ // incompatible, so if both are enabled only one should be active.
+ RuntimeEnabledFeatures::setVideoRotateToFullscreenEnabled(true);
+ RuntimeEnabledFeatures::setVideoFullscreenOrientationLockEnabled(true);
+ HTMLVideoElement* video = HTMLVideoElement::Create(GetDocument());
+ GetDocument().body()->AppendChild(video);
+ EXPECT_TRUE(HasDelegate(*video->GetMediaControls()));
+ EXPECT_FALSE(HasOrientationLockDelegate(*video->GetMediaControls()));
+}
+
+TEST_F(MediaControlsRotateToFullscreenDelegateTest, ComputeVideoOrientation) {
+ // Set up the WebMediaPlayer instance.
+ GetDocument().body()->AppendChild(&GetVideo());
+ GetVideo().SetSrc("https://example.com");
+ testing::RunPendingTasks();
+
+ // Each `ComputeVideoOrientation` calls `NaturalSize` twice, except the first
+ // one where the video is not yet ready.
+ EXPECT_CALL(GetWebMediaPlayer(), NaturalSize())
+ .Times(12)
+ .WillOnce(Return(WebSize(400, 400)))
+ .WillOnce(Return(WebSize(400, 400)))
+ .WillOnce(Return(WebSize(300, 200)))
+ .WillOnce(Return(WebSize(300, 200)))
+ .WillOnce(Return(WebSize(200, 300)))
+ .WillOnce(Return(WebSize(200, 300)))
+ .WillOnce(Return(WebSize(300, 199)))
+ .WillOnce(Return(WebSize(300, 199)))
+ .WillOnce(Return(WebSize(199, 300)))
+ .WillOnce(Return(WebSize(199, 300)))
+ .WillOnce(Return(WebSize(0, 0)))
+ .WillOnce(Return(WebSize(0, 0)));
+
+ // Video is not yet ready.
+ EXPECT_EQ(SimpleOrientation::kUnknown, ComputeVideoOrientation());
+
+ SimulateVideoReadyState(HTMLMediaElement::kHaveMetadata);
+
+ // 400x400 is square, which is currently treated as landscape.
+ EXPECT_EQ(SimpleOrientation::kLandscape, ComputeVideoOrientation());
+ // 300x200 is landscape.
+ EXPECT_EQ(SimpleOrientation::kLandscape, ComputeVideoOrientation());
+ // 200x300 is portrait.
+ EXPECT_EQ(SimpleOrientation::kPortrait, ComputeVideoOrientation());
+ // 300x199 is too small.
+ EXPECT_EQ(SimpleOrientation::kUnknown, ComputeVideoOrientation());
+ // 199x300 is too small.
+ EXPECT_EQ(SimpleOrientation::kUnknown, ComputeVideoOrientation());
+ // 0x0 is empty.
+ EXPECT_EQ(SimpleOrientation::kUnknown, ComputeVideoOrientation());
+}
+
+TEST_F(MediaControlsRotateToFullscreenDelegateTest,
+ OnlyObserveVisibilityWhenPlaying) {
+ // Should not initially be observing visibility.
+ GetDocument().body()->AppendChild(&GetVideo());
+ EXPECT_FALSE(IsObservingVisibility());
+
+ // Should start observing visibility when played.
+ {
+ UserGestureIndicator gesture(
+ DocumentUserGestureToken::Create(&GetDocument()));
+ GetVideo().Play();
+ }
+ testing::RunPendingTasks();
+ EXPECT_TRUE(IsObservingVisibility());
+ EXPECT_FALSE(ObservedVisibility());
+
+ // Should have observed visibility once compositor updates.
+ GetDocument().View()->UpdateAllLifecyclePhases();
+ testing::RunPendingTasks();
+ EXPECT_TRUE(ObservedVisibility());
+
+ // Should stop observing visibility when paused.
+ GetVideo().pause();
+ testing::RunPendingTasks();
+ EXPECT_FALSE(IsObservingVisibility());
+ EXPECT_FALSE(ObservedVisibility());
+
+ // Should resume observing visibility when playback resumes.
+ {
+ UserGestureIndicator gesture(
+ DocumentUserGestureToken::Create(&GetDocument()));
+ GetVideo().Play();
+ }
+ testing::RunPendingTasks();
+ EXPECT_TRUE(IsObservingVisibility());
+ EXPECT_FALSE(ObservedVisibility());
+
+ // Should have observed visibility once compositor updates.
+ GetDocument().View()->UpdateAllLifecyclePhases();
+ testing::RunPendingTasks();
+ EXPECT_TRUE(ObservedVisibility());
+}
+
+TEST_F(MediaControlsRotateToFullscreenDelegateTest,
+ EnterSuccessPortraitToLandscape) {
+ // Portrait screen, landscape video.
+ InitScreenAndVideo(kWebScreenOrientationPortraitPrimary, WebSize(640, 480));
+ EXPECT_EQ(SimpleOrientation::kPortrait, ObservedScreenOrientation());
+ EXPECT_EQ(SimpleOrientation::kLandscape, ComputeVideoOrientation());
+
+ // Play video.
+ PlayVideo();
+ UpdateVisibilityObserver();
+
+ EXPECT_TRUE(ObservedVisibility());
+ EXPECT_FALSE(GetVideo().IsFullscreen());
+
+ // Rotate screen to landscape.
+ RotateTo(kWebScreenOrientationLandscapePrimary);
+
+ // Should enter fullscreen.
+ EXPECT_TRUE(GetVideo().IsFullscreen());
+}
+
+TEST_F(MediaControlsRotateToFullscreenDelegateTest,
+ EnterSuccessLandscapeToPortrait) {
+ // Landscape screen, portrait video.
+ InitScreenAndVideo(kWebScreenOrientationLandscapePrimary, WebSize(480, 640));
+ EXPECT_EQ(SimpleOrientation::kLandscape, ObservedScreenOrientation());
+ EXPECT_EQ(SimpleOrientation::kPortrait, ComputeVideoOrientation());
+
+ // Play video.
+ PlayVideo();
+ UpdateVisibilityObserver();
+
+ EXPECT_TRUE(ObservedVisibility());
+ EXPECT_FALSE(GetVideo().IsFullscreen());
+
+ // Rotate screen to portrait.
+ RotateTo(kWebScreenOrientationPortraitPrimary);
+
+ // Should enter fullscreen.
+ EXPECT_TRUE(GetVideo().IsFullscreen());
+}
+
+TEST_F(MediaControlsRotateToFullscreenDelegateTest,
+ EnterSuccessSquarePortraitToLandscape) {
+ // Portrait screen, square video.
+ InitScreenAndVideo(kWebScreenOrientationPortraitPrimary, WebSize(400, 400));
+ EXPECT_EQ(SimpleOrientation::kPortrait, ObservedScreenOrientation());
+ EXPECT_EQ(SimpleOrientation::kLandscape, ComputeVideoOrientation());
+
+ // Play video.
+ PlayVideo();
+ UpdateVisibilityObserver();
+
+ EXPECT_TRUE(ObservedVisibility());
+ EXPECT_FALSE(GetVideo().IsFullscreen());
+
+ // Rotate screen to landscape.
+ RotateTo(kWebScreenOrientationLandscapePrimary);
+
+ // Should enter fullscreen, since square videos are currently treated the same
+ // as landscape videos.
+ EXPECT_TRUE(GetVideo().IsFullscreen());
+}
+
+TEST_F(MediaControlsRotateToFullscreenDelegateTest, EnterFailWrongOrientation) {
+ // Landscape screen, landscape video.
+ InitScreenAndVideo(kWebScreenOrientationLandscapePrimary, WebSize(640, 480));
+ EXPECT_EQ(SimpleOrientation::kLandscape, ObservedScreenOrientation());
+ EXPECT_EQ(SimpleOrientation::kLandscape, ComputeVideoOrientation());
+
+ // Play video.
+ PlayVideo();
+ UpdateVisibilityObserver();
+
+ EXPECT_TRUE(ObservedVisibility());
+
+ // Rotate screen to portrait.
+ RotateTo(kWebScreenOrientationPortraitPrimary);
+
+ // Should not enter fullscreen since the orientation that the device was
+ // rotated to does not match the orientation of the video.
+ EXPECT_FALSE(GetVideo().IsFullscreen());
+}
+
+TEST_F(MediaControlsRotateToFullscreenDelegateTest,
+ EnterFailSquareWrongOrientation) {
+ // Landscape screen, square video.
+ InitScreenAndVideo(kWebScreenOrientationLandscapePrimary, WebSize(400, 400));
+ EXPECT_EQ(SimpleOrientation::kLandscape, ObservedScreenOrientation());
+ EXPECT_EQ(SimpleOrientation::kLandscape, ComputeVideoOrientation());
+
+ // Play video.
+ PlayVideo();
+ UpdateVisibilityObserver();
+
+ EXPECT_TRUE(ObservedVisibility());
+
+ // Rotate screen to portrait.
+ RotateTo(kWebScreenOrientationPortraitPrimary);
+
+ // Should not enter fullscreen since square videos are treated as landscape,
+ // so rotating to portrait does not match the orientation of the video.
+ EXPECT_FALSE(GetVideo().IsFullscreen());
+}
+
+TEST_F(MediaControlsRotateToFullscreenDelegateTest, EnterFailNoControls) {
+ DisableControls();
+
+ // Portrait screen, landscape video.
+ InitScreenAndVideo(kWebScreenOrientationPortraitPrimary, WebSize(640, 480));
+ EXPECT_EQ(SimpleOrientation::kPortrait, ObservedScreenOrientation());
+ EXPECT_EQ(SimpleOrientation::kLandscape, ComputeVideoOrientation());
+
+ // Play video.
+ PlayVideo();
+ UpdateVisibilityObserver();
+
+ EXPECT_TRUE(ObservedVisibility());
+
+ // Rotate screen to landscape.
+ RotateTo(kWebScreenOrientationLandscapePrimary);
+
+ // Should not enter fullscreen since video has no controls.
+ EXPECT_FALSE(GetVideo().IsFullscreen());
+}
+
+TEST_F(MediaControlsRotateToFullscreenDelegateTest, EnterFailPaused) {
+ // Portrait screen, landscape video.
+ InitScreenAndVideo(kWebScreenOrientationPortraitPrimary, WebSize(640, 480));
+ EXPECT_EQ(SimpleOrientation::kPortrait, ObservedScreenOrientation());
+ EXPECT_EQ(SimpleOrientation::kLandscape, ComputeVideoOrientation());
+
+ EXPECT_FALSE(ObservedVisibility());
+
+ UpdateVisibilityObserver();
+
+ EXPECT_FALSE(ObservedVisibility());
+
+ // Rotate screen to landscape.
+ RotateTo(kWebScreenOrientationLandscapePrimary);
+
+ // Should not enter fullscreen since video is paused.
+ EXPECT_FALSE(GetVideo().IsFullscreen());
+}
+
+TEST_F(MediaControlsRotateToFullscreenDelegateTest, EnterFailHidden) {
+ // Portrait screen, landscape video.
+ InitScreenAndVideo(kWebScreenOrientationPortraitPrimary, WebSize(640, 480));
+ EXPECT_EQ(SimpleOrientation::kPortrait, ObservedScreenOrientation());
+ EXPECT_EQ(SimpleOrientation::kLandscape, ComputeVideoOrientation());
+
+ // Play video.
+ PlayVideo();
+ UpdateVisibilityObserver();
+
+ EXPECT_TRUE(ObservedVisibility());
+
+ // Move video offscreen.
+ GetDocument().body()->style()->setProperty("margin-top", "-999px", "",
+ ASSERT_NO_EXCEPTION);
+
+ UpdateVisibilityObserver();
+
+ EXPECT_FALSE(ObservedVisibility());
+
+ // Rotate screen to landscape.
+ RotateTo(kWebScreenOrientationLandscapePrimary);
+
+ // Should not enter fullscreen since video is not visible.
+ EXPECT_FALSE(GetVideo().IsFullscreen());
+}
+
+TEST_F(MediaControlsRotateToFullscreenDelegateTest,
+ EnterFail180DegreeRotation) {
+ // Landscape screen, landscape video.
+ InitScreenAndVideo(kWebScreenOrientationLandscapeSecondary,
+ WebSize(640, 480));
+ EXPECT_EQ(SimpleOrientation::kLandscape, ObservedScreenOrientation());
+ EXPECT_EQ(SimpleOrientation::kLandscape, ComputeVideoOrientation());
+
+ // Play video.
+ PlayVideo();
+ UpdateVisibilityObserver();
+
+ EXPECT_TRUE(ObservedVisibility());
+
+ // Rotate screen 180 degrees to the opposite landscape (without passing via a
+ // portrait orientation).
+ RotateTo(kWebScreenOrientationLandscapePrimary);
+
+ // Should not enter fullscreen since this is a 180 degree orientation.
+ EXPECT_FALSE(GetVideo().IsFullscreen());
+}
+
+TEST_F(MediaControlsRotateToFullscreenDelegateTest, EnterFailSmall) {
+ // Portrait screen, small landscape video.
+ InitScreenAndVideo(kWebScreenOrientationPortraitPrimary, WebSize(300, 199));
+ EXPECT_EQ(SimpleOrientation::kPortrait, ObservedScreenOrientation());
+ EXPECT_EQ(SimpleOrientation::kUnknown, ComputeVideoOrientation());
+
+ // Play video.
+ PlayVideo();
+ UpdateVisibilityObserver();
+
+ EXPECT_TRUE(ObservedVisibility());
+
+ // Rotate screen to landscape.
+ RotateTo(kWebScreenOrientationLandscapePrimary);
+
+ // Should not enter fullscreen since video is too small.
+ EXPECT_FALSE(GetVideo().IsFullscreen());
+}
+
+TEST_F(MediaControlsRotateToFullscreenDelegateTest,
+ EnterFailDocumentFullscreen) {
+ // Portrait screen, landscape video.
+ InitScreenAndVideo(kWebScreenOrientationPortraitPrimary, WebSize(640, 480));
+ EXPECT_EQ(SimpleOrientation::kPortrait, ObservedScreenOrientation());
+ EXPECT_EQ(SimpleOrientation::kLandscape, ComputeVideoOrientation());
+
+ // Simulate the webpage requesting fullscreen on some other element than the
+ // video (in this case document.body).
+ {
+ UserGestureIndicator gesture(
+ DocumentUserGestureToken::Create(&GetDocument()));
+ Fullscreen::RequestFullscreen(*GetDocument().body());
+ }
+ testing::RunPendingTasks();
+ EXPECT_TRUE(Fullscreen::IsCurrentFullScreenElement(*GetDocument().body()));
+ EXPECT_FALSE(GetVideo().IsFullscreen());
+
+ // Play video.
+ PlayVideo();
+ UpdateVisibilityObserver();
+
+ EXPECT_TRUE(ObservedVisibility());
+
+ // Rotate screen to landscape.
+ RotateTo(kWebScreenOrientationLandscapePrimary);
+
+ // Should not enter fullscreen on video, since document is already fullscreen.
+ EXPECT_TRUE(Fullscreen::IsCurrentFullScreenElement(*GetDocument().body()));
+ EXPECT_FALSE(GetVideo().IsFullscreen());
+}
+
+TEST_F(MediaControlsRotateToFullscreenDelegateTest,
+ ExitSuccessLandscapeFullscreenToPortraitInline) {
+ // Landscape screen, landscape video.
+ InitScreenAndVideo(kWebScreenOrientationLandscapePrimary, WebSize(640, 480));
+ EXPECT_EQ(SimpleOrientation::kLandscape, ObservedScreenOrientation());
+ EXPECT_EQ(SimpleOrientation::kLandscape, ComputeVideoOrientation());
+
+ // Start in fullscreen.
+ {
+ UserGestureIndicator gesture(
+ DocumentUserGestureToken::Create(&GetDocument()));
+ GetMediaControls().EnterFullscreen();
+ }
+ testing::RunPendingTasks();
+ EXPECT_TRUE(GetVideo().IsFullscreen());
+
+ // Leave video paused (playing is not a requirement to exit fullscreen).
+ EXPECT_TRUE(GetVideo().paused());
+ EXPECT_FALSE(ObservedVisibility());
+
+ // Rotate screen to portrait.
+ RotateTo(kWebScreenOrientationPortraitPrimary);
+
+ // Should exit fullscreen.
+ EXPECT_FALSE(GetVideo().IsFullscreen());
+}
+
+TEST_F(MediaControlsRotateToFullscreenDelegateTest,
+ ExitSuccessPortraitFullscreenToLandscapeInline) {
+ // Portrait screen, portrait video.
+ InitScreenAndVideo(kWebScreenOrientationPortraitPrimary, WebSize(480, 640));
+ EXPECT_EQ(SimpleOrientation::kPortrait, ObservedScreenOrientation());
+ EXPECT_EQ(SimpleOrientation::kPortrait, ComputeVideoOrientation());
+
+ // Start in fullscreen.
+ {
+ UserGestureIndicator gesture(
+ DocumentUserGestureToken::Create(&GetDocument()));
+ GetMediaControls().EnterFullscreen();
+ }
+ testing::RunPendingTasks();
+ EXPECT_TRUE(GetVideo().IsFullscreen());
+
+ // Leave video paused (playing is not a requirement to exit fullscreen).
+ EXPECT_TRUE(GetVideo().paused());
+ EXPECT_FALSE(ObservedVisibility());
+
+ // Rotate screen to landscape.
+ RotateTo(kWebScreenOrientationLandscapePrimary);
+
+ // Should exit fullscreen.
+ EXPECT_FALSE(GetVideo().IsFullscreen());
+}
+
+TEST_F(MediaControlsRotateToFullscreenDelegateTest,
+ ExitFailDocumentFullscreen) {
+ // Landscape screen, landscape video.
+ InitScreenAndVideo(kWebScreenOrientationLandscapePrimary, WebSize(640, 480));
+ EXPECT_EQ(SimpleOrientation::kLandscape, ObservedScreenOrientation());
+ EXPECT_EQ(SimpleOrientation::kLandscape, ComputeVideoOrientation());
+
+ // Simulate the webpage requesting fullscreen on some other element than the
+ // video (in this case document.body).
+ {
+ UserGestureIndicator gesture(
+ DocumentUserGestureToken::Create(&GetDocument()));
+ Fullscreen::RequestFullscreen(*GetDocument().body());
+ }
+ testing::RunPendingTasks();
+ EXPECT_TRUE(Fullscreen::IsCurrentFullScreenElement(*GetDocument().body()));
+ EXPECT_FALSE(GetVideo().IsFullscreen());
+
+ // Leave video paused (playing is not a requirement to exit fullscreen).
+ EXPECT_TRUE(GetVideo().paused());
+ EXPECT_FALSE(ObservedVisibility());
+
+ // Rotate screen to portrait.
+ RotateTo(kWebScreenOrientationPortraitPrimary);
+
+ // Should not exit fullscreen, since video was not the fullscreen element.
+ EXPECT_TRUE(Fullscreen::IsCurrentFullScreenElement(*GetDocument().body()));
+ EXPECT_FALSE(GetVideo().IsFullscreen());
+}
+
+} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698