OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "MediaControlsOrientationLockDelegate.h" | 5 #include "MediaControlsOrientationLockDelegate.h" |
6 | 6 |
7 #include "core/events/Event.h" | 7 #include "core/events/Event.h" |
8 #include "core/frame/ScreenOrientationController.h" | 8 #include "core/frame/ScreenOrientationController.h" |
9 #include "core/html/HTMLVideoElement.h" | 9 #include "core/html/HTMLVideoElement.h" |
10 #include "core/page/ChromeClient.h" | 10 #include "core/page/ChromeClient.h" |
| 11 #include "platform/Histogram.h" |
11 #include "public/platform/WebScreenInfo.h" | 12 #include "public/platform/WebScreenInfo.h" |
12 #include "public/platform/modules/screen_orientation/WebLockOrientationCallback.
h" | 13 #include "public/platform/modules/screen_orientation/WebLockOrientationCallback.
h" |
13 | 14 |
14 namespace blink { | 15 namespace blink { |
15 | 16 |
16 namespace { | 17 namespace { |
17 | 18 |
| 19 // These values are used for histograms. Do not reorder. |
| 20 enum class MetadataAvailabilityMetrics { |
| 21 Available = 0, // Available when lock was attempted. |
| 22 Missing = 1, // Missing when lock was attempted. |
| 23 Received = 2, // Received after being missing in order to lock. |
| 24 |
| 25 // Keep at the end. |
| 26 Max = 3 |
| 27 }; |
| 28 |
| 29 // These values are used for histograms. Do not reorder. |
| 30 enum class LockResultMetrics { |
| 31 AlreadyLocked = 0, // Frame already has a lock. |
| 32 Portrait = 1, // Locked to portrait. |
| 33 Landscape = 2, // Locked to landscape. |
| 34 |
| 35 // Keep at the end. |
| 36 Max = 3 |
| 37 }; |
| 38 |
| 39 void recordMetadataAvailability(MetadataAvailabilityMetrics metrics) { |
| 40 DEFINE_STATIC_LOCAL( |
| 41 EnumerationHistogram, metadataHistogram, |
| 42 ("Media.Video.FullscreenOrientationLock.MetadataAvailability", |
| 43 static_cast<int>(MetadataAvailabilityMetrics::Max))); |
| 44 metadataHistogram.count(static_cast<int>(metrics)); |
| 45 } |
| 46 |
| 47 void recordLockResult(LockResultMetrics metrics) { |
| 48 DEFINE_STATIC_LOCAL(EnumerationHistogram, lockResultHistogram, |
| 49 ("Media.Video.FullscreenOrientationLock.LockResult", |
| 50 static_cast<int>(LockResultMetrics::Max))); |
| 51 lockResultHistogram.count(static_cast<int>(metrics)); |
| 52 } |
| 53 |
18 // WebLockOrientationCallback implementation that will not react to a success | 54 // WebLockOrientationCallback implementation that will not react to a success |
19 // nor a failure. | 55 // nor a failure. |
20 class DummyScreenOrientationCallback : public WebLockOrientationCallback { | 56 class DummyScreenOrientationCallback : public WebLockOrientationCallback { |
21 public: | 57 public: |
22 void onSuccess() override {} | 58 void onSuccess() override {} |
23 void onError(WebLockOrientationError) override {} | 59 void onError(WebLockOrientationError) override {} |
24 }; | 60 }; |
25 | 61 |
26 } // anonymous namespace | 62 } // anonymous namespace |
27 | 63 |
28 MediaControlsOrientationLockDelegate::MediaControlsOrientationLockDelegate( | 64 MediaControlsOrientationLockDelegate::MediaControlsOrientationLockDelegate( |
29 HTMLVideoElement& video) | 65 HTMLVideoElement& video) |
30 : EventListener(CPPEventListenerType), m_videoElement(video) { | 66 : EventListener(CPPEventListenerType), m_videoElement(video) { |
31 document().addEventListener(EventTypeNames::fullscreenchange, this, true); | 67 document().addEventListener(EventTypeNames::fullscreenchange, this, true); |
32 videoElement().addEventListener(EventTypeNames::webkitfullscreenchange, this, | 68 videoElement().addEventListener(EventTypeNames::webkitfullscreenchange, this, |
33 true); | 69 true); |
34 videoElement().addEventListener(EventTypeNames::loadedmetadata, this, true); | 70 videoElement().addEventListener(EventTypeNames::loadedmetadata, this, true); |
35 } | 71 } |
36 | 72 |
37 bool MediaControlsOrientationLockDelegate::operator==( | 73 bool MediaControlsOrientationLockDelegate::operator==( |
38 const EventListener& other) const { | 74 const EventListener& other) const { |
39 return this == &other; | 75 return this == &other; |
40 } | 76 } |
41 | 77 |
42 void MediaControlsOrientationLockDelegate::maybeLockOrientation() { | 78 void MediaControlsOrientationLockDelegate::maybeLockOrientation() { |
43 DCHECK(m_state != State::MaybeLockedFullscreen); | 79 DCHECK(m_state != State::MaybeLockedFullscreen); |
44 | 80 |
45 if (videoElement().getReadyState() == HTMLMediaElement::kHaveNothing) { | 81 if (videoElement().getReadyState() == HTMLMediaElement::kHaveNothing) { |
| 82 recordMetadataAvailability(MetadataAvailabilityMetrics::Missing); |
46 m_state = State::PendingMetadata; | 83 m_state = State::PendingMetadata; |
47 return; | 84 return; |
48 } | 85 } |
49 | 86 |
| 87 if (m_state == State::PendingMetadata) |
| 88 recordMetadataAvailability(MetadataAvailabilityMetrics::Received); |
| 89 else |
| 90 recordMetadataAvailability(MetadataAvailabilityMetrics::Available); |
| 91 |
50 m_state = State::MaybeLockedFullscreen; | 92 m_state = State::MaybeLockedFullscreen; |
51 | 93 |
52 if (!document().frame()) | 94 if (!document().frame()) |
53 return; | 95 return; |
54 | 96 |
55 auto controller = ScreenOrientationController::from(*document().frame()); | 97 auto controller = ScreenOrientationController::from(*document().frame()); |
56 if (controller->maybeHasActiveLock()) | 98 if (controller->maybeHasActiveLock()) { |
| 99 recordLockResult(LockResultMetrics::AlreadyLocked); |
57 return; | 100 return; |
| 101 } |
58 | 102 |
59 controller->lock(computeOrientationLock(), | 103 WebScreenOrientationLockType orientationLock = computeOrientationLock(); |
| 104 controller->lock(orientationLock, |
60 WTF::wrapUnique(new DummyScreenOrientationCallback)); | 105 WTF::wrapUnique(new DummyScreenOrientationCallback)); |
61 m_shouldUnlockOrientation = true; | 106 m_shouldUnlockOrientation = true; |
| 107 |
| 108 if (orientationLock == WebScreenOrientationLockLandscape) |
| 109 recordLockResult(LockResultMetrics::Landscape); |
| 110 else |
| 111 recordLockResult(LockResultMetrics::Portrait); |
62 } | 112 } |
63 | 113 |
64 void MediaControlsOrientationLockDelegate::maybeUnlockOrientation() { | 114 void MediaControlsOrientationLockDelegate::maybeUnlockOrientation() { |
65 DCHECK(m_state != State::PendingFullscreen); | 115 DCHECK(m_state != State::PendingFullscreen); |
66 | 116 |
67 m_state = State::PendingFullscreen; | 117 m_state = State::PendingFullscreen; |
68 | 118 |
69 if (!m_shouldUnlockOrientation) | 119 if (!m_shouldUnlockOrientation) |
70 return; | 120 return; |
71 | 121 |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
142 NOTREACHED(); | 192 NOTREACHED(); |
143 return WebScreenOrientationLockLandscape; | 193 return WebScreenOrientationLockLandscape; |
144 } | 194 } |
145 | 195 |
146 DEFINE_TRACE(MediaControlsOrientationLockDelegate) { | 196 DEFINE_TRACE(MediaControlsOrientationLockDelegate) { |
147 EventListener::trace(visitor); | 197 EventListener::trace(visitor); |
148 visitor->trace(m_videoElement); | 198 visitor->trace(m_videoElement); |
149 } | 199 } |
150 | 200 |
151 } // namespace blink | 201 } // namespace blink |
OLD | NEW |