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 676 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
687 base::DictionaryValue* current_as_object = NULL; | 687 base::DictionaryValue* current_as_object = NULL; |
688 ASSERT_TRUE(current->GetAsDictionary(¤t_as_object)) << i; | 688 ASSERT_TRUE(current->GetAsDictionary(¤t_as_object)) << i; |
689 ASSERT_TRUE(current_as_object->Get(kKey, ¤t)) << i; | 689 ASSERT_TRUE(current_as_object->Get(kKey, ¤t)) << i; |
690 } | 690 } |
691 | 691 |
692 // The leaf node shouldn't have any properties. | 692 // The leaf node shouldn't have any properties. |
693 base::DictionaryValue empty; | 693 base::DictionaryValue empty; |
694 EXPECT_TRUE(base::Value::Equals(&empty, current)) << *current; | 694 EXPECT_TRUE(base::Value::Equals(&empty, current)) << *current; |
695 } | 695 } |
696 | 696 |
| 697 class V8ValueConverterOverridingStrategyForTesting |
| 698 : public V8ValueConverter::Strategy { |
| 699 public: |
| 700 V8ValueConverterOverridingStrategyForTesting() |
| 701 : reference_value_(NewReferenceValue()) {} |
| 702 virtual bool FromV8Object( |
| 703 v8::Handle<v8::Object> value, |
| 704 base::Value** out, |
| 705 v8::Isolate* isolate, |
| 706 const FromV8ValueCallback& callback) const OVERRIDE { |
| 707 *out = NewReferenceValue(); |
| 708 return true; |
| 709 } |
| 710 virtual bool FromV8Array(v8::Handle<v8::Array> value, |
| 711 base::Value** out, |
| 712 v8::Isolate* isolate, |
| 713 const FromV8ValueCallback& callback) const OVERRIDE { |
| 714 *out = NewReferenceValue(); |
| 715 return true; |
| 716 } |
| 717 virtual bool FromV8ArrayBuffer(v8::Handle<v8::Object> value, |
| 718 base::Value** out) const OVERRIDE { |
| 719 *out = NewReferenceValue(); |
| 720 return true; |
| 721 } |
| 722 virtual bool FromV8Number(v8::Handle<v8::Number> value, |
| 723 base::Value** out) const OVERRIDE { |
| 724 *out = NewReferenceValue(); |
| 725 return true; |
| 726 } |
| 727 virtual bool FromV8Undefined(base::Value** out) const OVERRIDE { |
| 728 *out = NewReferenceValue(); |
| 729 return true; |
| 730 } |
| 731 base::Value* reference_value() const { return reference_value_.get(); } |
| 732 |
| 733 private: |
| 734 static base::Value* NewReferenceValue() { |
| 735 return new base::StringValue("strategy"); |
| 736 } |
| 737 scoped_ptr<base::Value> reference_value_; |
| 738 }; |
| 739 |
| 740 TEST_F(V8ValueConverterImplTest, StrategyOverrides) { |
| 741 v8::HandleScope handle_scope(isolate_); |
| 742 v8::Local<v8::Context> context = |
| 743 v8::Local<v8::Context>::New(isolate_, context_); |
| 744 v8::Context::Scope context_scope(context); |
| 745 |
| 746 V8ValueConverterImpl converter; |
| 747 V8ValueConverterOverridingStrategyForTesting strategy; |
| 748 converter.SetStrategy(&strategy); |
| 749 |
| 750 v8::Handle<v8::Object> object(v8::Object::New(isolate_)); |
| 751 scoped_ptr<base::Value> object_value(converter.FromV8Value(object, context)); |
| 752 ASSERT_TRUE(object_value); |
| 753 EXPECT_TRUE( |
| 754 base::Value::Equals(strategy.reference_value(), object_value.get())); |
| 755 |
| 756 v8::Handle<v8::Array> array(v8::Array::New(isolate_)); |
| 757 scoped_ptr<base::Value> array_value(converter.FromV8Value(array, context)); |
| 758 ASSERT_TRUE(array_value); |
| 759 EXPECT_TRUE( |
| 760 base::Value::Equals(strategy.reference_value(), array_value.get())); |
| 761 |
| 762 v8::Handle<v8::ArrayBuffer> array_buffer(v8::ArrayBuffer::New(isolate_, 0)); |
| 763 scoped_ptr<base::Value> array_buffer_value( |
| 764 converter.FromV8Value(array_buffer, context)); |
| 765 ASSERT_TRUE(array_buffer_value); |
| 766 EXPECT_TRUE(base::Value::Equals(strategy.reference_value(), |
| 767 array_buffer_value.get())); |
| 768 |
| 769 v8::Handle<v8::ArrayBufferView> array_buffer_view( |
| 770 v8::Uint8Array::New(array_buffer, 0, 0)); |
| 771 scoped_ptr<base::Value> array_buffer_view_value( |
| 772 converter.FromV8Value(array_buffer_view, context)); |
| 773 ASSERT_TRUE(array_buffer_view_value); |
| 774 EXPECT_TRUE(base::Value::Equals(strategy.reference_value(), |
| 775 array_buffer_view_value.get())); |
| 776 |
| 777 v8::Handle<v8::Number> number(v8::Number::New(isolate_, 0.0)); |
| 778 scoped_ptr<base::Value> number_value(converter.FromV8Value(number, context)); |
| 779 ASSERT_TRUE(number_value); |
| 780 EXPECT_TRUE( |
| 781 base::Value::Equals(strategy.reference_value(), number_value.get())); |
| 782 |
| 783 v8::Handle<v8::Primitive> undefined(v8::Undefined(isolate_)); |
| 784 scoped_ptr<base::Value> undefined_value( |
| 785 converter.FromV8Value(undefined, context)); |
| 786 ASSERT_TRUE(undefined_value); |
| 787 EXPECT_TRUE( |
| 788 base::Value::Equals(strategy.reference_value(), undefined_value.get())); |
| 789 } |
| 790 |
| 791 class V8ValueConverterBypassStrategyForTesting |
| 792 : public V8ValueConverter::Strategy { |
| 793 public: |
| 794 virtual bool FromV8Object( |
| 795 v8::Handle<v8::Object> value, |
| 796 base::Value** out, |
| 797 v8::Isolate* isolate, |
| 798 const FromV8ValueCallback& callback) const OVERRIDE { |
| 799 return false; |
| 800 } |
| 801 virtual bool FromV8Array(v8::Handle<v8::Array> value, |
| 802 base::Value** out, |
| 803 v8::Isolate* isolate, |
| 804 const FromV8ValueCallback& callback) const OVERRIDE { |
| 805 return false; |
| 806 } |
| 807 virtual bool FromV8ArrayBuffer(v8::Handle<v8::Object> value, |
| 808 base::Value** out) const OVERRIDE { |
| 809 return false; |
| 810 } |
| 811 virtual bool FromV8Number(v8::Handle<v8::Number> value, |
| 812 base::Value** out) const OVERRIDE { |
| 813 return false; |
| 814 } |
| 815 virtual bool FromV8Undefined(base::Value** out) const OVERRIDE { |
| 816 return false; |
| 817 } |
| 818 }; |
| 819 |
| 820 // Verify that having a strategy that fallbacks to default behaviour |
| 821 // actually preserves it. |
| 822 TEST_F(V8ValueConverterImplTest, StrategyBypass) { |
| 823 v8::HandleScope handle_scope(isolate_); |
| 824 v8::Local<v8::Context> context = |
| 825 v8::Local<v8::Context>::New(isolate_, context_); |
| 826 v8::Context::Scope context_scope(context); |
| 827 |
| 828 V8ValueConverterImpl converter; |
| 829 V8ValueConverterBypassStrategyForTesting strategy; |
| 830 converter.SetStrategy(&strategy); |
| 831 |
| 832 v8::Handle<v8::Object> object(v8::Object::New(isolate_)); |
| 833 scoped_ptr<base::Value> object_value(converter.FromV8Value(object, context)); |
| 834 ASSERT_TRUE(object_value); |
| 835 scoped_ptr<base::Value> reference_object_value(base::test::ParseJson("{}")); |
| 836 EXPECT_TRUE( |
| 837 base::Value::Equals(reference_object_value.get(), object_value.get())); |
| 838 |
| 839 v8::Handle<v8::Array> array(v8::Array::New(isolate_)); |
| 840 scoped_ptr<base::Value> array_value(converter.FromV8Value(array, context)); |
| 841 ASSERT_TRUE(array_value); |
| 842 scoped_ptr<base::Value> reference_array_value(base::test::ParseJson("[]")); |
| 843 EXPECT_TRUE( |
| 844 base::Value::Equals(reference_array_value.get(), array_value.get())); |
| 845 |
| 846 // Not testing ArrayBuffers as V8ValueConverter uses blink helpers and |
| 847 // this requires having blink to be initialized. |
| 848 |
| 849 v8::Handle<v8::Number> number(v8::Number::New(isolate_, 0.0)); |
| 850 scoped_ptr<base::Value> number_value(converter.FromV8Value(number, context)); |
| 851 ASSERT_TRUE(number_value); |
| 852 scoped_ptr<base::Value> reference_number_value(base::test::ParseJson("0")); |
| 853 EXPECT_TRUE( |
| 854 base::Value::Equals(reference_number_value.get(), number_value.get())); |
| 855 |
| 856 v8::Handle<v8::Primitive> undefined(v8::Undefined(isolate_)); |
| 857 scoped_ptr<base::Value> undefined_value( |
| 858 converter.FromV8Value(undefined, context)); |
| 859 EXPECT_FALSE(undefined_value); |
| 860 } |
| 861 |
697 } // namespace content | 862 } // namespace content |
OLD | NEW |