Index: gin/wrappable_unittest.cc |
diff --git a/gin/wrappable_unittest.cc b/gin/wrappable_unittest.cc |
index bf143cebd0650fc5d2dac61d80c67cd17f91ef0f..ec067d531f9250d2b33da4de0a01ae96f777c6e6 100644 |
--- a/gin/wrappable_unittest.cc |
+++ b/gin/wrappable_unittest.cc |
@@ -74,6 +74,36 @@ class MyObjectSubclass : public MyObject { |
} |
}; |
+class MyCallableObject : public Wrappable<MyCallableObject> { |
+ public: |
+ static WrapperInfo kWrapperInfo; |
+ |
+ static gin::Handle<MyCallableObject> Create(v8::Isolate* isolate) { |
+ return CreateHandle(isolate, new MyCallableObject()); |
+ } |
+ |
+ int result() { return result_; } |
+ |
+ private: |
+ virtual ObjectTemplateBuilder GetObjectTemplateBuilder( |
+ v8::Isolate* isolate) OVERRIDE { |
+ return Wrappable<MyCallableObject>::GetObjectTemplateBuilder(isolate) |
+ .SetCallAsFunctionHandler(&MyCallableObject::Call); |
+ } |
+ |
+ MyCallableObject() : result_(0) { |
+ } |
+ |
+ virtual ~MyCallableObject() { |
+ } |
+ |
+ void Call(int val) { |
+ result_ = val; |
+ } |
+ |
+ int result_; |
+}; |
+ |
class MyObject2 : public Wrappable<MyObject2> { |
public: |
static WrapperInfo kWrapperInfo; |
@@ -90,6 +120,7 @@ ObjectTemplateBuilder MyObject::GetObjectTemplateBuilder(v8::Isolate* isolate) { |
.SetProperty("value", &MyObject::value, &MyObject::set_value); |
} |
+WrapperInfo MyCallableObject::kWrapperInfo = { kEmbedderNativeGin }; |
WrapperInfo MyObject2::kWrapperInfo = { kEmbedderNativeGin }; |
WrapperInfo MyObjectBlink::kWrapperInfo = { kEmbedderNativeGin }; |
@@ -213,4 +244,27 @@ TEST_F(WrappableTest, ErrorInObjectConstructorProperty) { |
EXPECT_TRUE(try_catch.HasCaught()); |
} |
+TEST_F(WrappableTest, CallAsFunction) { |
+ v8::Isolate* isolate = instance_->isolate(); |
+ v8::HandleScope handle_scope(isolate); |
+ |
+ gin::Handle<MyCallableObject> object(MyCallableObject::Create(isolate)); |
+ EXPECT_EQ(0, object->result()); |
+ v8::Handle<v8::String> source = StringToV8(isolate, |
+ "(function(obj) {" |
+ "obj(42);" |
+ "})"); |
+ gin::TryCatch try_catch; |
+ v8::Handle<v8::Script> script = v8::Script::Compile(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(42, object->result()); |
+} |
+ |
} // namespace gin |