 Chromium Code Reviews
 Chromium Code Reviews Issue 2734943003:
  Device Service: Decouple Wake Lock from //content  (Closed)
    
  
    Issue 2734943003:
  Device Service: Decouple Wake Lock from //content  (Closed) 
  | 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..b56680f3806510ef241cc5a6ef5cbf12f0ddc495 100644 | 
| --- a/device/wake_lock/wake_lock_service_context.cc | 
| +++ b/device/wake_lock/wake_lock_service_context.cc | 
| @@ -11,26 +11,36 @@ | 
| #include "base/threading/thread_task_runner_handle.h" | 
| #include "build/build_config.h" | 
| #include "device/power_save_blocker/power_save_blocker.h" | 
| -#include "mojo/public/cpp/bindings/strong_binding.h" | 
| namespace device { | 
| WakeLockServiceContext::WakeLockServiceContext( | 
| + mojom::WakeLockContextRequest request, | 
| + int context_id, | 
| scoped_refptr<base::SingleThreadTaskRunner> file_task_runner, | 
| - base::Callback<gfx::NativeView()> native_view_getter) | 
| + const WakeLockContextCallback& native_view_getter) | 
| : main_task_runner_(base::ThreadTaskRunnerHandle::Get()), | 
| - file_task_runner_(file_task_runner), | 
| + file_task_runner_(std::move(file_task_runner)), | 
| num_lock_requests_(0), | 
| +#if defined(OS_ANDROID) | 
| + context_id_(context_id), | 
| native_view_getter_(native_view_getter), | 
| - weak_factory_(this) {} | 
| +#endif | 
| + context_binding_(this, std::move(request)), | 
| + context_binding_encountered_error_(false) { | 
| + context_binding_.set_connection_error_handler(base::Bind( | 
| + &WakeLockServiceContext::OnContextBindingError, base::Unretained(this))); | 
| + wake_lock_bindings_.set_connection_error_handler( | 
| + base::Bind(&WakeLockServiceContext::DestroyIfNoLongerNeeded, | 
| + base::Unretained(this))); | 
| +} | 
| WakeLockServiceContext::~WakeLockServiceContext() {} | 
| -void WakeLockServiceContext::CreateService( | 
| +void WakeLockServiceContext::GetWakeLock( | 
| mojo::InterfaceRequest<mojom::WakeLockService> request) { | 
| - mojo::MakeStrongBinding( | 
| - base::MakeUnique<WakeLockServiceImpl>(weak_factory_.GetWeakPtr()), | 
| - std::move(request)); | 
| + wake_lock_bindings_.AddBinding(base::MakeUnique<WakeLockServiceImpl>(this), | 
| + std::move(request)); | 
| } | 
| void WakeLockServiceContext::RequestWakeLock() { | 
| @@ -45,8 +55,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 +68,7 @@ void WakeLockServiceContext::CreateWakeLock() { | 
| main_task_runner_, file_task_runner_)); | 
| #if defined(OS_ANDROID) | 
| - gfx::NativeView native_view = native_view_getter_.Run(); | 
| + gfx::NativeView native_view = native_view_getter_.Run(context_id_); | 
| if (native_view) { | 
| wake_lock_.get()->InitDisplaySleepBlocker(native_view); | 
| } | 
| @@ -80,4 +91,18 @@ void WakeLockServiceContext::UpdateWakeLock() { | 
| } | 
| } | 
| +void WakeLockServiceContext::OnContextBindingError() { | 
| + context_binding_encountered_error_ = true; | 
| 
blundell
2017/03/17 12:28:22
Ken, AFAICT there isn't a way to check a Binding t
 | 
| + DestroyIfNoLongerNeeded(); | 
| +} | 
| + | 
| +void WakeLockServiceContext::DestroyIfNoLongerNeeded() { | 
| + if (context_binding_encountered_error_ && wake_lock_bindings_.empty()) { | 
| + // Delete this instance once there are no more live connections to it. | 
| + // However, ensure that this instance stays alive throughout the destructor | 
| + // of a WakeLockServiceImpl instance that might be triggering this callback. | 
| + base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, this); | 
| + } | 
| +} | 
| + | 
| } // namespace device |