Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(104)

Side by Side Diff: content/browser/wake_lock/wake_lock_service_context.cc

Issue 2378033002: Decouple WakeLock from direct //content dependencies (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "content/browser/wake_lock/wake_lock_service_context.h" 5 #include "content/browser/wake_lock/wake_lock_service_context.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/threading/thread_task_runner_handle.h"
10 #include "build/build_config.h" 11 #include "build/build_config.h"
11 #include "content/public/browser/browser_thread.h"
12 #include "content/public/browser/render_frame_host.h"
13 #include "content/public/browser/render_process_host.h"
14 #include "content/public/browser/web_contents.h"
15 #include "device/power_save_blocker/power_save_blocker.h" 12 #include "device/power_save_blocker/power_save_blocker.h"
16 #include "mojo/public/cpp/bindings/strong_binding.h" 13 #include "mojo/public/cpp/bindings/strong_binding.h"
17 14
18 namespace content { 15 namespace content {
19 16
20 WakeLockServiceContext::WakeLockServiceContext(WebContents* web_contents) 17 WakeLockServiceContext::WakeLockServiceContext(
21 : WebContentsObserver(web_contents), weak_factory_(this) {} 18 scoped_refptr<base::SingleThreadTaskRunner> file_task_runner,
19 base::Callback<gfx::NativeView()> native_view_getter)
20 : main_task_runner_(base::ThreadTaskRunnerHandle::Get()),
21 file_task_runner_(file_task_runner),
22 num_lock_requests_(0),
23 native_view_getter_(native_view_getter),
24 weak_factory_(this) {}
22 25
23 WakeLockServiceContext::~WakeLockServiceContext() {} 26 WakeLockServiceContext::~WakeLockServiceContext() {}
24 27
25 void WakeLockServiceContext::CreateService( 28 void WakeLockServiceContext::CreateService(
26 int render_process_id,
27 int render_frame_id,
28 mojo::InterfaceRequest<blink::mojom::WakeLockService> request) { 29 mojo::InterfaceRequest<blink::mojom::WakeLockService> request) {
29 mojo::MakeStrongBinding( 30 mojo::MakeStrongBinding(
30 base::MakeUnique<WakeLockServiceImpl>(weak_factory_.GetWeakPtr(), 31 base::MakeUnique<WakeLockServiceImpl>(weak_factory_.GetWeakPtr()),
31 render_process_id, render_frame_id),
32 std::move(request)); 32 std::move(request));
33 } 33 }
34 34
35 void WakeLockServiceContext::RenderFrameDeleted( 35 void WakeLockServiceContext::RequestWakeLock() {
36 RenderFrameHost* render_frame_host) { 36 DCHECK(main_task_runner_->RunsTasksOnCurrentThread());
37 CancelWakeLock(render_frame_host->GetProcess()->GetID(), 37 num_lock_requests_++;
38 render_frame_host->GetRoutingID());
39 }
40
41 void WakeLockServiceContext::RequestWakeLock(int render_process_id,
42 int render_frame_id) {
43 DCHECK_CURRENTLY_ON(BrowserThread::UI);
44 if (!RenderFrameHost::FromID(render_process_id, render_frame_id))
45 return;
46
47 frames_requesting_lock_.insert(
48 std::pair<int, int>(render_process_id, render_frame_id));
49 UpdateWakeLock(); 38 UpdateWakeLock();
50 } 39 }
51 40
52 void WakeLockServiceContext::CancelWakeLock(int render_process_id, 41 void WakeLockServiceContext::CancelWakeLock() {
53 int render_frame_id) { 42 DCHECK(main_task_runner_->RunsTasksOnCurrentThread());
54 DCHECK_CURRENTLY_ON(BrowserThread::UI); 43 num_lock_requests_--;
55 frames_requesting_lock_.erase(
56 std::pair<int, int>(render_process_id, render_frame_id));
57 UpdateWakeLock(); 44 UpdateWakeLock();
58 } 45 }
59 46
60 bool WakeLockServiceContext::HasWakeLockForTests() const { 47 bool WakeLockServiceContext::HasWakeLockForTests() const {
61 return !!wake_lock_; 48 return !!wake_lock_;
62 } 49 }
63 50
64 void WakeLockServiceContext::CreateWakeLock() { 51 void WakeLockServiceContext::CreateWakeLock() {
65 DCHECK(!wake_lock_); 52 DCHECK(!wake_lock_);
66 wake_lock_.reset(new device::PowerSaveBlocker( 53 wake_lock_.reset(new device::PowerSaveBlocker(
67 device::PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep, 54 device::PowerSaveBlocker::kPowerSaveBlockPreventDisplaySleep,
68 device::PowerSaveBlocker::kReasonOther, "Wake Lock API", 55 device::PowerSaveBlocker::kReasonOther, "Wake Lock API",
69 BrowserThread::GetTaskRunnerForThread(BrowserThread::UI), 56 main_task_runner_, file_task_runner_));
70 BrowserThread::GetTaskRunnerForThread(BrowserThread::FILE)));
71 57
72 #if defined(OS_ANDROID) 58 #if defined(OS_ANDROID)
73 // On Android, additionaly associate the blocker with this WebContents. 59 gfx::NativeView native_view = native_view_getter_.Run();
74 DCHECK(web_contents()); 60 if (native_view) {
75 61 wake_lock_.get()->InitDisplaySleepBlocker(native_view);
76 if (web_contents()->GetNativeView()) {
77 wake_lock_.get()->InitDisplaySleepBlocker(web_contents()->GetNativeView());
78 } 62 }
79 #endif 63 #endif
80 } 64 }
81 65
82 void WakeLockServiceContext::RemoveWakeLock() { 66 void WakeLockServiceContext::RemoveWakeLock() {
83 DCHECK(wake_lock_); 67 DCHECK(wake_lock_);
84 wake_lock_.reset(); 68 wake_lock_.reset();
85 } 69 }
86 70
87 void WakeLockServiceContext::UpdateWakeLock() { 71 void WakeLockServiceContext::UpdateWakeLock() {
88 if (!frames_requesting_lock_.empty()) { 72 DCHECK(num_lock_requests_ >= 0);
73 if (num_lock_requests_) {
89 if (!wake_lock_) 74 if (!wake_lock_)
90 CreateWakeLock(); 75 CreateWakeLock();
91 } else { 76 } else {
92 if (wake_lock_) 77 if (wake_lock_)
93 RemoveWakeLock(); 78 RemoveWakeLock();
94 } 79 }
95 } 80 }
96 81
97 } // namespace content 82 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/wake_lock/wake_lock_service_context.h ('k') | content/browser/wake_lock/wake_lock_service_context_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698