handle.h revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
1a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file. 4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#ifndef MOJO_BINDINGS_JS_HANDLE_H_ 6a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define MOJO_BINDINGS_JS_HANDLE_H_ 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "gin/converter.h" 9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "gin/handle.h" 10c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "gin/wrappable.h" 11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "mojo/public/cpp/system/core.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace gin { 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Wrapper for mojo Handles exposed to JavaScript. This ensures the Handle 16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// is Closed when its JS object is garbage collected. 17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass HandleWrapper : public gin::Wrappable<HandleWrapper> { 18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch public: 19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static gin::WrapperInfo kWrapperInfo; 20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static gin::Handle<HandleWrapper> Create(v8::Isolate* isolate, 22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch MojoHandle handle) { 23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch return gin::CreateHandle(isolate, new HandleWrapper(handle)); 24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 26c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch mojo::Handle get() const { return handle_.get(); } 27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch mojo::Handle release() { return handle_.release(); } 28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void Close() { handle_.reset(); } 29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch protected: 31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch HandleWrapper(MojoHandle handle); 32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual ~HandleWrapper(); 33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch mojo::ScopedHandle handle_; 34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}; 35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Note: It's important to use this converter rather than the one for 37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// MojoHandle, since that will do a simple int32 conversion. It's unfortunate 38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// there's no way to prevent against accidental use. 39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// TODO(mpcomplete): define converters for all Handle subtypes. 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)template<> 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)struct Converter<mojo::Handle> { 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static v8::Handle<v8::Value> ToV8(v8::Isolate* isolate, 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const mojo::Handle& val); 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static bool FromV8(v8::Isolate* isolate, v8::Handle<v8::Value> val, 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) mojo::Handle* out); 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace gin 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 50a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#endif // MOJO_BINDINGS_JS_HANDLE_H_ 51