Chromium Code Reviews| Index: gin/wrappable.h |
| diff --git a/gin/wrappable.h b/gin/wrappable.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..5b0dfd0a155ccc87334bec2b794ecac79d38b334 |
| --- /dev/null |
| +++ b/gin/wrappable.h |
| @@ -0,0 +1,58 @@ |
| +// Copyright 2013 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 GIN_WRAPPABLE_H_ |
| +#define GIN_WRAPPABLE_H_ |
| + |
| +#include "base/memory/ref_counted.h" |
| +#include "gin/converter.h" |
| +#include "gin/public/wrapper_info.h" |
| + |
| +namespace gin { |
| + |
| +class Wrappable : public base::RefCounted<Wrappable> { |
| + public: |
| + virtual WrapperInfo* GetWrapperInfo() = 0; |
| + |
| + protected: |
| + Wrappable(); |
| + virtual ~Wrappable(); |
| + |
| + private: |
| + friend class base::RefCounted<Wrappable>; |
| + friend struct Converter<Wrappable*>; |
| + |
| + static void WeakCallback( |
| + const v8::WeakCallbackData<v8::Object, Wrappable>& data); |
| + v8::Handle<v8::Object> CreateWrapper(v8::Isolate* isolate); |
| + |
| + v8::Persistent<v8::Object> wrapper_; // Weak |
|
jochen (gone - plz use gerrit)
2013/11/21 13:06:28
if you end up copying a weak persistent, bad thing
|
| +}; |
| + |
| +template<> |
| +struct Converter<Wrappable*> { |
| + static v8::Handle<v8::Value> ToV8(v8::Isolate* isolate, |
| + Wrappable* val); |
| + static bool FromV8(v8::Handle<v8::Value> val, |
| + Wrappable** out); |
| +}; |
| + |
| +template<typename T> |
| +struct WrappableConverter { |
| + static v8::Handle<v8::Value> ToV8(v8::Isolate* isolate, T* val) { |
| + return Converter<Wrappable*>::ToV8(isolate, val); |
| + } |
| + static bool FromV8(v8::Handle<v8::Value> val, T** out) { |
| + Wrappable* wrappable = 0; |
| + if (!Converter<Wrappable*>::FromV8(val, &wrappable) |
| + || wrappable->GetWrapperInfo() != &T::kWrapperInfo) |
| + return false; |
| + *out = static_cast<T*>(wrappable); |
| + return true; |
| + } |
| +}; |
| + |
| +} // namespace gin |
| + |
| +#endif // GIN_WRAPPABLE_H_ |