OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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 "bindings/core/v8/serialization/V8ScriptValueSerializer.h" | 5 #include "bindings/core/v8/serialization/V8ScriptValueSerializer.h" |
6 | 6 |
7 #include "bindings/core/v8/ExceptionState.h" | 7 #include "bindings/core/v8/ExceptionState.h" |
8 #include "bindings/core/v8/ScriptController.h" | 8 #include "bindings/core/v8/ScriptController.h" |
9 #include "bindings/core/v8/ScriptSourceCode.h" | 9 #include "bindings/core/v8/ScriptSourceCode.h" |
10 #include "bindings/core/v8/V8BindingForTesting.h" | 10 #include "bindings/core/v8/V8BindingForTesting.h" |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
65 // Extract message ports and disentangle them. | 65 // Extract message ports and disentangle them. |
66 MessagePortChannelArray channels; | 66 MessagePortChannelArray channels; |
67 if (transferables) { | 67 if (transferables) { |
68 channels = MessagePort::disentanglePorts(scope.getExecutionContext(), | 68 channels = MessagePort::disentanglePorts(scope.getExecutionContext(), |
69 transferables->messagePorts, | 69 transferables->messagePorts, |
70 exceptionState); | 70 exceptionState); |
71 if (exceptionState.hadException()) | 71 if (exceptionState.hadException()) |
72 return v8::Local<v8::Value>(); | 72 return v8::Local<v8::Value>(); |
73 } | 73 } |
74 | 74 |
75 V8ScriptValueSerializer serializer(scriptState); | 75 V8ScriptValueSerializer::Options serializeOptions; |
76 serializer.setBlobInfoArray(blobInfo); | 76 serializeOptions.transferables = transferables; |
| 77 serializeOptions.blobInfo = blobInfo; |
| 78 V8ScriptValueSerializer serializer(scriptState, serializeOptions); |
77 RefPtr<SerializedScriptValue> serializedScriptValue = | 79 RefPtr<SerializedScriptValue> serializedScriptValue = |
78 serializer.serialize(value, transferables, exceptionState); | 80 serializer.serialize(value, exceptionState); |
79 DCHECK_EQ(!serializedScriptValue, exceptionState.hadException()); | 81 DCHECK_EQ(!serializedScriptValue, exceptionState.hadException()); |
80 if (!serializedScriptValue) | 82 if (!serializedScriptValue) |
81 return v8::Local<v8::Value>(); | 83 return v8::Local<v8::Value>(); |
82 | 84 |
83 // If there are message ports, make new ones and entangle them. | 85 // If there are message ports, make new ones and entangle them. |
84 MessagePortArray* transferredMessagePorts = MessagePort::entanglePorts( | 86 MessagePortArray* transferredMessagePorts = MessagePort::entanglePorts( |
85 *scope.getExecutionContext(), std::move(channels)); | 87 *scope.getExecutionContext(), std::move(channels)); |
86 | 88 |
87 V8ScriptValueDeserializer deserializer(scriptState, serializedScriptValue); | 89 V8ScriptValueDeserializer::Options deserializeOptions; |
88 deserializer.setTransferredMessagePorts(transferredMessagePorts); | 90 deserializeOptions.messagePorts = transferredMessagePorts; |
89 deserializer.setBlobInfoArray(blobInfo); | 91 deserializeOptions.blobInfo = blobInfo; |
| 92 V8ScriptValueDeserializer deserializer(scriptState, serializedScriptValue, |
| 93 deserializeOptions); |
90 return deserializer.deserialize(); | 94 return deserializer.deserialize(); |
91 } | 95 } |
92 | 96 |
93 v8::Local<v8::Value> eval(const String& source, V8TestingScope& scope) { | 97 v8::Local<v8::Value> eval(const String& source, V8TestingScope& scope) { |
94 return scope.frame().script().executeScriptInMainWorldAndReturnValue(source); | 98 return scope.frame().script().executeScriptInMainWorldAndReturnValue(source); |
95 } | 99 } |
96 | 100 |
97 String toJSON(v8::Local<v8::Object> object, const V8TestingScope& scope) { | 101 String toJSON(v8::Local<v8::Object> object, const V8TestingScope& scope) { |
98 return v8StringToWebCoreString<String>( | 102 return v8StringToWebCoreString<String>( |
99 v8::JSON::Stringify(scope.context(), object).ToLocalChecked(), | 103 v8::JSON::Stringify(scope.context(), object).ToLocalChecked(), |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
134 // are encountered in V8 (for example, cloning a symbol). It should be an | 138 // are encountered in V8 (for example, cloning a symbol). It should be an |
135 // instance of DOMException, and it should have a proper descriptive | 139 // instance of DOMException, and it should have a proper descriptive |
136 // message. | 140 // message. |
137 V8TestingScope scope; | 141 V8TestingScope scope; |
138 ScriptState* scriptState = scope.getScriptState(); | 142 ScriptState* scriptState = scope.getScriptState(); |
139 ExceptionState exceptionState(scope.isolate(), | 143 ExceptionState exceptionState(scope.isolate(), |
140 ExceptionState::ExecutionContext, "Window", | 144 ExceptionState::ExecutionContext, "Window", |
141 "postMessage"); | 145 "postMessage"); |
142 v8::Local<v8::Value> symbol = eval("Symbol()", scope); | 146 v8::Local<v8::Value> symbol = eval("Symbol()", scope); |
143 DCHECK(symbol->IsSymbol()); | 147 DCHECK(symbol->IsSymbol()); |
144 ASSERT_FALSE(V8ScriptValueSerializer(scriptState) | 148 ASSERT_FALSE( |
145 .serialize(symbol, nullptr, exceptionState)); | 149 V8ScriptValueSerializer(scriptState).serialize(symbol, exceptionState)); |
146 ASSERT_TRUE(hadDOMException("DataCloneError", scriptState, exceptionState)); | 150 ASSERT_TRUE(hadDOMException("DataCloneError", scriptState, exceptionState)); |
147 DOMException* domException = | 151 DOMException* domException = |
148 V8DOMException::toImpl(exceptionState.getException().As<v8::Object>()); | 152 V8DOMException::toImpl(exceptionState.getException().As<v8::Object>()); |
149 EXPECT_TRUE(domException->toString().contains("postMessage")); | 153 EXPECT_TRUE(domException->toString().contains("postMessage")); |
150 } | 154 } |
151 | 155 |
152 TEST(V8ScriptValueSerializerTest, RethrowsScriptError) { | 156 TEST(V8ScriptValueSerializerTest, RethrowsScriptError) { |
153 // Ensure that other exceptions, like those thrown by script, are properly | 157 // Ensure that other exceptions, like those thrown by script, are properly |
154 // rethrown. | 158 // rethrown. |
155 V8TestingScope scope; | 159 V8TestingScope scope; |
156 ScriptState* scriptState = scope.getScriptState(); | 160 ScriptState* scriptState = scope.getScriptState(); |
157 ExceptionState exceptionState(scope.isolate(), | 161 ExceptionState exceptionState(scope.isolate(), |
158 ExceptionState::ExecutionContext, "Window", | 162 ExceptionState::ExecutionContext, "Window", |
159 "postMessage"); | 163 "postMessage"); |
160 v8::Local<v8::Value> exception = eval("myException=new Error()", scope); | 164 v8::Local<v8::Value> exception = eval("myException=new Error()", scope); |
161 v8::Local<v8::Value> object = | 165 v8::Local<v8::Value> object = |
162 eval("({ get a() { throw myException; }})", scope); | 166 eval("({ get a() { throw myException; }})", scope); |
163 DCHECK(object->IsObject()); | 167 DCHECK(object->IsObject()); |
164 ASSERT_FALSE(V8ScriptValueSerializer(scriptState) | 168 ASSERT_FALSE( |
165 .serialize(object, nullptr, exceptionState)); | 169 V8ScriptValueSerializer(scriptState).serialize(object, exceptionState)); |
166 ASSERT_TRUE(exceptionState.hadException()); | 170 ASSERT_TRUE(exceptionState.hadException()); |
167 EXPECT_EQ(exception, exceptionState.getException()); | 171 EXPECT_EQ(exception, exceptionState.getException()); |
168 } | 172 } |
169 | 173 |
170 TEST(V8ScriptValueSerializerTest, DeserializationErrorReturnsNull) { | 174 TEST(V8ScriptValueSerializerTest, DeserializationErrorReturnsNull) { |
171 // If there's a problem during deserialization, it results in null, but no | 175 // If there's a problem during deserialization, it results in null, but no |
172 // exception. | 176 // exception. |
173 V8TestingScope scope; | 177 V8TestingScope scope; |
174 ScriptState* scriptState = scope.getScriptState(); | 178 ScriptState* scriptState = scope.getScriptState(); |
175 RefPtr<SerializedScriptValue> invalid = | 179 RefPtr<SerializedScriptValue> invalid = |
(...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
332 ScriptState* scriptState = scope.getScriptState(); | 336 ScriptState* scriptState = scope.getScriptState(); |
333 RefPtr<SerializedScriptValue> input = | 337 RefPtr<SerializedScriptValue> input = |
334 serializedValue({0xff, 0x09, 0x3f, 0x00, 0x4d, 0x01}); | 338 serializedValue({0xff, 0x09, 0x3f, 0x00, 0x4d, 0x01}); |
335 MessagePort* port1 = makeMessagePort(scope.getExecutionContext()); | 339 MessagePort* port1 = makeMessagePort(scope.getExecutionContext()); |
336 MessagePort* port2 = makeMessagePort(scope.getExecutionContext()); | 340 MessagePort* port2 = makeMessagePort(scope.getExecutionContext()); |
337 { | 341 { |
338 V8ScriptValueDeserializer deserializer(scriptState, input); | 342 V8ScriptValueDeserializer deserializer(scriptState, input); |
339 ASSERT_TRUE(deserializer.deserialize()->IsNull()); | 343 ASSERT_TRUE(deserializer.deserialize()->IsNull()); |
340 } | 344 } |
341 { | 345 { |
342 V8ScriptValueDeserializer deserializer(scriptState, input); | 346 V8ScriptValueDeserializer::Options options; |
343 deserializer.setTransferredMessagePorts(new MessagePortArray); | 347 options.messagePorts = new MessagePortArray; |
| 348 V8ScriptValueDeserializer deserializer(scriptState, input, options); |
344 ASSERT_TRUE(deserializer.deserialize()->IsNull()); | 349 ASSERT_TRUE(deserializer.deserialize()->IsNull()); |
345 } | 350 } |
346 { | 351 { |
347 MessagePortArray* ports = new MessagePortArray; | 352 V8ScriptValueDeserializer::Options options; |
348 ports->push_back(port1); | 353 options.messagePorts = new MessagePortArray; |
349 V8ScriptValueDeserializer deserializer(scriptState, input); | 354 options.messagePorts->push_back(port1); |
350 deserializer.setTransferredMessagePorts(ports); | 355 V8ScriptValueDeserializer deserializer(scriptState, input, options); |
351 ASSERT_TRUE(deserializer.deserialize()->IsNull()); | 356 ASSERT_TRUE(deserializer.deserialize()->IsNull()); |
352 } | 357 } |
353 { | 358 { |
354 MessagePortArray* ports = new MessagePortArray; | 359 V8ScriptValueDeserializer::Options options; |
355 ports->push_back(port1); | 360 options.messagePorts = new MessagePortArray; |
356 ports->push_back(port2); | 361 options.messagePorts->push_back(port1); |
357 V8ScriptValueDeserializer deserializer(scriptState, input); | 362 options.messagePorts->push_back(port2); |
358 deserializer.setTransferredMessagePorts(ports); | 363 V8ScriptValueDeserializer deserializer(scriptState, input, options); |
359 v8::Local<v8::Value> result = deserializer.deserialize(); | 364 v8::Local<v8::Value> result = deserializer.deserialize(); |
360 ASSERT_TRUE(V8MessagePort::hasInstance(result, scope.isolate())); | 365 ASSERT_TRUE(V8MessagePort::hasInstance(result, scope.isolate())); |
361 EXPECT_EQ(port2, V8MessagePort::toImpl(result.As<v8::Object>())); | 366 EXPECT_EQ(port2, V8MessagePort::toImpl(result.As<v8::Object>())); |
362 } | 367 } |
363 } | 368 } |
364 | 369 |
365 // Decode tests for backward compatibility are not required for message ports | 370 // Decode tests for backward compatibility are not required for message ports |
366 // because they cannot be persisted to disk. | 371 // because they cannot be persisted to disk. |
367 | 372 |
368 // A more exhaustive set of ImageBitmap cases are covered by LayoutTests. | 373 // A more exhaustive set of ImageBitmap cases are covered by LayoutTests. |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
578 EXPECT_EQ(sizeof(kHelloWorld), static_cast<size_t>(info.size())); | 583 EXPECT_EQ(sizeof(kHelloWorld), static_cast<size_t>(info.size())); |
579 } | 584 } |
580 | 585 |
581 TEST(V8ScriptValueSerializerTest, DecodeBlobIndex) { | 586 TEST(V8ScriptValueSerializerTest, DecodeBlobIndex) { |
582 V8TestingScope scope; | 587 V8TestingScope scope; |
583 RefPtr<SerializedScriptValue> input = | 588 RefPtr<SerializedScriptValue> input = |
584 serializedValue({0xff, 0x09, 0x3f, 0x00, 0x69, 0x00}); | 589 serializedValue({0xff, 0x09, 0x3f, 0x00, 0x69, 0x00}); |
585 WebBlobInfoArray blobInfoArray; | 590 WebBlobInfoArray blobInfoArray; |
586 blobInfoArray.emplace_back("d875dfc2-4505-461b-98fe-0cf6cc5eaf44", | 591 blobInfoArray.emplace_back("d875dfc2-4505-461b-98fe-0cf6cc5eaf44", |
587 "text/plain", 12); | 592 "text/plain", 12); |
588 V8ScriptValueDeserializer deserializer(scope.getScriptState(), input); | 593 V8ScriptValueDeserializer::Options options; |
589 deserializer.setBlobInfoArray(&blobInfoArray); | 594 options.blobInfo = &blobInfoArray; |
| 595 V8ScriptValueDeserializer deserializer(scope.getScriptState(), input, |
| 596 options); |
590 v8::Local<v8::Value> result = deserializer.deserialize(); | 597 v8::Local<v8::Value> result = deserializer.deserialize(); |
591 ASSERT_TRUE(V8Blob::hasInstance(result, scope.isolate())); | 598 ASSERT_TRUE(V8Blob::hasInstance(result, scope.isolate())); |
592 Blob* newBlob = V8Blob::toImpl(result.As<v8::Object>()); | 599 Blob* newBlob = V8Blob::toImpl(result.As<v8::Object>()); |
593 EXPECT_EQ("d875dfc2-4505-461b-98fe-0cf6cc5eaf44", newBlob->uuid()); | 600 EXPECT_EQ("d875dfc2-4505-461b-98fe-0cf6cc5eaf44", newBlob->uuid()); |
594 EXPECT_EQ("text/plain", newBlob->type()); | 601 EXPECT_EQ("text/plain", newBlob->type()); |
595 EXPECT_EQ(12u, newBlob->size()); | 602 EXPECT_EQ(12u, newBlob->size()); |
596 } | 603 } |
597 | 604 |
598 TEST(V8ScriptValueSerializerTest, DecodeBlobIndexOutOfRange) { | 605 TEST(V8ScriptValueSerializerTest, DecodeBlobIndexOutOfRange) { |
599 V8TestingScope scope; | 606 V8TestingScope scope; |
600 RefPtr<SerializedScriptValue> input = | 607 RefPtr<SerializedScriptValue> input = |
601 serializedValue({0xff, 0x09, 0x3f, 0x00, 0x69, 0x01}); | 608 serializedValue({0xff, 0x09, 0x3f, 0x00, 0x69, 0x01}); |
602 { | 609 { |
603 V8ScriptValueDeserializer deserializer(scope.getScriptState(), input); | 610 V8ScriptValueDeserializer deserializer(scope.getScriptState(), input); |
604 ASSERT_TRUE(deserializer.deserialize()->IsNull()); | 611 ASSERT_TRUE(deserializer.deserialize()->IsNull()); |
605 } | 612 } |
606 { | 613 { |
607 WebBlobInfoArray blobInfoArray; | 614 WebBlobInfoArray blobInfoArray; |
608 blobInfoArray.emplace_back("d875dfc2-4505-461b-98fe-0cf6cc5eaf44", | 615 blobInfoArray.emplace_back("d875dfc2-4505-461b-98fe-0cf6cc5eaf44", |
609 "text/plain", 12); | 616 "text/plain", 12); |
610 V8ScriptValueDeserializer deserializer(scope.getScriptState(), input); | 617 V8ScriptValueDeserializer::Options options; |
611 deserializer.setBlobInfoArray(&blobInfoArray); | 618 options.blobInfo = &blobInfoArray; |
| 619 V8ScriptValueDeserializer deserializer(scope.getScriptState(), input, |
| 620 options); |
612 ASSERT_TRUE(deserializer.deserialize()->IsNull()); | 621 ASSERT_TRUE(deserializer.deserialize()->IsNull()); |
613 } | 622 } |
614 } | 623 } |
615 | 624 |
616 TEST(V8ScriptValueSerializerTest, RoundTripFileNative) { | 625 TEST(V8ScriptValueSerializerTest, RoundTripFileNative) { |
617 V8TestingScope scope; | 626 V8TestingScope scope; |
618 File* file = File::create("/native/path"); | 627 File* file = File::create("/native/path"); |
619 v8::Local<v8::Value> wrapper = ToV8(file, scope.getScriptState()); | 628 v8::Local<v8::Value> wrapper = ToV8(file, scope.getScriptState()); |
620 v8::Local<v8::Value> result = roundTrip(wrapper, scope); | 629 v8::Local<v8::Value> result = roundTrip(wrapper, scope); |
621 ASSERT_TRUE(V8File::hasInstance(result, scope.isolate())); | 630 ASSERT_TRUE(V8File::hasInstance(result, scope.isolate())); |
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
833 EXPECT_EQ(file->uuid(), String(info.uuid())); | 842 EXPECT_EQ(file->uuid(), String(info.uuid())); |
834 } | 843 } |
835 | 844 |
836 TEST(V8ScriptValueSerializerTest, DecodeFileIndex) { | 845 TEST(V8ScriptValueSerializerTest, DecodeFileIndex) { |
837 V8TestingScope scope; | 846 V8TestingScope scope; |
838 RefPtr<SerializedScriptValue> input = | 847 RefPtr<SerializedScriptValue> input = |
839 serializedValue({0xff, 0x09, 0x3f, 0x00, 0x65, 0x00}); | 848 serializedValue({0xff, 0x09, 0x3f, 0x00, 0x65, 0x00}); |
840 WebBlobInfoArray blobInfoArray; | 849 WebBlobInfoArray blobInfoArray; |
841 blobInfoArray.emplace_back("d875dfc2-4505-461b-98fe-0cf6cc5eaf44", | 850 blobInfoArray.emplace_back("d875dfc2-4505-461b-98fe-0cf6cc5eaf44", |
842 "/native/path", "path", "text/plain"); | 851 "/native/path", "path", "text/plain"); |
843 V8ScriptValueDeserializer deserializer(scope.getScriptState(), input); | 852 V8ScriptValueDeserializer::Options options; |
844 deserializer.setBlobInfoArray(&blobInfoArray); | 853 options.blobInfo = &blobInfoArray; |
| 854 V8ScriptValueDeserializer deserializer(scope.getScriptState(), input, |
| 855 options); |
845 v8::Local<v8::Value> result = deserializer.deserialize(); | 856 v8::Local<v8::Value> result = deserializer.deserialize(); |
846 ASSERT_TRUE(V8File::hasInstance(result, scope.isolate())); | 857 ASSERT_TRUE(V8File::hasInstance(result, scope.isolate())); |
847 File* newFile = V8File::toImpl(result.As<v8::Object>()); | 858 File* newFile = V8File::toImpl(result.As<v8::Object>()); |
848 EXPECT_EQ("d875dfc2-4505-461b-98fe-0cf6cc5eaf44", newFile->uuid()); | 859 EXPECT_EQ("d875dfc2-4505-461b-98fe-0cf6cc5eaf44", newFile->uuid()); |
849 EXPECT_EQ("text/plain", newFile->type()); | 860 EXPECT_EQ("text/plain", newFile->type()); |
850 EXPECT_EQ("/native/path", newFile->path()); | 861 EXPECT_EQ("/native/path", newFile->path()); |
851 EXPECT_EQ("path", newFile->name()); | 862 EXPECT_EQ("path", newFile->name()); |
852 } | 863 } |
853 | 864 |
854 TEST(V8ScriptValueSerializerTest, DecodeFileIndexOutOfRange) { | 865 TEST(V8ScriptValueSerializerTest, DecodeFileIndexOutOfRange) { |
855 V8TestingScope scope; | 866 V8TestingScope scope; |
856 RefPtr<SerializedScriptValue> input = | 867 RefPtr<SerializedScriptValue> input = |
857 serializedValue({0xff, 0x09, 0x3f, 0x00, 0x65, 0x01}); | 868 serializedValue({0xff, 0x09, 0x3f, 0x00, 0x65, 0x01}); |
858 { | 869 { |
859 V8ScriptValueDeserializer deserializer(scope.getScriptState(), input); | 870 V8ScriptValueDeserializer deserializer(scope.getScriptState(), input); |
860 ASSERT_TRUE(deserializer.deserialize()->IsNull()); | 871 ASSERT_TRUE(deserializer.deserialize()->IsNull()); |
861 } | 872 } |
862 { | 873 { |
863 WebBlobInfoArray blobInfoArray; | 874 WebBlobInfoArray blobInfoArray; |
864 blobInfoArray.emplace_back("d875dfc2-4505-461b-98fe-0cf6cc5eaf44", | 875 blobInfoArray.emplace_back("d875dfc2-4505-461b-98fe-0cf6cc5eaf44", |
865 "/native/path", "path", "text/plain"); | 876 "/native/path", "path", "text/plain"); |
866 V8ScriptValueDeserializer deserializer(scope.getScriptState(), input); | 877 V8ScriptValueDeserializer::Options options; |
867 deserializer.setBlobInfoArray(&blobInfoArray); | 878 options.blobInfo = &blobInfoArray; |
| 879 V8ScriptValueDeserializer deserializer(scope.getScriptState(), input, |
| 880 options); |
868 ASSERT_TRUE(deserializer.deserialize()->IsNull()); | 881 ASSERT_TRUE(deserializer.deserialize()->IsNull()); |
869 } | 882 } |
870 } | 883 } |
871 | 884 |
872 // Most of the logic for FileList is shared with File, so the tests here are | 885 // Most of the logic for FileList is shared with File, so the tests here are |
873 // fairly basic. | 886 // fairly basic. |
874 | 887 |
875 TEST(V8ScriptValueSerializerTest, RoundTripFileList) { | 888 TEST(V8ScriptValueSerializerTest, RoundTripFileList) { |
876 V8TestingScope scope; | 889 V8TestingScope scope; |
877 FileList* fileList = FileList::create(); | 890 FileList* fileList = FileList::create(); |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
956 EXPECT_EQ("/native/path", blobInfoArray[0].filePath()); | 969 EXPECT_EQ("/native/path", blobInfoArray[0].filePath()); |
957 EXPECT_TRUE(blobInfoArray[1].isFile()); | 970 EXPECT_TRUE(blobInfoArray[1].isFile()); |
958 EXPECT_EQ("/native/path2", blobInfoArray[1].filePath()); | 971 EXPECT_EQ("/native/path2", blobInfoArray[1].filePath()); |
959 } | 972 } |
960 | 973 |
961 TEST(V8ScriptValueSerializerTest, DecodeEmptyFileListIndex) { | 974 TEST(V8ScriptValueSerializerTest, DecodeEmptyFileListIndex) { |
962 V8TestingScope scope; | 975 V8TestingScope scope; |
963 RefPtr<SerializedScriptValue> input = | 976 RefPtr<SerializedScriptValue> input = |
964 serializedValue({0xff, 0x09, 0x3f, 0x00, 0x4c, 0x00}); | 977 serializedValue({0xff, 0x09, 0x3f, 0x00, 0x4c, 0x00}); |
965 WebBlobInfoArray blobInfoArray; | 978 WebBlobInfoArray blobInfoArray; |
966 V8ScriptValueDeserializer deserializer(scope.getScriptState(), input); | 979 V8ScriptValueDeserializer::Options options; |
967 deserializer.setBlobInfoArray(&blobInfoArray); | 980 options.blobInfo = &blobInfoArray; |
| 981 V8ScriptValueDeserializer deserializer(scope.getScriptState(), input, |
| 982 options); |
968 v8::Local<v8::Value> result = deserializer.deserialize(); | 983 v8::Local<v8::Value> result = deserializer.deserialize(); |
969 ASSERT_TRUE(V8FileList::hasInstance(result, scope.isolate())); | 984 ASSERT_TRUE(V8FileList::hasInstance(result, scope.isolate())); |
970 FileList* newFileList = V8FileList::toImpl(result.As<v8::Object>()); | 985 FileList* newFileList = V8FileList::toImpl(result.As<v8::Object>()); |
971 EXPECT_EQ(0u, newFileList->length()); | 986 EXPECT_EQ(0u, newFileList->length()); |
972 } | 987 } |
973 | 988 |
974 TEST(V8ScriptValueSerializerTest, DecodeFileListIndexWithInvalidLength) { | 989 TEST(V8ScriptValueSerializerTest, DecodeFileListIndexWithInvalidLength) { |
975 V8TestingScope scope; | 990 V8TestingScope scope; |
976 RefPtr<SerializedScriptValue> input = | 991 RefPtr<SerializedScriptValue> input = |
977 serializedValue({0xff, 0x09, 0x3f, 0x00, 0x4c, 0x02}); | 992 serializedValue({0xff, 0x09, 0x3f, 0x00, 0x4c, 0x02}); |
978 WebBlobInfoArray blobInfoArray; | 993 WebBlobInfoArray blobInfoArray; |
979 V8ScriptValueDeserializer deserializer(scope.getScriptState(), input); | 994 V8ScriptValueDeserializer::Options options; |
980 deserializer.setBlobInfoArray(&blobInfoArray); | 995 options.blobInfo = &blobInfoArray; |
| 996 V8ScriptValueDeserializer deserializer(scope.getScriptState(), input, |
| 997 options); |
981 v8::Local<v8::Value> result = deserializer.deserialize(); | 998 v8::Local<v8::Value> result = deserializer.deserialize(); |
982 EXPECT_TRUE(result->IsNull()); | 999 EXPECT_TRUE(result->IsNull()); |
983 } | 1000 } |
984 | 1001 |
985 TEST(V8ScriptValueSerializerTest, DecodeFileListIndex) { | 1002 TEST(V8ScriptValueSerializerTest, DecodeFileListIndex) { |
986 V8TestingScope scope; | 1003 V8TestingScope scope; |
987 RefPtr<SerializedScriptValue> input = | 1004 RefPtr<SerializedScriptValue> input = |
988 serializedValue({0xff, 0x09, 0x3f, 0x00, 0x4c, 0x01, 0x00, 0x00}); | 1005 serializedValue({0xff, 0x09, 0x3f, 0x00, 0x4c, 0x01, 0x00, 0x00}); |
989 WebBlobInfoArray blobInfoArray; | 1006 WebBlobInfoArray blobInfoArray; |
990 blobInfoArray.emplace_back("d875dfc2-4505-461b-98fe-0cf6cc5eaf44", | 1007 blobInfoArray.emplace_back("d875dfc2-4505-461b-98fe-0cf6cc5eaf44", |
991 "/native/path", "name", "text/plain"); | 1008 "/native/path", "name", "text/plain"); |
992 V8ScriptValueDeserializer deserializer(scope.getScriptState(), input); | 1009 V8ScriptValueDeserializer::Options options; |
993 deserializer.setBlobInfoArray(&blobInfoArray); | 1010 options.blobInfo = &blobInfoArray; |
| 1011 V8ScriptValueDeserializer deserializer(scope.getScriptState(), input, |
| 1012 options); |
994 v8::Local<v8::Value> result = deserializer.deserialize(); | 1013 v8::Local<v8::Value> result = deserializer.deserialize(); |
995 FileList* newFileList = V8FileList::toImpl(result.As<v8::Object>()); | 1014 FileList* newFileList = V8FileList::toImpl(result.As<v8::Object>()); |
996 EXPECT_EQ(1u, newFileList->length()); | 1015 EXPECT_EQ(1u, newFileList->length()); |
997 File* newFile = newFileList->item(0); | 1016 File* newFile = newFileList->item(0); |
998 EXPECT_EQ("/native/path", newFile->path()); | 1017 EXPECT_EQ("/native/path", newFile->path()); |
999 EXPECT_EQ("name", newFile->name()); | 1018 EXPECT_EQ("name", newFile->name()); |
1000 EXPECT_EQ("d875dfc2-4505-461b-98fe-0cf6cc5eaf44", newFile->uuid()); | 1019 EXPECT_EQ("d875dfc2-4505-461b-98fe-0cf6cc5eaf44", newFile->uuid()); |
1001 EXPECT_EQ("text/plain", newFile->type()); | 1020 EXPECT_EQ("text/plain", newFile->type()); |
1002 } | 1021 } |
1003 | 1022 |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1071 RefPtr<SerializedScriptValue> input = | 1090 RefPtr<SerializedScriptValue> input = |
1072 serializedValue({0xff, 0x80, 0x09, 0xff, 0x09, 0x54}); | 1091 serializedValue({0xff, 0x80, 0x09, 0xff, 0x09, 0x54}); |
1073 EXPECT_TRUE( | 1092 EXPECT_TRUE( |
1074 V8ScriptValueDeserializer(scope.getScriptState(), std::move(input)) | 1093 V8ScriptValueDeserializer(scope.getScriptState(), std::move(input)) |
1075 .deserialize() | 1094 .deserialize() |
1076 ->IsTrue()); | 1095 ->IsTrue()); |
1077 } | 1096 } |
1078 | 1097 |
1079 } // namespace | 1098 } // namespace |
1080 } // namespace blink | 1099 } // namespace blink |
OLD | NEW |