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 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 // 3) If the object is an array, return an ArrayVar. | 237 // 3) If the object is an array, return an ArrayVar. |
238 // 4) If the object can be converted to a resource, return the ResourceVar. | 238 // 4) If the object can be converted to a resource, return the ResourceVar. |
239 // 5) Otherwise return a DictionaryVar. | 239 // 5) Otherwise return a DictionaryVar. |
240 scoped_ptr<blink::WebArrayBuffer> web_array_buffer( | 240 scoped_ptr<blink::WebArrayBuffer> web_array_buffer( |
241 blink::WebArrayBufferConverter::createFromV8Value(val, isolate)); | 241 blink::WebArrayBufferConverter::createFromV8Value(val, isolate)); |
242 if (web_array_buffer.get()) { | 242 if (web_array_buffer.get()) { |
243 scoped_refptr<HostArrayBufferVar> buffer_var( | 243 scoped_refptr<HostArrayBufferVar> buffer_var( |
244 new HostArrayBufferVar(*web_array_buffer)); | 244 new HostArrayBufferVar(*web_array_buffer)); |
245 *result = buffer_var->GetPPVar(); | 245 *result = buffer_var->GetPPVar(); |
246 } else if (object_vars_allowed == V8VarConverter::kAllowObjectVars) { | 246 } else if (object_vars_allowed == V8VarConverter::kAllowObjectVars) { |
247 v8::Handle<v8::Object> object = val->ToObject(); | 247 v8::Handle<v8::Object> object = val.As<v8::Object>(); |
248 *result = content::HostGlobals::Get()-> | 248 *result = content::HostGlobals::Get()-> |
249 host_var_tracker()->V8ObjectVarForV8Object(instance, object); | 249 host_var_tracker()->V8ObjectVarForV8Object(instance, object); |
250 } else if (val->IsArray()) { | 250 } else if (val->IsArray()) { |
251 *result = (new ArrayVar())->GetPPVar(); | 251 *result = (new ArrayVar())->GetPPVar(); |
252 } else { | 252 } else { |
253 bool was_resource; | 253 bool was_resource; |
254 if (!resource_converter->FromV8Value( | 254 if (!resource_converter->FromV8Value(val.As<v8::Object>(), context, |
255 val->ToObject(), context, result, &was_resource)) | 255 result, &was_resource)) |
256 return false; | 256 return false; |
257 if (!was_resource) { | 257 if (!was_resource) { |
258 *result = (new DictionaryVar())->GetPPVar(); | 258 *result = (new DictionaryVar())->GetPPVar(); |
259 } | 259 } |
260 } | 260 } |
261 } else { | 261 } else { |
262 // Silently ignore the case where we can't convert to a Var as we may | 262 // Silently ignore the case where we can't convert to a Var as we may |
263 // be trying to convert a type that doesn't have a corresponding | 263 // be trying to convert a type that doesn't have a corresponding |
264 // PP_Var type. | 264 // PP_Var type. |
265 return true; | 265 return true; |
266 } | 266 } |
267 | 267 |
268 *did_create = true; | 268 *did_create = true; |
269 if (val->IsObject() || val->IsString()) { | 269 if (val->IsObject() || val->IsString()) { |
270 visited_handles->insert( | 270 visited_handles->insert( |
271 make_pair(HashedHandle(val->ToObject()), | 271 make_pair(HashedHandle(val->ToObject(isolate)), |
272 ScopedPPVar(ScopedPPVar::PassRef(), *result))); | 272 ScopedPPVar(ScopedPPVar::PassRef(), *result))); |
273 } | 273 } |
274 return true; | 274 return true; |
275 } | 275 } |
276 | 276 |
277 bool CanHaveChildren(PP_Var var) { | 277 bool CanHaveChildren(PP_Var var) { |
278 return var.type == PP_VARTYPE_ARRAY || var.type == PP_VARTYPE_DICTIONARY; | 278 return var.type == PP_VARTYPE_ARRAY || var.type == PP_VARTYPE_DICTIONARY; |
279 } | 279 } |
280 | 280 |
281 } // namespace | 281 } // namespace |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
384 } | 384 } |
385 } | 385 } |
386 } else if (current_var.type == PP_VARTYPE_DICTIONARY) { | 386 } else if (current_var.type == PP_VARTYPE_DICTIONARY) { |
387 parent_ids.insert(current_var.value.as_id); | 387 parent_ids.insert(current_var.value.as_id); |
388 DictionaryVar* dict_var = DictionaryVar::FromPPVar(current_var); | 388 DictionaryVar* dict_var = DictionaryVar::FromPPVar(current_var); |
389 if (!dict_var) { | 389 if (!dict_var) { |
390 NOTREACHED(); | 390 NOTREACHED(); |
391 return false; | 391 return false; |
392 } | 392 } |
393 DCHECK(current_v8->IsObject()); | 393 DCHECK(current_v8->IsObject()); |
394 v8::Handle<v8::Object> v8_object = current_v8->ToObject(); | 394 v8::Handle<v8::Object> v8_object = current_v8.As<v8::Object>(); |
395 | 395 |
396 for (DictionaryVar::KeyValueMap::const_iterator iter = | 396 for (DictionaryVar::KeyValueMap::const_iterator iter = |
397 dict_var->key_value_map().begin(); | 397 dict_var->key_value_map().begin(); |
398 iter != dict_var->key_value_map().end(); | 398 iter != dict_var->key_value_map().end(); |
399 ++iter) { | 399 ++iter) { |
400 const std::string& key = iter->first; | 400 const std::string& key = iter->first; |
401 const PP_Var& child_var = iter->second.get(); | 401 const PP_Var& child_var = iter->second.get(); |
402 v8::Handle<v8::Value> child_v8; | 402 v8::Handle<v8::Value> child_v8; |
403 if (!GetOrCreateV8Value(context, | 403 if (!GetOrCreateV8Value(context, |
404 child_var, | 404 child_var, |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
473 *result_var = PP_MakeUndefined(); | 473 *result_var = PP_MakeUndefined(); |
474 bool is_root = true; | 474 bool is_root = true; |
475 | 475 |
476 while (!stack.empty()) { | 476 while (!stack.empty()) { |
477 v8::Handle<v8::Value> current_v8 = stack.top().val; | 477 v8::Handle<v8::Value> current_v8 = stack.top().val; |
478 PP_Var current_var; | 478 PP_Var current_var; |
479 | 479 |
480 if (stack.top().sentinel) { | 480 if (stack.top().sentinel) { |
481 stack.pop(); | 481 stack.pop(); |
482 if (current_v8->IsObject()) | 482 if (current_v8->IsObject()) |
483 parent_handles.erase(HashedHandle(current_v8->ToObject())); | 483 parent_handles.erase(HashedHandle(current_v8.As<v8::Object>())); |
484 continue; | 484 continue; |
485 } else { | 485 } else { |
486 stack.top().sentinel = true; | 486 stack.top().sentinel = true; |
487 } | 487 } |
488 | 488 |
489 bool did_create = false; | 489 bool did_create = false; |
490 if (!GetOrCreateVar(current_v8, | 490 if (!GetOrCreateVar(current_v8, |
491 context, | 491 context, |
492 instance_, | 492 instance_, |
493 object_vars_allowed_, | 493 object_vars_allowed_, |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
537 resource_converter_.get())) { | 537 resource_converter_.get())) { |
538 return false; | 538 return false; |
539 } | 539 } |
540 if (did_create && child_v8->IsObject()) | 540 if (did_create && child_v8->IsObject()) |
541 stack.push(child_v8); | 541 stack.push(child_v8); |
542 | 542 |
543 array_var->Set(i, child_var); | 543 array_var->Set(i, child_var); |
544 } | 544 } |
545 } else if (current_var.type == PP_VARTYPE_DICTIONARY) { | 545 } else if (current_var.type == PP_VARTYPE_DICTIONARY) { |
546 DCHECK(current_v8->IsObject()); | 546 DCHECK(current_v8->IsObject()); |
547 v8::Handle<v8::Object> v8_object = current_v8->ToObject(); | 547 v8::Handle<v8::Object> v8_object = current_v8.As<v8::Object>(); |
548 parent_handles.insert(HashedHandle(v8_object)); | 548 parent_handles.insert(HashedHandle(v8_object)); |
549 | 549 |
550 DictionaryVar* dict_var = DictionaryVar::FromPPVar(current_var); | 550 DictionaryVar* dict_var = DictionaryVar::FromPPVar(current_var); |
551 if (!dict_var) { | 551 if (!dict_var) { |
552 NOTREACHED(); | 552 NOTREACHED(); |
553 return false; | 553 return false; |
554 } | 554 } |
555 | 555 |
556 v8::Handle<v8::Array> property_names(v8_object->GetOwnPropertyNames()); | 556 v8::Handle<v8::Array> property_names(v8_object->GetOwnPropertyNames()); |
557 for (uint32 i = 0; i < property_names->Length(); ++i) { | 557 for (uint32 i = 0; i < property_names->Length(); ++i) { |
558 v8::Handle<v8::Value> key(property_names->Get(i)); | 558 v8::Handle<v8::Value> key(property_names->Get(i)); |
559 | 559 |
560 // Extend this test to cover more types as necessary and if sensible. | 560 // Extend this test to cover more types as necessary and if sensible. |
561 if (!key->IsString() && !key->IsNumber()) { | 561 if (!key->IsString() && !key->IsNumber()) { |
562 NOTREACHED() << "Key \"" << *v8::String::Utf8Value(key) | 562 NOTREACHED() << "Key \"" << *v8::String::Utf8Value(key) |
563 << "\" " | 563 << "\" " |
564 "is neither a string nor a number"; | 564 "is neither a string nor a number"; |
565 return false; | 565 return false; |
566 } | 566 } |
567 | 567 |
| 568 v8::Handle<v8::String> key_string = |
| 569 key->ToString(context->GetIsolate()); |
568 // Skip all callbacks: crbug.com/139933 | 570 // Skip all callbacks: crbug.com/139933 |
569 if (v8_object->HasRealNamedCallbackProperty(key->ToString())) | 571 if (v8_object->HasRealNamedCallbackProperty(key_string)) |
570 continue; | 572 continue; |
571 | 573 |
572 v8::String::Utf8Value name_utf8(key->ToString()); | 574 v8::String::Utf8Value name_utf8(key_string); |
573 | 575 |
574 v8::TryCatch try_catch; | 576 v8::TryCatch try_catch; |
575 v8::Handle<v8::Value> child_v8 = v8_object->Get(key); | 577 v8::Handle<v8::Value> child_v8 = v8_object->Get(key); |
576 if (try_catch.HasCaught()) | 578 if (try_catch.HasCaught()) |
577 return false; | 579 return false; |
578 | 580 |
579 PP_Var child_var; | 581 PP_Var child_var; |
580 if (!GetOrCreateVar(child_v8, | 582 if (!GetOrCreateVar(child_v8, |
581 context, | 583 context, |
582 instance_, | 584 instance_, |
(...skipping 12 matching lines...) Expand all Loading... |
595 std::string(*name_utf8, name_utf8.length()), child_var); | 597 std::string(*name_utf8, name_utf8.length()), child_var); |
596 DCHECK(success); | 598 DCHECK(success); |
597 } | 599 } |
598 } | 600 } |
599 } | 601 } |
600 *result_var = root; | 602 *result_var = root; |
601 return true; | 603 return true; |
602 } | 604 } |
603 | 605 |
604 } // namespace content | 606 } // namespace content |
OLD | NEW |