Index: gin/wrappable_unittest.cc |
diff --git a/gin/wrappable_unittest.cc b/gin/wrappable_unittest.cc |
index d6ec19e112bec7cb19cada24df2b4e81915a7437..8886a7990ccebbe7f1950f7577d25a27a039e962 100644 |
--- a/gin/wrappable_unittest.cc |
+++ b/gin/wrappable_unittest.cc |
@@ -43,14 +43,38 @@ WrapperInfo* MyObject::GetWrapperInfo() { |
return &kWrapperInfo; |
} |
-} // namespace |
-template<> |
-struct Converter<MyObject*> : public WrappableConverter<MyObject> {}; |
+class MyObject2 : public Wrappable { |
+ public: |
+ MyObject2() { |
+ } |
+ static WrapperInfo kWrapperInfo; |
+ virtual WrapperInfo* GetWrapperInfo() OVERRIDE; |
+}; |
+ |
+WrapperInfo MyObject2::kWrapperInfo = { kEmbedderNativeGin }; |
-namespace { |
+WrapperInfo* MyObject2::GetWrapperInfo() { |
+ return &kWrapperInfo; |
+} |
+ |
+ |
+class MyObjectBlink : public Wrappable { |
+ public: |
+ MyObjectBlink() { |
+ } |
+ static WrapperInfo kWrapperInfo; |
+ virtual WrapperInfo* GetWrapperInfo() OVERRIDE; |
+}; |
-void RegisterTemplate(v8::Isolate* isolate) { |
+WrapperInfo MyObjectBlink::kWrapperInfo = { kEmbedderBlink }; |
+ |
+WrapperInfo* MyObjectBlink::GetWrapperInfo() { |
+ return &kWrapperInfo; |
+} |
+ |
+ |
+void RegisterTemplates(v8::Isolate* isolate) { |
PerIsolateData* data = PerIsolateData::From(isolate); |
DCHECK(data->GetObjectTemplate(&MyObject::kWrapperInfo).IsEmpty()); |
@@ -59,6 +83,14 @@ void RegisterTemplate(v8::Isolate* isolate) { |
.Build(); |
templ->SetInternalFieldCount(kNumberOfInternalFields); |
data->SetObjectTemplate(&MyObject::kWrapperInfo, templ); |
+ |
+ templ = v8::ObjectTemplate::New(isolate); |
+ templ->SetInternalFieldCount(kNumberOfInternalFields); |
+ data->SetObjectTemplate(&MyObject2::kWrapperInfo, templ); |
+ |
+ templ = v8::ObjectTemplate::New(isolate); |
+ templ->SetInternalFieldCount(kNumberOfInternalFields); |
+ data->SetObjectTemplate(&MyObjectBlink::kWrapperInfo, templ); |
} |
typedef V8Test WrappableTest; |
@@ -67,22 +99,52 @@ TEST_F(WrappableTest, WrapAndUnwrap) { |
v8::Isolate* isolate = instance_->isolate(); |
v8::HandleScope handle_scope(isolate); |
- RegisterTemplate(isolate); |
+ RegisterTemplates(isolate); |
Handle<MyObject> obj = MyObject::Create(isolate); |
v8::Handle<v8::Value> wrapper = ConvertToV8(isolate, obj.get()); |
EXPECT_FALSE(wrapper.IsEmpty()); |
- MyObject* unwrapped = 0; |
+ MyObject* unwrapped = NULL; |
EXPECT_TRUE(ConvertFromV8(isolate, wrapper, &unwrapped)); |
EXPECT_EQ(obj.get(), unwrapped); |
} |
+TEST_F(WrappableTest, UnwrapFailures) { |
+ v8::Isolate* isolate = instance_->isolate(); |
+ v8::HandleScope handle_scope(isolate); |
+ |
+ RegisterTemplates(isolate); |
+ |
+ // Something that isn't an object. |
+ v8::Handle<v8::Value> thing = v8::Number::New(42); |
+ MyObject* unwrapped = NULL; |
+ EXPECT_FALSE(ConvertFromV8(isolate, thing, &unwrapped)); |
+ EXPECT_FALSE(unwrapped); |
+ |
+ // An object that's not wrapping anything. |
+ thing = v8::Object::New(isolate); |
+ EXPECT_FALSE(ConvertFromV8(isolate, thing, &unwrapped)); |
+ EXPECT_FALSE(unwrapped); |
+ |
+ // An object that's wrapping a C++ object from Blink. |
+ thing.Clear(); |
+ thing = ConvertToV8(isolate, new MyObjectBlink()); |
+ EXPECT_FALSE(ConvertFromV8(isolate, thing, &unwrapped)); |
+ EXPECT_FALSE(unwrapped); |
+ |
+ // An object that's wrapping a C++ object of the wrong type. |
+ thing.Clear(); |
+ thing = ConvertToV8(isolate, new MyObject2()); |
+ EXPECT_FALSE(ConvertFromV8(isolate, thing, &unwrapped)); |
+ EXPECT_FALSE(unwrapped); |
+} |
+ |
TEST_F(WrappableTest, GetAndSetProperty) { |
v8::Isolate* isolate = instance_->isolate(); |
v8::HandleScope handle_scope(isolate); |
- RegisterTemplate(isolate); |
+ RegisterTemplates(isolate); |
gin::Handle<MyObject> obj = MyObject::Create(isolate); |
obj->set_value(42); |