Index: gin/wrappable_unittest.cc |
diff --git a/gin/wrappable_unittest.cc b/gin/wrappable_unittest.cc |
index 35035ce19d74916ff62fc5977491a12a34bc4797..ad8b6b7a23c392a837d4fa3c3df40b698708a3f9 100644 |
--- a/gin/wrappable_unittest.cc |
+++ b/gin/wrappable_unittest.cc |
@@ -19,8 +19,6 @@ class MyObject : public Wrappable<MyObject> { |
public: |
static WrapperInfo kWrapperInfo; |
- static v8::Local<v8::ObjectTemplate> GetObjectTemplate(v8::Isolate* isolate); |
- |
static gin::Handle<MyObject> Create(v8::Isolate* isolate) { |
return CreateHandle(isolate, new MyObject()); |
} |
@@ -28,13 +26,42 @@ class MyObject : public Wrappable<MyObject> { |
int value() const { return value_; } |
void set_value(int value) { value_ = value; } |
- private: |
+ protected: |
MyObject() : value_(0) {} |
+ virtual ObjectTemplateBuilder GetObjectTemplateBuilder( |
+ v8::Isolate* isolate) OVERRIDE; |
virtual ~MyObject() {} |
+ private: |
int value_; |
}; |
+class MyObjectSubclass : public MyObject { |
+ public: |
+ static gin::Handle<MyObjectSubclass> Create(v8::Isolate* isolate) { |
+ return CreateHandle(isolate, new MyObjectSubclass()); |
+ } |
+ |
+ void SayHello(const std::string& name) { |
+ result = std::string("Hello, ") + name; |
+ } |
+ |
+ std::string result; |
+ |
+ private: |
+ virtual ObjectTemplateBuilder GetObjectTemplateBuilder( |
+ v8::Isolate* isolate) OVERRIDE { |
+ return MyObject::GetObjectTemplateBuilder(isolate) |
+ .SetMethod("sayHello", &MyObjectSubclass::SayHello); |
+ } |
+ |
+ MyObjectSubclass() { |
+ } |
+ |
+ virtual ~MyObjectSubclass() { |
+ } |
+}; |
+ |
class MyObject2 : public Wrappable<MyObject2> { |
public: |
static WrapperInfo kWrapperInfo; |
@@ -46,11 +73,9 @@ class MyObjectBlink : public Wrappable<MyObjectBlink> { |
}; |
WrapperInfo MyObject::kWrapperInfo = { kEmbedderNativeGin }; |
-v8::Local<v8::ObjectTemplate> MyObject::GetObjectTemplate( |
- v8::Isolate* isolate) { |
- return ObjectTemplateBuilder(isolate) |
- .SetProperty("value", &MyObject::value, &MyObject::set_value) |
- .Build(); |
+ObjectTemplateBuilder MyObject::GetObjectTemplateBuilder(v8::Isolate* isolate) { |
+ return Wrappable<MyObject>::GetObjectTemplateBuilder(isolate) |
+ .SetProperty("value", &MyObject::value, &MyObject::set_value); |
} |
WrapperInfo MyObject2::kWrapperInfo = { kEmbedderNativeGin }; |
@@ -132,4 +157,26 @@ TEST_F(WrappableTest, GetAndSetProperty) { |
EXPECT_EQ(191, obj->value()); |
} |
+TEST_F(WrappableTest, WrappableSubclass) { |
+ v8::Isolate* isolate = instance_->isolate(); |
+ v8::HandleScope handle_scope(isolate); |
+ |
+ gin::Handle<MyObjectSubclass> object(MyObjectSubclass::Create(isolate)); |
+ v8::Handle<v8::String> source = StringToV8(isolate, |
+ "(function(obj) {" |
+ "obj.sayHello('Lily');" |
+ "})"); |
+ gin::TryCatch try_catch; |
+ v8::Handle<v8::Script> script = v8::Script::New(source); |
+ v8::Handle<v8::Value> val = script->Run(); |
+ v8::Handle<v8::Function> func; |
+ EXPECT_TRUE(ConvertFromV8(isolate, val, &func)); |
+ v8::Handle<v8::Value> argv[] = { |
+ ConvertToV8(isolate, object.get()) |
+ }; |
+ func->Call(v8::Undefined(isolate), 1, argv); |
+ EXPECT_FALSE(try_catch.HasCaught()); |
+ EXPECT_EQ("Hello, Lily", object->result); |
+} |
+ |
} // namespace gin |