/* * Copyright (C) 2009, 2013, 2016 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #pragma once #include "ExceptionOr.h" #include #include #include #include #include #include #include typedef const struct OpaqueJSContext* JSContextRef; typedef const struct OpaqueJSValue* JSValueRef; namespace WebCore { class IDBValue; class MessagePort; class SharedBuffer; enum class SerializationReturnCode; enum class SerializationErrorMode { NonThrowing, Throwing }; enum class SerializationContext { Default, WorkerPostMessage }; using ArrayBufferContentsArray = Vector; class SerializedScriptValue : public ThreadSafeRefCounted { public: WEBCORE_EXPORT static RefPtr create(JSC::ExecState&, JSC::JSValue, SerializationErrorMode = SerializationErrorMode::Throwing); WEBCORE_EXPORT static ExceptionOr> create(JSC::ExecState&, JSC::JSValue, Vector>&& transfer, Vector>&, SerializationContext = SerializationContext::Default); WEBCORE_EXPORT static RefPtr create(StringView); static Ref adopt(Vector&& buffer) { return adoptRef(*new SerializedScriptValue(WTFMove(buffer))); } static Ref nullValue(); WEBCORE_EXPORT JSC::JSValue deserialize(JSC::ExecState&, JSC::JSGlobalObject*, SerializationErrorMode = SerializationErrorMode::Throwing); WEBCORE_EXPORT JSC::JSValue deserialize(JSC::ExecState&, JSC::JSGlobalObject*, Vector>&, SerializationErrorMode = SerializationErrorMode::Throwing); JSC::JSValue deserialize(JSC::ExecState&, JSC::JSGlobalObject*, Vector>&, const Vector& blobURLs, const Vector& blobFilePaths, SerializationErrorMode = SerializationErrorMode::Throwing); static uint32_t wireFormatVersion(); String toString(); // API implementation helpers. These don't expose special behavior for ArrayBuffers or MessagePorts. WEBCORE_EXPORT static RefPtr create(JSContextRef, JSValueRef, JSValueRef* exception); WEBCORE_EXPORT JSValueRef deserialize(JSContextRef, JSValueRef* exception); const Vector& data() const { return m_data; } bool hasBlobURLs() const { return !m_blobURLs.isEmpty(); } #if ENABLE(INDEXED_DATABASE) Vector blobURLsIsolatedCopy() const; void writeBlobsToDiskForIndexedDB(WTF::Function&& completionHandler); IDBValue writeBlobsToDiskForIndexedDBSynchronously(); #endif // ENABLE(INDEXED_DATABASE) static Ref createFromWireBytes(Vector&& data) { return adoptRef(*new SerializedScriptValue(WTFMove(data))); } const Vector& toWireBytes() const { return m_data; } WEBCORE_EXPORT ~SerializedScriptValue(); private: WEBCORE_EXPORT SerializedScriptValue(Vector&&); SerializedScriptValue(Vector&&, const Vector& blobURLs, std::unique_ptr, std::unique_ptr sharedBuffers); Vector m_data; std::unique_ptr m_arrayBufferContentsArray; std::unique_ptr m_sharedBufferContentsArray; Vector m_blobURLs; }; }