OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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/v8_var_converter.h" | 5 #include "content/renderer/pepper/v8_var_converter.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <stack> | 8 #include <stack> |
9 #include <string> | 9 #include <string> |
10 | 10 |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
148 &host_buffer->webkit_buffer(), context->Global(), isolate); | 148 &host_buffer->webkit_buffer(), context->Global(), isolate); |
149 break; | 149 break; |
150 } | 150 } |
151 case PP_VARTYPE_ARRAY: | 151 case PP_VARTYPE_ARRAY: |
152 *result = v8::Array::New(isolate); | 152 *result = v8::Array::New(isolate); |
153 break; | 153 break; |
154 case PP_VARTYPE_DICTIONARY: | 154 case PP_VARTYPE_DICTIONARY: |
155 *result = v8::Object::New(isolate); | 155 *result = v8::Object::New(isolate); |
156 break; | 156 break; |
157 case PP_VARTYPE_OBJECT: { | 157 case PP_VARTYPE_OBJECT: { |
158 DCHECK(object_vars_allowed == V8VarConverter::kAllowObjectVars); | 158 // If object vars are disallowed, we should never be passed an object var |
| 159 // to convert. Also, we should never expect to convert an object var which |
| 160 // is nested inside an array or dictionary. |
| 161 if (object_vars_allowed == V8VarConverter::kDisallowObjectVars || |
| 162 visited_ids->size() != 0) { |
| 163 NOTREACHED(); |
| 164 result->Clear(); |
| 165 return false; |
| 166 } |
159 scoped_refptr<V8ObjectVar> v8_object_var = V8ObjectVar::FromPPVar(var); | 167 scoped_refptr<V8ObjectVar> v8_object_var = V8ObjectVar::FromPPVar(var); |
160 if (!v8_object_var.get()) { | 168 if (!v8_object_var.get()) { |
161 NOTREACHED(); | 169 NOTREACHED(); |
162 result->Clear(); | 170 result->Clear(); |
163 return false; | 171 return false; |
164 } | 172 } |
165 *result = v8_object_var->GetHandle(); | 173 *result = v8_object_var->GetHandle(); |
166 break; | 174 break; |
167 } | 175 } |
168 case PP_VARTYPE_RESOURCE: | 176 case PP_VARTYPE_RESOURCE: |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
218 *result = PP_MakeNull(); | 226 *result = PP_MakeNull(); |
219 } else if (val->IsBoolean() || val->IsBooleanObject()) { | 227 } else if (val->IsBoolean() || val->IsBooleanObject()) { |
220 *result = PP_MakeBool(PP_FromBool(val->ToBoolean()->Value())); | 228 *result = PP_MakeBool(PP_FromBool(val->ToBoolean()->Value())); |
221 } else if (val->IsInt32()) { | 229 } else if (val->IsInt32()) { |
222 *result = PP_MakeInt32(val->ToInt32()->Value()); | 230 *result = PP_MakeInt32(val->ToInt32()->Value()); |
223 } else if (val->IsNumber() || val->IsNumberObject()) { | 231 } else if (val->IsNumber() || val->IsNumberObject()) { |
224 *result = PP_MakeDouble(val->ToNumber()->Value()); | 232 *result = PP_MakeDouble(val->ToNumber()->Value()); |
225 } else if (val->IsString() || val->IsStringObject()) { | 233 } else if (val->IsString() || val->IsStringObject()) { |
226 v8::String::Utf8Value utf8(val->ToString()); | 234 v8::String::Utf8Value utf8(val->ToString()); |
227 *result = StringVar::StringToPPVar(std::string(*utf8, utf8.length())); | 235 *result = StringVar::StringToPPVar(std::string(*utf8, utf8.length())); |
228 } else if (val->IsArray()) { | |
229 *result = (new ArrayVar())->GetPPVar(); | |
230 } else if (val->IsObject()) { | 236 } else if (val->IsObject()) { |
| 237 // For any other v8 objects, the conversion happens as follows: |
| 238 // 1) If the object is an array buffer, return an ArrayBufferVar. |
| 239 // 2) If object vars are allowed, return the object wrapped as a |
| 240 // V8ObjectVar. This is to maintain backward compatibility with |
| 241 // synchronous scripting in Flash. |
| 242 // 3) If the object is an array, return an ArrayVar. |
| 243 // 4) If the object can be converted to a resource, return the ResourceVar. |
| 244 // 5) Otherwise return a DictionaryVar. |
231 scoped_ptr<blink::WebArrayBuffer> web_array_buffer( | 245 scoped_ptr<blink::WebArrayBuffer> web_array_buffer( |
232 blink::WebArrayBufferConverter::createFromV8Value(val, isolate)); | 246 blink::WebArrayBufferConverter::createFromV8Value(val, isolate)); |
233 if (web_array_buffer.get()) { | 247 if (web_array_buffer.get()) { |
234 scoped_refptr<HostArrayBufferVar> buffer_var( | 248 scoped_refptr<HostArrayBufferVar> buffer_var( |
235 new HostArrayBufferVar(*web_array_buffer)); | 249 new HostArrayBufferVar(*web_array_buffer)); |
236 *result = buffer_var->GetPPVar(); | 250 *result = buffer_var->GetPPVar(); |
237 } else if (object_vars_allowed == V8VarConverter::kAllowObjectVars) { | 251 } else if (object_vars_allowed == V8VarConverter::kAllowObjectVars) { |
238 v8::Handle<v8::Object> object = val->ToObject(); | 252 v8::Handle<v8::Object> object = val->ToObject(); |
239 *result = content::HostGlobals::Get()-> | 253 *result = content::HostGlobals::Get()-> |
240 host_var_tracker()->V8ObjectVarForV8Object(instance, object); | 254 host_var_tracker()->V8ObjectVarForV8Object(instance, object); |
| 255 } else if (val->IsArray()) { |
| 256 *result = (new ArrayVar())->GetPPVar(); |
241 } else { | 257 } else { |
242 bool was_resource; | 258 bool was_resource; |
243 if (!resource_converter->FromV8Value( | 259 if (!resource_converter->FromV8Value( |
244 val->ToObject(), context, result, &was_resource)) | 260 val->ToObject(), context, result, &was_resource)) |
245 return false; | 261 return false; |
246 if (!was_resource) { | 262 if (!was_resource) { |
247 *result = (new DictionaryVar())->GetPPVar(); | 263 *result = (new DictionaryVar())->GetPPVar(); |
248 } | 264 } |
249 } | 265 } |
250 } else { | 266 } else { |
(...skipping 344 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
595 std::string(*name_utf8, name_utf8.length()), child_var); | 611 std::string(*name_utf8, name_utf8.length()), child_var); |
596 DCHECK(success); | 612 DCHECK(success); |
597 } | 613 } |
598 } | 614 } |
599 } | 615 } |
600 *result_var = root; | 616 *result_var = root; |
601 return true; | 617 return true; |
602 } | 618 } |
603 | 619 |
604 } // namespace content | 620 } // namespace content |
OLD | NEW |