| Index: mojo/edk/js/waiting_callback.cc
|
| diff --git a/mojo/edk/js/waiting_callback.cc b/mojo/edk/js/waiting_callback.cc
|
| index a28791ca965347271b1cd68fbbb598214c97fefc..af34d87ef801c3fcd1a5d2331595b040de975b70 100644
|
| --- a/mojo/edk/js/waiting_callback.cc
|
| +++ b/mojo/edk/js/waiting_callback.cc
|
| @@ -7,7 +7,6 @@
|
| #include "base/bind.h"
|
| #include "base/message_loop/message_loop.h"
|
| #include "gin/per_context_data.h"
|
| -#include "mojo/public/cpp/environment/environment.h"
|
|
|
| namespace mojo {
|
| namespace edk {
|
| @@ -32,29 +31,27 @@ gin::Handle<WaitingCallback> WaitingCallback::Create(
|
| MojoHandleSignals signals) {
|
| gin::Handle<WaitingCallback> waiting_callback = gin::CreateHandle(
|
| isolate, new WaitingCallback(isolate, callback, handle_wrapper));
|
| - waiting_callback->wait_id_ = Environment::GetDefaultAsyncWaiter()->AsyncWait(
|
| - handle_wrapper->get().value(),
|
| - signals,
|
| - MOJO_DEADLINE_INDEFINITE,
|
| - &WaitingCallback::CallOnHandleReady,
|
| - waiting_callback.get());
|
| +
|
| + waiting_callback->handle_watcher_.Start(
|
| + handle_wrapper->get(), signals, MOJO_DEADLINE_INDEFINITE,
|
| + base::Bind(&WaitingCallback::OnHandleReady,
|
| + base::Unretained(waiting_callback.get())));
|
| return waiting_callback;
|
| }
|
|
|
| void WaitingCallback::Cancel() {
|
| - if (!wait_id_)
|
| + if (!handle_watcher_.is_watching())
|
| return;
|
|
|
| - handle_wrapper_->RemoveCloseObserver(this);
|
| - handle_wrapper_ = NULL;
|
| - Environment::GetDefaultAsyncWaiter()->CancelWait(wait_id_);
|
| - wait_id_ = 0;
|
| + RemoveHandleCloseObserver();
|
| + handle_watcher_.Stop();
|
| }
|
|
|
| WaitingCallback::WaitingCallback(v8::Isolate* isolate,
|
| v8::Handle<v8::Function> callback,
|
| gin::Handle<HandleWrapper> handle_wrapper)
|
| - : wait_id_(0), handle_wrapper_(handle_wrapper.get()), weak_factory_(this) {
|
| + : handle_wrapper_(handle_wrapper.get()),
|
| + weak_factory_(this) {
|
| handle_wrapper_->AddCloseObserver(this);
|
| v8::Handle<v8::Context> context = isolate->GetCurrentContext();
|
| runner_ = gin::PerContextData::From(context)->runner()->GetWeakPtr();
|
| @@ -67,25 +64,18 @@ WaitingCallback::~WaitingCallback() {
|
| Cancel();
|
| }
|
|
|
| -// static
|
| -void WaitingCallback::CallOnHandleReady(void* closure, MojoResult result) {
|
| - static_cast<WaitingCallback*>(closure)->OnHandleReady(result);
|
| -}
|
| -
|
| -void WaitingCallback::ClearWaitId() {
|
| - wait_id_ = 0;
|
| +void WaitingCallback::RemoveHandleCloseObserver() {
|
| handle_wrapper_->RemoveCloseObserver(this);
|
| handle_wrapper_ = nullptr;
|
| }
|
|
|
| void WaitingCallback::OnHandleReady(MojoResult result) {
|
| - ClearWaitId();
|
| + RemoveHandleCloseObserver();
|
| CallCallback(result);
|
| }
|
|
|
| void WaitingCallback::CallCallback(MojoResult result) {
|
| - // ClearWaitId must already have been called.
|
| - DCHECK(!wait_id_);
|
| + DCHECK(!handle_watcher_.is_watching());
|
| DCHECK(!handle_wrapper_);
|
|
|
| if (!runner_)
|
| @@ -107,11 +97,11 @@ void WaitingCallback::CallCallback(MojoResult result) {
|
| }
|
|
|
| void WaitingCallback::OnWillCloseHandle() {
|
| - Environment::GetDefaultAsyncWaiter()->CancelWait(wait_id_);
|
| + handle_watcher_.Stop();
|
|
|
| // This may be called from GC, so we can't execute Javascript now, call
|
| - // ClearWaitId explicitly, and CallCallback asynchronously.
|
| - ClearWaitId();
|
| + // RemoveHandleCloseObserver explicitly, and CallCallback asynchronously.
|
| + RemoveHandleCloseObserver();
|
| base::MessageLoop::current()->PostTask(
|
| FROM_HERE,
|
| base::Bind(&WaitingCallback::CallCallback, weak_factory_.GetWeakPtr(),
|
|
|