1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef MOJO_BINDINGS_JS_WAITING_CALLBACK_H_ 6#define MOJO_BINDINGS_JS_WAITING_CALLBACK_H_ 7 8#include "gin/handle.h" 9#include "gin/runner.h" 10#include "gin/wrappable.h" 11#include "mojo/bindings/js/handle.h" 12#include "mojo/bindings/js/handle_close_observer.h" 13#include "mojo/public/c/environment/async_waiter.h" 14#include "mojo/public/cpp/system/core.h" 15 16namespace mojo { 17namespace js { 18 19class WaitingCallback : public gin::Wrappable<WaitingCallback>, 20 public gin::HandleCloseObserver { 21 public: 22 static gin::WrapperInfo kWrapperInfo; 23 24 // Creates a new WaitingCallback. 25 static gin::Handle<WaitingCallback> Create( 26 v8::Isolate* isolate, 27 v8::Handle<v8::Function> callback, 28 gin::Handle<gin::HandleWrapper> handle_wrapper, 29 MojoHandleSignals signals); 30 31 // Cancels the callback. Does nothing if a callback is not pending. This is 32 // implicitly invoked from the destructor but can be explicitly invoked as 33 // necessary. 34 void Cancel(); 35 36 private: 37 WaitingCallback(v8::Isolate* isolate, 38 v8::Handle<v8::Function> callback, 39 gin::Handle<gin::HandleWrapper> handle_wrapper); 40 virtual ~WaitingCallback(); 41 42 // Callback from MojoAsyncWaiter. |closure| is the WaitingCallback. 43 static void CallOnHandleReady(void* closure, MojoResult result); 44 45 // Invoked from CallOnHandleReady() (CallOnHandleReady() must be static). 46 void OnHandleReady(MojoResult result); 47 48 // Invoked by the HandleWrapper if the handle is closed while this wait is 49 // still in progress. 50 virtual void OnWillCloseHandle() OVERRIDE; 51 52 base::WeakPtr<gin::Runner> runner_; 53 MojoAsyncWaitID wait_id_; 54 55 gin::HandleWrapper* handle_wrapper_; 56 57 DISALLOW_COPY_AND_ASSIGN(WaitingCallback); 58}; 59 60} // namespace js 61} // namespace mojo 62 63#endif // MOJO_BINDINGS_JS_WAITING_CALLBACK_H_ 64