// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef MOJO_BINDINGS_JS_HANDLE_H_ #define MOJO_BINDINGS_JS_HANDLE_H_ #include "gin/converter.h" #include "gin/handle.h" #include "gin/wrappable.h" #include "mojo/public/cpp/system/core.h" namespace gin { // Wrapper for mojo Handles exposed to JavaScript. This ensures the Handle // is Closed when its JS object is garbage collected. class HandleWrapper : public gin::Wrappable { public: static gin::WrapperInfo kWrapperInfo; static gin::Handle Create(v8::Isolate* isolate, MojoHandle handle) { return gin::CreateHandle(isolate, new HandleWrapper(handle)); } mojo::Handle get() const { return handle_.get(); } mojo::Handle release() { return handle_.release(); } void Close() { handle_.reset(); } protected: HandleWrapper(MojoHandle handle); virtual ~HandleWrapper(); mojo::ScopedHandle handle_; }; // Note: It's important to use this converter rather than the one for // MojoHandle, since that will do a simple int32 conversion. It's unfortunate // there's no way to prevent against accidental use. // TODO(mpcomplete): define converters for all Handle subtypes. template<> struct Converter { static v8::Handle ToV8(v8::Isolate* isolate, const mojo::Handle& val); static bool FromV8(v8::Isolate* isolate, v8::Handle val, mojo::Handle* out); }; } // namespace gin #endif // MOJO_BINDINGS_JS_HANDLE_H_