OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (c) 2011 The Native Client Authors. All rights reserved. | |
3 * Use of this source code is governed by a BSD-style license that can be | |
4 * found in the LICENSE file. | |
5 */ | |
6 | |
7 #include <string.h> | |
8 #include <map> | |
9 #include <string> | |
10 | |
11 #include "native_client/tests/fake_browser_ppapi/fake_object.h" | |
12 | |
13 #include "native_client/src/include/nacl_macros.h" | |
14 #include "native_client/src/include/portability.h" | |
15 #include "native_client/src/shared/ppapi_proxy/plugin_ppb_var_deprecated.h" | |
16 #include "native_client/tests/fake_browser_ppapi/utility.h" | |
17 #include "ppapi/c/dev/ppb_var_deprecated.h" | |
18 #include "ppapi/c/pp_var.h" | |
19 | |
20 using fake_browser_ppapi::DebugPrintf; | |
21 using ppapi_proxy::PluginVarDeprecated; | |
22 using fake_browser_ppapi::Object; | |
23 | |
24 namespace fake_browser_ppapi { | |
25 | |
26 const PPB_Var_Deprecated* ppb_var_deprecated = NULL; | |
27 | |
28 bool Object::HasProperty(PP_Var name, | |
29 PP_Var* exception) { | |
30 UNREFERENCED_PARAMETER(exception); | |
31 DebugPrintf("Object::HasProperty: object=%p, name=%s\n", | |
32 reinterpret_cast<void*>(this), | |
33 PluginVarDeprecated::DebugString(name).c_str()); | |
34 Object* browser_obj = reinterpret_cast<Object*>(this); | |
35 Object::PropertyMap::iterator i = | |
36 browser_obj->properties()->find(PluginVarDeprecated::DebugString(name)); | |
37 return (i != browser_obj->properties()->end()); | |
38 } | |
39 | |
40 bool Object::HasMethod(PP_Var name, | |
41 PP_Var* exception) { | |
42 UNREFERENCED_PARAMETER(exception); | |
43 DebugPrintf("Object::HasMethod: object=%p, name=%s\n", | |
44 reinterpret_cast<void*>(this), | |
45 PluginVarDeprecated::DebugString(name).c_str()); | |
46 Object* browser_obj = reinterpret_cast<Object*>(this); | |
47 Object::MethodMap::iterator i = | |
48 browser_obj->methods()->find(PluginVarDeprecated::DebugString(name)); | |
49 return (i != browser_obj->methods()->end()); | |
50 } | |
51 | |
52 PP_Var Object::GetProperty(PP_Var name, | |
53 PP_Var* exception) { | |
54 UNREFERENCED_PARAMETER(exception); | |
55 DebugPrintf("Object::GetProperty: object=%p, name=%s\n", | |
56 reinterpret_cast<void*>(this), | |
57 PluginVarDeprecated::DebugString(name).c_str()); | |
58 Object* browser_obj = reinterpret_cast<Object*>(this); | |
59 Object::PropertyMap::iterator i = | |
60 browser_obj->properties()->find(PluginVarDeprecated::DebugString(name)); | |
61 if (i != browser_obj->properties()->end()) { | |
62 ppb_var_deprecated->AddRef(*(i->second)); | |
63 return *(i->second); | |
64 } | |
65 return PP_MakeUndefined(); | |
66 } | |
67 | |
68 void Object::GetAllPropertyNames(uint32_t* property_count, | |
69 PP_Var** properties, | |
70 PP_Var* exception) { | |
71 UNREFERENCED_PARAMETER(exception); | |
72 DebugPrintf("Object::GetAllPropertyNames: object=%p\n", | |
73 reinterpret_cast<void*>(this)); | |
74 // Figure out the length of the vector. | |
75 Object* browser_obj = reinterpret_cast<Object*>(this); | |
76 Object::PropertyMap::iterator prop; | |
77 for (prop = browser_obj->properties()->begin(); | |
78 prop != browser_obj->properties()->end(); ++prop) { | |
79 ++(*property_count); | |
80 } | |
81 Object::MethodMap::iterator meth; | |
82 for (meth = browser_obj->methods()->begin(); | |
83 meth != browser_obj->methods()->end(); ++meth) { | |
84 ++(*property_count); | |
85 } | |
86 // Fill out the vector. | |
87 *properties = | |
88 reinterpret_cast<PP_Var*>(malloc(*property_count * sizeof(**properties))); | |
89 uint32_t i = 0; | |
90 for (prop = browser_obj->properties()->begin(); | |
91 prop != browser_obj->properties()->end(); ++prop) { | |
92 (*properties)[i] = | |
93 ppb_var_deprecated->VarFromUtf8( | |
94 browser_obj->module(), | |
95 prop->first.c_str(), | |
96 static_cast<uint32_t>(prop->first.size())); | |
97 ++i; | |
98 } | |
99 for (meth = browser_obj->methods()->begin(); | |
100 meth != browser_obj->methods()->end(); ++meth) { | |
101 (*properties)[i] = | |
102 ppb_var_deprecated->VarFromUtf8( | |
103 browser_obj->module(), | |
104 meth->first.c_str(), | |
105 static_cast<uint32_t>(meth->first.size())); | |
106 ++i; | |
107 } | |
108 } | |
109 | |
110 void Object::SetProperty(PP_Var name, | |
111 PP_Var value, | |
112 PP_Var* exception) { | |
113 UNREFERENCED_PARAMETER(exception); | |
114 DebugPrintf("Object::SetProperty: object=%p, name=%s, value=%s\n", | |
115 reinterpret_cast<void*>(this), | |
116 PluginVarDeprecated::DebugString(name).c_str(), | |
117 PluginVarDeprecated::DebugString(value).c_str()); | |
118 Object* browser_obj = reinterpret_cast<Object*>(this); | |
119 // Release the previous value in the map. | |
120 Object::PropertyMap::iterator i = | |
121 browser_obj->properties()->find(PluginVarDeprecated::DebugString(name)); | |
122 if (i != browser_obj->properties()->end()) { | |
123 ppb_var_deprecated->Release(*(i->second)); | |
124 } | |
125 PP_Var* newval = reinterpret_cast<PP_Var*>(malloc(sizeof(*newval))); | |
126 *newval = value; | |
127 ppb_var_deprecated->AddRef(*newval); | |
128 (*browser_obj->properties())[PluginVarDeprecated::DebugString(name)] = newval; | |
129 } | |
130 | |
131 void Object::RemoveProperty(PP_Var name, | |
132 PP_Var* exception) { | |
133 UNREFERENCED_PARAMETER(exception); | |
134 DebugPrintf("Object::RemoveProperty: object=%p, name=", | |
135 reinterpret_cast<void*>(this), | |
136 PluginVarDeprecated::DebugString(name).c_str()); | |
137 Object* browser_obj = reinterpret_cast<Object*>(this); | |
138 // Release the value. | |
139 Object::PropertyMap::iterator i = | |
140 browser_obj->properties()->find(PluginVarDeprecated::DebugString(name)); | |
141 if (i != browser_obj->properties()->end()) { | |
142 ppb_var_deprecated->Release(*(i->second)); | |
143 browser_obj->properties()->erase(i); | |
144 } | |
145 } | |
146 | |
147 PP_Var Object::Call(PP_Var method_name, | |
148 uint32_t argc, | |
149 PP_Var* argv, | |
150 PP_Var* exception) { | |
151 Object* browser_obj = reinterpret_cast<Object*>(this); | |
152 UNREFERENCED_PARAMETER(exception); | |
153 DebugPrintf("Object::Call: object=%p, method_name=%s, " | |
154 "argc=%"NACL_PRIu32", argv={\n", | |
155 reinterpret_cast<void*>(this), | |
156 PluginVarDeprecated::DebugString(method_name).c_str(), | |
157 argc); | |
158 for (uint32_t i = 0; i < argc; ++i) { | |
159 PluginVarDeprecated::Print(argv[i]); | |
160 if (i < argc - 1) { | |
161 DebugPrintf(", "); | |
162 } | |
163 } | |
164 DebugPrintf("}\n"); | |
165 Object::MethodMap::iterator i = | |
166 browser_obj->methods()->find( | |
167 PluginVarDeprecated::DebugString(method_name)); | |
168 if (i != browser_obj->methods()->end()) { | |
169 return (i->second)(browser_obj, argc, argv, exception); | |
170 } | |
171 return PP_MakeUndefined(); | |
172 } | |
173 | |
174 PP_Var Object::Construct(uint32_t argc, | |
175 PP_Var* argv, | |
176 PP_Var* exception) { | |
177 UNREFERENCED_PARAMETER(exception); | |
178 DebugPrintf("Object::Construct: object=%p", | |
179 reinterpret_cast<void*>(this)); | |
180 DebugPrintf(", argc=%"NACL_PRIu32", argv={ ", argc); | |
181 for (uint32_t i = 0; i < argc; ++i) { | |
182 PluginVarDeprecated::Print(argv[i]); | |
183 if (i < argc - 1) { | |
184 DebugPrintf(", "); | |
185 } | |
186 } | |
187 DebugPrintf(" }\n"); | |
188 NACL_UNIMPLEMENTED(); | |
189 return PP_MakeUndefined(); | |
190 } | |
191 | |
192 void Object::Deallocate() { | |
193 DebugPrintf("Object::Deallocate: object=%p\n", | |
194 reinterpret_cast<void*>(this)); | |
195 delete reinterpret_cast<Object*>(this); | |
196 } | |
197 | |
198 Object::Object(PP_Module module, | |
199 PP_Instance instance, | |
200 const PropertyMap& properties, | |
201 const MethodMap& methods) | |
202 : module_(module), | |
203 instance_(instance) { | |
204 PropertyMap::const_iterator prop; | |
205 for (prop = properties.begin(); prop != properties.end(); ++prop) { | |
206 properties_[prop->first] = prop->second; | |
207 } | |
208 MethodMap::const_iterator meth; | |
209 for (meth = methods.begin(); meth != methods.end(); ++meth) { | |
210 methods_[meth->first] = meth->second; | |
211 } | |
212 } | |
213 | |
214 PP_Var Object::New(PP_Module module, | |
215 PP_Instance instance, | |
216 const PropertyMap& properties, | |
217 const MethodMap& methods) { | |
218 // Save the PPB_Var_Deprecated interface to be used in constructing objects. | |
219 if (ppb_var_deprecated == NULL) { | |
220 ppb_var_deprecated = reinterpret_cast<const PPB_Var_Deprecated*>( | |
221 PluginVarDeprecated::GetInterface()); | |
222 if (ppb_var_deprecated == NULL) { | |
223 return PP_MakeUndefined(); | |
224 } | |
225 } | |
226 Object* obj = new Object(module, instance, properties, methods); | |
227 if (obj == NULL) { | |
228 return PP_MakeUndefined(); | |
229 } | |
230 return ppb_var_deprecated->CreateObject(instance, | |
231 &ppapi_proxy::Object::object_class, | |
232 obj); | |
233 } | |
234 | |
235 } // namespace fake_browser_ppapi | |
OLD | NEW |