handle.h revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
1bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller// Copyright 2014 The Chromium Authors. All rights reserved. 2bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller// Use of this source code is governed by a BSD-style license that can be 3bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller// found in the LICENSE file. 4bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 5bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller#ifndef MOJO_BINDINGS_JS_HANDLE_H_ 6bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller#define MOJO_BINDINGS_JS_HANDLE_H_ 7bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 8bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller#include "base/observer_list.h" 9bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller#include "gin/converter.h" 10bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller#include "gin/handle.h" 11bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller#include "gin/wrappable.h" 12bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller#include "mojo/public/cpp/system/core.h" 13bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 14bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillernamespace gin { 15bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillerclass HandleCloseObserver; 16bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 17bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller// Wrapper for mojo Handles exposed to JavaScript. This ensures the Handle 18bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller// is Closed when its JS object is garbage collected. 19bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillerclass HandleWrapper : public gin::Wrappable<HandleWrapper> { 20bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller public: 217fd802b96cd916e5cadf7eda7329105169dd29bbChristoph Bumiller static gin::WrapperInfo kWrapperInfo; 22bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 23bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller static gin::Handle<HandleWrapper> Create(v8::Isolate* isolate, 24bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller MojoHandle handle) { 25bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return gin::CreateHandle(isolate, new HandleWrapper(handle)); 26bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 27bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 28bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mojo::Handle get() const { return handle_.get(); } 29bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mojo::Handle release() { return handle_.release(); } 30bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller void Close(); 31bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 32bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller void AddCloseObserver(HandleCloseObserver* observer); 33bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller void RemoveCloseObserver(HandleCloseObserver* observer); 34bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 35bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller protected: 36bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller HandleWrapper(MojoHandle handle); 37bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller virtual ~HandleWrapper(); 38bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller void NotifyCloseObservers(); 39bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 40bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mojo::ScopedHandle handle_; 41bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller ObserverList<HandleCloseObserver> close_observers_; 42bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller}; 43bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 44bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller// Note: It's important to use this converter rather than the one for 45bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller// MojoHandle, since that will do a simple int32 conversion. It's unfortunate 46bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller// there's no way to prevent against accidental use. 47bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller// TODO(mpcomplete): define converters for all Handle subtypes. 48bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillertemplate<> 49bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillerstruct Converter<mojo::Handle> { 50bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller static v8::Handle<v8::Value> ToV8(v8::Isolate* isolate, 51bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller const mojo::Handle& val); 52bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller static bool FromV8(v8::Isolate* isolate, v8::Handle<v8::Value> val, 53bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller mojo::Handle* out); 54bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller}; 55bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 56bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller// We need to specialize the normal gin::Handle converter in order to handle 57bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller// converting |null| to a wrapper for an empty mojo::Handle. 58bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillertemplate<> 59bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumillerstruct Converter<gin::Handle<gin::HandleWrapper> > { 60bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller static v8::Handle<v8::Value> ToV8( 61bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller v8::Isolate* isolate, const gin::Handle<gin::HandleWrapper>& val) { 62bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return val.ToV8(); 63bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 64bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 65bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller static bool FromV8(v8::Isolate* isolate, v8::Handle<v8::Value> val, 66bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller gin::Handle<gin::HandleWrapper>* out) { 67bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (val->IsNull()) { 68bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller *out = HandleWrapper::Create(isolate, MOJO_HANDLE_INVALID); 69bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return true; 70bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 71bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 72bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller gin::HandleWrapper* object = NULL; 73bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller if (!Converter<gin::HandleWrapper*>::FromV8(isolate, val, &object)) { 74bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return false; 75bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 76bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller *out = gin::Handle<gin::HandleWrapper>(val, object); 77bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller return true; 78bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller } 79bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller}; 80bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 81bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller} // namespace gin 82bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller 83bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller#endif // MOJO_BINDINGS_JS_HANDLE_H_ 84bb0482a55bbebfdd4b06954fbfacf5a57a04b1f3Christoph Bumiller