Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1968)

Side by Side Diff: gin/wrappable_unittest.cc

Issue 107113005: Gin: Consolidate all the Converter<Wrappable> subclasses. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: ok Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "base/logging.h" 5 #include "base/logging.h"
6 #include "gin/arguments.h" 6 #include "gin/arguments.h"
7 #include "gin/handle.h" 7 #include "gin/handle.h"
8 #include "gin/object_template_builder.h" 8 #include "gin/object_template_builder.h"
9 #include "gin/per_isolate_data.h" 9 #include "gin/per_isolate_data.h"
10 #include "gin/public/isolate_holder.h" 10 #include "gin/public/isolate_holder.h"
(...skipping 25 matching lines...) Expand all
36 WrapperInfo MyObject::kWrapperInfo = { kEmbedderNativeGin }; 36 WrapperInfo MyObject::kWrapperInfo = { kEmbedderNativeGin };
37 37
38 gin::Handle<MyObject> MyObject::Create(v8::Isolate* isolate) { 38 gin::Handle<MyObject> MyObject::Create(v8::Isolate* isolate) {
39 return CreateHandle(isolate, new MyObject()); 39 return CreateHandle(isolate, new MyObject());
40 } 40 }
41 41
42 WrapperInfo* MyObject::GetWrapperInfo() { 42 WrapperInfo* MyObject::GetWrapperInfo() {
43 return &kWrapperInfo; 43 return &kWrapperInfo;
44 } 44 }
45 45
46 } // namespace
47 46
48 template<> 47 class MyObject2 : public Wrappable {
49 struct Converter<MyObject*> : public WrappableConverter<MyObject> {}; 48 public:
49 MyObject2() {
50 }
51 static WrapperInfo kWrapperInfo;
52 virtual WrapperInfo* GetWrapperInfo() OVERRIDE;
53 };
50 54
51 namespace { 55 WrapperInfo MyObject2::kWrapperInfo = { kEmbedderNativeGin };
52 56
53 void RegisterTemplate(v8::Isolate* isolate) { 57 WrapperInfo* MyObject2::GetWrapperInfo() {
58 return &kWrapperInfo;
59 }
60
61
62 class MyObjectBlink : public Wrappable {
63 public:
64 MyObjectBlink() {
65 }
66 static WrapperInfo kWrapperInfo;
67 virtual WrapperInfo* GetWrapperInfo() OVERRIDE;
68 };
69
70 WrapperInfo MyObjectBlink::kWrapperInfo = { kEmbedderBlink };
71
72 WrapperInfo* MyObjectBlink::GetWrapperInfo() {
73 return &kWrapperInfo;
74 }
75
76
77 void RegisterTemplates(v8::Isolate* isolate) {
54 PerIsolateData* data = PerIsolateData::From(isolate); 78 PerIsolateData* data = PerIsolateData::From(isolate);
55 DCHECK(data->GetObjectTemplate(&MyObject::kWrapperInfo).IsEmpty()); 79 DCHECK(data->GetObjectTemplate(&MyObject::kWrapperInfo).IsEmpty());
56 80
57 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplateBuilder(isolate) 81 v8::Handle<v8::ObjectTemplate> templ = ObjectTemplateBuilder(isolate)
58 .SetProperty("value", &MyObject::value, &MyObject::set_value) 82 .SetProperty("value", &MyObject::value, &MyObject::set_value)
59 .Build(); 83 .Build();
60 templ->SetInternalFieldCount(kNumberOfInternalFields); 84 templ->SetInternalFieldCount(kNumberOfInternalFields);
61 data->SetObjectTemplate(&MyObject::kWrapperInfo, templ); 85 data->SetObjectTemplate(&MyObject::kWrapperInfo, templ);
86
87 templ = v8::ObjectTemplate::New(isolate);
88 templ->SetInternalFieldCount(kNumberOfInternalFields);
89 data->SetObjectTemplate(&MyObject2::kWrapperInfo, templ);
90
91 templ = v8::ObjectTemplate::New(isolate);
92 templ->SetInternalFieldCount(kNumberOfInternalFields);
93 data->SetObjectTemplate(&MyObjectBlink::kWrapperInfo, templ);
62 } 94 }
63 95
64 typedef V8Test WrappableTest; 96 typedef V8Test WrappableTest;
65 97
66 TEST_F(WrappableTest, WrapAndUnwrap) { 98 TEST_F(WrappableTest, WrapAndUnwrap) {
67 v8::Isolate* isolate = instance_->isolate(); 99 v8::Isolate* isolate = instance_->isolate();
68 v8::HandleScope handle_scope(isolate); 100 v8::HandleScope handle_scope(isolate);
69 101
70 RegisterTemplate(isolate); 102 RegisterTemplates(isolate);
71 Handle<MyObject> obj = MyObject::Create(isolate); 103 Handle<MyObject> obj = MyObject::Create(isolate);
72 104
73 v8::Handle<v8::Value> wrapper = ConvertToV8(isolate, obj.get()); 105 v8::Handle<v8::Value> wrapper = ConvertToV8(isolate, obj.get());
74 EXPECT_FALSE(wrapper.IsEmpty()); 106 EXPECT_FALSE(wrapper.IsEmpty());
75 107
76 MyObject* unwrapped = 0; 108 MyObject* unwrapped = NULL;
77 EXPECT_TRUE(ConvertFromV8(isolate, wrapper, &unwrapped)); 109 EXPECT_TRUE(ConvertFromV8(isolate, wrapper, &unwrapped));
78 EXPECT_EQ(obj.get(), unwrapped); 110 EXPECT_EQ(obj.get(), unwrapped);
79 } 111 }
80 112
113 TEST_F(WrappableTest, UnwrapFailures) {
114 v8::Isolate* isolate = instance_->isolate();
115 v8::HandleScope handle_scope(isolate);
116
117 RegisterTemplates(isolate);
118
119 // Something that isn't an object.
120 v8::Handle<v8::Value> thing = v8::Number::New(42);
121 MyObject* unwrapped = NULL;
122 EXPECT_FALSE(ConvertFromV8(isolate, thing, &unwrapped));
123 EXPECT_FALSE(unwrapped);
124
125 // An object that's not wrapping anything.
126 thing = v8::Object::New(isolate);
127 EXPECT_FALSE(ConvertFromV8(isolate, thing, &unwrapped));
128 EXPECT_FALSE(unwrapped);
129
130 // An object that's wrapping a C++ object from Blink.
131 thing.Clear();
132 thing = ConvertToV8(isolate, new MyObjectBlink());
133 EXPECT_FALSE(ConvertFromV8(isolate, thing, &unwrapped));
134 EXPECT_FALSE(unwrapped);
135
136 // An object that's wrapping a C++ object of the wrong type.
137 thing.Clear();
138 thing = ConvertToV8(isolate, new MyObject2());
139 EXPECT_FALSE(ConvertFromV8(isolate, thing, &unwrapped));
140 EXPECT_FALSE(unwrapped);
141 }
142
81 TEST_F(WrappableTest, GetAndSetProperty) { 143 TEST_F(WrappableTest, GetAndSetProperty) {
82 v8::Isolate* isolate = instance_->isolate(); 144 v8::Isolate* isolate = instance_->isolate();
83 v8::HandleScope handle_scope(isolate); 145 v8::HandleScope handle_scope(isolate);
84 146
85 RegisterTemplate(isolate); 147 RegisterTemplates(isolate);
86 gin::Handle<MyObject> obj = MyObject::Create(isolate); 148 gin::Handle<MyObject> obj = MyObject::Create(isolate);
87 149
88 obj->set_value(42); 150 obj->set_value(42);
89 EXPECT_EQ(42, obj->value()); 151 EXPECT_EQ(42, obj->value());
90 152
91 v8::Handle<v8::String> source = StringToV8(isolate, 153 v8::Handle<v8::String> source = StringToV8(isolate,
92 "(function (obj) {" 154 "(function (obj) {"
93 " if (obj.value !== 42) throw 'FAIL';" 155 " if (obj.value !== 42) throw 'FAIL';"
94 " else obj.value = 191; })"); 156 " else obj.value = 191; })");
95 EXPECT_FALSE(source.IsEmpty()); 157 EXPECT_FALSE(source.IsEmpty());
(...skipping 10 matching lines...) Expand all
106 }; 168 };
107 func->Call(v8::Undefined(isolate), 1, argv); 169 func->Call(v8::Undefined(isolate), 1, argv);
108 EXPECT_FALSE(try_catch.HasCaught()); 170 EXPECT_FALSE(try_catch.HasCaught());
109 EXPECT_EQ("", try_catch.GetStackTrace()); 171 EXPECT_EQ("", try_catch.GetStackTrace());
110 172
111 EXPECT_EQ(191, obj->value()); 173 EXPECT_EQ(191, obj->value());
112 } 174 }
113 175
114 } // namespace 176 } // namespace
115 } // namespace gin 177 } // namespace gin
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698