OLD | NEW |
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 22 matching lines...) Expand all Loading... |
33 | 33 |
34 static gin::Handle<MyObject> Create(v8::Isolate* isolate) { | 34 static gin::Handle<MyObject> Create(v8::Isolate* isolate) { |
35 return CreateHandle(isolate, new MyObject()); | 35 return CreateHandle(isolate, new MyObject()); |
36 } | 36 } |
37 | 37 |
38 int value() const { return value_; } | 38 int value() const { return value_; } |
39 void set_value(int value) { value_ = value; } | 39 void set_value(int value) { value_ = value; } |
40 | 40 |
41 protected: | 41 protected: |
42 MyObject() : value_(0) {} | 42 MyObject() : value_(0) {} |
43 ObjectTemplateBuilder GetObjectTemplateBuilder(v8::Isolate* isolate) override; | 43 ObjectTemplateBuilder GetObjectTemplateBuilder(v8::Isolate* isolate) final { |
| 44 return Wrappable<MyObject>::GetObjectTemplateBuilder(isolate) |
| 45 .SetProperty("value", &MyObject::value, &MyObject::set_value); |
| 46 } |
44 ~MyObject() override {} | 47 ~MyObject() override {} |
45 | 48 |
46 private: | 49 private: |
47 int value_; | 50 int value_; |
48 }; | 51 }; |
49 | 52 |
50 class MyObjectSubclass : public MyObject { | |
51 public: | |
52 static gin::Handle<MyObjectSubclass> Create(v8::Isolate* isolate) { | |
53 return CreateHandle(isolate, new MyObjectSubclass()); | |
54 } | |
55 | |
56 void SayHello(const std::string& name) { | |
57 result = std::string("Hello, ") + name; | |
58 } | |
59 | |
60 std::string result; | |
61 | |
62 private: | |
63 ObjectTemplateBuilder GetObjectTemplateBuilder( | |
64 v8::Isolate* isolate) override { | |
65 return MyObject::GetObjectTemplateBuilder(isolate) | |
66 .SetMethod("sayHello", &MyObjectSubclass::SayHello); | |
67 } | |
68 | |
69 MyObjectSubclass() { | |
70 } | |
71 | |
72 ~MyObjectSubclass() override {} | |
73 }; | |
74 | |
75 class MyCallableObject : public Wrappable<MyCallableObject> { | 53 class MyCallableObject : public Wrappable<MyCallableObject> { |
76 public: | 54 public: |
77 static WrapperInfo kWrapperInfo; | 55 static WrapperInfo kWrapperInfo; |
78 | 56 |
79 static gin::Handle<MyCallableObject> Create(v8::Isolate* isolate) { | 57 static gin::Handle<MyCallableObject> Create(v8::Isolate* isolate) { |
80 return CreateHandle(isolate, new MyCallableObject()); | 58 return CreateHandle(isolate, new MyCallableObject()); |
81 } | 59 } |
82 | 60 |
83 int result() { return result_; } | 61 int result() { return result_; } |
84 | 62 |
85 private: | 63 private: |
86 ObjectTemplateBuilder GetObjectTemplateBuilder( | 64 ObjectTemplateBuilder GetObjectTemplateBuilder(v8::Isolate* isolate) final { |
87 v8::Isolate* isolate) override { | |
88 return Wrappable<MyCallableObject>::GetObjectTemplateBuilder(isolate) | 65 return Wrappable<MyCallableObject>::GetObjectTemplateBuilder(isolate) |
89 .SetCallAsFunctionHandler(&MyCallableObject::Call); | 66 .SetCallAsFunctionHandler(&MyCallableObject::Call); |
90 } | 67 } |
91 | 68 |
92 MyCallableObject() : result_(0) { | 69 MyCallableObject() : result_(0) { |
93 } | 70 } |
94 | 71 |
95 ~MyCallableObject() override {} | 72 ~MyCallableObject() override {} |
96 | 73 |
97 void Call(int val1, int val2, int val3, const gin::Arguments& arguments) { | 74 void Call(int val1, int val2, int val3, const gin::Arguments& arguments) { |
98 if (arguments.IsConstructCall()) | 75 if (arguments.IsConstructCall()) |
99 arguments.ThrowTypeError("Cannot be called as constructor."); | 76 arguments.ThrowTypeError("Cannot be called as constructor."); |
100 else | 77 else |
101 result_ = val1; | 78 result_ = val1; |
102 } | 79 } |
103 | 80 |
104 int result_; | 81 int result_; |
105 }; | 82 }; |
106 | 83 |
107 class MyObject2 : public Wrappable<MyObject2> { | 84 class MyObject2 : public Wrappable<MyObject2> { |
108 public: | 85 public: |
109 static WrapperInfo kWrapperInfo; | 86 static WrapperInfo kWrapperInfo; |
110 }; | 87 }; |
111 | 88 |
112 class MyObjectBlink : public Wrappable<MyObjectBlink> { | |
113 public: | |
114 static WrapperInfo kWrapperInfo; | |
115 }; | |
116 | |
117 WrapperInfo MyObject::kWrapperInfo = { kEmbedderNativeGin }; | 89 WrapperInfo MyObject::kWrapperInfo = { kEmbedderNativeGin }; |
118 ObjectTemplateBuilder MyObject::GetObjectTemplateBuilder(v8::Isolate* isolate) { | |
119 return Wrappable<MyObject>::GetObjectTemplateBuilder(isolate) | |
120 .SetProperty("value", &MyObject::value, &MyObject::set_value); | |
121 } | |
122 | |
123 WrapperInfo MyCallableObject::kWrapperInfo = { kEmbedderNativeGin }; | 90 WrapperInfo MyCallableObject::kWrapperInfo = { kEmbedderNativeGin }; |
124 WrapperInfo MyObject2::kWrapperInfo = { kEmbedderNativeGin }; | 91 WrapperInfo MyObject2::kWrapperInfo = { kEmbedderNativeGin }; |
125 WrapperInfo MyObjectBlink::kWrapperInfo = { kEmbedderNativeGin }; | |
126 | 92 |
127 typedef V8Test WrappableTest; | 93 typedef V8Test WrappableTest; |
128 | 94 |
129 TEST_F(WrappableTest, WrapAndUnwrap) { | 95 TEST_F(WrappableTest, WrapAndUnwrap) { |
130 v8::Isolate* isolate = instance_->isolate(); | 96 v8::Isolate* isolate = instance_->isolate(); |
131 v8::HandleScope handle_scope(isolate); | 97 v8::HandleScope handle_scope(isolate); |
132 | 98 |
133 Handle<MyObject> obj = MyObject::Create(isolate); | 99 Handle<MyObject> obj = MyObject::Create(isolate); |
134 | 100 |
135 v8::Local<v8::Value> wrapper = ConvertToV8(isolate, obj.get()); | 101 v8::Local<v8::Value> wrapper = ConvertToV8(isolate, obj.get()); |
(...skipping 12 matching lines...) Expand all Loading... |
148 v8::Local<v8::Value> thing = v8::Number::New(isolate, 42); | 114 v8::Local<v8::Value> thing = v8::Number::New(isolate, 42); |
149 MyObject* unwrapped = NULL; | 115 MyObject* unwrapped = NULL; |
150 EXPECT_FALSE(ConvertFromV8(isolate, thing, &unwrapped)); | 116 EXPECT_FALSE(ConvertFromV8(isolate, thing, &unwrapped)); |
151 EXPECT_FALSE(unwrapped); | 117 EXPECT_FALSE(unwrapped); |
152 | 118 |
153 // An object that's not wrapping anything. | 119 // An object that's not wrapping anything. |
154 thing = v8::Object::New(isolate); | 120 thing = v8::Object::New(isolate); |
155 EXPECT_FALSE(ConvertFromV8(isolate, thing, &unwrapped)); | 121 EXPECT_FALSE(ConvertFromV8(isolate, thing, &unwrapped)); |
156 EXPECT_FALSE(unwrapped); | 122 EXPECT_FALSE(unwrapped); |
157 | 123 |
158 // An object that's wrapping a C++ object from Blink. | |
159 thing.Clear(); | |
160 thing = ConvertToV8(isolate, new MyObjectBlink()); | |
161 EXPECT_FALSE(ConvertFromV8(isolate, thing, &unwrapped)); | |
162 EXPECT_FALSE(unwrapped); | |
163 | |
164 // An object that's wrapping a C++ object of the wrong type. | 124 // An object that's wrapping a C++ object of the wrong type. |
165 thing.Clear(); | 125 thing.Clear(); |
166 thing = ConvertToV8(isolate, new MyObject2()); | 126 thing = ConvertToV8(isolate, new MyObject2()); |
167 EXPECT_FALSE(ConvertFromV8(isolate, thing, &unwrapped)); | 127 EXPECT_FALSE(ConvertFromV8(isolate, thing, &unwrapped)); |
168 EXPECT_FALSE(unwrapped); | 128 EXPECT_FALSE(unwrapped); |
169 } | 129 } |
170 | 130 |
171 TEST_F(WrappableTest, GetAndSetProperty) { | 131 TEST_F(WrappableTest, GetAndSetProperty) { |
172 v8::Isolate* isolate = instance_->isolate(); | 132 v8::Isolate* isolate = instance_->isolate(); |
173 v8::HandleScope handle_scope(isolate); | 133 v8::HandleScope handle_scope(isolate); |
(...skipping 19 matching lines...) Expand all Loading... |
193 v8::Local<v8::Value> argv[] = { | 153 v8::Local<v8::Value> argv[] = { |
194 ConvertToV8(isolate, obj.get()), | 154 ConvertToV8(isolate, obj.get()), |
195 }; | 155 }; |
196 func->Call(v8::Undefined(isolate), 1, argv); | 156 func->Call(v8::Undefined(isolate), 1, argv); |
197 EXPECT_FALSE(try_catch.HasCaught()); | 157 EXPECT_FALSE(try_catch.HasCaught()); |
198 EXPECT_EQ("", try_catch.GetStackTrace()); | 158 EXPECT_EQ("", try_catch.GetStackTrace()); |
199 | 159 |
200 EXPECT_EQ(191, obj->value()); | 160 EXPECT_EQ(191, obj->value()); |
201 } | 161 } |
202 | 162 |
203 TEST_F(WrappableTest, WrappableSubclass) { | |
204 v8::Isolate* isolate = instance_->isolate(); | |
205 v8::HandleScope handle_scope(isolate); | |
206 | |
207 gin::Handle<MyObjectSubclass> object(MyObjectSubclass::Create(isolate)); | |
208 v8::Local<v8::String> source = StringToV8(isolate, | |
209 "(function(obj) {" | |
210 "obj.sayHello('Lily');" | |
211 "})"); | |
212 gin::TryCatch try_catch(isolate); | |
213 v8::Local<v8::Script> script = v8::Script::Compile(source); | |
214 v8::Local<v8::Value> val = script->Run(); | |
215 v8::Local<v8::Function> func; | |
216 EXPECT_TRUE(ConvertFromV8(isolate, val, &func)); | |
217 v8::Local<v8::Value> argv[] = { | |
218 ConvertToV8(isolate, object.get()) | |
219 }; | |
220 func->Call(v8::Undefined(isolate), 1, argv); | |
221 EXPECT_FALSE(try_catch.HasCaught()); | |
222 EXPECT_EQ("Hello, Lily", object->result); | |
223 } | |
224 | |
225 TEST_F(WrappableTest, CallAsFunction) { | 163 TEST_F(WrappableTest, CallAsFunction) { |
226 v8::Isolate* isolate = instance_->isolate(); | 164 v8::Isolate* isolate = instance_->isolate(); |
227 v8::HandleScope handle_scope(isolate); | 165 v8::HandleScope handle_scope(isolate); |
228 | 166 |
229 gin::Handle<MyCallableObject> object(MyCallableObject::Create(isolate)); | 167 gin::Handle<MyCallableObject> object(MyCallableObject::Create(isolate)); |
230 EXPECT_EQ(0, object->result()); | 168 EXPECT_EQ(0, object->result()); |
231 v8::Local<v8::String> source = StringToV8(isolate, | 169 v8::Local<v8::String> source = StringToV8(isolate, |
232 "(function(obj) {" | 170 "(function(obj) {" |
233 "obj(42, 2, 5);" | 171 "obj(42, 2, 5);" |
234 "})"); | 172 "})"); |
(...skipping 26 matching lines...) Expand all Loading... |
261 v8::Local<v8::Function> func; | 199 v8::Local<v8::Function> func; |
262 EXPECT_TRUE(ConvertFromV8(isolate, val, &func)); | 200 EXPECT_TRUE(ConvertFromV8(isolate, val, &func)); |
263 v8::Local<v8::Value> argv[] = { | 201 v8::Local<v8::Value> argv[] = { |
264 ConvertToV8(isolate, object.get()) | 202 ConvertToV8(isolate, object.get()) |
265 }; | 203 }; |
266 func->Call(v8::Undefined(isolate), 1, argv); | 204 func->Call(v8::Undefined(isolate), 1, argv); |
267 EXPECT_TRUE(try_catch.HasCaught()); | 205 EXPECT_TRUE(try_catch.HasCaught()); |
268 } | 206 } |
269 | 207 |
270 } // namespace gin | 208 } // namespace gin |
OLD | NEW |