| 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 |