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

Side by Side Diff: gin/wrappable_unittest.cc

Issue 79203004: [Gin] Add a mechanism for wrapping C++ object (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 1 month 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
« gin/dictionary.cc ('K') | « gin/wrappable.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "base/logging.h"
6 #include "gin/arguments.h"
7 #include "gin/gin.h"
8 #include "gin/per_isolate_data.h"
9 #include "gin/test/v8_test.h"
10 #include "gin/wrappable.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12
13 namespace gin {
14 namespace {
15
16 class MyObject : public Wrappable {
17 public:
18 static scoped_refptr<MyObject> Create();
19
20 int value() const { return value_; }
21 void set_value(int value) { value_ = value; }
22
23 static WrapperInfo kWrapperInfo;
24
25 private:
26 friend struct WrappableConverter<MyObject>;
27
28 MyObject() : value_(0) {}
29 virtual ~MyObject() {}
30
31 virtual WrapperInfo* GetWrapperInfo() OVERRIDE;
32
33 int value_;
34 };
35
36 WrapperInfo MyObject::kWrapperInfo = { kEmbedderNativeGin };
37
38 scoped_refptr<MyObject> MyObject::Create() {
39 return make_scoped_refptr(new MyObject());
40 }
41
42 WrapperInfo* MyObject::GetWrapperInfo() {
43 return &kWrapperInfo;
44 }
45
46 } // namespace
47
48 template<>
49 struct Converter<MyObject*> : public WrappableConverter<MyObject> {};
50
51 namespace {
52
53 // TODO(abarth): This is too much typing.
54
55 void MyObjectGetValue(const v8::FunctionCallbackInfo<v8::Value>& info) {
56 Arguments args(info);
57
58 MyObject* obj = 0;
59 CHECK(args.Holder(&obj));
60
61 args.Return(obj->value());
62 }
63
64 void MyObjectSetValue(const v8::FunctionCallbackInfo<v8::Value>& info) {
65 Arguments args(info);
66
67 MyObject* obj = 0;
68 CHECK(args.Holder(&obj));
69
70 int val = 0;
71 if (!args.GetNext(&val))
72 return args.ThrowError();
73
74 obj->set_value(val);
75 }
76
77 void RegisterTemplate(v8::Isolate* isolate) {
78 PerIsolateData* data = PerIsolateData::From(isolate);
79 DCHECK(data->GetObjectTemplate(&MyObject::kWrapperInfo).IsEmpty());
80
81 v8::Handle<v8::ObjectTemplate> templ = v8::ObjectTemplate::New();
82 templ->SetInternalFieldCount(kNumberOfInternalFields);
83 templ->SetAccessorProperty(
84 StringToSymbol(isolate, "value"),
85 v8::FunctionTemplate::New(MyObjectGetValue),
86 v8::FunctionTemplate::New(MyObjectSetValue));
87
88 data->SetObjectTemplate(&MyObject::kWrapperInfo, templ);
89 }
90
91 typedef V8Test WrappableTest;
92
93 TEST_F(WrappableTest, WrapAndUnwrap) {
94 v8::Isolate* isolate = instance_->isolate();
95 v8::HandleScope handle_scope(isolate);
96
97 RegisterTemplate(isolate);
98 scoped_refptr<MyObject> obj = MyObject::Create();
99
100 v8::Handle<v8::Value> wrapper = ConvertToV8(isolate, obj.get());
101 EXPECT_FALSE(wrapper.IsEmpty());
102
103 MyObject* unwrapped = 0;
104 EXPECT_TRUE(ConvertFromV8(wrapper, &unwrapped));
105 EXPECT_EQ(obj, unwrapped);
106 }
107
108 TEST_F(WrappableTest, GetAndSetProperty) {
109 v8::Isolate* isolate = instance_->isolate();
110 v8::HandleScope handle_scope(isolate);
111
112 RegisterTemplate(isolate);
113 scoped_refptr<MyObject> obj = MyObject::Create();
114
115 obj->set_value(42);
116 EXPECT_EQ(42, obj->value());
117
118 v8::Handle<v8::String> source = StringToV8(isolate,
119 "(function (obj) {"
120 " if (obj.value !== 42) throw 'FAIL';"
121 " else obj.value = 191; })");
122 EXPECT_FALSE(source.IsEmpty());
123
124 v8::TryCatch try_catch;
125 v8::Handle<v8::Script> script = v8::Script::New(source);
126 EXPECT_FALSE(script.IsEmpty());
127 v8::Handle<v8::Value> val = script->Run();
128 EXPECT_FALSE(val.IsEmpty());
129 v8::Handle<v8::Function> func;
130 EXPECT_TRUE(ConvertFromV8(val, &func));
131 v8::Handle<v8::Value> argv[] = {
132 ConvertToV8(isolate, obj.get()),
133 };
134 func->Call(v8::Undefined(isolate), 1, argv);
135
136 EXPECT_EQ(191, obj->value());
137 }
138
139 } // namespace
140 } // namespace gin
OLDNEW
« gin/dictionary.cc ('K') | « gin/wrappable.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698