OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "modules/wake_lock/ScreenWakeLock.h" | 5 #include "modules/wake_lock/ScreenWakeLock.h" |
6 | 6 |
7 #include "core/frame/LocalFrame.h" | 7 #include "core/frame/LocalFrame.h" |
8 #include "core/frame/Screen.h" | 8 #include "core/frame/Screen.h" |
9 #include "core/page/PageVisibilityState.h" | 9 #include "core/page/PageVisibilityState.h" |
10 #include "platform/RuntimeEnabledFeatures.h" | 10 #include "platform/RuntimeEnabledFeatures.h" |
11 #include "public/platform/modules/wake_lock/WebWakeLockClient.h" | 11 #include "public/platform/ServiceRegistry.h" |
12 | 12 |
13 namespace blink { | 13 namespace blink { |
14 | 14 |
| 15 RawPtr<ScreenWakeLock> ScreenWakeLock::create(LocalFrame& frame, ServiceRegistry
* registry) |
| 16 { |
| 17 DCHECK(RuntimeEnabledFeatures::wakeLockEnabled()); |
| 18 return registry ? new ScreenWakeLock(frame, registry) : nullptr; |
| 19 } |
| 20 |
15 // static | 21 // static |
16 bool ScreenWakeLock::keepAwake(Screen& screen) | 22 bool ScreenWakeLock::keepAwake(Screen& screen) |
17 { | 23 { |
18 ScreenWakeLock* screenWakeLock = fromScreen(screen); | 24 ScreenWakeLock* screenWakeLock = fromScreen(screen); |
19 if (!screenWakeLock) | 25 if (!screenWakeLock) |
20 return false; | 26 return false; |
21 | 27 |
22 return screenWakeLock->keepAwake(); | 28 return screenWakeLock->keepAwake(); |
23 } | 29 } |
24 | 30 |
25 // static | 31 // static |
26 void ScreenWakeLock::setKeepAwake(Screen& screen, bool keepAwake) | 32 void ScreenWakeLock::setKeepAwake(Screen& screen, bool keepAwake) |
27 { | 33 { |
28 ScreenWakeLock* screenWakeLock = fromScreen(screen); | 34 ScreenWakeLock* screenWakeLock = fromScreen(screen); |
29 if (!screenWakeLock) | 35 if (screenWakeLock) |
30 return; | 36 screenWakeLock->setKeepAwake(keepAwake); |
31 | |
32 screenWakeLock->setKeepAwake(keepAwake); | |
33 } | |
34 | |
35 void ScreenWakeLock::setKeepAwake(bool keepAwake) | |
36 { | |
37 m_keepAwake = keepAwake; | |
38 notifyClient(); | |
39 } | 37 } |
40 | 38 |
41 // static | 39 // static |
42 const char* ScreenWakeLock::supplementName() | 40 const char* ScreenWakeLock::supplementName() |
43 { | 41 { |
44 return "ScreenWakeLock"; | 42 return "ScreenWakeLock"; |
45 } | 43 } |
46 | 44 |
47 // static | 45 // static |
48 ScreenWakeLock* ScreenWakeLock::from(LocalFrame* frame) | 46 ScreenWakeLock* ScreenWakeLock::from(LocalFrame* frame) |
49 { | 47 { |
50 return static_cast<ScreenWakeLock*>(Supplement<LocalFrame>::from(frame, supp
lementName())); | 48 return static_cast<ScreenWakeLock*>(Supplement<LocalFrame>::from(frame, supp
lementName())); |
51 } | 49 } |
52 | 50 |
53 // static | |
54 void ScreenWakeLock::provideTo(LocalFrame& frame, WebWakeLockClient* client) | |
55 { | |
56 ASSERT(RuntimeEnabledFeatures::wakeLockEnabled()); | |
57 Supplement<LocalFrame>::provideTo( | |
58 frame, | |
59 ScreenWakeLock::supplementName(), | |
60 new ScreenWakeLock(frame, client)); | |
61 } | |
62 | |
63 void ScreenWakeLock::pageVisibilityChanged() | 51 void ScreenWakeLock::pageVisibilityChanged() |
64 { | 52 { |
65 notifyClient(); | 53 notifyClient(); |
66 } | 54 } |
67 | 55 |
68 void ScreenWakeLock::didCommitLoad(LocalFrame* committedFrame) | 56 void ScreenWakeLock::didCommitLoad(LocalFrame* committedFrame) |
69 { | 57 { |
70 // Reset wake lock flag for this frame if it is the one being navigated. | 58 // Reset wake lock flag for this frame if it is the one being navigated. |
71 if (committedFrame == frame()) { | 59 if (committedFrame == frame()) |
72 setKeepAwake(false); | 60 setKeepAwake(false); |
73 } | |
74 } | 61 } |
75 | 62 |
76 void ScreenWakeLock::willDetachFrameHost() | 63 void ScreenWakeLock::willDetachFrameHost() |
77 { | 64 { |
78 m_client = nullptr; | 65 setKeepAwake(false); |
79 } | 66 } |
80 | 67 |
81 DEFINE_TRACE(ScreenWakeLock) | 68 DEFINE_TRACE(ScreenWakeLock) |
82 { | 69 { |
83 Supplement<LocalFrame>::trace(visitor); | 70 Supplement<LocalFrame>::trace(visitor); |
84 PageLifecycleObserver::trace(visitor); | 71 PageLifecycleObserver::trace(visitor); |
85 LocalFrameLifecycleObserver::trace(visitor); | 72 LocalFrameLifecycleObserver::trace(visitor); |
86 } | 73 } |
87 | 74 |
88 ScreenWakeLock::ScreenWakeLock(LocalFrame& frame, WebWakeLockClient* client) | 75 ScreenWakeLock::ScreenWakeLock(LocalFrame& frame, ServiceRegistry* registry) |
89 : PageLifecycleObserver(frame.page()) | 76 : PageLifecycleObserver(frame.page()) |
90 , LocalFrameLifecycleObserver(&frame) | 77 , LocalFrameLifecycleObserver(&frame) |
91 , m_client(client) | |
92 , m_keepAwake(false) | 78 , m_keepAwake(false) |
93 { | 79 { |
| 80 DCHECK(!m_service.is_bound()); |
| 81 DCHECK(registry); |
| 82 registry->connectToRemoteService(mojo::GetProxy(&m_service)); |
| 83 } |
| 84 |
| 85 bool ScreenWakeLock::keepAwake() const |
| 86 { |
| 87 return m_keepAwake; |
| 88 } |
| 89 |
| 90 void ScreenWakeLock::setKeepAwake(bool keepAwake) |
| 91 { |
| 92 m_keepAwake = keepAwake; |
| 93 notifyClient(); |
94 } | 94 } |
95 | 95 |
96 // static | 96 // static |
97 ScreenWakeLock* ScreenWakeLock::fromScreen(Screen& screen) | 97 ScreenWakeLock* ScreenWakeLock::fromScreen(Screen& screen) |
98 { | 98 { |
99 return screen.frame() ? ScreenWakeLock::from(screen.frame()) : nullptr; | 99 return screen.frame() ? ScreenWakeLock::from(screen.frame()) : nullptr; |
100 } | 100 } |
101 | 101 |
102 void ScreenWakeLock::notifyClient() | 102 void ScreenWakeLock::notifyClient() |
103 { | 103 { |
104 if (!m_client) | 104 if (!m_service) |
105 return; | 105 return; |
106 | 106 |
107 m_client->requestKeepScreenAwake(m_keepAwake && page() && page()->isPageVisi
ble()); | 107 if (m_keepAwake && frame()->page() && frame()->page()->isPageVisible()) |
| 108 m_service->RequestWakeLock(); |
| 109 else |
| 110 m_service->CancelWakeLock(); |
108 } | 111 } |
109 | 112 |
| 113 void provideScreenWakeLockTo(LocalFrame& frame, ServiceRegistry* registry) |
| 114 { |
| 115 frame.provideSupplement(ScreenWakeLock::supplementName(), ScreenWakeLock::cr
eate(frame, registry)); |
| 116 } |
| 117 |
| 118 |
110 } // namespace blink | 119 } // namespace blink |
OLD | NEW |