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

Side by Side Diff: content/renderer/pepper/ppb_var_deprecated_impl.cc

Issue 635593004: PPAPI: Make V8VarConverter longer-lived (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Merge Created 6 years, 2 months 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
« no previous file with comments | « content/renderer/pepper/plugin_object.cc ('k') | content/renderer/pepper/resource_converter.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « content/renderer/pepper/plugin_object.cc ('k') | content/renderer/pepper/resource_converter.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698