Index: device/wake_lock/wake_lock_service_context.cc |
diff --git a/device/wake_lock/wake_lock_service_context.cc b/device/wake_lock/wake_lock_service_context.cc |
index d30f8cdaadd5f8a7224a237932bfb02bc12e1467..5012411287db4df544cb5661d834ff6d0b6fbd4f 100644 |
--- a/device/wake_lock/wake_lock_service_context.cc |
+++ b/device/wake_lock/wake_lock_service_context.cc |
@@ -15,22 +15,42 @@ |
namespace device { |
+namespace { |
+ |
+const int kInvalidContextId = -1; |
+} |
+ |
WakeLockServiceContext::WakeLockServiceContext( |
+ mojom::WakeLockServiceContextRequest request, |
scoped_refptr<base::SingleThreadTaskRunner> file_task_runner, |
- base::Callback<gfx::NativeView()> native_view_getter) |
+ WakeLockContextCallback native_view_getter) |
: main_task_runner_(base::ThreadTaskRunnerHandle::Get()), |
file_task_runner_(file_task_runner), |
+ context_id_(kInvalidContextId), |
num_lock_requests_(0), |
native_view_getter_(native_view_getter), |
- weak_factory_(this) {} |
+ binding_(this, std::move(request)), |
+ num_connections_(1), |
+ weak_factory_(this) { |
+ binding_.set_connection_error_handler(base::Bind( |
+ &WakeLockServiceContext::OnConnectionError, base::Unretained(this))); |
+} |
WakeLockServiceContext::~WakeLockServiceContext() {} |
-void WakeLockServiceContext::CreateService( |
+void WakeLockServiceContext::SetContextID(int context_id) { |
+ context_id_ = context_id; |
+} |
+ |
+void WakeLockServiceContext::BindWakeLock( |
mojo::InterfaceRequest<mojom::WakeLockService> request) { |
- mojo::MakeStrongBinding( |
- base::MakeUnique<WakeLockServiceImpl>(weak_factory_.GetWeakPtr()), |
- std::move(request)); |
+ num_connections_++; |
+ mojo::StrongBindingPtr<mojom::WakeLockService> binding = |
+ mojo::MakeStrongBinding( |
+ base::MakeUnique<WakeLockServiceImpl>(weak_factory_.GetWeakPtr()), |
+ std::move(request)); |
+ binding->set_connection_error_handler(base::Bind( |
+ &WakeLockServiceContext::OnConnectionError, base::Unretained(this))); |
} |
void WakeLockServiceContext::RequestWakeLock() { |
@@ -45,8 +65,9 @@ void WakeLockServiceContext::CancelWakeLock() { |
UpdateWakeLock(); |
} |
-bool WakeLockServiceContext::HasWakeLockForTests() const { |
- return !!wake_lock_; |
+void WakeLockServiceContext::HasWakeLockForTests( |
+ const HasWakeLockForTestsCallback& callback) { |
+ callback.Run(!!wake_lock_); |
} |
void WakeLockServiceContext::CreateWakeLock() { |
@@ -57,7 +78,10 @@ void WakeLockServiceContext::CreateWakeLock() { |
main_task_runner_, file_task_runner_)); |
#if defined(OS_ANDROID) |
- gfx::NativeView native_view = native_view_getter_.Run(); |
+ if (context_id_ == kInvalidContextId) |
+ return; |
+ |
+ gfx::NativeView native_view = native_view_getter_.Run(context_id_); |
if (native_view) { |
wake_lock_.get()->InitDisplaySleepBlocker(native_view); |
} |
@@ -80,4 +104,11 @@ void WakeLockServiceContext::UpdateWakeLock() { |
} |
} |
+void WakeLockServiceContext::OnConnectionError() { |
+ DCHECK(num_connections_ > 0); |
+ num_connections_--; |
+ if (num_connections_ == 0) |
+ delete this; |
+} |
+ |
} // namespace device |