OLD | NEW |
(Empty) | |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include "bindings/core/v8/NativeValueTraitsImpl.h" |
| 6 |
| 7 #include <utility> |
| 8 #include "bindings/core/v8/ExceptionState.h" |
| 9 #include "bindings/core/v8/IDLTypes.h" |
| 10 #include "bindings/core/v8/ToV8.h" |
| 11 #include "bindings/core/v8/V8BindingForTesting.h" |
| 12 #include "testing/gtest/include/gtest/gtest.h" |
| 13 #include "wtf/Vector.h" |
| 14 |
| 15 namespace blink { |
| 16 |
| 17 namespace { |
| 18 |
| 19 template <typename T> |
| 20 v8::Local<v8::Value> ToV8(V8TestingScope* scope, T value) { |
| 21 return blink::ToV8(value, scope->context()->Global(), scope->isolate()); |
| 22 } |
| 23 |
| 24 TEST(NativeValueTraitsImplTest, IDLRecord) { |
| 25 V8TestingScope scope; |
| 26 { |
| 27 v8::Local<v8::Object> v8Object = v8::Object::New(scope.isolate()); |
| 28 NonThrowableExceptionState exceptionState; |
| 29 const auto& record = |
| 30 NativeValueTraits<IDLRecord<IDLString, IDLOctet>>::nativeValue( |
| 31 scope.isolate(), v8Object, exceptionState); |
| 32 EXPECT_TRUE(record.isEmpty()); |
| 33 } |
| 34 { |
| 35 v8::Local<v8::Object> v8Object = v8::Object::New(scope.isolate()); |
| 36 EXPECT_TRUE(v8CallBoolean( |
| 37 v8Object->Set(scope.context(), ToV8(&scope, "foo"), ToV8(&scope, 34)))); |
| 38 EXPECT_TRUE(v8CallBoolean(v8Object->Set( |
| 39 scope.context(), ToV8(&scope, "bar"), ToV8(&scope, -1024)))); |
| 40 EXPECT_TRUE(v8CallBoolean( |
| 41 v8Object->Set(scope.context(), ToV8(&scope, "foo"), ToV8(&scope, 42)))); |
| 42 |
| 43 NonThrowableExceptionState exceptionState; |
| 44 const auto& record = |
| 45 NativeValueTraits<IDLRecord<IDLByteString, IDLLong>>::nativeValue( |
| 46 scope.isolate(), v8Object, exceptionState); |
| 47 EXPECT_EQ(2U, record.size()); |
| 48 EXPECT_EQ(std::make_pair(String("foo"), int32_t(42)), record[0]); |
| 49 EXPECT_EQ(std::make_pair(String("bar"), int32_t(-1024)), record[1]); |
| 50 } |
| 51 { |
| 52 v8::Local<v8::Object> v8Object = v8::Object::New(scope.isolate()); |
| 53 EXPECT_TRUE(v8CallBoolean( |
| 54 v8Object->Set(scope.context(), ToV8(&scope, "foo"), ToV8(&scope, 42)))); |
| 55 EXPECT_TRUE(v8CallBoolean( |
| 56 v8Object->Set(scope.context(), ToV8(&scope, "bar"), ToV8(&scope, 0)))); |
| 57 EXPECT_TRUE(v8CallBoolean(v8Object->Set(scope.context(), ToV8(&scope, "xx"), |
| 58 ToV8(&scope, true)))); |
| 59 EXPECT_TRUE(v8CallBoolean(v8Object->Set( |
| 60 scope.context(), ToV8(&scope, "abcd"), ToV8(&scope, false)))); |
| 61 |
| 62 NonThrowableExceptionState exceptionState; |
| 63 const auto& record = |
| 64 NativeValueTraits<IDLRecord<IDLByteString, IDLBoolean>>::nativeValue( |
| 65 scope.isolate(), v8Object, exceptionState); |
| 66 EXPECT_EQ(4U, record.size()); |
| 67 EXPECT_EQ(std::make_pair(String("foo"), true), record[0]); |
| 68 EXPECT_EQ(std::make_pair(String("bar"), false), record[1]); |
| 69 EXPECT_EQ(std::make_pair(String("xx"), true), record[2]); |
| 70 EXPECT_EQ(std::make_pair(String("abcd"), false), record[3]); |
| 71 } |
| 72 { |
| 73 v8::Local<v8::Array> v8StringArray = v8::Array::New(scope.isolate(), 2); |
| 74 EXPECT_TRUE(v8CallBoolean(v8StringArray->Set( |
| 75 scope.context(), ToV8(&scope, 0), ToV8(&scope, "Hello, World!")))); |
| 76 EXPECT_TRUE(v8CallBoolean(v8StringArray->Set( |
| 77 scope.context(), ToV8(&scope, 1), ToV8(&scope, "Hi, Mom!")))); |
| 78 EXPECT_TRUE(v8CallBoolean(v8StringArray->Set( |
| 79 scope.context(), ToV8(&scope, "foo"), ToV8(&scope, "Ohai")))); |
| 80 |
| 81 NonThrowableExceptionState exceptionState; |
| 82 const auto& record = |
| 83 NativeValueTraits<IDLRecord<IDLUSVString, IDLString>>::nativeValue( |
| 84 scope.isolate(), v8StringArray, exceptionState); |
| 85 EXPECT_EQ(3U, record.size()); |
| 86 EXPECT_EQ(std::make_pair(String("0"), String("Hello, World!")), record[0]); |
| 87 EXPECT_EQ(std::make_pair(String("1"), String("Hi, Mom!")), record[1]); |
| 88 EXPECT_EQ(std::make_pair(String("foo"), String("Ohai")), record[2]); |
| 89 } |
| 90 { |
| 91 v8::Local<v8::Object> v8Object = v8::Object::New(scope.isolate()); |
| 92 EXPECT_TRUE(v8CallBoolean(v8Object->Set( |
| 93 scope.context(), v8::Symbol::GetToStringTag(scope.isolate()), |
| 94 ToV8(&scope, 34)))); |
| 95 EXPECT_TRUE(v8CallBoolean( |
| 96 v8Object->Set(scope.context(), ToV8(&scope, "foo"), ToV8(&scope, 42)))); |
| 97 |
| 98 NonThrowableExceptionState exceptionState; |
| 99 const auto& record = |
| 100 NativeValueTraits<IDLRecord<IDLString, IDLShort>>::nativeValue( |
| 101 scope.isolate(), v8Object, exceptionState); |
| 102 EXPECT_EQ(1U, record.size()); |
| 103 EXPECT_EQ(std::make_pair(String("foo"), int16_t(42)), record[0]); |
| 104 } |
| 105 { |
| 106 v8::Local<v8::Object> v8Object = v8::Object::New(scope.isolate()); |
| 107 EXPECT_TRUE(v8CallBoolean(v8Object->Set( |
| 108 scope.context(), v8::Symbol::GetToStringTag(scope.isolate()), |
| 109 ToV8(&scope, 34)))); |
| 110 EXPECT_TRUE(v8CallBoolean( |
| 111 v8Object->Set(scope.context(), ToV8(&scope, "foo"), ToV8(&scope, 42)))); |
| 112 |
| 113 NonThrowableExceptionState exceptionState; |
| 114 const auto& record = |
| 115 NativeValueTraits<IDLRecord<IDLString, IDLShort>>::nativeValue( |
| 116 scope.isolate(), v8Object, exceptionState); |
| 117 EXPECT_EQ(1U, record.size()); |
| 118 EXPECT_EQ(std::make_pair(String("foo"), int16_t(42)), record[0]); |
| 119 } |
| 120 { |
| 121 v8::Local<v8::Object> v8ParentObject = v8::Object::New(scope.isolate()); |
| 122 EXPECT_TRUE(v8CallBoolean(v8ParentObject->Set( |
| 123 scope.context(), ToV8(&scope, "foo"), ToV8(&scope, 34)))); |
| 124 EXPECT_TRUE(v8CallBoolean(v8ParentObject->Set( |
| 125 scope.context(), ToV8(&scope, "bar"), ToV8(&scope, 512)))); |
| 126 v8::Local<v8::Object> v8Object = v8::Object::New(scope.isolate()); |
| 127 EXPECT_TRUE( |
| 128 v8CallBoolean(v8Object->SetPrototype(scope.context(), v8ParentObject))); |
| 129 |
| 130 NonThrowableExceptionState exceptionState; |
| 131 auto record = |
| 132 NativeValueTraits<IDLRecord<IDLString, IDLUnsignedLong>>::nativeValue( |
| 133 scope.isolate(), v8Object, exceptionState); |
| 134 EXPECT_TRUE(record.isEmpty()); |
| 135 |
| 136 EXPECT_TRUE(v8CallBoolean(v8Object->Set( |
| 137 scope.context(), ToV8(&scope, "quux"), ToV8(&scope, 42)))); |
| 138 EXPECT_TRUE(v8CallBoolean(v8Object->Set( |
| 139 scope.context(), ToV8(&scope, "foo"), ToV8(&scope, 1024)))); |
| 140 record = |
| 141 NativeValueTraits<IDLRecord<IDLString, IDLUnsignedLong>>::nativeValue( |
| 142 scope.isolate(), v8Object, exceptionState); |
| 143 EXPECT_EQ(2U, record.size()); |
| 144 EXPECT_EQ(std::make_pair(String("quux"), uint32_t(42)), record[0]); |
| 145 EXPECT_EQ(std::make_pair(String("foo"), uint32_t(1024)), record[1]); |
| 146 } |
| 147 { |
| 148 v8::Local<v8::Array> v8StringArray = v8::Array::New(scope.isolate(), 2); |
| 149 EXPECT_TRUE(v8CallBoolean(v8StringArray->Set( |
| 150 scope.context(), ToV8(&scope, 0), ToV8(&scope, "Hello, World!")))); |
| 151 EXPECT_TRUE(v8CallBoolean(v8StringArray->Set( |
| 152 scope.context(), ToV8(&scope, 1), ToV8(&scope, "Hi, Mom!")))); |
| 153 v8::Local<v8::Object> v8Object = v8::Object::New(scope.isolate()); |
| 154 EXPECT_TRUE(v8CallBoolean(v8Object->Set( |
| 155 scope.context(), ToV8(&scope, "foo"), ToV8(&scope, v8StringArray)))); |
| 156 |
| 157 NonThrowableExceptionState exceptionState; |
| 158 const auto& record = |
| 159 NativeValueTraits<IDLRecord<IDLString, IDLSequence<IDLString>>>:: |
| 160 nativeValue(scope.isolate(), v8Object, exceptionState); |
| 161 EXPECT_EQ(1U, record.size()); |
| 162 EXPECT_EQ("foo", record[0].first); |
| 163 EXPECT_EQ("Hello, World!", record[0].second[0]); |
| 164 EXPECT_EQ("Hi, Mom!", record[0].second[1]); |
| 165 } |
| 166 } |
| 167 |
| 168 } // namespace |
| 169 |
| 170 } // namespace blink |
OLD | NEW |