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 8ea3871549e9b52282e2dc19441444eacdee1348..5def95e350cde62612f5d51f32feb358a7bbbda0 100644 |
--- a/third_party/WebKit/Source/modules/media_controls/MediaControlsOrientationLockDelegateTest.cpp |
+++ b/third_party/WebKit/Source/modules/media_controls/MediaControlsOrientationLockDelegateTest.cpp |
@@ -4,23 +4,32 @@ |
#include "modules/media_controls/MediaControlsOrientationLockDelegate.h" |
+#include "core/HTMLNames.h" |
#include "core/dom/Document.h" |
#include "core/dom/Fullscreen.h" |
#include "core/dom/UserGestureIndicator.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/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 { |
@@ -29,84 +38,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 DeviceOrientationType = |
+ MediaControlsOrientationLockDelegate::DeviceOrientationType; |
+ void SetUp() override { |
chrome_client_ = new MockChromeClient(); |
Page::PageClients clients; |
@@ -116,18 +117,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) { |
@@ -186,10 +200,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(); |
@@ -199,21 +217,158 @@ 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 to avoid this (crbug.com/726817). |
+ 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_override_for_testing_ = 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(UserGestureToken::Create(&GetDocument())); |
+ Video().Play(); |
+ } |
+ testing::RunPendingTasks(); |
+ } |
+ |
+ void UpdateVisibilityObserver() { |
+ // Let IntersectionObserver update. |
+ GetDocument().View()->UpdateAllLifecyclePhases(); |
+ testing::RunPendingTasks(); |
+ } |
+ |
+ DeviceOrientationType 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())); |
@@ -236,7 +391,7 @@ TEST_F(MediaControlsOrientationLockDelegateTest, InitialState) { |
} |
TEST_F(MediaControlsOrientationLockDelegateTest, EnterFullscreenNoMetadata) { |
- EXPECT_CALL(GetScreenOrientationController(), lock(_)).Times(0); |
+ EXPECT_CALL(ScreenOrientationClient(), LockOrientation(_)).Times(0); |
SimulateEnterFullscreen(); |
@@ -244,8 +399,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. |
@@ -257,7 +412,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(); |
@@ -269,8 +424,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. |
@@ -285,7 +440,7 @@ TEST_F(MediaControlsOrientationLockDelegateTest, EnterFullscreenAfterPageLock) { |
SimulateOrientationLock(); |
EXPECT_FALSE(DelegateWillUnlockFullscreen()); |
- EXPECT_CALL(GetScreenOrientationController(), lock(_)).Times(0); |
+ EXPECT_CALL(ScreenOrientationClient(), LockOrientation(_)).Times(0); |
SimulateEnterFullscreen(); |
@@ -297,8 +452,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. |
@@ -310,7 +465,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. |
@@ -327,8 +482,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. |
@@ -400,4 +555,735 @@ 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 = 0; n_o_i_p <= 1; 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_); |
+ |
+ DeviceOrientationType natural_orientation = |
+ natural_orientation_is_portrait_ ? DeviceOrientationType::kPortrait |
+ : DeviceOrientationType::kLandscape; |
+ DeviceOrientationType perpendicular_to_natural_orientation = |
+ natural_orientation_is_portrait_ ? DeviceOrientationType::kLandscape |
+ : DeviceOrientationType::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(DeviceOrientationType::kFlat, // face up |
+ ComputeDeviceOrientation(DeviceOrientationData::Create( |
+ alpha, 0. /* beta */, 0. /* gamma */, absolute))); |
+ EXPECT_EQ(DeviceOrientationType::kFlat, // face down |
+ ComputeDeviceOrientation(DeviceOrientationData::Create( |
+ alpha, 180. /* beta */, 0. /* gamma */, absolute))); |
+ EXPECT_EQ(DeviceOrientationType::kFlat, // face down |
+ ComputeDeviceOrientation(DeviceOrientationData::Create( |
+ alpha, -180. /* beta */, 0. /* gamma */, absolute))); |
+ EXPECT_EQ(DeviceOrientationType::kFlat, // face up, angle=0 |
+ ComputeDeviceOrientation(DeviceOrientationData::Create( |
+ alpha, 20. /* beta */, 0. /* gamma */, absolute))); |
+ EXPECT_EQ(DeviceOrientationType::kFlat, // face up, angle=90 |
+ ComputeDeviceOrientation(DeviceOrientationData::Create( |
+ alpha, 0. /* beta */, -20. /* gamma */, absolute))); |
+ EXPECT_EQ(DeviceOrientationType::kFlat, // face up, angle=180 |
+ ComputeDeviceOrientation(DeviceOrientationData::Create( |
+ alpha, -20. /* beta */, 0. /* gamma */, absolute))); |
+ EXPECT_EQ(DeviceOrientationType::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(DeviceOrientationType::kDiagonal, // angle=45 |
+ ComputeDeviceOrientation(DeviceOrientationData::Create( |
+ alpha, 135. /* beta */, 90. /* gamma */, absolute))); |
+ EXPECT_EQ(DeviceOrientationType::kDiagonal, // angle=45 |
+ ComputeDeviceOrientation(DeviceOrientationData::Create( |
+ alpha, 45. /* beta */, -90. /* gamma */, absolute))); |
+ EXPECT_EQ(DeviceOrientationType::kDiagonal, // angle=135 |
+ ComputeDeviceOrientation(DeviceOrientationData::Create( |
+ alpha, -135. /* beta */, 90. /* gamma */, absolute))); |
+ EXPECT_EQ(DeviceOrientationType::kDiagonal, // angle=135 |
+ ComputeDeviceOrientation(DeviceOrientationData::Create( |
+ alpha, -45. /* beta */, -90. /* gamma */, absolute))); |
+ EXPECT_EQ(DeviceOrientationType::kDiagonal, // angle=225 |
+ ComputeDeviceOrientation(DeviceOrientationData::Create( |
+ alpha, -45. /* beta */, 90. /* gamma */, absolute))); |
+ EXPECT_EQ(DeviceOrientationType::kDiagonal, // angle=225 |
+ ComputeDeviceOrientation(DeviceOrientationData::Create( |
+ alpha, -135. /* beta */, -90. /* gamma */, absolute))); |
+ EXPECT_EQ(DeviceOrientationType::kDiagonal, // angle=315 |
+ ComputeDeviceOrientation(DeviceOrientationData::Create( |
+ alpha, 45. /* beta */, 90. /* gamma */, absolute))); |
+ EXPECT_EQ(DeviceOrientationType::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. |
+ 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. |
+ 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. |
+ 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. |
+ 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 |