| Index: third_party/WebKit/Source/bindings/modules/v8/serialization/V8ScriptValueSerializerForModulesTest.cpp
|
| diff --git a/third_party/WebKit/Source/bindings/modules/v8/serialization/V8ScriptValueSerializerForModulesTest.cpp b/third_party/WebKit/Source/bindings/modules/v8/serialization/V8ScriptValueSerializerForModulesTest.cpp
|
| index 366d6984052d4d4fe11a4d02f1fcfe4495192b00..ca883f9dca21ad92523a57376e8a9c8cf8ad319c 100644
|
| --- a/third_party/WebKit/Source/bindings/modules/v8/serialization/V8ScriptValueSerializerForModulesTest.cpp
|
| +++ b/third_party/WebKit/Source/bindings/modules/v8/serialization/V8ScriptValueSerializerForModulesTest.cpp
|
| @@ -10,10 +10,12 @@
|
| #include "bindings/core/v8/V8BindingForTesting.h"
|
| #include "bindings/core/v8/V8DOMException.h"
|
| #include "bindings/modules/v8/V8CryptoKey.h"
|
| +#include "bindings/modules/v8/V8DOMFileSystem.h"
|
| #include "bindings/modules/v8/V8RTCCertificate.h"
|
| #include "bindings/modules/v8/serialization/V8ScriptValueDeserializerForModules.h"
|
| #include "core/dom/DOMArrayBuffer.h"
|
| #include "modules/crypto/CryptoResultImpl.h"
|
| +#include "modules/filesystem/DOMFileSystem.h"
|
| #include "modules/peerconnection/RTCCertificate.h"
|
| #include "platform/RuntimeEnabledFeatures.h"
|
| #include "platform/testing/UnitTestHelpers.h"
|
| @@ -67,6 +69,23 @@ v8::Local<v8::Value> roundTrip(v8::Local<v8::Value> value,
|
| .deserialize();
|
| }
|
|
|
| +// Checks for a DOM exception, including a rethrown one.
|
| +::testing::AssertionResult hadDOMException(const StringView& name,
|
| + ScriptState* scriptState,
|
| + ExceptionState& exceptionState) {
|
| + if (!exceptionState.hadException())
|
| + return ::testing::AssertionFailure() << "no exception thrown";
|
| + DOMException* domException = V8DOMException::toImplWithTypeCheck(
|
| + scriptState->isolate(), exceptionState.getException());
|
| + if (!domException) {
|
| + return ::testing::AssertionFailure()
|
| + << "exception thrown was not a DOMException";
|
| + }
|
| + if (domException->name() != name)
|
| + return ::testing::AssertionFailure() << "was " << domException->name();
|
| + return ::testing::AssertionSuccess();
|
| +}
|
| +
|
| static const char kEcdsaPrivateKey[] =
|
| "-----BEGIN PRIVATE KEY-----\n"
|
| "MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQghHwQ1xYtCoEhFk7r\n"
|
| @@ -837,5 +856,95 @@ TEST(V8ScriptValueSerializerForModulesTest, DecodeCryptoKeyInvalid) {
|
| ->IsNull());
|
| }
|
|
|
| +TEST(V8ScriptValueSerializerForModulesTest, RoundTripDOMFileSystem) {
|
| + ScopedEnableV8BasedStructuredClone enable;
|
| + V8TestingScope scope;
|
| +
|
| + DOMFileSystem* fs = DOMFileSystem::create(
|
| + scope.getExecutionContext(), "http_example.com_0:Persistent",
|
| + FileSystemTypePersistent,
|
| + KURL(ParsedURLString, "filesystem:http://example.com/persistent/"));
|
| + // At time of writing, this can only happen for filesystems from PPAPI.
|
| + fs->makeClonable();
|
| + v8::Local<v8::Value> wrapper = toV8(fs, scope.getScriptState());
|
| + v8::Local<v8::Value> result = roundTrip(wrapper, scope);
|
| + ASSERT_FALSE(result.IsEmpty());
|
| + ASSERT_TRUE(V8DOMFileSystem::hasInstance(result, scope.isolate()));
|
| + DOMFileSystem* newFS = V8DOMFileSystem::toImpl(result.As<v8::Object>());
|
| + EXPECT_EQ("http_example.com_0:Persistent", newFS->name());
|
| + EXPECT_EQ(FileSystemTypePersistent, newFS->type());
|
| + EXPECT_EQ("filesystem:http://example.com/persistent/",
|
| + newFS->rootURL().getString());
|
| +}
|
| +
|
| +TEST(V8ScriptValueSerializerForModulesTest, RoundTripDOMFileSystemNotClonable) {
|
| + ScopedEnableV8BasedStructuredClone enable;
|
| + V8TestingScope scope;
|
| + ExceptionState exceptionState(scope.isolate(),
|
| + ExceptionState::ExecutionContext, "Window",
|
| + "postMessage");
|
| +
|
| + DOMFileSystem* fs = DOMFileSystem::create(
|
| + scope.getExecutionContext(), "http_example.com_0:Persistent",
|
| + FileSystemTypePersistent,
|
| + KURL(ParsedURLString, "filesystem:http://example.com/persistent/0/"));
|
| + ASSERT_FALSE(fs->clonable());
|
| + v8::Local<v8::Value> wrapper = toV8(fs, scope.getScriptState());
|
| + EXPECT_FALSE(V8ScriptValueSerializer(scope.getScriptState())
|
| + .serialize(wrapper, nullptr, exceptionState));
|
| + EXPECT_TRUE(hadDOMException("DataCloneError", scope.getScriptState(),
|
| + exceptionState));
|
| +}
|
| +
|
| +TEST(V8ScriptValueSerializerForModulesTest, DecodeDOMFileSystem) {
|
| + ScopedEnableV8BasedStructuredClone enable;
|
| + V8TestingScope scope;
|
| +
|
| + // This is encoded data generated from Chromium (around M56).
|
| + ScriptState* scriptState = scope.getScriptState();
|
| + RefPtr<SerializedScriptValue> input = serializedValue(
|
| + {0xff, 0x09, 0x3f, 0x00, 0x64, 0x01, 0x1d, 0x68, 0x74, 0x74, 0x70, 0x5f,
|
| + 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x5f,
|
| + 0x30, 0x3a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74,
|
| + 0x29, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x3a,
|
| + 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x65, 0x78, 0x61, 0x6d, 0x70,
|
| + 0x6c, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x73, 0x69,
|
| + 0x73, 0x74, 0x65, 0x6e, 0x74, 0x2f});
|
| +
|
| + // Decode test.
|
| + v8::Local<v8::Value> result =
|
| + V8ScriptValueDeserializerForModules(scriptState, input).deserialize();
|
| + ASSERT_TRUE(V8DOMFileSystem::hasInstance(result, scope.isolate()));
|
| + DOMFileSystem* newFS = V8DOMFileSystem::toImpl(result.As<v8::Object>());
|
| + EXPECT_EQ("http_example.com_0:Persistent", newFS->name());
|
| + EXPECT_EQ(FileSystemTypePersistent, newFS->type());
|
| + EXPECT_EQ("filesystem:http://example.com/persistent/",
|
| + newFS->rootURL().getString());
|
| +}
|
| +
|
| +TEST(V8ScriptValueSerializerForModulesTest, DecodeInvalidDOMFileSystem) {
|
| + ScopedEnableV8BasedStructuredClone enable;
|
| + V8TestingScope scope;
|
| + ScriptState* scriptState = scope.getScriptState();
|
| +
|
| + // Filesystem type out of range.
|
| + EXPECT_TRUE(
|
| + V8ScriptValueDeserializerForModules(
|
| + scriptState,
|
| + serializedValue({0xff, 0x09, 0x3f, 0x00, 0x64, 0x04, 0x1d, 0x68, 0x74,
|
| + 0x74, 0x70, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c,
|
| + 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x5f, 0x30, 0x3a, 0x50,
|
| + 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74,
|
| + 0x29, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74,
|
| + 0x65, 0x6d, 0x3a, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
|
| + 0x2f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e,
|
| + 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x73, 0x69,
|
| + 0x73, 0x74, 0x65, 0x6e, 0x74, 0x2f
|
| +
|
| + }))
|
| + .deserialize()
|
| + ->IsNull());
|
| +}
|
| +
|
| } // namespace
|
| } // namespace blink
|
|
|