OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "content/browser/screen_orientation/screen_orientation_provider.h" | 5 #include "content/browser/screen_orientation/screen_orientation_provider.h" |
6 | 6 |
7 #include "base/callback_helpers.h" | 7 #include "base/callback_helpers.h" |
8 #include "content/browser/renderer_host/render_view_host_impl.h" | 8 #include "content/browser/renderer_host/render_view_host_impl.h" |
9 #include "content/browser/web_contents/web_contents_impl.h" | 9 #include "content/browser/web_contents/web_contents_impl.h" |
10 #include "content/public/browser/navigation_handle.h" | 10 #include "content/public/browser/navigation_handle.h" |
(...skipping 16 matching lines...) Expand all Loading... |
27 ScreenOrientationProvider::~ScreenOrientationProvider() = default; | 27 ScreenOrientationProvider::~ScreenOrientationProvider() = default; |
28 | 28 |
29 void ScreenOrientationProvider::LockOrientation( | 29 void ScreenOrientationProvider::LockOrientation( |
30 blink::WebScreenOrientationLockType orientation, | 30 blink::WebScreenOrientationLockType orientation, |
31 const LockOrientationCallback& callback) { | 31 const LockOrientationCallback& callback) { |
32 // Cancel any pending lock request. | 32 // Cancel any pending lock request. |
33 NotifyLockResult(ScreenOrientationLockResult:: | 33 NotifyLockResult(ScreenOrientationLockResult:: |
34 SCREEN_ORIENTATION_LOCK_RESULT_ERROR_CANCELED); | 34 SCREEN_ORIENTATION_LOCK_RESULT_ERROR_CANCELED); |
35 // Record new pending lock request. | 35 // Record new pending lock request. |
36 pending_callback_ = callback; | 36 pending_callback_ = callback; |
| 37 pending_lock_orientation_ = orientation; |
37 | 38 |
38 if (!delegate_ || !delegate_->ScreenOrientationProviderSupported()) { | 39 if (!delegate_ || !delegate_->ScreenOrientationProviderSupported()) { |
39 NotifyLockResult(ScreenOrientationLockResult:: | 40 NotifyLockResult(ScreenOrientationLockResult:: |
40 SCREEN_ORIENTATION_LOCK_RESULT_ERROR_NOT_AVAILABLE); | 41 SCREEN_ORIENTATION_LOCK_RESULT_ERROR_NOT_AVAILABLE); |
41 return; | 42 return; |
42 } | 43 } |
43 | 44 |
44 if (delegate_->FullScreenRequired(web_contents())) { | 45 if (delegate_->FullScreenRequired(web_contents())) { |
45 RenderViewHostImpl* rvhi = | 46 RenderViewHostImpl* rvhi = |
46 static_cast<RenderViewHostImpl*>(web_contents()->GetRenderViewHost()); | 47 static_cast<RenderViewHostImpl*>(web_contents()->GetRenderViewHost()); |
47 if (!rvhi) { | 48 if (!rvhi) { |
48 NotifyLockResult(ScreenOrientationLockResult:: | 49 NotifyLockResult(ScreenOrientationLockResult:: |
49 SCREEN_ORIENTATION_LOCK_RESULT_ERROR_CANCELED); | 50 SCREEN_ORIENTATION_LOCK_RESULT_ERROR_CANCELED); |
50 return; | 51 return; |
51 } | 52 } |
52 if (!static_cast<WebContentsImpl*>(web_contents()) | 53 if (!static_cast<WebContentsImpl*>(web_contents()) |
53 ->IsFullscreenForCurrentTab()) { | 54 ->IsFullscreenForCurrentTab()) { |
54 NotifyLockResult( | 55 NotifyLockResult( |
55 ScreenOrientationLockResult:: | 56 ScreenOrientationLockResult:: |
56 SCREEN_ORIENTATION_LOCK_RESULT_ERROR_FULLSCREEN_REQUIRED); | 57 SCREEN_ORIENTATION_LOCK_RESULT_ERROR_FULLSCREEN_REQUIRED); |
57 return; | 58 return; |
58 } | 59 } |
59 } | 60 } |
60 | 61 |
61 if (orientation == blink::WebScreenOrientationLockNatural) { | 62 if (orientation == blink::WebScreenOrientationLockNatural) { |
62 orientation = GetNaturalLockType(); | 63 orientation = GetNaturalLockType(); |
| 64 pending_lock_orientation_ = orientation; |
63 if (orientation == blink::WebScreenOrientationLockDefault) { | 65 if (orientation == blink::WebScreenOrientationLockDefault) { |
64 // We are in a broken state, let's pretend we got canceled. | 66 // We are in a broken state, let's pretend we got canceled. |
65 NotifyLockResult(ScreenOrientationLockResult:: | 67 NotifyLockResult(ScreenOrientationLockResult:: |
66 SCREEN_ORIENTATION_LOCK_RESULT_ERROR_CANCELED); | 68 SCREEN_ORIENTATION_LOCK_RESULT_ERROR_CANCELED); |
67 return; | 69 return; |
68 } | 70 } |
69 } | 71 } |
70 | 72 |
71 lock_applied_ = true; | 73 lock_applied_ = true; |
72 delegate_->Lock(web_contents(), orientation); | 74 delegate_->Lock(web_contents(), orientation); |
73 | 75 |
74 // If the orientation we are locking to matches the current orientation, we | 76 // If the orientation we are locking to matches the current orientation, we |
75 // should succeed immediately. | 77 // should succeed immediately. |
76 if (LockMatchesCurrentOrientation(orientation)) { | 78 if (LockMatchesCurrentOrientation(orientation)) { |
77 NotifyLockResult( | 79 NotifyLockResult( |
78 ScreenOrientationLockResult::SCREEN_ORIENTATION_LOCK_RESULT_SUCCESS); | 80 ScreenOrientationLockResult::SCREEN_ORIENTATION_LOCK_RESULT_SUCCESS); |
79 return; | 81 return; |
80 } | 82 } |
81 | 83 // After delegate_ calls Lock() above, on Android we expect the actual |
82 pending_lock_orientation_ = orientation; | 84 // orientation value be returned asynchronous from OnOrientationChange() being |
| 85 // called later, but on other platforms we do expect current orientation has |
| 86 // changed to the value we wanted to lock to, otherwise let's pretend the lock |
| 87 // got cancelled to resolve the promise in blink side. |
| 88 #if !defined(OS_ANDROID) |
| 89 else { |
| 90 NotifyLockResult(ScreenOrientationLockResult:: |
| 91 SCREEN_ORIENTATION_LOCK_RESULT_ERROR_CANCELED); |
| 92 return; |
| 93 } |
| 94 #endif |
83 } | 95 } |
84 | 96 |
85 void ScreenOrientationProvider::UnlockOrientation() { | 97 void ScreenOrientationProvider::UnlockOrientation() { |
86 // Cancel any pending lock request. | 98 // Cancel any pending lock request. |
87 NotifyLockResult(ScreenOrientationLockResult:: | 99 NotifyLockResult(ScreenOrientationLockResult:: |
88 SCREEN_ORIENTATION_LOCK_RESULT_ERROR_CANCELED); | 100 SCREEN_ORIENTATION_LOCK_RESULT_ERROR_CANCELED); |
89 | 101 |
90 if (!lock_applied_ || !delegate_) | 102 if (!lock_applied_ || !delegate_) |
91 return; | 103 return; |
92 | 104 |
93 delegate_->Unlock(web_contents()); | 105 delegate_->Unlock(web_contents()); |
94 | 106 |
95 lock_applied_ = false; | 107 lock_applied_ = false; |
96 } | 108 } |
97 | 109 |
| 110 #if defined(OS_ANDROID) |
98 void ScreenOrientationProvider::OnOrientationChange() { | 111 void ScreenOrientationProvider::OnOrientationChange() { |
99 if (!pending_lock_orientation_.has_value()) | 112 if (!pending_lock_orientation_.has_value()) |
100 return; | 113 return; |
101 | 114 |
| 115 DCHECK(!pending_callback_.is_null()); |
102 if (LockMatchesCurrentOrientation(pending_lock_orientation_.value())) { | 116 if (LockMatchesCurrentOrientation(pending_lock_orientation_.value())) { |
103 DCHECK(!pending_callback_.is_null()); | |
104 NotifyLockResult( | 117 NotifyLockResult( |
105 ScreenOrientationLockResult::SCREEN_ORIENTATION_LOCK_RESULT_SUCCESS); | 118 ScreenOrientationLockResult::SCREEN_ORIENTATION_LOCK_RESULT_SUCCESS); |
| 119 } else { |
| 120 // Screen orientation changed to a value not matching with current pending |
| 121 // lock request, let's pretend it's cancelled to resolve the promise in |
| 122 // blink side. |
| 123 NotifyLockResult(ScreenOrientationLockResult:: |
| 124 SCREEN_ORIENTATION_LOCK_RESULT_ERROR_CANCELED); |
106 } | 125 } |
107 } | 126 } |
| 127 #endif |
108 | 128 |
109 void ScreenOrientationProvider::NotifyLockResult( | 129 void ScreenOrientationProvider::NotifyLockResult( |
110 ScreenOrientationLockResult result) { | 130 ScreenOrientationLockResult result) { |
111 if (!pending_callback_.is_null()) | 131 if (!pending_callback_.is_null()) |
112 base::ResetAndReturn(&pending_callback_).Run(result); | 132 base::ResetAndReturn(&pending_callback_).Run(result); |
113 | 133 |
114 pending_lock_orientation_.reset(); | 134 pending_lock_orientation_.reset(); |
115 } | 135 } |
116 | 136 |
117 void ScreenOrientationProvider::SetDelegate( | 137 void ScreenOrientationProvider::SetDelegate( |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
213 case blink::WebScreenOrientationLockDefault: | 233 case blink::WebScreenOrientationLockDefault: |
214 NOTREACHED(); | 234 NOTREACHED(); |
215 return false; | 235 return false; |
216 } | 236 } |
217 | 237 |
218 NOTREACHED(); | 238 NOTREACHED(); |
219 return false; | 239 return false; |
220 } | 240 } |
221 | 241 |
222 } // namespace content | 242 } // namespace content |
OLD | NEW |