OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/renderer/pepper/ppb_var_deprecated_impl.h" | 5 #include "content/renderer/pepper/ppb_var_deprecated_impl.h" |
6 | 6 |
7 #include <limits> | 7 #include <limits> |
8 | 8 |
9 #include "content/renderer/pepper/host_globals.h" | 9 #include "content/renderer/pepper/host_globals.h" |
10 #include "content/renderer/pepper/message_channel.h" | 10 #include "content/renderer/pepper/message_channel.h" |
(...skipping 24 matching lines...) Expand all Loading... |
35 | 35 |
36 const char kInvalidIdentifierException[] = "Error: Invalid identifier."; | 36 const char kInvalidIdentifierException[] = "Error: Invalid identifier."; |
37 const char kInvalidObjectException[] = "Error: Invalid object"; | 37 const char kInvalidObjectException[] = "Error: Invalid object"; |
38 const char kUnableToCallMethodException[] = "Error: Unable to call method"; | 38 const char kUnableToCallMethodException[] = "Error: Unable to call method"; |
39 | 39 |
40 class ObjectAccessor { | 40 class ObjectAccessor { |
41 public: | 41 public: |
42 ObjectAccessor(PP_Var var) | 42 ObjectAccessor(PP_Var var) |
43 : object_var_(V8ObjectVar::FromPPVar(var).get()), | 43 : object_var_(V8ObjectVar::FromPPVar(var).get()), |
44 instance_(object_var_ ? object_var_->instance() : NULL) { | 44 instance_(object_var_ ? object_var_->instance() : NULL) { |
| 45 if (instance_) { |
| 46 converter_.reset(new V8VarConverter(instance_->pp_instance(), |
| 47 V8VarConverter::kAllowObjectVars)); |
| 48 } |
45 } | 49 } |
46 | 50 |
47 // Check if the object is valid. If it isn't, set an exception and return | 51 // Check if the object is valid. If it isn't, set an exception and return |
48 // false. | 52 // false. |
49 bool IsValid(PP_Var* exception) { | 53 bool IsValid(PP_Var* exception) { |
50 // If we already have an exception, then the call is invalid according to | 54 // If we already have an exception, then the call is invalid according to |
51 // the unittests. | 55 // the unittests. |
52 if (exception && exception->type != PP_VARTYPE_UNDEFINED) | 56 if (exception && exception->type != PP_VARTYPE_UNDEFINED) |
53 return false; | 57 return false; |
54 if (instance_) | 58 if (instance_) |
55 return true; | 59 return true; |
56 if (exception) | 60 if (exception) |
57 *exception = ppapi::StringVar::StringToPPVar(kInvalidObjectException); | 61 *exception = ppapi::StringVar::StringToPPVar(kInvalidObjectException); |
58 return false; | 62 return false; |
59 } | 63 } |
60 // Lazily grab the object so that the handle is created in the current handle | 64 // Lazily grab the object so that the handle is created in the current handle |
61 // scope. | 65 // scope. |
62 v8::Handle<v8::Object> GetObject() { return object_var_->GetHandle(); } | 66 v8::Handle<v8::Object> GetObject() { return object_var_->GetHandle(); } |
63 PepperPluginInstanceImpl* instance() { return instance_; } | 67 PepperPluginInstanceImpl* instance() { return instance_; } |
| 68 V8VarConverter* converter() { return converter_.get(); } |
64 | 69 |
65 private: | 70 private: |
66 V8ObjectVar* object_var_; | 71 V8ObjectVar* object_var_; |
67 PepperPluginInstanceImpl* instance_; | 72 PepperPluginInstanceImpl* instance_; |
| 73 scoped_ptr<V8VarConverter> converter_; |
68 }; | 74 }; |
69 | 75 |
70 bool IsValidIdentifer(PP_Var identifier, PP_Var* exception) { | 76 bool IsValidIdentifer(PP_Var identifier, PP_Var* exception) { |
71 if (identifier.type == PP_VARTYPE_INT32 || | 77 if (identifier.type == PP_VARTYPE_INT32 || |
72 identifier.type == PP_VARTYPE_STRING) { | 78 identifier.type == PP_VARTYPE_STRING) { |
73 return true; | 79 return true; |
74 } | 80 } |
75 if (exception) | 81 if (exception) |
76 *exception = ppapi::StringVar::StringToPPVar(kInvalidIdentifierException); | 82 *exception = ppapi::StringVar::StringToPPVar(kInvalidIdentifierException); |
77 return false; | 83 return false; |
78 } | 84 } |
79 | 85 |
80 bool HasPropertyDeprecated(PP_Var var, PP_Var name, PP_Var* exception) { | 86 bool HasPropertyDeprecated(PP_Var var, PP_Var name, PP_Var* exception) { |
81 ObjectAccessor accessor(var); | 87 ObjectAccessor accessor(var); |
82 if (!accessor.IsValid(exception) || !IsValidIdentifer(name, exception)) | 88 if (!accessor.IsValid(exception) || !IsValidIdentifer(name, exception)) |
83 return false; | 89 return false; |
84 | 90 |
85 PepperTryCatchVar try_catch(accessor.instance(), exception); | 91 PepperTryCatchVar try_catch(accessor.instance(), accessor.converter(), |
| 92 exception); |
86 v8::Handle<v8::Value> v8_name = try_catch.ToV8(name); | 93 v8::Handle<v8::Value> v8_name = try_catch.ToV8(name); |
87 if (try_catch.HasException()) | 94 if (try_catch.HasException()) |
88 return false; | 95 return false; |
89 | 96 |
90 bool result = accessor.GetObject()->Has(v8_name); | 97 bool result = accessor.GetObject()->Has(v8_name); |
91 if (try_catch.HasException()) | 98 if (try_catch.HasException()) |
92 return false; | 99 return false; |
93 return result; | 100 return result; |
94 } | 101 } |
95 | 102 |
96 bool HasMethodDeprecated(PP_Var var, PP_Var name, PP_Var* exception) { | 103 bool HasMethodDeprecated(PP_Var var, PP_Var name, PP_Var* exception) { |
97 ObjectAccessor accessor(var); | 104 ObjectAccessor accessor(var); |
98 if (!accessor.IsValid(exception) || !IsValidIdentifer(name, exception)) | 105 if (!accessor.IsValid(exception) || !IsValidIdentifer(name, exception)) |
99 return false; | 106 return false; |
100 | 107 |
101 PepperTryCatchVar try_catch(accessor.instance(), exception); | 108 PepperTryCatchVar try_catch(accessor.instance(), accessor.converter(), |
| 109 exception); |
102 v8::Handle<v8::Value> v8_name = try_catch.ToV8(name); | 110 v8::Handle<v8::Value> v8_name = try_catch.ToV8(name); |
103 if (try_catch.HasException()) | 111 if (try_catch.HasException()) |
104 return false; | 112 return false; |
105 | 113 |
106 bool result = accessor.GetObject()->Has(v8_name) && | 114 bool result = accessor.GetObject()->Has(v8_name) && |
107 accessor.GetObject()->Get(v8_name)->IsFunction(); | 115 accessor.GetObject()->Get(v8_name)->IsFunction(); |
108 if (try_catch.HasException()) | 116 if (try_catch.HasException()) |
109 return false; | 117 return false; |
110 return result; | 118 return result; |
111 } | 119 } |
112 | 120 |
113 PP_Var GetProperty(PP_Var var, PP_Var name, PP_Var* exception) { | 121 PP_Var GetProperty(PP_Var var, PP_Var name, PP_Var* exception) { |
114 ObjectAccessor accessor(var); | 122 ObjectAccessor accessor(var); |
115 if (!accessor.IsValid(exception) || !IsValidIdentifer(name, exception)) | 123 if (!accessor.IsValid(exception) || !IsValidIdentifer(name, exception)) |
116 return PP_MakeUndefined(); | 124 return PP_MakeUndefined(); |
117 | 125 |
118 PepperTryCatchVar try_catch(accessor.instance(), exception); | 126 PepperTryCatchVar try_catch(accessor.instance(), accessor.converter(), |
| 127 exception); |
119 v8::Handle<v8::Value> v8_name = try_catch.ToV8(name); | 128 v8::Handle<v8::Value> v8_name = try_catch.ToV8(name); |
120 if (try_catch.HasException()) | 129 if (try_catch.HasException()) |
121 return PP_MakeUndefined(); | 130 return PP_MakeUndefined(); |
122 | 131 |
123 ScopedPPVar result_var = try_catch.FromV8(accessor.GetObject()->Get(v8_name)); | 132 ScopedPPVar result_var = try_catch.FromV8(accessor.GetObject()->Get(v8_name)); |
124 if (try_catch.HasException()) | 133 if (try_catch.HasException()) |
125 return PP_MakeUndefined(); | 134 return PP_MakeUndefined(); |
126 | 135 |
127 return result_var.Release(); | 136 return result_var.Release(); |
128 } | 137 } |
129 | 138 |
130 void EnumerateProperties(PP_Var var, | 139 void EnumerateProperties(PP_Var var, |
131 uint32_t* property_count, | 140 uint32_t* property_count, |
132 PP_Var** properties, | 141 PP_Var** properties, |
133 PP_Var* exception) { | 142 PP_Var* exception) { |
134 ObjectAccessor accessor(var); | 143 ObjectAccessor accessor(var); |
135 if (!accessor.IsValid(exception)) | 144 if (!accessor.IsValid(exception)) |
136 return; | 145 return; |
137 | 146 |
138 PepperTryCatchVar try_catch(accessor.instance(), exception); | 147 PepperTryCatchVar try_catch(accessor.instance(), accessor.converter(), |
| 148 exception); |
139 | 149 |
140 *properties = NULL; | 150 *properties = NULL; |
141 *property_count = 0; | 151 *property_count = 0; |
142 | 152 |
143 v8::Local<v8::Array> identifiers = accessor.GetObject()->GetPropertyNames(); | 153 v8::Local<v8::Array> identifiers = accessor.GetObject()->GetPropertyNames(); |
144 if (try_catch.HasException()) | 154 if (try_catch.HasException()) |
145 return; | 155 return; |
146 ScopedPPVarArray identifier_vars(identifiers->Length()); | 156 ScopedPPVarArray identifier_vars(identifiers->Length()); |
147 for (uint32_t i = 0; i < identifiers->Length(); ++i) { | 157 for (uint32_t i = 0; i < identifiers->Length(); ++i) { |
148 ScopedPPVar var = try_catch.FromV8(identifiers->Get(i)); | 158 ScopedPPVar var = try_catch.FromV8(identifiers->Get(i)); |
149 if (try_catch.HasException()) | 159 if (try_catch.HasException()) |
150 return; | 160 return; |
151 identifier_vars.Set(i, var); | 161 identifier_vars.Set(i, var); |
152 } | 162 } |
153 | 163 |
154 size_t size = identifier_vars.size(); | 164 size_t size = identifier_vars.size(); |
155 *properties = identifier_vars.Release( | 165 *properties = identifier_vars.Release( |
156 ScopedPPVarArray::PassPPBMemoryAllocatedArray()); | 166 ScopedPPVarArray::PassPPBMemoryAllocatedArray()); |
157 *property_count = size; | 167 *property_count = size; |
158 } | 168 } |
159 | 169 |
160 void SetPropertyDeprecated(PP_Var var, | 170 void SetPropertyDeprecated(PP_Var var, |
161 PP_Var name, | 171 PP_Var name, |
162 PP_Var value, | 172 PP_Var value, |
163 PP_Var* exception) { | 173 PP_Var* exception) { |
164 ObjectAccessor accessor(var); | 174 ObjectAccessor accessor(var); |
165 if (!accessor.IsValid(exception) || !IsValidIdentifer(name, exception)) | 175 if (!accessor.IsValid(exception) || !IsValidIdentifer(name, exception)) |
166 return; | 176 return; |
167 | 177 |
168 PepperTryCatchVar try_catch(accessor.instance(), exception); | 178 PepperTryCatchVar try_catch(accessor.instance(), accessor.converter(), |
| 179 exception); |
169 v8::Handle<v8::Value> v8_name = try_catch.ToV8(name); | 180 v8::Handle<v8::Value> v8_name = try_catch.ToV8(name); |
170 v8::Handle<v8::Value> v8_value = try_catch.ToV8(value); | 181 v8::Handle<v8::Value> v8_value = try_catch.ToV8(value); |
171 | 182 |
172 if (try_catch.HasException()) | 183 if (try_catch.HasException()) |
173 return; | 184 return; |
174 | 185 |
175 accessor.GetObject()->Set(v8_name, v8_value); | 186 accessor.GetObject()->Set(v8_name, v8_value); |
176 try_catch.HasException(); // Ensure an exception gets set if one occured. | 187 try_catch.HasException(); // Ensure an exception gets set if one occured. |
177 } | 188 } |
178 | 189 |
179 void DeletePropertyDeprecated(PP_Var var, PP_Var name, PP_Var* exception) { | 190 void DeletePropertyDeprecated(PP_Var var, PP_Var name, PP_Var* exception) { |
180 ObjectAccessor accessor(var); | 191 ObjectAccessor accessor(var); |
181 if (!accessor.IsValid(exception) || !IsValidIdentifer(name, exception)) | 192 if (!accessor.IsValid(exception) || !IsValidIdentifer(name, exception)) |
182 return; | 193 return; |
183 | 194 |
184 PepperTryCatchVar try_catch(accessor.instance(), exception); | 195 PepperTryCatchVar try_catch(accessor.instance(), accessor.converter(), |
| 196 exception); |
185 v8::Handle<v8::Value> v8_name = try_catch.ToV8(name); | 197 v8::Handle<v8::Value> v8_name = try_catch.ToV8(name); |
186 | 198 |
187 if (try_catch.HasException()) | 199 if (try_catch.HasException()) |
188 return; | 200 return; |
189 | 201 |
190 accessor.GetObject()->Delete(v8_name); | 202 accessor.GetObject()->Delete(v8_name); |
191 try_catch.HasException(); // Ensure an exception gets set if one occured. | 203 try_catch.HasException(); // Ensure an exception gets set if one occured. |
192 } | 204 } |
193 | 205 |
194 PP_Var CallDeprecatedInternal(PP_Var var, | 206 PP_Var CallDeprecatedInternal(PP_Var var, |
195 PP_Var method_name, | 207 PP_Var method_name, |
196 uint32_t argc, | 208 uint32_t argc, |
197 PP_Var* argv, | 209 PP_Var* argv, |
198 PP_Var* exception) { | 210 PP_Var* exception) { |
199 ObjectAccessor accessor(var); | 211 ObjectAccessor accessor(var); |
200 if (!accessor.IsValid(exception)) | 212 if (!accessor.IsValid(exception)) |
201 return PP_MakeUndefined(); | 213 return PP_MakeUndefined(); |
202 | 214 |
203 // If the method name is undefined, set it to the empty string to trigger | 215 // If the method name is undefined, set it to the empty string to trigger |
204 // calling |var| as a function. | 216 // calling |var| as a function. |
205 ScopedPPVar scoped_name(method_name); | 217 ScopedPPVar scoped_name(method_name); |
206 if (method_name.type == PP_VARTYPE_UNDEFINED) { | 218 if (method_name.type == PP_VARTYPE_UNDEFINED) { |
207 scoped_name = ScopedPPVar(ScopedPPVar::PassRef(), | 219 scoped_name = ScopedPPVar(ScopedPPVar::PassRef(), |
208 StringVar::StringToPPVar("")); | 220 StringVar::StringToPPVar("")); |
209 } | 221 } |
210 | 222 |
211 PepperTryCatchVar try_catch(accessor.instance(), exception); | 223 PepperTryCatchVar try_catch(accessor.instance(), accessor.converter(), |
| 224 exception); |
212 v8::Handle<v8::Value> v8_method_name = try_catch.ToV8(scoped_name.get()); | 225 v8::Handle<v8::Value> v8_method_name = try_catch.ToV8(scoped_name.get()); |
213 if (try_catch.HasException()) | 226 if (try_catch.HasException()) |
214 return PP_MakeUndefined(); | 227 return PP_MakeUndefined(); |
215 | 228 |
216 if (!v8_method_name->IsString()) { | 229 if (!v8_method_name->IsString()) { |
217 try_catch.SetException(kUnableToCallMethodException); | 230 try_catch.SetException(kUnableToCallMethodException); |
218 return PP_MakeUndefined(); | 231 return PP_MakeUndefined(); |
219 } | 232 } |
220 | 233 |
221 v8::Handle<v8::Object> function = accessor.GetObject(); | 234 v8::Handle<v8::Object> function = accessor.GetObject(); |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
342 &CallDeprecated, | 355 &CallDeprecated, |
343 &Construct, | 356 &Construct, |
344 &IsInstanceOfDeprecated, | 357 &IsInstanceOfDeprecated, |
345 &CreateObjectDeprecated, | 358 &CreateObjectDeprecated, |
346 &CreateObjectWithModuleDeprecated, }; | 359 &CreateObjectWithModuleDeprecated, }; |
347 | 360 |
348 return &var_deprecated_interface; | 361 return &var_deprecated_interface; |
349 } | 362 } |
350 | 363 |
351 } // namespace content | 364 } // namespace content |
OLD | NEW |