31e41aa8d152f5d49baff4f510230e6fb0ef3deb
[WebKit-https.git] / Source / WebCore / Modules / indexeddb / IDBDatabaseIdentifier.h
1 /*
2  * Copyright (C) 2015 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. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef IDBDatabaseIdentifier_h
27 #define IDBDatabaseIdentifier_h
28
29 #if ENABLE(INDEXED_DATABASE)
30
31 #include "SecurityOriginData.h"
32 #include <wtf/Ref.h>
33 #include <wtf/RefCounted.h>
34 #include <wtf/text/StringHash.h>
35 #include <wtf/text/WTFString.h>
36
37 namespace WebCore {
38
39 class SecurityOrigin;
40
41 class IDBDatabaseIdentifier {
42 public:
43     IDBDatabaseIdentifier()
44     {
45         m_openingOrigin.port = -2;
46         m_mainFrameOrigin.port = -2;
47     }
48
49     IDBDatabaseIdentifier(WTF::HashTableDeletedValueType)
50     {
51         m_openingOrigin.port = -1;
52         m_mainFrameOrigin.port = -1;
53     }
54
55     IDBDatabaseIdentifier isolatedCopy() const;
56
57     bool isHashTableDeletedValue() const
58     {
59         return m_openingOrigin.port == -1 && m_mainFrameOrigin.port == -1;
60     }
61
62     unsigned hash() const
63     {
64         unsigned nameHash = StringHash::hash(m_databaseName);
65         unsigned openingProtocolHash = StringHash::hash(m_openingOrigin.protocol);
66         unsigned openingHostHash = StringHash::hash(m_openingOrigin.host);
67         unsigned mainFrameProtocolHash = StringHash::hash(m_mainFrameOrigin.protocol);
68         unsigned mainFrameHostHash = StringHash::hash(m_mainFrameOrigin.host);
69         
70         unsigned hashCodes[7] = { nameHash, openingProtocolHash, openingHostHash, static_cast<unsigned>(m_openingOrigin.port), mainFrameProtocolHash, mainFrameHostHash, static_cast<unsigned>(m_mainFrameOrigin.port) };
71         return StringHasher::hashMemory<sizeof(hashCodes)>(hashCodes);
72     }
73
74     IDBDatabaseIdentifier(const String& databaseName, const SecurityOrigin& openingOrigin, const SecurityOrigin& mainFrameOrigin);
75
76     bool isValid() const
77     {
78         return !m_databaseName.isNull() && m_openingOrigin.port >= 0 && m_mainFrameOrigin.port >= 0;
79     }
80
81     bool isEmpty() const
82     {
83         return m_openingOrigin.port == -2 && m_mainFrameOrigin.port == -2;
84     }
85
86     bool operator==(const IDBDatabaseIdentifier& other) const
87     {
88         return other.m_databaseName == m_databaseName
89             && other.m_openingOrigin == m_openingOrigin
90             && other.m_mainFrameOrigin == m_mainFrameOrigin;
91     }
92
93     const String& databaseName() const { return m_databaseName; }
94
95     String databaseDirectoryRelativeToRoot(const String& rootDirectory) const;
96     static String databaseDirectoryRelativeToRoot(const SecurityOriginData& topLevelOrigin, const SecurityOriginData& openingOrigin, const String& rootDirectory);
97
98     template<class Encoder> void encode(Encoder&) const;
99     template<class Decoder> static bool decode(Decoder&, IDBDatabaseIdentifier&);
100
101 #ifndef NDEBUG
102     String debugString() const;
103 #endif
104
105 private:
106     String m_databaseName;
107     SecurityOriginData m_openingOrigin;
108     SecurityOriginData m_mainFrameOrigin;
109 };
110
111 struct IDBDatabaseIdentifierHash {
112     static unsigned hash(const IDBDatabaseIdentifier& a) { return a.hash(); }
113     static bool equal(const IDBDatabaseIdentifier& a, const IDBDatabaseIdentifier& b) { return a == b; }
114     static const bool safeToCompareToEmptyOrDeleted = false;
115 };
116
117 struct IDBDatabaseIdentifierHashTraits : WTF::SimpleClassHashTraits<IDBDatabaseIdentifier> {
118     static const bool hasIsEmptyValueFunction = true;
119     static const bool emptyValueIsZero = false;
120     static bool isEmptyValue(const IDBDatabaseIdentifier& info) { return info.isEmpty(); }
121 };
122
123 template<class Encoder>
124 void IDBDatabaseIdentifier::encode(Encoder& encoder) const
125 {
126     encoder << m_databaseName << m_openingOrigin << m_mainFrameOrigin;
127 }
128
129 template<class Decoder>
130 bool IDBDatabaseIdentifier::decode(Decoder& decoder, IDBDatabaseIdentifier& identifier)
131 {
132     if (!decoder.decode(identifier.m_databaseName))
133         return false;
134
135     if (!decoder.decode(identifier.m_openingOrigin))
136         return false;
137
138     if (!decoder.decode(identifier.m_mainFrameOrigin))
139         return false;
140
141     return true;
142 }
143
144 } // namespace WebCore
145
146 namespace WTF {
147
148 template<> struct HashTraits<WebCore::IDBDatabaseIdentifier> : WebCore::IDBDatabaseIdentifierHashTraits { };
149 template<> struct DefaultHash<WebCore::IDBDatabaseIdentifier> {
150     typedef WebCore::IDBDatabaseIdentifierHash Hash;
151 };
152
153 } // namespace WTF
154
155 #endif // ENABLE(INDEXED_DATABASE)
156 #endif // IDBDatabaseIdentifier_h