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 <cmath> | 5 #include <cmath> |
6 | 6 |
7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
9 #include "base/test/values_test_util.h" | 9 #include "base/test/values_test_util.h" |
10 #include "base/values.h" | 10 #include "base/values.h" |
(...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
440 array->Set(0, v8::String::New("1")); | 440 array->Set(0, v8::String::New("1")); |
441 array->Set(1, array); | 441 array->Set(1, array); |
442 | 442 |
443 scoped_ptr<base::ListValue> list_result( | 443 scoped_ptr<base::ListValue> list_result( |
444 static_cast<base::ListValue*>(converter.FromV8Value(array, context_))); | 444 static_cast<base::ListValue*>(converter.FromV8Value(array, context_))); |
445 ASSERT_TRUE(list_result.get()); | 445 ASSERT_TRUE(list_result.get()); |
446 EXPECT_EQ(2u, list_result->GetSize()); | 446 EXPECT_EQ(2u, list_result->GetSize()); |
447 EXPECT_TRUE(IsNull(list_result.get(), 1)); | 447 EXPECT_TRUE(IsNull(list_result.get(), 1)); |
448 } | 448 } |
449 | 449 |
450 // Do not try and convert any named callbacks including getters. | |
451 TEST_F(V8ValueConverterImplTest, ObjectGetters) { | |
452 v8::Context::Scope context_scope(context_); | |
453 v8::HandleScope handle_scope; | |
454 | |
455 const char* source = "(function() {" | |
456 "var a = {};" | |
457 "a.__defineGetter__('foo', function() { return 'bar'; });" | |
458 "return a;" | |
459 "})();"; | |
460 | |
461 v8::Handle<v8::Script> script(v8::Script::New(v8::String::New(source))); | |
462 v8::Handle<v8::Object> object = script->Run().As<v8::Object>(); | |
463 ASSERT_FALSE(object.IsEmpty()); | |
464 | |
465 V8ValueConverterImpl converter; | |
466 scoped_ptr<base::DictionaryValue> result( | |
467 static_cast<base::DictionaryValue*>( | |
468 converter.FromV8Value(object, context_))); | |
469 ASSERT_TRUE(result.get()); | |
470 EXPECT_EQ(0u, result->size()); | |
471 } | |
472 | |
473 // Do not try and convert any named callbacks including getters. | |
474 TEST_F(V8ValueConverterImplTest, ObjectWithInternalFieldsGetters) { | |
475 v8::Context::Scope context_scope(context_); | |
476 v8::HandleScope handle_scope; | |
477 | |
478 v8::Handle<v8::ObjectTemplate> object_template = v8::ObjectTemplate::New(); | |
479 object_template->SetInternalFieldCount(1); | |
480 object_template->SetAccessor(v8::String::New("foo"), NamedCallbackGetter); | |
481 v8::Handle<v8::Object> object = object_template->NewInstance(); | |
482 ASSERT_FALSE(object.IsEmpty()); | |
483 object->Set(v8::String::New("a"), v8::String::New("b")); | |
484 | |
485 V8ValueConverterImpl converter; | |
486 scoped_ptr<base::DictionaryValue> result( | |
487 static_cast<base::DictionaryValue*>( | |
488 converter.FromV8Value(object, context_))); | |
489 ASSERT_TRUE(result.get()); | |
490 EXPECT_EQ(1u, result->size()); | |
491 } | |
492 | |
493 TEST_F(V8ValueConverterImplTest, WeirdProperties) { | 450 TEST_F(V8ValueConverterImplTest, WeirdProperties) { |
494 v8::Context::Scope context_scope(context_); | 451 v8::Context::Scope context_scope(context_); |
495 v8::HandleScope handle_scope; | 452 v8::HandleScope handle_scope; |
496 | 453 |
497 const char* source = "(function() {" | 454 const char* source = "(function() {" |
498 "return {" | 455 "return {" |
499 "1: 'foo'," | 456 "1: 'foo'," |
500 "'2': 'bar'," | 457 "'2': 'bar'," |
501 "true: 'baz'," | 458 "true: 'baz'," |
502 "false: 'qux'," | 459 "false: 'qux'," |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
643 expected_dictionary.Set(key, base::Value::CreateNullValue()); | 600 expected_dictionary.Set(key, base::Value::CreateNullValue()); |
644 | 601 |
645 // The actual result. | 602 // The actual result. |
646 scoped_ptr<base::Value> actual_dictionary( | 603 scoped_ptr<base::Value> actual_dictionary( |
647 converter.FromV8Value(recursive_object, context_)); | 604 converter.FromV8Value(recursive_object, context_)); |
648 ASSERT_TRUE(actual_dictionary.get()); | 605 ASSERT_TRUE(actual_dictionary.get()); |
649 | 606 |
650 EXPECT_TRUE(expected_dictionary.Equals(actual_dictionary.get())); | 607 EXPECT_TRUE(expected_dictionary.Equals(actual_dictionary.get())); |
651 } | 608 } |
652 | 609 |
| 610 TEST_F(V8ValueConverterImplTest, MaxRecursionDepth) { |
| 611 v8::Context::Scope context_scope(context_); |
| 612 v8::HandleScope handle_scope; |
| 613 |
| 614 // Must larger than kMaxRecursionDepth in v8_value_converter_impl.cc. |
| 615 int kDepth = 100; |
| 616 const char kKey[] = "key"; |
| 617 |
| 618 v8::Local<v8::Object> deep_object = v8::Object::New(); |
| 619 |
| 620 v8::Local<v8::Object> leaf = deep_object; |
| 621 for (int i = 0; i < kDepth; ++i) { |
| 622 v8::Local<v8::Object> new_object = v8::Object::New(); |
| 623 leaf->Set(v8::String::New(kKey), new_object); |
| 624 leaf = new_object; |
| 625 } |
| 626 |
| 627 V8ValueConverterImpl converter; |
| 628 scoped_ptr<base::Value> value(converter.FromV8Value(deep_object, context_)); |
| 629 ASSERT_TRUE(value); |
| 630 |
| 631 // Expected depth is kMaxRecursionDepth in v8_value_converter_impl.cc. |
| 632 int kExpectedDepth = 10; |
| 633 |
| 634 base::Value* current = value.get(); |
| 635 for (int i = 1; i < kExpectedDepth; ++i) { |
| 636 base::DictionaryValue* current_as_object = NULL; |
| 637 ASSERT_TRUE(current->GetAsDictionary(¤t_as_object)) << i; |
| 638 ASSERT_TRUE(current_as_object->Get(kKey, ¤t)) << i; |
| 639 } |
| 640 |
| 641 // The leaf node shouldn't have any properties. |
| 642 base::DictionaryValue empty; |
| 643 EXPECT_TRUE(Value::Equals(&empty, current)) << *current; |
| 644 } |
| 645 |
653 } // namespace content | 646 } // namespace content |
OLD | NEW |