| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "webkit/glue/plugins/pepper_var.h" | 5 #include "webkit/glue/plugins/pepper_var.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/scoped_ptr.h" | 8 #include "base/scoped_ptr.h" |
| 9 #include "base/string_util.h" | 9 #include "base/string_util.h" |
| 10 #include "third_party/ppapi/c/pp_var.h" | 10 #include "third_party/ppapi/c/pp_var.h" |
| (...skipping 19 matching lines...) Expand all Loading... |
| 30 public: | 30 public: |
| 31 TryCatch(PP_Var* exception) : exception_(exception) { | 31 TryCatch(PP_Var* exception) : exception_(exception) { |
| 32 WebBindings::pushExceptionHandler(&TryCatch::Catch, this); | 32 WebBindings::pushExceptionHandler(&TryCatch::Catch, this); |
| 33 } | 33 } |
| 34 | 34 |
| 35 ~TryCatch() { | 35 ~TryCatch() { |
| 36 WebBindings::popExceptionHandler(); | 36 WebBindings::popExceptionHandler(); |
| 37 } | 37 } |
| 38 | 38 |
| 39 bool HasException() const { | 39 bool HasException() const { |
| 40 return exception_ && exception_->type != PP_VarType_Void; | 40 return exception_ && exception_->type != PP_VARTYPE_VOID; |
| 41 } | 41 } |
| 42 | 42 |
| 43 void SetException(const char* message) { | 43 void SetException(const char* message) { |
| 44 DCHECK(!HasException()); | 44 DCHECK(!HasException()); |
| 45 if (exception_) | 45 if (exception_) |
| 46 *exception_ = VarFromUtf8(message, strlen(message)); | 46 *exception_ = VarFromUtf8(message, strlen(message)); |
| 47 } | 47 } |
| 48 | 48 |
| 49 private: | 49 private: |
| 50 static void Catch(void* self, const NPUTF8* message) { | 50 static void Catch(void* self, const NPUTF8* message) { |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 99 } | 99 } |
| 100 NOTREACHED(); | 100 NOTREACHED(); |
| 101 return PP_MakeVoid(); | 101 return PP_MakeVoid(); |
| 102 } | 102 } |
| 103 | 103 |
| 104 // Returns a NPVariant that corresponds to the given PP_Var. The contents of | 104 // Returns a NPVariant that corresponds to the given PP_Var. The contents of |
| 105 // the PP_Var will be copied unless the PP_Var corresponds to an object. | 105 // the PP_Var will be copied unless the PP_Var corresponds to an object. |
| 106 NPVariant PPVarToNPVariant(PP_Var var) { | 106 NPVariant PPVarToNPVariant(PP_Var var) { |
| 107 NPVariant ret; | 107 NPVariant ret; |
| 108 switch (var.type) { | 108 switch (var.type) { |
| 109 case PP_VarType_Void: | 109 case PP_VARTYPE_VOID: |
| 110 VOID_TO_NPVARIANT(ret); | 110 VOID_TO_NPVARIANT(ret); |
| 111 break; | 111 break; |
| 112 case PP_VarType_Null: | 112 case PP_VARTYPE_NULL: |
| 113 NULL_TO_NPVARIANT(ret); | 113 NULL_TO_NPVARIANT(ret); |
| 114 break; | 114 break; |
| 115 case PP_VarType_Bool: | 115 case PP_VARTYPE_BOOL: |
| 116 BOOLEAN_TO_NPVARIANT(var.value.as_bool, ret); | 116 BOOLEAN_TO_NPVARIANT(var.value.as_bool, ret); |
| 117 break; | 117 break; |
| 118 case PP_VarType_Int32: | 118 case PP_VARTYPE_INT32: |
| 119 INT32_TO_NPVARIANT(var.value.as_int, ret); | 119 INT32_TO_NPVARIANT(var.value.as_int, ret); |
| 120 break; | 120 break; |
| 121 case PP_VarType_Double: | 121 case PP_VARTYPE_DOUBLE: |
| 122 DOUBLE_TO_NPVARIANT(var.value.as_double, ret); | 122 DOUBLE_TO_NPVARIANT(var.value.as_double, ret); |
| 123 break; | 123 break; |
| 124 case PP_VarType_String: { | 124 case PP_VARTYPE_STRING: { |
| 125 const std::string& value = GetStringUnchecked(var)->value(); | 125 const std::string& value = GetStringUnchecked(var)->value(); |
| 126 STRINGN_TO_NPVARIANT(base::strdup(value.c_str()), value.size(), ret); | 126 STRINGN_TO_NPVARIANT(base::strdup(value.c_str()), value.size(), ret); |
| 127 break; | 127 break; |
| 128 } | 128 } |
| 129 case PP_VarType_Object: { | 129 case PP_VARTYPE_OBJECT: { |
| 130 NPObject* object = GetNPObjectUnchecked(var); | 130 NPObject* object = GetNPObjectUnchecked(var); |
| 131 OBJECT_TO_NPVARIANT(WebBindings::retainObject(object), ret); | 131 OBJECT_TO_NPVARIANT(WebBindings::retainObject(object), ret); |
| 132 break; | 132 break; |
| 133 } | 133 } |
| 134 } | 134 } |
| 135 return ret; | 135 return ret; |
| 136 } | 136 } |
| 137 | 137 |
| 138 // Returns a NPVariant that corresponds to the given PP_Var. The contents of | 138 // Returns a NPVariant that corresponds to the given PP_Var. The contents of |
| 139 // the PP_Var will NOT be copied, so you need to ensure that the PP_Var remains | 139 // the PP_Var will NOT be copied, so you need to ensure that the PP_Var remains |
| 140 // valid while the resultant NPVariant is in use. | 140 // valid while the resultant NPVariant is in use. |
| 141 NPVariant PPVarToNPVariantNoCopy(PP_Var var) { | 141 NPVariant PPVarToNPVariantNoCopy(PP_Var var) { |
| 142 NPVariant ret; | 142 NPVariant ret; |
| 143 switch (var.type) { | 143 switch (var.type) { |
| 144 case PP_VarType_Void: | 144 case PP_VARTYPE_VOID: |
| 145 VOID_TO_NPVARIANT(ret); | 145 VOID_TO_NPVARIANT(ret); |
| 146 break; | 146 break; |
| 147 case PP_VarType_Null: | 147 case PP_VARTYPE_NULL: |
| 148 NULL_TO_NPVARIANT(ret); | 148 NULL_TO_NPVARIANT(ret); |
| 149 break; | 149 break; |
| 150 case PP_VarType_Bool: | 150 case PP_VARTYPE_BOOL: |
| 151 BOOLEAN_TO_NPVARIANT(var.value.as_bool, ret); | 151 BOOLEAN_TO_NPVARIANT(var.value.as_bool, ret); |
| 152 break; | 152 break; |
| 153 case PP_VarType_Int32: | 153 case PP_VARTYPE_INT32: |
| 154 INT32_TO_NPVARIANT(var.value.as_int, ret); | 154 INT32_TO_NPVARIANT(var.value.as_int, ret); |
| 155 break; | 155 break; |
| 156 case PP_VarType_Double: | 156 case PP_VARTYPE_DOUBLE: |
| 157 DOUBLE_TO_NPVARIANT(var.value.as_double, ret); | 157 DOUBLE_TO_NPVARIANT(var.value.as_double, ret); |
| 158 break; | 158 break; |
| 159 case PP_VarType_String: { | 159 case PP_VARTYPE_STRING: { |
| 160 const std::string& value = GetStringUnchecked(var)->value(); | 160 const std::string& value = GetStringUnchecked(var)->value(); |
| 161 STRINGN_TO_NPVARIANT(value.c_str(), value.size(), ret); | 161 STRINGN_TO_NPVARIANT(value.c_str(), value.size(), ret); |
| 162 break; | 162 break; |
| 163 } | 163 } |
| 164 case PP_VarType_Object: { | 164 case PP_VARTYPE_OBJECT: { |
| 165 OBJECT_TO_NPVARIANT(GetNPObjectUnchecked(var), ret); | 165 OBJECT_TO_NPVARIANT(GetNPObjectUnchecked(var), ret); |
| 166 break; | 166 break; |
| 167 } | 167 } |
| 168 } | 168 } |
| 169 return ret; | 169 return ret; |
| 170 } | 170 } |
| 171 | 171 |
| 172 // Returns a NPIdentifier that corresponds to the given PP_Var. The contents | 172 // Returns a NPIdentifier that corresponds to the given PP_Var. The contents |
| 173 // of the PP_Var will be copied. Returns NULL if the given PP_Var is not a a | 173 // of the PP_Var will be copied. Returns NULL if the given PP_Var is not a a |
| 174 // string or integer type. | 174 // string or integer type. |
| 175 NPIdentifier PPVarToNPIdentifier(PP_Var var) { | 175 NPIdentifier PPVarToNPIdentifier(PP_Var var) { |
| 176 switch (var.type) { | 176 switch (var.type) { |
| 177 case PP_VarType_String: | 177 case PP_VARTYPE_STRING: |
| 178 return WebBindings::getStringIdentifier( | 178 return WebBindings::getStringIdentifier( |
| 179 GetStringUnchecked(var)->value().c_str()); | 179 GetStringUnchecked(var)->value().c_str()); |
| 180 case PP_VarType_Int32: | 180 case PP_VARTYPE_INT32: |
| 181 return WebBindings::getIntIdentifier(var.value.as_int); | 181 return WebBindings::getIntIdentifier(var.value.as_int); |
| 182 default: | 182 default: |
| 183 return NULL; | 183 return NULL; |
| 184 } | 184 } |
| 185 } | 185 } |
| 186 | 186 |
| 187 PP_Var NPIdentifierToPPVar(NPIdentifier id) { | 187 PP_Var NPIdentifierToPPVar(NPIdentifier id) { |
| 188 const NPUTF8* string_value = NULL; | 188 const NPUTF8* string_value = NULL; |
| 189 int32_t int_value = 0; | 189 int32_t int_value = 0; |
| 190 bool is_string = false; | 190 bool is_string = false; |
| 191 WebBindings::extractIdentifierData(id, string_value, int_value, is_string); | 191 WebBindings::extractIdentifierData(id, string_value, int_value, is_string); |
| 192 if (is_string) | 192 if (is_string) |
| 193 return VarFromUtf8(string_value, strlen(string_value)); | 193 return VarFromUtf8(string_value, strlen(string_value)); |
| 194 | 194 |
| 195 return PP_MakeInt32(int_value); | 195 return PP_MakeInt32(int_value); |
| 196 } | 196 } |
| 197 | 197 |
| 198 PP_Var NPIdentifierToPPVarString(NPIdentifier id) { | 198 PP_Var NPIdentifierToPPVarString(NPIdentifier id) { |
| 199 PP_Var var = NPIdentifierToPPVar(id); | 199 PP_Var var = NPIdentifierToPPVar(id); |
| 200 if (var.type == PP_VarType_String) | 200 if (var.type == PP_VARTYPE_STRING) |
| 201 return var; | 201 return var; |
| 202 DCHECK(var.type == PP_VarType_Int32); | 202 DCHECK(var.type == PP_VARTYPE_INT32); |
| 203 const std::string& str = IntToString(var.value.as_int); | 203 const std::string& str = IntToString(var.value.as_int); |
| 204 return VarFromUtf8(str.data(), str.size()); | 204 return VarFromUtf8(str.data(), str.size()); |
| 205 } | 205 } |
| 206 | 206 |
| 207 void ThrowException(NPObject* object, PP_Var exception) { | 207 void ThrowException(NPObject* object, PP_Var exception) { |
| 208 String* str = GetString(exception); | 208 String* str = GetString(exception); |
| 209 if (str) | 209 if (str) |
| 210 WebBindings::setException(object, str->value().c_str()); | 210 WebBindings::setException(object, str->value().c_str()); |
| 211 } | 211 } |
| 212 | 212 |
| (...skipping 26 matching lines...) Expand all Loading... |
| 239 bool WrapperClass_HasMethod(NPObject* object, NPIdentifier method_name) { | 239 bool WrapperClass_HasMethod(NPObject* object, NPIdentifier method_name) { |
| 240 WrapperObject* wrapper = ToWrapper(object); | 240 WrapperObject* wrapper = ToWrapper(object); |
| 241 | 241 |
| 242 PP_Var method_name_var = NPIdentifierToPPVarString(method_name); | 242 PP_Var method_name_var = NPIdentifierToPPVarString(method_name); |
| 243 PP_Var exception = PP_MakeVoid(); | 243 PP_Var exception = PP_MakeVoid(); |
| 244 bool rv = wrapper->ppp_class->HasMethod(wrapper->ppp_class_data, | 244 bool rv = wrapper->ppp_class->HasMethod(wrapper->ppp_class_data, |
| 245 method_name_var, | 245 method_name_var, |
| 246 &exception); | 246 &exception); |
| 247 Release(method_name_var); | 247 Release(method_name_var); |
| 248 | 248 |
| 249 if (exception.type != PP_VarType_Void) { | 249 if (exception.type != PP_VARTYPE_VOID) { |
| 250 ThrowException(object, exception); | 250 ThrowException(object, exception); |
| 251 Release(exception); | 251 Release(exception); |
| 252 return false; | 252 return false; |
| 253 } | 253 } |
| 254 return rv; | 254 return rv; |
| 255 } | 255 } |
| 256 | 256 |
| 257 bool WrapperClass_Invoke(NPObject* object, NPIdentifier method_name, | 257 bool WrapperClass_Invoke(NPObject* object, NPIdentifier method_name, |
| 258 const NPVariant* argv, uint32_t argc, | 258 const NPVariant* argv, uint32_t argc, |
| 259 NPVariant* result) { | 259 NPVariant* result) { |
| 260 WrapperObject* wrapper = ToWrapper(object); | 260 WrapperObject* wrapper = ToWrapper(object); |
| 261 | 261 |
| 262 scoped_array<PP_Var> args; | 262 scoped_array<PP_Var> args; |
| 263 if (argc) { | 263 if (argc) { |
| 264 args.reset(new PP_Var[argc]); | 264 args.reset(new PP_Var[argc]); |
| 265 for (uint32_t i = 0; i < argc; ++i) | 265 for (uint32_t i = 0; i < argc; ++i) |
| 266 args[i] = NPVariantToPPVar(&argv[i]); | 266 args[i] = NPVariantToPPVar(&argv[i]); |
| 267 } | 267 } |
| 268 PP_Var method_name_var = NPIdentifierToPPVarString(method_name); | 268 PP_Var method_name_var = NPIdentifierToPPVarString(method_name); |
| 269 PP_Var exception = PP_MakeVoid(); | 269 PP_Var exception = PP_MakeVoid(); |
| 270 PP_Var result_var = wrapper->ppp_class->Call(wrapper->ppp_class_data, | 270 PP_Var result_var = wrapper->ppp_class->Call(wrapper->ppp_class_data, |
| 271 method_name_var, argc, | 271 method_name_var, argc, |
| 272 args.get(), &exception); | 272 args.get(), &exception); |
| 273 Release(method_name_var); | 273 Release(method_name_var); |
| 274 for (uint32_t i = 0; i < argc; ++i) | 274 for (uint32_t i = 0; i < argc; ++i) |
| 275 Release(args[i]); | 275 Release(args[i]); |
| 276 | 276 |
| 277 bool rv; | 277 bool rv; |
| 278 if (exception.type == PP_VarType_Void) { | 278 if (exception.type == PP_VARTYPE_VOID) { |
| 279 rv = true; | 279 rv = true; |
| 280 *result = PPVarToNPVariant(result_var); | 280 *result = PPVarToNPVariant(result_var); |
| 281 } else { | 281 } else { |
| 282 rv = false; | 282 rv = false; |
| 283 ThrowException(object, exception); | 283 ThrowException(object, exception); |
| 284 Release(exception); | 284 Release(exception); |
| 285 } | 285 } |
| 286 Release(result_var); | 286 Release(result_var); |
| 287 return rv; | 287 return rv; |
| 288 } | 288 } |
| 289 | 289 |
| 290 bool WrapperClass_InvokeDefault(NPObject* object, const NPVariant* argv, | 290 bool WrapperClass_InvokeDefault(NPObject* object, const NPVariant* argv, |
| 291 uint32_t argc, NPVariant* result) { | 291 uint32_t argc, NPVariant* result) { |
| 292 WrapperObject* wrapper = ToWrapper(object); | 292 WrapperObject* wrapper = ToWrapper(object); |
| 293 | 293 |
| 294 scoped_array<PP_Var> args; | 294 scoped_array<PP_Var> args; |
| 295 if (argc) { | 295 if (argc) { |
| 296 args.reset(new PP_Var[argc]); | 296 args.reset(new PP_Var[argc]); |
| 297 for (uint32_t i = 0; i < argc; ++i) | 297 for (uint32_t i = 0; i < argc; ++i) |
| 298 args[i] = NPVariantToPPVar(&argv[i]); | 298 args[i] = NPVariantToPPVar(&argv[i]); |
| 299 } | 299 } |
| 300 PP_Var exception = PP_MakeVoid(); | 300 PP_Var exception = PP_MakeVoid(); |
| 301 PP_Var result_var = wrapper->ppp_class->Call(wrapper->ppp_class_data, | 301 PP_Var result_var = wrapper->ppp_class->Call(wrapper->ppp_class_data, |
| 302 PP_MakeVoid(), argc, args.get(), | 302 PP_MakeVoid(), argc, args.get(), |
| 303 &exception); | 303 &exception); |
| 304 for (uint32_t i = 0; i < argc; ++i) | 304 for (uint32_t i = 0; i < argc; ++i) |
| 305 Release(args[i]); | 305 Release(args[i]); |
| 306 | 306 |
| 307 bool rv; | 307 bool rv; |
| 308 if (exception.type == PP_VarType_Void) { | 308 if (exception.type == PP_VARTYPE_VOID) { |
| 309 rv = true; | 309 rv = true; |
| 310 *result = PPVarToNPVariant(result_var); | 310 *result = PPVarToNPVariant(result_var); |
| 311 } else { | 311 } else { |
| 312 rv = false; | 312 rv = false; |
| 313 ThrowException(object, exception); | 313 ThrowException(object, exception); |
| 314 Release(exception); | 314 Release(exception); |
| 315 } | 315 } |
| 316 Release(result_var); | 316 Release(result_var); |
| 317 return rv; | 317 return rv; |
| 318 } | 318 } |
| 319 | 319 |
| 320 bool WrapperClass_HasProperty(NPObject* object, NPIdentifier property_name) { | 320 bool WrapperClass_HasProperty(NPObject* object, NPIdentifier property_name) { |
| 321 WrapperObject* wrapper = ToWrapper(object); | 321 WrapperObject* wrapper = ToWrapper(object); |
| 322 | 322 |
| 323 PP_Var property_name_var = NPIdentifierToPPVar(property_name); | 323 PP_Var property_name_var = NPIdentifierToPPVar(property_name); |
| 324 PP_Var exception = PP_MakeVoid(); | 324 PP_Var exception = PP_MakeVoid(); |
| 325 bool rv = wrapper->ppp_class->HasProperty(wrapper->ppp_class_data, | 325 bool rv = wrapper->ppp_class->HasProperty(wrapper->ppp_class_data, |
| 326 property_name_var, | 326 property_name_var, |
| 327 &exception); | 327 &exception); |
| 328 Release(property_name_var); | 328 Release(property_name_var); |
| 329 | 329 |
| 330 if (exception.type != PP_VarType_Void) { | 330 if (exception.type != PP_VARTYPE_VOID) { |
| 331 ThrowException(object, exception); | 331 ThrowException(object, exception); |
| 332 Release(exception); | 332 Release(exception); |
| 333 return false; | 333 return false; |
| 334 } | 334 } |
| 335 return rv; | 335 return rv; |
| 336 } | 336 } |
| 337 | 337 |
| 338 bool WrapperClass_GetProperty(NPObject* object, NPIdentifier property_name, | 338 bool WrapperClass_GetProperty(NPObject* object, NPIdentifier property_name, |
| 339 NPVariant* result) { | 339 NPVariant* result) { |
| 340 WrapperObject* wrapper = ToWrapper(object); | 340 WrapperObject* wrapper = ToWrapper(object); |
| 341 | 341 |
| 342 PP_Var property_name_var = NPIdentifierToPPVar(property_name); | 342 PP_Var property_name_var = NPIdentifierToPPVar(property_name); |
| 343 PP_Var exception = PP_MakeVoid(); | 343 PP_Var exception = PP_MakeVoid(); |
| 344 PP_Var result_var = wrapper->ppp_class->GetProperty(wrapper->ppp_class_data, | 344 PP_Var result_var = wrapper->ppp_class->GetProperty(wrapper->ppp_class_data, |
| 345 property_name_var, | 345 property_name_var, |
| 346 &exception); | 346 &exception); |
| 347 Release(property_name_var); | 347 Release(property_name_var); |
| 348 | 348 |
| 349 bool rv; | 349 bool rv; |
| 350 if (exception.type == PP_VarType_Void) { | 350 if (exception.type == PP_VARTYPE_VOID) { |
| 351 rv = true; | 351 rv = true; |
| 352 *result = PPVarToNPVariant(result_var); | 352 *result = PPVarToNPVariant(result_var); |
| 353 } else { | 353 } else { |
| 354 rv = false; | 354 rv = false; |
| 355 ThrowException(object, exception); | 355 ThrowException(object, exception); |
| 356 Release(exception); | 356 Release(exception); |
| 357 } | 357 } |
| 358 Release(result_var); | 358 Release(result_var); |
| 359 return rv; | 359 return rv; |
| 360 } | 360 } |
| 361 | 361 |
| 362 bool WrapperClass_SetProperty(NPObject* object, NPIdentifier property_name, | 362 bool WrapperClass_SetProperty(NPObject* object, NPIdentifier property_name, |
| 363 const NPVariant* value) { | 363 const NPVariant* value) { |
| 364 WrapperObject* wrapper = ToWrapper(object); | 364 WrapperObject* wrapper = ToWrapper(object); |
| 365 | 365 |
| 366 PP_Var property_name_var = NPIdentifierToPPVar(property_name); | 366 PP_Var property_name_var = NPIdentifierToPPVar(property_name); |
| 367 PP_Var value_var = NPVariantToPPVar(value); | 367 PP_Var value_var = NPVariantToPPVar(value); |
| 368 PP_Var exception = PP_MakeVoid(); | 368 PP_Var exception = PP_MakeVoid(); |
| 369 wrapper->ppp_class->SetProperty(wrapper->ppp_class_data, property_name_var, | 369 wrapper->ppp_class->SetProperty(wrapper->ppp_class_data, property_name_var, |
| 370 value_var, &exception); | 370 value_var, &exception); |
| 371 Release(value_var); | 371 Release(value_var); |
| 372 Release(property_name_var); | 372 Release(property_name_var); |
| 373 | 373 |
| 374 if (exception.type != PP_VarType_Void) { | 374 if (exception.type != PP_VARTYPE_VOID) { |
| 375 ThrowException(object, exception); | 375 ThrowException(object, exception); |
| 376 Release(exception); | 376 Release(exception); |
| 377 return false; | 377 return false; |
| 378 } | 378 } |
| 379 return true; | 379 return true; |
| 380 } | 380 } |
| 381 | 381 |
| 382 bool WrapperClass_RemoveProperty(NPObject* object, NPIdentifier property_name) { | 382 bool WrapperClass_RemoveProperty(NPObject* object, NPIdentifier property_name) { |
| 383 WrapperObject* wrapper = ToWrapper(object); | 383 WrapperObject* wrapper = ToWrapper(object); |
| 384 | 384 |
| 385 PP_Var property_name_var = NPIdentifierToPPVar(property_name); | 385 PP_Var property_name_var = NPIdentifierToPPVar(property_name); |
| 386 PP_Var exception = PP_MakeVoid(); | 386 PP_Var exception = PP_MakeVoid(); |
| 387 wrapper->ppp_class->RemoveProperty(wrapper->ppp_class_data, property_name_var, | 387 wrapper->ppp_class->RemoveProperty(wrapper->ppp_class_data, property_name_var, |
| 388 &exception); | 388 &exception); |
| 389 Release(property_name_var); | 389 Release(property_name_var); |
| 390 | 390 |
| 391 if (exception.type != PP_VarType_Void) { | 391 if (exception.type != PP_VARTYPE_VOID) { |
| 392 ThrowException(object, exception); | 392 ThrowException(object, exception); |
| 393 Release(exception); | 393 Release(exception); |
| 394 return false; | 394 return false; |
| 395 } | 395 } |
| 396 return true; | 396 return true; |
| 397 } | 397 } |
| 398 | 398 |
| 399 bool WrapperClass_Enumerate(NPObject* object, NPIdentifier** values, | 399 bool WrapperClass_Enumerate(NPObject* object, NPIdentifier** values, |
| 400 uint32_t* count) { | 400 uint32_t* count) { |
| 401 WrapperObject* wrapper = ToWrapper(object); | 401 WrapperObject* wrapper = ToWrapper(object); |
| 402 | 402 |
| 403 uint32_t property_count = 0; | 403 uint32_t property_count = 0; |
| 404 PP_Var* properties = NULL; | 404 PP_Var* properties = NULL; |
| 405 PP_Var exception = PP_MakeVoid(); | 405 PP_Var exception = PP_MakeVoid(); |
| 406 wrapper->ppp_class->GetAllPropertyNames(wrapper->ppp_class_data, | 406 wrapper->ppp_class->GetAllPropertyNames(wrapper->ppp_class_data, |
| 407 &property_count, | 407 &property_count, |
| 408 &properties, | 408 &properties, |
| 409 &exception); | 409 &exception); |
| 410 | 410 |
| 411 bool rv; | 411 bool rv; |
| 412 if (exception.type == PP_VarType_Void) { | 412 if (exception.type == PP_VARTYPE_VOID) { |
| 413 rv = true; | 413 rv = true; |
| 414 if (property_count == 0) { | 414 if (property_count == 0) { |
| 415 *values = NULL; | 415 *values = NULL; |
| 416 *count = 0; | 416 *count = 0; |
| 417 } else { | 417 } else { |
| 418 *values = static_cast<NPIdentifier*>( | 418 *values = static_cast<NPIdentifier*>( |
| 419 malloc(sizeof(NPIdentifier) * property_count)); | 419 malloc(sizeof(NPIdentifier) * property_count)); |
| 420 *count = property_count; | 420 *count = property_count; |
| 421 for (uint32_t i = 0; i < property_count; ++i) | 421 for (uint32_t i = 0; i < property_count; ++i) |
| 422 (*values)[i] = PPVarToNPIdentifier(properties[i]); | 422 (*values)[i] = PPVarToNPIdentifier(properties[i]); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 445 } | 445 } |
| 446 | 446 |
| 447 PP_Var exception = PP_MakeVoid(); | 447 PP_Var exception = PP_MakeVoid(); |
| 448 PP_Var result_var = wrapper->ppp_class->Construct(wrapper->ppp_class_data, | 448 PP_Var result_var = wrapper->ppp_class->Construct(wrapper->ppp_class_data, |
| 449 argc, args.get(), | 449 argc, args.get(), |
| 450 &exception); | 450 &exception); |
| 451 for (uint32_t i = 0; i < argc; ++i) | 451 for (uint32_t i = 0; i < argc; ++i) |
| 452 Release(args[i]); | 452 Release(args[i]); |
| 453 | 453 |
| 454 bool rv; | 454 bool rv; |
| 455 if (exception.type == PP_VarType_Void) { | 455 if (exception.type == PP_VARTYPE_VOID) { |
| 456 rv = true; | 456 rv = true; |
| 457 *result = PPVarToNPVariant(result_var); | 457 *result = PPVarToNPVariant(result_var); |
| 458 } else { | 458 } else { |
| 459 rv = false; | 459 rv = false; |
| 460 ThrowException(object, exception); | 460 ThrowException(object, exception); |
| 461 Release(exception); | 461 Release(exception); |
| 462 } | 462 } |
| 463 Release(result_var); | 463 Release(result_var); |
| 464 return rv; | 464 return rv; |
| 465 } | 465 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 477 WrapperClass_SetProperty, | 477 WrapperClass_SetProperty, |
| 478 WrapperClass_RemoveProperty, | 478 WrapperClass_RemoveProperty, |
| 479 WrapperClass_Enumerate, | 479 WrapperClass_Enumerate, |
| 480 WrapperClass_Construct | 480 WrapperClass_Construct |
| 481 }; | 481 }; |
| 482 | 482 |
| 483 // --------------------------------------------------------------------------- | 483 // --------------------------------------------------------------------------- |
| 484 // PPB_Var methods | 484 // PPB_Var methods |
| 485 | 485 |
| 486 void AddRef(PP_Var var) { | 486 void AddRef(PP_Var var) { |
| 487 if (var.type == PP_VarType_String) { | 487 if (var.type == PP_VARTYPE_STRING) { |
| 488 GetStringUnchecked(var)->AddRef(); | 488 GetStringUnchecked(var)->AddRef(); |
| 489 } else if (var.type == PP_VarType_Object) { | 489 } else if (var.type == PP_VARTYPE_OBJECT) { |
| 490 // TODO(darin): Add thread safety check | 490 // TODO(darin): Add thread safety check |
| 491 WebBindings::retainObject(GetNPObjectUnchecked(var)); | 491 WebBindings::retainObject(GetNPObjectUnchecked(var)); |
| 492 } | 492 } |
| 493 } | 493 } |
| 494 | 494 |
| 495 void Release(PP_Var var) { | 495 void Release(PP_Var var) { |
| 496 if (var.type == PP_VarType_String) { | 496 if (var.type == PP_VARTYPE_STRING) { |
| 497 GetStringUnchecked(var)->Release(); | 497 GetStringUnchecked(var)->Release(); |
| 498 } else if (var.type == PP_VarType_Object) { | 498 } else if (var.type == PP_VARTYPE_OBJECT) { |
| 499 // TODO(darin): Add thread safety check | 499 // TODO(darin): Add thread safety check |
| 500 WebBindings::releaseObject(GetNPObjectUnchecked(var)); | 500 WebBindings::releaseObject(GetNPObjectUnchecked(var)); |
| 501 } | 501 } |
| 502 } | 502 } |
| 503 | 503 |
| 504 PP_Var VarFromUtf8(const char* data, uint32_t len) { | 504 PP_Var VarFromUtf8(const char* data, uint32_t len) { |
| 505 String* str = new String(data, len); | 505 String* str = new String(data, len); |
| 506 str->AddRef(); // This is for the caller, we return w/ a refcount of 1. | 506 str->AddRef(); // This is for the caller, we return w/ a refcount of 1. |
| 507 PP_Var ret; | 507 PP_Var ret; |
| 508 ret.type = PP_VarType_String; | 508 ret.type = PP_VARTYPE_STRING; |
| 509 ret.value.as_id = reinterpret_cast<intptr_t>(str); | 509 ret.value.as_id = reinterpret_cast<intptr_t>(str); |
| 510 return ret; | 510 return ret; |
| 511 } | 511 } |
| 512 | 512 |
| 513 const char* VarToUtf8(PP_Var var, uint32_t* len) { | 513 const char* VarToUtf8(PP_Var var, uint32_t* len) { |
| 514 if (var.type != PP_VarType_String) { | 514 if (var.type != PP_VARTYPE_STRING) { |
| 515 *len = 0; | 515 *len = 0; |
| 516 return NULL; | 516 return NULL; |
| 517 } | 517 } |
| 518 const std::string& str = GetStringUnchecked(var)->value(); | 518 const std::string& str = GetStringUnchecked(var)->value(); |
| 519 *len = static_cast<uint32_t>(str.size()); | 519 *len = static_cast<uint32_t>(str.size()); |
| 520 if (str.empty()) | 520 if (str.empty()) |
| 521 return ""; // Don't return NULL on success. | 521 return ""; // Don't return NULL on success. |
| 522 return str.data(); | 522 return str.data(); |
| 523 } | 523 } |
| 524 | 524 |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 694 if (try_catch.HasException()) | 694 if (try_catch.HasException()) |
| 695 return PP_MakeVoid(); | 695 return PP_MakeVoid(); |
| 696 | 696 |
| 697 NPObject* object = GetNPObject(var); | 697 NPObject* object = GetNPObject(var); |
| 698 if (!object) { | 698 if (!object) { |
| 699 try_catch.SetException(kInvalidObjectException); | 699 try_catch.SetException(kInvalidObjectException); |
| 700 return PP_MakeVoid(); | 700 return PP_MakeVoid(); |
| 701 } | 701 } |
| 702 | 702 |
| 703 NPIdentifier identifier; | 703 NPIdentifier identifier; |
| 704 if (method_name.type == PP_VarType_Void) { | 704 if (method_name.type == PP_VARTYPE_VOID) { |
| 705 identifier = NULL; | 705 identifier = NULL; |
| 706 } else if (method_name.type == PP_VarType_String) { | 706 } else if (method_name.type == PP_VARTYPE_STRING) { |
| 707 // Specifically allow only string functions to be called. | 707 // Specifically allow only string functions to be called. |
| 708 identifier = PPVarToNPIdentifier(method_name); | 708 identifier = PPVarToNPIdentifier(method_name); |
| 709 if (!identifier) { | 709 if (!identifier) { |
| 710 try_catch.SetException(kInvalidPropertyException); | 710 try_catch.SetException(kInvalidPropertyException); |
| 711 return PP_MakeVoid(); | 711 return PP_MakeVoid(); |
| 712 } | 712 } |
| 713 } else { | 713 } else { |
| 714 try_catch.SetException(kInvalidPropertyException); | 714 try_catch.SetException(kInvalidPropertyException); |
| 715 return PP_MakeVoid(); | 715 return PP_MakeVoid(); |
| 716 } | 716 } |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 824 }; | 824 }; |
| 825 | 825 |
| 826 } // namespace | 826 } // namespace |
| 827 | 827 |
| 828 const PPB_Var* GetVarInterface() { | 828 const PPB_Var* GetVarInterface() { |
| 829 return &var_interface; | 829 return &var_interface; |
| 830 } | 830 } |
| 831 | 831 |
| 832 PP_Var NPObjectToPPVar(NPObject* object) { | 832 PP_Var NPObjectToPPVar(NPObject* object) { |
| 833 PP_Var ret; | 833 PP_Var ret; |
| 834 ret.type = PP_VarType_Object; | 834 ret.type = PP_VARTYPE_OBJECT; |
| 835 ret.value.as_id = reinterpret_cast<intptr_t>(object); | 835 ret.value.as_id = reinterpret_cast<intptr_t>(object); |
| 836 WebBindings::retainObject(object); | 836 WebBindings::retainObject(object); |
| 837 return ret; | 837 return ret; |
| 838 } | 838 } |
| 839 | 839 |
| 840 NPObject* GetNPObject(PP_Var var) { | 840 NPObject* GetNPObject(PP_Var var) { |
| 841 if (var.type != PP_VarType_Object) | 841 if (var.type != PP_VARTYPE_OBJECT) |
| 842 return NULL; | 842 return NULL; |
| 843 return GetNPObjectUnchecked(var); | 843 return GetNPObjectUnchecked(var); |
| 844 } | 844 } |
| 845 | 845 |
| 846 PP_Var StringToPPVar(const std::string& str) { | 846 PP_Var StringToPPVar(const std::string& str) { |
| 847 DCHECK(IsStringUTF8(str)); | 847 DCHECK(IsStringUTF8(str)); |
| 848 return VarFromUtf8(str.data(), str.size()); | 848 return VarFromUtf8(str.data(), str.size()); |
| 849 } | 849 } |
| 850 | 850 |
| 851 String* GetString(PP_Var var) { | 851 String* GetString(PP_Var var) { |
| 852 if (var.type != PP_VarType_String) | 852 if (var.type != PP_VARTYPE_STRING) |
| 853 return NULL; | 853 return NULL; |
| 854 return GetStringUnchecked(var); | 854 return GetStringUnchecked(var); |
| 855 } | 855 } |
| 856 | 856 |
| 857 } // namespace pepper | 857 } // namespace pepper |
| OLD | NEW |