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 |
450 TEST_F(V8ValueConverterImplTest, WeirdProperties) { | 493 TEST_F(V8ValueConverterImplTest, WeirdProperties) { |
451 v8::Context::Scope context_scope(context_); | 494 v8::Context::Scope context_scope(context_); |
452 v8::HandleScope handle_scope; | 495 v8::HandleScope handle_scope; |
453 | 496 |
454 const char* source = "(function() {" | 497 const char* source = "(function() {" |
455 "return {" | 498 "return {" |
456 "1: 'foo'," | 499 "1: 'foo'," |
457 "'2': 'bar'," | 500 "'2': 'bar'," |
458 "true: 'baz'," | 501 "true: 'baz'," |
459 "false: 'qux'," | 502 "false: 'qux'," |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
600 expected_dictionary.Set(key, base::Value::CreateNullValue()); | 643 expected_dictionary.Set(key, base::Value::CreateNullValue()); |
601 | 644 |
602 // The actual result. | 645 // The actual result. |
603 scoped_ptr<base::Value> actual_dictionary( | 646 scoped_ptr<base::Value> actual_dictionary( |
604 converter.FromV8Value(recursive_object, context_)); | 647 converter.FromV8Value(recursive_object, context_)); |
605 ASSERT_TRUE(actual_dictionary.get()); | 648 ASSERT_TRUE(actual_dictionary.get()); |
606 | 649 |
607 EXPECT_TRUE(expected_dictionary.Equals(actual_dictionary.get())); | 650 EXPECT_TRUE(expected_dictionary.Equals(actual_dictionary.get())); |
608 } | 651 } |
609 | 652 |
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 | |
646 } // namespace content | 653 } // namespace content |
OLD | NEW |