Index: third_party/WebKit/Source/modules/media_controls/MediaControlsOrientationLockDelegate.cpp |
diff --git a/third_party/WebKit/Source/modules/media_controls/MediaControlsOrientationLockDelegate.cpp b/third_party/WebKit/Source/modules/media_controls/MediaControlsOrientationLockDelegate.cpp |
index 1b58a9bab3c21384eee9749fcb826f628e479688..bc5ab11aac7fbfd432ed0b52a8d9039772c4e4b3 100644 |
--- a/third_party/WebKit/Source/modules/media_controls/MediaControlsOrientationLockDelegate.cpp |
+++ b/third_party/WebKit/Source/modules/media_controls/MediaControlsOrientationLockDelegate.cpp |
@@ -4,6 +4,7 @@ |
#include "modules/media_controls/MediaControlsOrientationLockDelegate.h" |
+#include "core/dom/TaskRunnerHelper.h" |
#include "core/events/Event.h" |
#include "core/frame/LocalDOMWindow.h" |
#include "core/frame/Screen.h" |
@@ -168,6 +169,8 @@ void MediaControlsOrientationLockDelegate::MaybeUnlockOrientation() { |
ScreenOrientationController::From(*GetDocument().GetFrame())->unlock(); |
locked_orientation_ = kWebScreenOrientationLockDefault /* unlocked */; |
+ |
+ unlock_task_.Cancel(); |
} |
void MediaControlsOrientationLockDelegate::MaybeListenToDeviceOrientation() { |
@@ -403,8 +406,28 @@ void MediaControlsOrientationLockDelegate:: |
return; |
// Job done: the user rotated their device to match the orientation of the |
- // video that we locked to, so now we can unlock (and stop listening). |
- MaybeUnlockOrientation(); |
+ // video that we locked to, so now we can stop listening and unlock. |
+ if (LocalDOMWindow* dom_window = GetDocument().domWindow()) { |
+ dom_window->removeEventListener(EventTypeNames::deviceorientation, this, |
+ false); |
+ } |
+ // Delay before unlocking, as a workaround for the case where the device is |
+ // initially portrait-primary, then fullscreen orientation lock locks it to |
+ // landscape and the screen orientation changes to landscape-primary, but the |
+ // user actually rotates the device to landscape-secondary. In that case, if |
+ // this delegate unlocks the orientation before Android has detected the |
+ // rotation to landscape-secondary (which is slow due to low-pass filtering), |
+ // Android would change the screen orientation back to portrait-primary. This |
+ // is avoided by delaying unlocking long enough to ensure that Android has |
+ // detected the orientation change. |
+ unlock_task_ = |
+ TaskRunnerHelper::Get(TaskType::kMediaElementEvent, &GetDocument()) |
+ ->PostDelayedCancellableTask( |
+ BLINK_FROM_HERE, |
+ WTF::Bind( |
+ &MediaControlsOrientationLockDelegate::MaybeUnlockOrientation, |
+ WrapPersistent(this)), |
+ TimeDelta::FromMilliseconds(kUnlockDelayMs)); |
} |
DEFINE_TRACE(MediaControlsOrientationLockDelegate) { |