Chromium Code Reviews| Index: third_party/WebKit/Source/modules/media_controls/MediaControlsOrientationLockDelegateTest.cpp |
| diff --git a/third_party/WebKit/Source/modules/media_controls/MediaControlsOrientationLockDelegateTest.cpp b/third_party/WebKit/Source/modules/media_controls/MediaControlsOrientationLockDelegateTest.cpp |
| index d91eea1f3829e940073b41036a2143f59a4674a1..1a6760c8ecbba9c7ae4f854cb4ed5bd251518040 100644 |
| --- a/third_party/WebKit/Source/modules/media_controls/MediaControlsOrientationLockDelegateTest.cpp |
| +++ b/third_party/WebKit/Source/modules/media_controls/MediaControlsOrientationLockDelegateTest.cpp |
| @@ -4,24 +4,33 @@ |
| #include "modules/media_controls/MediaControlsOrientationLockDelegate.h" |
| +#include "core/HTMLNames.h" |
| #include "core/dom/Document.h" |
| #include "core/dom/DocumentUserGestureToken.h" |
| #include "core/dom/Fullscreen.h" |
| +#include "core/frame/FrameView.h" |
| #include "core/frame/ScreenOrientationController.h" |
| #include "core/html/HTMLAudioElement.h" |
| #include "core/html/HTMLVideoElement.h" |
| #include "core/loader/EmptyClients.h" |
| #include "core/testing/DummyPageHolder.h" |
| +#include "modules/device_orientation/DeviceOrientationController.h" |
| +#include "modules/device_orientation/DeviceOrientationData.h" |
| #include "modules/media_controls/MediaControlsImpl.h" |
| +#include "modules/screen_orientation/ScreenOrientationControllerImpl.h" |
| +#include "platform/LayoutTestSupport.h" |
| #include "platform/UserGestureIndicator.h" |
| +#include "platform/geometry/IntRect.h" |
| #include "platform/testing/EmptyWebMediaPlayer.h" |
| #include "platform/testing/UnitTestHelpers.h" |
| #include "public/platform/WebSize.h" |
| #include "public/platform/modules/screen_orientation/WebLockOrientationCallback.h" |
| +#include "public/platform/modules/screen_orientation/WebScreenOrientationClient.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| using ::testing::_; |
| +using ::testing::AtLeast; |
| using ::testing::Return; |
| namespace blink { |
| @@ -30,84 +39,76 @@ namespace { |
| // WebLockOrientationCallback implementation that will not react to a success |
| // nor a failure. |
| -class DummyScreenOrientationCallback : public WebLockOrientationCallback { |
| +class DummyScreenOrientationCallback final : public WebLockOrientationCallback { |
| public: |
| void OnSuccess() override {} |
| void OnError(WebLockOrientationError) override {} |
| }; |
| -class MockVideoWebMediaPlayer : public EmptyWebMediaPlayer { |
| +class MockVideoWebMediaPlayer final : public EmptyWebMediaPlayer { |
| public: |
| bool HasVideo() const override { return true; } |
| MOCK_CONST_METHOD0(NaturalSize, WebSize()); |
| }; |
| -class MockChromeClient : public EmptyChromeClient { |
| +class MockWebScreenOrientationClient final : public WebScreenOrientationClient { |
| public: |
| - 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>(); |
| + // WebScreenOrientationClient overrides: |
| + void LockOrientation(WebScreenOrientationLockType type, |
| + std::unique_ptr<WebLockOrientationCallback>) override { |
| + LockOrientation(type); |
| } |
| -}; |
| + MOCK_METHOD0(UnlockOrientation, void()); |
| -class MockScreenOrientationController final |
| - : public ScreenOrientationController { |
| - WTF_MAKE_NONCOPYABLE(MockScreenOrientationController); |
| + MOCK_METHOD1(LockOrientation, void(WebScreenOrientationLockType)); |
| +}; |
| +class MockChromeClient final : public EmptyChromeClient { |
| public: |
| - static MockScreenOrientationController* ProvideTo(LocalFrame& frame) { |
| - MockScreenOrientationController* controller = |
| - new MockScreenOrientationController(frame); |
| - ScreenOrientationController::ProvideTo(frame, controller); |
| - return controller; |
| + // ChromeClient overrides: |
| + void InstallSupplements(LocalFrame& frame) override { |
| + EmptyChromeClient::InstallSupplements(frame); |
| + ScreenOrientationControllerImpl::ProvideTo(frame, |
| + &web_screen_orientation_client_); |
| + } |
| + void EnterFullscreen(LocalFrame& frame) override { |
| + Fullscreen::From(*frame.GetDocument()).DidEnterFullscreen(); |
| + } |
| + void ExitFullscreen(LocalFrame& frame) override { |
| + Fullscreen::From(*frame.GetDocument()).DidExitFullscreen(); |
| } |
| - MOCK_METHOD1(lock, void(WebScreenOrientationLockType)); |
| - MOCK_METHOD0(MockUnlock, void()); |
| + MOCK_CONST_METHOD0(GetScreenInfo, WebScreenInfo()); |
| - DEFINE_INLINE_VIRTUAL_TRACE() { ScreenOrientationController::Trace(visitor); } |
| + MockWebScreenOrientationClient& WebScreenOrientationClient() { |
| + return web_screen_orientation_client_; |
| + } |
| private: |
| - explicit MockScreenOrientationController(LocalFrame& frame) |
| - : ScreenOrientationController(frame) {} |
| + MockWebScreenOrientationClient web_screen_orientation_client_; |
| +}; |
| - void lock(WebScreenOrientationLockType type, |
| - std::unique_ptr<WebLockOrientationCallback>) override { |
| - locked_ = true; |
| - lock(type); |
| - } |
| +class StubLocalFrameClient final : public EmptyLocalFrameClient { |
| + public: |
| + static StubLocalFrameClient* Create() { return new StubLocalFrameClient; } |
| - void unlock() override { |
| - locked_ = false; |
| - MockUnlock(); |
| + std::unique_ptr<WebMediaPlayer> CreateWebMediaPlayer( |
| + HTMLMediaElement&, |
| + const WebMediaPlayerSource&, |
| + WebMediaPlayerClient*) override { |
| + return WTF::MakeUnique<MockVideoWebMediaPlayer>(); |
| } |
| - |
| - void NotifyOrientationChanged() override {} |
| - |
| - bool MaybeHasActiveLock() const override { return locked_; } |
| - |
| - bool locked_ = false; |
| }; |
| } // anonymous namespace |
| class MediaControlsOrientationLockDelegateTest : public ::testing::Test { |
| protected: |
| - void SetUp() override { |
| - previous_video_fullscreen_orientation_lock_value_ = |
| - RuntimeEnabledFeatures::videoFullscreenOrientationLockEnabled(); |
| - RuntimeEnabledFeatures::setVideoFullscreenOrientationLockEnabled(true); |
| + using DeviceOrientation = |
| + MediaControlsOrientationLockDelegate::DeviceOrientation; |
| + void SetUp() override { |
| chrome_client_ = new MockChromeClient(); |
| Page::PageClients clients; |
| @@ -117,18 +118,31 @@ class MediaControlsOrientationLockDelegateTest : public ::testing::Test { |
| page_holder_ = DummyPageHolder::Create(IntSize(800, 600), &clients, |
| StubLocalFrameClient::Create()); |
| + previous_orientation_event_value_ = |
| + RuntimeEnabledFeatures::orientationEventEnabled(); |
| + previous_video_fullscreen_orientation_lock_value_ = |
| + RuntimeEnabledFeatures::videoFullscreenOrientationLockEnabled(); |
| + previous_video_rotate_to_fullscreen_value_ = |
| + RuntimeEnabledFeatures::videoRotateToFullscreenEnabled(); |
| + RuntimeEnabledFeatures::setVideoFullscreenOrientationLockEnabled(true); |
| + // Turn off rotate-to-fullscreen. Tests covering the intersection of the two |
| + // can use the MediaControlsOrientationLockAndRotateToFullscreenDelegateTest |
| + // subclass. |
| + RuntimeEnabledFeatures::setVideoRotateToFullscreenEnabled(false); |
| + |
| GetDocument().write("<body><video></body>"); |
| video_ = toHTMLVideoElement(*GetDocument().QuerySelector("video")); |
| - |
| - screen_orientation_controller_ = |
| - MockScreenOrientationController::ProvideTo(page_holder_->GetFrame()); |
| } |
| void TearDown() override { |
| - ::testing::Mock::VerifyAndClear(&GetScreenOrientationController()); |
| + ::testing::Mock::VerifyAndClear(&ScreenOrientationClient()); |
| + RuntimeEnabledFeatures::setOrientationEventEnabled( |
| + previous_orientation_event_value_); |
| RuntimeEnabledFeatures::setVideoFullscreenOrientationLockEnabled( |
| previous_video_fullscreen_orientation_lock_value_); |
| + RuntimeEnabledFeatures::setVideoRotateToFullscreenEnabled( |
| + previous_video_rotate_to_fullscreen_value_); |
| } |
| static bool HasDelegate(const MediaControls& media_controls) { |
| @@ -188,10 +202,14 @@ class MediaControlsOrientationLockDelegateTest : public ::testing::Test { |
| } |
| bool DelegateWillUnlockFullscreen() const { |
| - return MediaControls()->orientation_lock_delegate_->locked_orientation_ != |
| + return DelegateOrientationLock() != |
| kWebScreenOrientationLockDefault /* unlocked */; |
| } |
| + WebScreenOrientationLockType DelegateOrientationLock() const { |
| + return MediaControls()->orientation_lock_delegate_->locked_orientation_; |
| + } |
| + |
| WebScreenOrientationLockType ComputeOrientationLock() const { |
| return MediaControls() |
| ->orientation_lock_delegate_->ComputeOrientationLock(); |
| @@ -201,21 +219,160 @@ class MediaControlsOrientationLockDelegateTest : public ::testing::Test { |
| HTMLVideoElement& Video() const { return *video_; } |
| Document& GetDocument() const { return page_holder_->GetDocument(); } |
| - MockScreenOrientationController& GetScreenOrientationController() const { |
| - return *screen_orientation_controller_; |
| + MockWebScreenOrientationClient& ScreenOrientationClient() const { |
| + return ChromeClient().WebScreenOrientationClient(); |
| } |
| MockVideoWebMediaPlayer& MockWebMediaPlayer() const { |
| return *static_cast<MockVideoWebMediaPlayer*>(Video().GetWebMediaPlayer()); |
| } |
| private: |
| + friend class MediaControlsOrientationLockAndRotateToFullscreenDelegateTest; |
| + |
| + bool previous_orientation_event_value_; |
| bool previous_video_fullscreen_orientation_lock_value_; |
| + bool previous_video_rotate_to_fullscreen_value_; |
| std::unique_ptr<DummyPageHolder> page_holder_; |
| Persistent<HTMLVideoElement> video_; |
| - Persistent<MockScreenOrientationController> screen_orientation_controller_; |
| Persistent<MockChromeClient> chrome_client_; |
| }; |
| +class MediaControlsOrientationLockAndRotateToFullscreenDelegateTest |
| + : public MediaControlsOrientationLockDelegateTest { |
| + protected: |
| + enum DeviceNaturalOrientation { kNaturalIsPortrait, kNaturalIsLandscape }; |
| + |
| + void SetUp() override { |
| + // Unset this to fix ScreenOrientationControllerImpl::ComputeOrientation. |
| + // TODO(mlamouri): Refactor ScreenOrientationControllerImpl to avoid this. |
|
timvolodine
2017/05/31 18:07:21
nit: maybe add crbug if there is one?
johnme
2017/06/01 13:15:10
Done.
|
| + was_running_layout_test_ = LayoutTestSupport::IsRunningLayoutTest(); |
| + LayoutTestSupport::SetIsRunningLayoutTest(false); |
| + |
| + MediaControlsOrientationLockDelegateTest::SetUp(); |
| + |
| + RuntimeEnabledFeatures::setOrientationEventEnabled(true); |
| + RuntimeEnabledFeatures::setVideoRotateToFullscreenEnabled(true); |
| + |
| + // Reset the <video> element now we've enabled the runtime feature. |
| + video_->parentElement()->RemoveChild(video_); |
| + video_ = HTMLVideoElement::Create(GetDocument()); |
| + video_->setAttribute(HTMLNames::controlsAttr, g_empty_atom); |
| + // Most tests should call GetDocument().body()->AppendChild(&Video()); |
| + // This is not done automatically, so that tests control timing of `Attach`, |
| + // which is important for MediaControlsRotateToFullscreenDelegate since |
| + // that's when it reads the initial screen orientation. |
| + } |
| + |
| + void TearDown() override { |
| + MediaControlsOrientationLockDelegateTest::TearDown(); |
| + LayoutTestSupport::SetIsRunningLayoutTest(was_running_layout_test_); |
| + } |
| + |
| + void SetIsAutoRotateEnabledByUser(bool enabled) { |
| + MediaControls() |
| + ->orientation_lock_delegate_ |
| + ->is_auto_rotate_enabled_by_user_for_testing_ = |
| + static_cast<int>(enabled); |
| + } |
| + |
| + WebRect ScreenRectFromAngle(uint16_t screen_orientation_angle) { |
| + uint16_t portrait_angle_mod_180 = natural_orientation_is_portrait_ ? 0 : 90; |
| + bool screen_rect_is_portrait = |
| + screen_orientation_angle % 180 == portrait_angle_mod_180; |
| + return screen_rect_is_portrait ? IntRect(0, 0, 1080, 1920) |
| + : IntRect(0, 0, 1920, 1080); |
| + } |
| + |
| + void RotateDeviceTo(uint16_t new_device_orientation_angle) { |
| + // Pick one of the many (beta,gamma) pairs that should map to each angle. |
| + switch (new_device_orientation_angle) { |
| + case 0: |
| + RotateDeviceTo(90, 0); |
| + break; |
| + case 90: |
| + RotateDeviceTo(0, -90); |
| + break; |
| + case 180: |
| + RotateDeviceTo(-90, 0); |
| + break; |
| + case 270: |
| + RotateDeviceTo(0, 90); |
| + break; |
| + default: |
| + NOTREACHED(); |
| + break; |
| + } |
| + } |
| + void RotateDeviceTo(double beta, double gamma) { |
| + DeviceOrientationController::From(GetDocument()) |
| + .SetOverride(DeviceOrientationData::Create(0.0 /* alpha */, beta, gamma, |
| + false /* absolute */)); |
| + testing::RunPendingTasks(); |
| + } |
| + |
| + // Calls must be wrapped in ASSERT_NO_FATAL_FAILURE. |
| + void RotateScreenTo(WebScreenOrientationType screen_orientation_type, |
| + uint16_t screen_orientation_angle) { |
| + WebScreenInfo screen_info; |
| + screen_info.orientation_type = screen_orientation_type; |
| + screen_info.orientation_angle = screen_orientation_angle; |
| + screen_info.rect = ScreenRectFromAngle(screen_orientation_angle); |
| + ASSERT_TRUE(screen_info.orientation_type == |
| + ScreenOrientationControllerImpl::ComputeOrientation( |
| + screen_info.rect, screen_info.orientation_angle)); |
| + |
| + ::testing::Mock::VerifyAndClearExpectations(&ChromeClient()); |
| + EXPECT_CALL(ChromeClient(), GetScreenInfo()) |
| + .Times(AtLeast(1)) |
| + .WillRepeatedly(Return(screen_info)); |
| + |
| + // Screen Orientation API |
| + ScreenOrientationController::From(*GetDocument().GetFrame()) |
| + ->NotifyOrientationChanged(); |
| + |
| + // Legacy window.orientation API |
| + GetDocument().domWindow()->SendOrientationChangeEvent(); |
| + |
| + testing::RunPendingTasks(); |
| + } |
| + |
| + void InitVideo(int video_width, int video_height) { |
| + // Set up the WebMediaPlayer instance. |
| + GetDocument().body()->AppendChild(&Video()); |
| + Video().SetSrc("https://example.com"); |
| + testing::RunPendingTasks(); |
| + SimulateVideoReadyState(HTMLMediaElement::kHaveMetadata); |
| + |
| + // Set video size. |
| + EXPECT_CALL(MockWebMediaPlayer(), NaturalSize()) |
| + .WillRepeatedly(Return(WebSize(video_width, video_height))); |
| + } |
| + |
| + void PlayVideo() { |
| + { |
| + UserGestureIndicator gesture( |
| + DocumentUserGestureToken::Create(&GetDocument())); |
| + Video().Play(); |
| + } |
| + testing::RunPendingTasks(); |
| + } |
| + |
| + void UpdateVisibilityObserver() { |
| + // Let IntersectionObserver update. |
| + GetDocument().View()->UpdateAllLifecyclePhases(); |
| + testing::RunPendingTasks(); |
| + } |
| + |
| + DeviceOrientation ComputeDeviceOrientation( |
| + DeviceOrientationData* data) const { |
| + return MediaControls() |
| + ->orientation_lock_delegate_->ComputeDeviceOrientation(data); |
| + } |
| + |
| + bool was_running_layout_test_ = false; |
| + bool natural_orientation_is_portrait_ = true; |
| +}; |
| + |
| TEST_F(MediaControlsOrientationLockDelegateTest, DelegateRequiresFlag) { |
| // Flag on by default. |
| EXPECT_TRUE(HasDelegate(*Video().GetMediaControls())); |
| @@ -238,7 +395,7 @@ TEST_F(MediaControlsOrientationLockDelegateTest, InitialState) { |
| } |
| TEST_F(MediaControlsOrientationLockDelegateTest, EnterFullscreenNoMetadata) { |
| - EXPECT_CALL(GetScreenOrientationController(), lock(_)).Times(0); |
| + EXPECT_CALL(ScreenOrientationClient(), LockOrientation(_)).Times(0); |
| SimulateEnterFullscreen(); |
| @@ -246,8 +403,8 @@ TEST_F(MediaControlsOrientationLockDelegateTest, EnterFullscreenNoMetadata) { |
| } |
| TEST_F(MediaControlsOrientationLockDelegateTest, LeaveFullscreenNoMetadata) { |
| - EXPECT_CALL(GetScreenOrientationController(), lock(_)).Times(0); |
| - EXPECT_CALL(GetScreenOrientationController(), MockUnlock()).Times(0); |
| + EXPECT_CALL(ScreenOrientationClient(), LockOrientation(_)).Times(0); |
| + EXPECT_CALL(ScreenOrientationClient(), UnlockOrientation()).Times(0); |
| SimulateEnterFullscreen(); |
| // State set to PendingMetadata. |
| @@ -259,7 +416,7 @@ TEST_F(MediaControlsOrientationLockDelegateTest, LeaveFullscreenNoMetadata) { |
| TEST_F(MediaControlsOrientationLockDelegateTest, EnterFullscreenWithMetadata) { |
| SimulateVideoReadyState(HTMLMediaElement::kHaveMetadata); |
| - EXPECT_CALL(GetScreenOrientationController(), lock(_)).Times(1); |
| + EXPECT_CALL(ScreenOrientationClient(), LockOrientation(_)).Times(1); |
| EXPECT_FALSE(DelegateWillUnlockFullscreen()); |
| SimulateEnterFullscreen(); |
| @@ -271,8 +428,8 @@ TEST_F(MediaControlsOrientationLockDelegateTest, EnterFullscreenWithMetadata) { |
| TEST_F(MediaControlsOrientationLockDelegateTest, LeaveFullscreenWithMetadata) { |
| SimulateVideoReadyState(HTMLMediaElement::kHaveMetadata); |
| - EXPECT_CALL(GetScreenOrientationController(), lock(_)).Times(1); |
| - EXPECT_CALL(GetScreenOrientationController(), MockUnlock()).Times(1); |
| + EXPECT_CALL(ScreenOrientationClient(), LockOrientation(_)).Times(1); |
| + EXPECT_CALL(ScreenOrientationClient(), UnlockOrientation()).Times(1); |
| SimulateEnterFullscreen(); |
| // State set to MaybeLockedFullscreen. |
| @@ -287,7 +444,7 @@ TEST_F(MediaControlsOrientationLockDelegateTest, EnterFullscreenAfterPageLock) { |
| SimulateOrientationLock(); |
| EXPECT_FALSE(DelegateWillUnlockFullscreen()); |
| - EXPECT_CALL(GetScreenOrientationController(), lock(_)).Times(0); |
| + EXPECT_CALL(ScreenOrientationClient(), LockOrientation(_)).Times(0); |
| SimulateEnterFullscreen(); |
| @@ -299,8 +456,8 @@ TEST_F(MediaControlsOrientationLockDelegateTest, LeaveFullscreenAfterPageLock) { |
| SimulateVideoReadyState(HTMLMediaElement::kHaveMetadata); |
| SimulateOrientationLock(); |
| - EXPECT_CALL(GetScreenOrientationController(), lock(_)).Times(0); |
| - EXPECT_CALL(GetScreenOrientationController(), MockUnlock()).Times(0); |
| + EXPECT_CALL(ScreenOrientationClient(), LockOrientation(_)).Times(0); |
| + EXPECT_CALL(ScreenOrientationClient(), UnlockOrientation()).Times(0); |
| SimulateEnterFullscreen(); |
| // State set to MaybeLockedFullscreen. |
| @@ -312,7 +469,7 @@ TEST_F(MediaControlsOrientationLockDelegateTest, LeaveFullscreenAfterPageLock) { |
| TEST_F(MediaControlsOrientationLockDelegateTest, |
| ReceivedMetadataAfterExitingFullscreen) { |
| - EXPECT_CALL(GetScreenOrientationController(), lock(_)).Times(1); |
| + EXPECT_CALL(ScreenOrientationClient(), LockOrientation(_)).Times(1); |
| SimulateEnterFullscreen(); |
| // State set to PendingMetadata. |
| @@ -329,8 +486,8 @@ TEST_F(MediaControlsOrientationLockDelegateTest, |
| } |
| TEST_F(MediaControlsOrientationLockDelegateTest, ReceivedMetadataLater) { |
| - EXPECT_CALL(GetScreenOrientationController(), lock(_)).Times(0); |
| - EXPECT_CALL(GetScreenOrientationController(), MockUnlock()).Times(0); |
| + EXPECT_CALL(ScreenOrientationClient(), LockOrientation(_)).Times(0); |
| + EXPECT_CALL(ScreenOrientationClient(), UnlockOrientation()).Times(0); |
| SimulateEnterFullscreen(); |
| // State set to PendingMetadata. |
| @@ -402,4 +559,739 @@ TEST_F(MediaControlsOrientationLockDelegateTest, ComputeOrientationLock) { |
| EXPECT_EQ(kWebScreenOrientationLockLandscape, ComputeOrientationLock()); |
| } |
| +TEST_F(MediaControlsOrientationLockAndRotateToFullscreenDelegateTest, |
| + ComputeDeviceOrientation) { |
| + InitVideo(400, 400); |
| + |
| + // Repeat test with natural_orientation_is_portrait_ = false then true. |
| + for (int n_o_i_p = false; n_o_i_p <= true; n_o_i_p++) { |
| + natural_orientation_is_portrait_ = static_cast<bool>(n_o_i_p); |
| + SCOPED_TRACE(::testing::Message() << "natural_orientation_is_portrait_=" |
| + << natural_orientation_is_portrait_); |
| + |
| + DeviceOrientation natural_orientation = natural_orientation_is_portrait_ |
| + ? DeviceOrientation::kPortrait |
| + : DeviceOrientation::kLandscape; |
| + DeviceOrientation perpendicular_to_natural_orientation = |
| + natural_orientation_is_portrait_ ? DeviceOrientation::kLandscape |
| + : DeviceOrientation::kPortrait; |
| + |
| + // There are four valid combinations of orientation type and orientation |
| + // angle for a naturally portrait device, and they should all calculate the |
| + // same device orientation (since this doesn't depend on the screen |
| + // orientation, it only depends on whether the device is naturally portrait |
| + // or naturally landscape). Similarly for a naturally landscape device. |
| + for (int screen_angle = 0; screen_angle < 360; screen_angle += 90) { |
| + SCOPED_TRACE(::testing::Message() << "screen_angle=" << screen_angle); |
| + WebScreenOrientationType screen_type = kWebScreenOrientationUndefined; |
| + switch (screen_angle) { |
| + case 0: |
| + screen_type = natural_orientation_is_portrait_ |
| + ? kWebScreenOrientationPortraitPrimary |
| + : kWebScreenOrientationLandscapePrimary; |
| + break; |
| + case 90: |
| + screen_type = natural_orientation_is_portrait_ |
| + ? kWebScreenOrientationLandscapePrimary |
| + : kWebScreenOrientationPortraitSecondary; |
| + break; |
| + case 180: |
| + screen_type = natural_orientation_is_portrait_ |
| + ? kWebScreenOrientationPortraitSecondary |
| + : kWebScreenOrientationLandscapeSecondary; |
| + break; |
| + case 270: |
| + screen_type = natural_orientation_is_portrait_ |
| + ? kWebScreenOrientationLandscapeSecondary |
| + : kWebScreenOrientationPortraitPrimary; |
| + break; |
| + } |
| + ASSERT_NO_FATAL_FAILURE(RotateScreenTo(screen_type, screen_angle)); |
| + |
| + // Compass heading is irrelevant to this calculation. |
| + double alpha = 0.0; |
| + bool absolute = false; |
| + |
| + // These beta and gamma values should all map to r < sin(24 degrees), so |
| + // orientation == kFlat, irrespective of their device_orientation_angle. |
| + EXPECT_EQ(DeviceOrientation::kFlat, // face up |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, 0. /* beta */, 0. /* gamma */, absolute))); |
| + EXPECT_EQ(DeviceOrientation::kFlat, // face down |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, 180. /* beta */, 0. /* gamma */, absolute))); |
| + EXPECT_EQ(DeviceOrientation::kFlat, // face down |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, -180. /* beta */, 0. /* gamma */, absolute))); |
| + EXPECT_EQ(DeviceOrientation::kFlat, // face up, angle=0 |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, 20. /* beta */, 0. /* gamma */, absolute))); |
| + EXPECT_EQ(DeviceOrientation::kFlat, // face up, angle=90 |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, 0. /* beta */, -20. /* gamma */, absolute))); |
| + EXPECT_EQ(DeviceOrientation::kFlat, // face up, angle=180 |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, -20. /* beta */, 0. /* gamma */, absolute))); |
| + EXPECT_EQ(DeviceOrientation::kFlat, // face up, angle=270 |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, 0. /* beta */, 20. /* gamma */, absolute))); |
| + |
| + // These beta and gamma values should all map to r ~= 1 and |
| + // device_orientation_angle % 90 ~= 45, hence orientation == kDiagonal. |
| + EXPECT_EQ(DeviceOrientation::kDiagonal, // angle=45 |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, 135. /* beta */, 90. /* gamma */, absolute))); |
| + EXPECT_EQ(DeviceOrientation::kDiagonal, // angle=45 |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, 45. /* beta */, -90. /* gamma */, absolute))); |
| + EXPECT_EQ(DeviceOrientation::kDiagonal, // angle=135 |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, -135. /* beta */, 90. /* gamma */, absolute))); |
| + EXPECT_EQ(DeviceOrientation::kDiagonal, // angle=135 |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, -45. /* beta */, -90. /* gamma */, absolute))); |
| + EXPECT_EQ(DeviceOrientation::kDiagonal, // angle=225 |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, -45. /* beta */, 90. /* gamma */, absolute))); |
| + EXPECT_EQ(DeviceOrientation::kDiagonal, // angle=225 |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, -135. /* beta */, -90. /* gamma */, absolute))); |
| + EXPECT_EQ(DeviceOrientation::kDiagonal, // angle=315 |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, 45. /* beta */, 90. /* gamma */, absolute))); |
| + EXPECT_EQ(DeviceOrientation::kDiagonal, // angle=315 |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, 135. /* beta */, -90. /* gamma */, absolute))); |
| + |
| + // These beta and gamma values should all map to r ~= 1 and |
| + // device_orientation_angle ~= 0, hence orientation == kPortrait. |
| + EXPECT_EQ(natural_orientation, |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, 90. /* beta */, 0. /* gamma */, absolute))); |
| + EXPECT_EQ(natural_orientation, |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, 90. /* beta */, 90. /* gamma */, absolute))); |
| + EXPECT_EQ(natural_orientation, |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, 90. /* beta */, -90. /* gamma */, absolute))); |
| + EXPECT_EQ(natural_orientation, |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, 85. /* beta */, 90. /* gamma */, absolute))); |
| + EXPECT_EQ(natural_orientation, |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, 85. /* beta */, -90. /* gamma */, absolute))); |
| + EXPECT_EQ(natural_orientation, |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, 95. /* beta */, 90. /* gamma */, absolute))); |
| + EXPECT_EQ(natural_orientation, |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, 95. /* beta */, -90. /* gamma */, absolute))); |
| + |
| + // These beta and gamma values should all map to r == 1 and |
| + // device_orientation_angle == 90, hence orientation == kLandscape. |
| + EXPECT_EQ(perpendicular_to_natural_orientation, |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, 0. /* beta */, -90. /* gamma */, absolute))); |
| + EXPECT_EQ(perpendicular_to_natural_orientation, |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, 180. /* beta */, 90. /* gamma */, absolute))); |
| + EXPECT_EQ(perpendicular_to_natural_orientation, |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, -180. /* beta */, 90. /* gamma */, absolute))); |
| + |
| + // These beta and gamma values should all map to r ~= 1 and |
| + // device_orientation_angle ~= 180, hence orientation == kPortrait. |
| + EXPECT_EQ(natural_orientation, |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, -90. /* beta */, 0. /* gamma */, absolute))); |
| + EXPECT_EQ(natural_orientation, |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, -90. /* beta */, 90. /* gamma */, absolute))); |
| + EXPECT_EQ(natural_orientation, |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, -90. /* beta */, -90. /* gamma */, absolute))); |
| + EXPECT_EQ(natural_orientation, |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, -85. /* beta */, 90. /* gamma */, absolute))); |
| + EXPECT_EQ(natural_orientation, |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, -85. /* beta */, -90. /* gamma */, absolute))); |
| + EXPECT_EQ(natural_orientation, |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, -95. /* beta */, 90. /* gamma */, absolute))); |
| + EXPECT_EQ(natural_orientation, |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, -95. /* beta */, -90. /* gamma */, absolute))); |
| + |
| + // These beta and gamma values should all map to r == 1 and |
| + // device_orientation_angle == 270, hence orientation == kLandscape. |
| + EXPECT_EQ(perpendicular_to_natural_orientation, |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, 0. /* beta */, 90. /* gamma */, absolute))); |
| + EXPECT_EQ(perpendicular_to_natural_orientation, |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, 180. /* beta */, -90. /* gamma */, absolute))); |
| + EXPECT_EQ(perpendicular_to_natural_orientation, |
| + ComputeDeviceOrientation(DeviceOrientationData::Create( |
| + alpha, -180. /* beta */, -90. /* gamma */, absolute))); |
| + } |
| + } |
| +} |
| + |
| +TEST_F(MediaControlsOrientationLockAndRotateToFullscreenDelegateTest, |
| + PortraitInlineRotateToLandscapeFullscreen) { |
| + // Naturally portrait device, initially portrait, with landscape video. |
| + natural_orientation_is_portrait_ = true; |
| + ASSERT_NO_FATAL_FAILURE( |
| + RotateScreenTo(kWebScreenOrientationPortraitPrimary, 0)); |
| + InitVideo(640, 480); |
| + SetIsAutoRotateEnabledByUser(true); |
| + PlayVideo(); |
| + UpdateVisibilityObserver(); |
| + |
| + // Initially inline, unlocked orientation. |
| + ASSERT_FALSE(Video().IsFullscreen()); |
| + CheckStatePendingFullscreen(); |
| + ASSERT_FALSE(DelegateWillUnlockFullscreen()); |
| + |
| + // Simulate user rotating their device to landscape triggering a screen |
| + // orientation change. |
| + ASSERT_NO_FATAL_FAILURE( |
| + RotateScreenTo(kWebScreenOrientationLandscapePrimary, 90)); |
| + |
| + // MediaControlsRotateToFullscreenDelegate should enter fullscreen, so |
| + // MediaControlsOrientationLockDelegate should lock orientation to landscape |
| + // (even though the screen is already landscape). |
| + EXPECT_TRUE(Video().IsFullscreen()); |
| + CheckStateMaybeLockedFullscreen(); |
| + EXPECT_EQ(kWebScreenOrientationLockLandscape, DelegateOrientationLock()); |
| + |
| + // Device orientation events received by MediaControlsOrientationLockDelegate |
| + // will confirm that the device is already landscape. |
| + RotateDeviceTo(90 /* landscape primary */); |
| + |
| + // MediaControlsOrientationLockDelegate should unlock orientation. |
| + CheckStatePendingFullscreen(); |
| + EXPECT_FALSE(DelegateWillUnlockFullscreen()); |
| +} |
| + |
| +TEST_F(MediaControlsOrientationLockAndRotateToFullscreenDelegateTest, |
| + PortraitInlineButtonToPortraitLockedLandscapeFullscreen) { |
| + // Naturally portrait device, initially portrait, with landscape video. |
| + natural_orientation_is_portrait_ = true; |
| + ASSERT_NO_FATAL_FAILURE( |
| + RotateScreenTo(kWebScreenOrientationPortraitPrimary, 0)); |
| + InitVideo(640, 480); |
| + SetIsAutoRotateEnabledByUser(true); |
| + |
| + // Initially inline, unlocked orientation. |
| + ASSERT_FALSE(Video().IsFullscreen()); |
| + CheckStatePendingFullscreen(); |
| + ASSERT_FALSE(DelegateWillUnlockFullscreen()); |
| + |
| + // Simulate user clicking on media controls fullscreen button. |
| + SimulateEnterFullscreen(); |
| + EXPECT_TRUE(Video().IsFullscreen()); |
| + |
| + // MediaControlsOrientationLockDelegate should lock to landscape. |
| + CheckStateMaybeLockedFullscreen(); |
| + EXPECT_EQ(kWebScreenOrientationLockLandscape, DelegateOrientationLock()); |
| + |
| + // This will trigger a screen orientation change to landscape. |
| + ASSERT_NO_FATAL_FAILURE( |
| + RotateScreenTo(kWebScreenOrientationLandscapePrimary, 90)); |
| + |
| + // Even though the device is still held in portrait. |
| + RotateDeviceTo(0 /* portrait primary */); |
| + |
| + // MediaControlsOrientationLockDelegate should remain locked to landscape. |
| + CheckStateMaybeLockedFullscreen(); |
| + EXPECT_EQ(kWebScreenOrientationLockLandscape, DelegateOrientationLock()); |
| +} |
| + |
| +TEST_F(MediaControlsOrientationLockAndRotateToFullscreenDelegateTest, |
| + PortraitLockedLandscapeFullscreenRotateToLandscapeFullscreen) { |
| + // Naturally portrait device, initially portrait device orientation but locked |
| + // to landscape screen orientation, with landscape video. |
| + natural_orientation_is_portrait_ = true; |
| + ASSERT_NO_FATAL_FAILURE( |
| + RotateScreenTo(kWebScreenOrientationLandscapePrimary, 90)); |
| + InitVideo(640, 480); |
| + SetIsAutoRotateEnabledByUser(true); |
| + |
| + // Initially fullscreen, locked orientation. |
| + SimulateEnterFullscreen(); |
| + ASSERT_TRUE(Video().IsFullscreen()); |
| + CheckStateMaybeLockedFullscreen(); |
| + EXPECT_EQ(kWebScreenOrientationLockLandscape, DelegateOrientationLock()); |
| + |
| + // Simulate user rotating their device to landscape (matching the screen |
| + // orientation lock). |
| + RotateDeviceTo(90 /* landscape primary */); |
| + |
| + // MediaControlsOrientationLockDelegate should unlock orientation. |
| + CheckStatePendingFullscreen(); |
| + EXPECT_FALSE(DelegateWillUnlockFullscreen()); |
| + EXPECT_TRUE(Video().IsFullscreen()); |
| +} |
| + |
| +TEST_F(MediaControlsOrientationLockAndRotateToFullscreenDelegateTest, |
| + PortraitLockedLandscapeFullscreenBackToPortraitInline) { |
| + // Naturally portrait device, initially portrait device orientation but locked |
| + // to landscape screen orientation, with landscape video. |
| + natural_orientation_is_portrait_ = true; |
| + ASSERT_NO_FATAL_FAILURE( |
| + RotateScreenTo(kWebScreenOrientationLandscapePrimary, 90)); |
| + InitVideo(640, 480); |
| + SetIsAutoRotateEnabledByUser(true); |
| + |
| + // Initially fullscreen, locked orientation. |
| + SimulateEnterFullscreen(); |
| + ASSERT_TRUE(Video().IsFullscreen()); |
| + CheckStateMaybeLockedFullscreen(); |
| + EXPECT_EQ(kWebScreenOrientationLockLandscape, DelegateOrientationLock()); |
| + |
| + // Simulate user clicking on media controls exit fullscreen button. |
| + // orientation lock). |
|
timvolodine
2017/05/31 18:07:21
looks like extra ")"? should there be a whole sent
johnme
2017/06/01 13:15:10
Done.
|
| + SimulateExitFullscreen(); |
| + EXPECT_FALSE(Video().IsFullscreen()); |
| + |
| + // MediaControlsOrientationLockDelegate should unlock orientation. |
| + CheckStatePendingFullscreen(); |
| + EXPECT_FALSE(DelegateWillUnlockFullscreen()); |
| + |
| + // Play the video and make it visible, just to make sure |
| + // MediaControlsRotateToFullscreenDelegate doesn't react to the |
| + // orientationchange event. |
| + PlayVideo(); |
| + UpdateVisibilityObserver(); |
| + |
| + // Unlocking the orientation earlier will trigger a screen orientation change |
| + // to portrait (since the device orientation was already portrait, even though |
| + // the screen was locked to landscape). |
| + ASSERT_NO_FATAL_FAILURE( |
| + RotateScreenTo(kWebScreenOrientationPortraitPrimary, 0)); |
| + |
| + // Video should remain inline, unlocked. |
| + CheckStatePendingFullscreen(); |
| + EXPECT_FALSE(DelegateWillUnlockFullscreen()); |
| + EXPECT_FALSE(Video().IsFullscreen()); |
| +} |
| + |
| +TEST_F(MediaControlsOrientationLockAndRotateToFullscreenDelegateTest, |
| + LandscapeInlineRotateToPortraitInline) { |
| + // Naturally portrait device, initially landscape, with landscape video. |
| + natural_orientation_is_portrait_ = true; |
| + ASSERT_NO_FATAL_FAILURE( |
| + RotateScreenTo(kWebScreenOrientationLandscapePrimary, 90)); |
| + InitVideo(640, 480); |
| + SetIsAutoRotateEnabledByUser(true); |
| + PlayVideo(); |
| + UpdateVisibilityObserver(); |
| + |
| + // Initially inline, unlocked orientation. |
| + ASSERT_FALSE(Video().IsFullscreen()); |
| + CheckStatePendingFullscreen(); |
| + ASSERT_FALSE(DelegateWillUnlockFullscreen()); |
| + |
| + // Simulate user rotating their device to portrait triggering a screen |
| + // orientation change. |
| + ASSERT_NO_FATAL_FAILURE( |
| + RotateScreenTo(kWebScreenOrientationPortraitPrimary, 0)); |
| + |
| + // Video should remain inline, unlocked. |
| + CheckStatePendingFullscreen(); |
| + EXPECT_FALSE(DelegateWillUnlockFullscreen()); |
| + EXPECT_FALSE(Video().IsFullscreen()); |
| +} |
| + |
| +TEST_F(MediaControlsOrientationLockAndRotateToFullscreenDelegateTest, |
| + LandscapeInlineButtonToLandscapeFullscreen) { |
| + // Naturally portrait device, initially landscape, with landscape video. |
| + natural_orientation_is_portrait_ = true; |
| + ASSERT_NO_FATAL_FAILURE( |
| + RotateScreenTo(kWebScreenOrientationLandscapePrimary, 90)); |
| + InitVideo(640, 480); |
| + SetIsAutoRotateEnabledByUser(true); |
| + |
| + // Initially inline, unlocked orientation. |
| + ASSERT_FALSE(Video().IsFullscreen()); |
| + CheckStatePendingFullscreen(); |
| + ASSERT_FALSE(DelegateWillUnlockFullscreen()); |
| + |
| + // Simulate user clicking on media controls fullscreen button. |
| + SimulateEnterFullscreen(); |
| + EXPECT_TRUE(Video().IsFullscreen()); |
| + |
| + // MediaControlsOrientationLockDelegate should lock to landscape (even though |
| + // the screen is already landscape). |
| + CheckStateMaybeLockedFullscreen(); |
| + EXPECT_EQ(kWebScreenOrientationLockLandscape, DelegateOrientationLock()); |
| + |
| + // Device orientation events received by MediaControlsOrientationLockDelegate |
| + // will confirm that the device is already landscape. |
| + RotateDeviceTo(90 /* landscape primary */); |
| + |
| + // MediaControlsOrientationLockDelegate should unlock orientation. |
| + CheckStatePendingFullscreen(); |
| + EXPECT_FALSE(DelegateWillUnlockFullscreen()); |
| +} |
| + |
| +TEST_F(MediaControlsOrientationLockAndRotateToFullscreenDelegateTest, |
| + LandscapeFullscreenRotateToPortraitInline) { |
| + // Naturally portrait device, initially landscape, with landscape video. |
| + natural_orientation_is_portrait_ = true; |
| + ASSERT_NO_FATAL_FAILURE( |
| + RotateScreenTo(kWebScreenOrientationLandscapePrimary, 90)); |
| + InitVideo(640, 480); |
| + SetIsAutoRotateEnabledByUser(true); |
| + |
| + // Initially fullscreen, unlocked orientation. |
| + SimulateEnterFullscreen(); |
| + RotateDeviceTo(90 /* landscape primary */); |
| + ASSERT_TRUE(Video().IsFullscreen()); |
| + CheckStatePendingFullscreen(); |
| + EXPECT_FALSE(DelegateWillUnlockFullscreen()); |
| + |
| + // Simulate user rotating their device to portrait triggering a screen |
| + // orientation change. |
| + ASSERT_NO_FATAL_FAILURE( |
| + RotateScreenTo(kWebScreenOrientationPortraitPrimary, 0)); |
| + |
| + // MediaControlsRotateToFullscreenDelegate should exit fullscreen. |
| + EXPECT_FALSE(Video().IsFullscreen()); |
| + |
| + // MediaControlsOrientationLockDelegate should remain unlocked. |
| + CheckStatePendingFullscreen(); |
| + EXPECT_FALSE(DelegateWillUnlockFullscreen()); |
| +} |
| + |
| +TEST_F(MediaControlsOrientationLockAndRotateToFullscreenDelegateTest, |
| + LandscapeFullscreenBackToLandscapeInline) { |
| + // Naturally portrait device, initially landscape, with landscape video. |
| + natural_orientation_is_portrait_ = true; |
| + ASSERT_NO_FATAL_FAILURE( |
| + RotateScreenTo(kWebScreenOrientationLandscapePrimary, 90)); |
| + InitVideo(640, 480); |
| + SetIsAutoRotateEnabledByUser(true); |
| + |
| + // Initially fullscreen, unlocked orientation. |
| + SimulateEnterFullscreen(); |
| + RotateDeviceTo(90 /* landscape primary */); |
| + ASSERT_TRUE(Video().IsFullscreen()); |
| + CheckStatePendingFullscreen(); |
| + EXPECT_FALSE(DelegateWillUnlockFullscreen()); |
| + |
| + // Simulate user clicking on media controls exit fullscreen button. |
| + // orientation lock). |
|
timvolodine
2017/05/31 18:07:21
same here
johnme
2017/06/01 13:15:10
Done.
|
| + SimulateExitFullscreen(); |
| + EXPECT_FALSE(Video().IsFullscreen()); |
| + |
| + // MediaControlsOrientationLockDelegate should remain unlocked. |
| + CheckStatePendingFullscreen(); |
| + EXPECT_FALSE(DelegateWillUnlockFullscreen()); |
| +} |
| + |
| +TEST_F( |
| + MediaControlsOrientationLockAndRotateToFullscreenDelegateTest, |
| + AutoRotateDisabledPortraitInlineButtonToPortraitLockedLandscapeFullscreen) { |
| + // Naturally portrait device, initially portrait, with landscape video. |
| + natural_orientation_is_portrait_ = true; |
| + ASSERT_NO_FATAL_FAILURE( |
| + RotateScreenTo(kWebScreenOrientationPortraitPrimary, 0)); |
| + InitVideo(640, 480); |
| + // But this time the user has disabled auto rotate, e.g. locked to portrait. |
| + SetIsAutoRotateEnabledByUser(false); |
| + |
| + // Initially inline, unlocked orientation. |
| + ASSERT_FALSE(Video().IsFullscreen()); |
| + CheckStatePendingFullscreen(); |
| + ASSERT_FALSE(DelegateWillUnlockFullscreen()); |
| + |
| + // Simulate user clicking on media controls fullscreen button. |
| + SimulateEnterFullscreen(); |
| + EXPECT_TRUE(Video().IsFullscreen()); |
| + |
| + // MediaControlsOrientationLockDelegate should lock to landscape. |
| + CheckStateMaybeLockedFullscreen(); |
| + EXPECT_EQ(kWebScreenOrientationLockLandscape, DelegateOrientationLock()); |
| + |
| + // This will trigger a screen orientation change to landscape, since the app's |
| + // lock overrides the user's orientation lock (at least on Android). |
| + ASSERT_NO_FATAL_FAILURE( |
| + RotateScreenTo(kWebScreenOrientationLandscapePrimary, 90)); |
| + |
| + // Even though the device is still held in portrait. |
| + RotateDeviceTo(0 /* portrait primary */); |
| + |
| + // MediaControlsOrientationLockDelegate should remain locked to landscape. |
| + CheckStateMaybeLockedFullscreen(); |
| + EXPECT_EQ(kWebScreenOrientationLockLandscape, DelegateOrientationLock()); |
| +} |
| + |
| +TEST_F( |
| + MediaControlsOrientationLockAndRotateToFullscreenDelegateTest, |
| + AutoRotateDisabledPortraitLockedLandscapeFullscreenRotateToLandscapeLockedLandscapeFullscreen) { |
| + // Naturally portrait device, initially portrait device orientation but locked |
| + // to landscape screen orientation, with landscape video. |
| + natural_orientation_is_portrait_ = true; |
| + ASSERT_NO_FATAL_FAILURE( |
| + RotateScreenTo(kWebScreenOrientationLandscapePrimary, 90)); |
| + InitVideo(640, 480); |
| + // But this time the user has disabled auto rotate, e.g. locked to portrait |
| + // (even though the app's landscape screen orientation lock overrides it). |
| + SetIsAutoRotateEnabledByUser(false); |
| + |
| + // Initially fullscreen, locked orientation. |
| + SimulateEnterFullscreen(); |
| + ASSERT_TRUE(Video().IsFullscreen()); |
| + CheckStateMaybeLockedFullscreen(); |
| + EXPECT_EQ(kWebScreenOrientationLockLandscape, DelegateOrientationLock()); |
| + |
| + // Simulate user rotating their device to landscape (matching the screen |
| + // orientation lock). |
| + RotateDeviceTo(90 /* landscape primary */); |
| + |
| + // MediaControlsOrientationLockDelegate should remain locked to landscape even |
| + // though the screen orientation is now landscape, since the user has disabled |
| + // auto rotate, so unlocking now would cause the device to return to the |
| + // portrait orientation. |
| + CheckStateMaybeLockedFullscreen(); |
| + EXPECT_EQ(kWebScreenOrientationLockLandscape, DelegateOrientationLock()); |
| + EXPECT_TRUE(Video().IsFullscreen()); |
| +} |
| + |
| +TEST_F( |
| + MediaControlsOrientationLockAndRotateToFullscreenDelegateTest, |
| + AutoRotateDisabledPortraitLockedLandscapeFullscreenBackToPortraitInline) { |
| + // Naturally portrait device, initially portrait device orientation but locked |
| + // to landscape screen orientation, with landscape video. |
| + natural_orientation_is_portrait_ = true; |
| + ASSERT_NO_FATAL_FAILURE( |
| + RotateScreenTo(kWebScreenOrientationLandscapePrimary, 90)); |
| + InitVideo(640, 480); |
| + // But this time the user has disabled auto rotate, e.g. locked to portrait |
| + // (even though the app's landscape screen orientation lock overrides it). |
| + SetIsAutoRotateEnabledByUser(false); |
| + |
| + // Initially fullscreen, locked orientation. |
| + SimulateEnterFullscreen(); |
| + ASSERT_TRUE(Video().IsFullscreen()); |
| + CheckStateMaybeLockedFullscreen(); |
| + EXPECT_EQ(kWebScreenOrientationLockLandscape, DelegateOrientationLock()); |
| + |
| + // Simulate user clicking on media controls exit fullscreen button. |
| + // orientation lock). |
|
timvolodine
2017/05/31 18:07:21
and here
johnme
2017/06/01 13:15:10
Done.
|
| + SimulateExitFullscreen(); |
| + EXPECT_FALSE(Video().IsFullscreen()); |
| + |
| + // MediaControlsOrientationLockDelegate should unlock orientation. |
| + CheckStatePendingFullscreen(); |
| + EXPECT_FALSE(DelegateWillUnlockFullscreen()); |
| + |
| + // Play the video and make it visible, just to make sure |
| + // MediaControlsRotateToFullscreenDelegate doesn't react to the |
| + // orientationchange event. |
| + PlayVideo(); |
| + UpdateVisibilityObserver(); |
| + |
| + // Unlocking the orientation earlier will trigger a screen orientation change |
| + // to portrait, since the user had locked the screen orientation to portrait, |
| + // (which happens to also match the device orientation) and |
| + // MediaControlsOrientationLockDelegate is no longer overriding that lock. |
| + ASSERT_NO_FATAL_FAILURE( |
| + RotateScreenTo(kWebScreenOrientationPortraitPrimary, 0)); |
| + |
| + // Video should remain inline, unlocked. |
| + CheckStatePendingFullscreen(); |
| + EXPECT_FALSE(DelegateWillUnlockFullscreen()); |
| + EXPECT_FALSE(Video().IsFullscreen()); |
| +} |
| + |
| +TEST_F( |
| + MediaControlsOrientationLockAndRotateToFullscreenDelegateTest, |
| + AutoRotateDisabledLandscapeLockedLandscapeFullscreenRotateToPortraitLockedLandscapeFullscreen) { |
| + // Naturally portrait device, initially landscape device orientation yet also |
| + // locked to landscape screen orientation since the user had disabled auto |
| + // rotate, with landscape video. |
| + natural_orientation_is_portrait_ = true; |
| + ASSERT_NO_FATAL_FAILURE( |
| + RotateScreenTo(kWebScreenOrientationLandscapePrimary, 90)); |
| + InitVideo(640, 480); |
| + // The user has disabled auto rotate, e.g. locked to portrait (even though the |
| + // app's landscape screen orientation lock overrides it). |
| + SetIsAutoRotateEnabledByUser(false); |
| + |
| + // Initially fullscreen, locked orientation. |
| + SimulateEnterFullscreen(); |
| + ASSERT_TRUE(Video().IsFullscreen()); |
| + CheckStateMaybeLockedFullscreen(); |
| + EXPECT_EQ(kWebScreenOrientationLockLandscape, DelegateOrientationLock()); |
| + |
| + // Simulate user rotating their device to portrait (matching the user's |
| + // rotation lock, but perpendicular to MediaControlsOrientationLockDelegate's |
| + // screen orientation lock which overrides it). |
| + RotateDeviceTo(0 /* portrait primary */); |
| + |
| + // Video should remain locked and fullscreen. This may disappoint users who |
| + // expect MediaControlsRotateToFullscreenDelegate to let them always leave |
| + // fullscreen by rotating perpendicular to the video's orientation (i.e. |
| + // rotating to portrait for a landscape video), however in this specific case, |
| + // since the user disabled auto rotate at the OS level, it's likely that they |
| + // wish to be able to use their phone whilst their head is lying sideways on a |
| + // pillow (or similar), in which case it's essential to keep the fullscreen |
| + // orientation lock. |
| + CheckStateMaybeLockedFullscreen(); |
| + EXPECT_EQ(kWebScreenOrientationLockLandscape, DelegateOrientationLock()); |
| + EXPECT_TRUE(Video().IsFullscreen()); |
| +} |
| + |
| +TEST_F( |
| + MediaControlsOrientationLockAndRotateToFullscreenDelegateTest, |
| + AutoRotateDisabledLandscapeLockedLandscapeFullscreenBackToPortraitInline) { |
| + // Naturally portrait device, initially landscape device orientation yet also |
| + // locked to landscape screen orientation since the user had disabled auto |
| + // rotate, with landscape video. |
| + natural_orientation_is_portrait_ = true; |
| + ASSERT_NO_FATAL_FAILURE( |
| + RotateScreenTo(kWebScreenOrientationLandscapePrimary, 90)); |
| + InitVideo(640, 480); |
| + // The user has disabled auto rotate, e.g. locked to portrait (even though the |
| + // app's landscape screen orientation lock overrides it). |
| + SetIsAutoRotateEnabledByUser(false); |
| + |
| + // Initially fullscreen, locked orientation. |
| + SimulateEnterFullscreen(); |
| + ASSERT_TRUE(Video().IsFullscreen()); |
| + CheckStateMaybeLockedFullscreen(); |
| + EXPECT_EQ(kWebScreenOrientationLockLandscape, DelegateOrientationLock()); |
| + |
| + // Simulate user clicking on media controls exit fullscreen button. |
| + // orientation lock). |
|
timvolodine
2017/05/31 18:07:21
and here
johnme
2017/06/01 13:15:10
Done.
|
| + SimulateExitFullscreen(); |
| + EXPECT_FALSE(Video().IsFullscreen()); |
| + |
| + // MediaControlsOrientationLockDelegate should unlock orientation. |
| + CheckStatePendingFullscreen(); |
| + EXPECT_FALSE(DelegateWillUnlockFullscreen()); |
| + |
| + // Play the video and make it visible, just to make sure |
| + // MediaControlsRotateToFullscreenDelegate doesn't react to the |
| + // orientationchange event. |
| + PlayVideo(); |
| + UpdateVisibilityObserver(); |
| + |
| + // Unlocking the orientation earlier will trigger a screen orientation change |
| + // to portrait even though the device orientation is landscape, since the user |
| + // had locked the screen orientation to portrait, and |
| + // MediaControlsOrientationLockDelegate is no longer overriding that. |
| + ASSERT_NO_FATAL_FAILURE( |
| + RotateScreenTo(kWebScreenOrientationPortraitPrimary, 0)); |
| + |
| + // Video should remain inline, unlocked. |
| + CheckStatePendingFullscreen(); |
| + EXPECT_FALSE(DelegateWillUnlockFullscreen()); |
| + EXPECT_FALSE(Video().IsFullscreen()); |
| +} |
| + |
| +TEST_F(MediaControlsOrientationLockAndRotateToFullscreenDelegateTest, |
| + PortraitVideoRotateEnterExit) { |
| + // Naturally portrait device, initially landscape, with *portrait* video. |
| + natural_orientation_is_portrait_ = true; |
| + ASSERT_NO_FATAL_FAILURE( |
| + RotateScreenTo(kWebScreenOrientationLandscapePrimary, 90)); |
| + InitVideo(480, 640); |
| + SetIsAutoRotateEnabledByUser(true); |
| + PlayVideo(); |
| + UpdateVisibilityObserver(); |
| + |
| + // Initially inline, unlocked orientation. |
| + ASSERT_FALSE(Video().IsFullscreen()); |
| + CheckStatePendingFullscreen(); |
| + ASSERT_FALSE(DelegateWillUnlockFullscreen()); |
| + |
| + // Simulate user rotating their device to portrait triggering a screen |
| + // orientation change. |
| + ASSERT_NO_FATAL_FAILURE( |
| + RotateScreenTo(kWebScreenOrientationPortraitPrimary, 0)); |
| + |
| + // MediaControlsRotateToFullscreenDelegate should enter fullscreen, so |
| + // MediaControlsOrientationLockDelegate should lock orientation to portrait |
| + // (even though the screen is already portrait). |
| + EXPECT_TRUE(Video().IsFullscreen()); |
| + CheckStateMaybeLockedFullscreen(); |
| + EXPECT_EQ(kWebScreenOrientationLockPortrait, DelegateOrientationLock()); |
| + |
| + // Device orientation events received by MediaControlsOrientationLockDelegate |
| + // will confirm that the device is already portrait. |
| + RotateDeviceTo(0 /* portrait primary */); |
| + |
| + // MediaControlsOrientationLockDelegate should unlock orientation. |
| + CheckStatePendingFullscreen(); |
| + EXPECT_FALSE(DelegateWillUnlockFullscreen()); |
| + EXPECT_TRUE(Video().IsFullscreen()); |
| + |
| + // Simulate user rotating their device to landscape triggering a screen |
| + // orientation change. |
| + ASSERT_NO_FATAL_FAILURE( |
| + RotateScreenTo(kWebScreenOrientationLandscapePrimary, 90)); |
| + |
| + // MediaControlsRotateToFullscreenDelegate should exit fullscreen. |
| + EXPECT_FALSE(Video().IsFullscreen()); |
| + |
| + // MediaControlsOrientationLockDelegate should remain unlocked. |
| + CheckStatePendingFullscreen(); |
| + EXPECT_FALSE(DelegateWillUnlockFullscreen()); |
| +} |
| + |
| +TEST_F(MediaControlsOrientationLockAndRotateToFullscreenDelegateTest, |
| + LandscapeDeviceRotateEnterExit) { |
| + // Naturally *landscape* device, initially portrait, with landscape video. |
| + natural_orientation_is_portrait_ = false; |
| + ASSERT_NO_FATAL_FAILURE( |
| + RotateScreenTo(kWebScreenOrientationPortraitPrimary, 270)); |
| + InitVideo(640, 480); |
| + SetIsAutoRotateEnabledByUser(true); |
| + PlayVideo(); |
| + UpdateVisibilityObserver(); |
| + |
| + // Initially inline, unlocked orientation. |
| + ASSERT_FALSE(Video().IsFullscreen()); |
| + CheckStatePendingFullscreen(); |
| + ASSERT_FALSE(DelegateWillUnlockFullscreen()); |
| + |
| + // Simulate user rotating their device to landscape triggering a screen |
| + // orientation change. |
| + ASSERT_NO_FATAL_FAILURE( |
| + RotateScreenTo(kWebScreenOrientationLandscapePrimary, 0)); |
| + |
| + // MediaControlsRotateToFullscreenDelegate should enter fullscreen, so |
| + // MediaControlsOrientationLockDelegate should lock orientation to landscape |
| + // (even though the screen is already landscape). |
| + EXPECT_TRUE(Video().IsFullscreen()); |
| + CheckStateMaybeLockedFullscreen(); |
| + EXPECT_EQ(kWebScreenOrientationLockLandscape, DelegateOrientationLock()); |
| + |
| + // Device orientation events received by MediaControlsOrientationLockDelegate |
| + // will confirm that the device is already landscape. |
| + RotateDeviceTo(0 /* landscape primary */); |
| + |
| + // MediaControlsOrientationLockDelegate should unlock orientation. |
| + CheckStatePendingFullscreen(); |
| + EXPECT_FALSE(DelegateWillUnlockFullscreen()); |
| + EXPECT_TRUE(Video().IsFullscreen()); |
| + |
| + // Simulate user rotating their device to portrait triggering a screen |
| + // orientation change. |
| + ASSERT_NO_FATAL_FAILURE( |
| + RotateScreenTo(kWebScreenOrientationPortraitPrimary, 270)); |
| + |
| + // MediaControlsRotateToFullscreenDelegate should exit fullscreen. |
| + EXPECT_FALSE(Video().IsFullscreen()); |
| + |
| + // MediaControlsOrientationLockDelegate should remain unlocked. |
| + CheckStatePendingFullscreen(); |
| + EXPECT_FALSE(DelegateWillUnlockFullscreen()); |
| +} |
| + |
| } // namespace blink |