696f752e883d1e6e6036d29bea3fe570670ac6c3
[WebKit-https.git] / Source / WebCore / Modules / indexeddb / IDBValue.h
1 /*
2  * Copyright (C) 2016 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #if ENABLE(INDEXED_DATABASE)
29
30 #include "ThreadSafeDataBuffer.h"
31 #include <pal/SessionID.h>
32 #include <wtf/text/WTFString.h>
33
34 namespace WebCore {
35
36 class SerializedScriptValue;
37
38 class IDBValue {
39     WTF_MAKE_FAST_ALLOCATED;
40 public:
41     WEBCORE_EXPORT IDBValue();
42     IDBValue(const SerializedScriptValue&);
43     IDBValue(const ThreadSafeDataBuffer&);
44     IDBValue(const SerializedScriptValue&, const Vector<String>& blobURLs, const PAL::SessionID&, const Vector<String>& blobFilePaths);
45     IDBValue(const ThreadSafeDataBuffer&, Vector<String>&& blobURLs, const PAL::SessionID&, Vector<String>&& blobFilePaths);
46     IDBValue(const ThreadSafeDataBuffer&, const Vector<String>& blobURLs, const PAL::SessionID&, const Vector<String>& blobFilePaths);
47
48     void setAsIsolatedCopy(const IDBValue&);
49     IDBValue isolatedCopy() const;
50
51     const ThreadSafeDataBuffer& data() const { return m_data; }
52     const Vector<String>& blobURLs() const { return m_blobURLs; }
53     PAL::SessionID sessionID() const;
54     const Vector<String>& blobFilePaths() const { return m_blobFilePaths; }
55
56     template<class Encoder> void encode(Encoder&) const;
57     template<class Decoder> static Optional<IDBValue> decode(Decoder&);
58
59 private:
60     ThreadSafeDataBuffer m_data;
61     Vector<String> m_blobURLs;
62     Optional<PAL::SessionID> m_sessionID;
63     Vector<String> m_blobFilePaths;
64 };
65
66 inline PAL::SessionID IDBValue::sessionID() const
67 {
68     // FIXME: We should assert m_sessionID is valid or remove m_sessionID.
69     if (!m_sessionID)
70         return { };
71     return *m_sessionID;
72 }
73
74 template<class Encoder>
75 void IDBValue::encode(Encoder& encoder) const
76 {
77     encoder << m_data;
78     encoder << m_blobURLs;
79     encoder << m_sessionID;
80     encoder << m_blobFilePaths;
81 }
82
83 template<class Decoder>
84 Optional<IDBValue> IDBValue::decode(Decoder& decoder)
85 {
86     IDBValue result;
87     if (!decoder.decode(result.m_data))
88         return WTF::nullopt;
89
90     if (!decoder.decode(result.m_blobURLs))
91         return WTF::nullopt;
92
93     if (!decoder.decode(result.m_sessionID))
94         return WTF::nullopt;
95
96     if (!decoder.decode(result.m_blobFilePaths))
97         return WTF::nullopt;
98
99     return result;
100 }
101
102 } // namespace WebCore
103
104 #endif // ENABLE(INDEXED_DATABASE)