Implement StorageAreaProxy::getItem and StorageAreaProxy::setItem
[WebKit-https.git] / Source / WebKit2 / UIProcess / Storage / StorageManager.cpp
1 /*
2  * Copyright (C) 2013 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 #include "config.h"
27 #include "StorageManager.h"
28
29 #include "StorageManagerMessages.h"
30 #include "WebProcessProxy.h"
31 #include "WorkQueue.h"
32 #include <WebCore/SecurityOriginHash.h>
33
34 using namespace WebCore;
35
36 namespace WebKit {
37
38 class StorageManager::StorageArea : public ThreadSafeRefCounted<StorageManager::StorageArea> {
39 public:
40     static PassRefPtr<StorageArea> create();
41     ~StorageArea();
42
43 private:
44     StorageArea();
45 };
46
47 PassRefPtr<StorageManager::StorageArea> StorageManager::StorageArea::create()
48 {
49     return adoptRef(new StorageArea());
50 }
51
52 StorageManager::StorageArea::StorageArea()
53 {
54 }
55
56 StorageManager::StorageArea::~StorageArea()
57 {
58 }
59
60 class StorageManager::SessionStorageNamespace : public ThreadSafeRefCounted<SessionStorageNamespace> {
61 public:
62     static PassRefPtr<SessionStorageNamespace> create();
63     ~SessionStorageNamespace();
64
65     bool isEmpty() const { return m_storageAreaMap.isEmpty(); }
66
67     void cloneTo(SessionStorageNamespace& newSessionStorageNamespace);
68
69 private:
70     SessionStorageNamespace();
71
72     HashMap<RefPtr<SecurityOrigin>, RefPtr<StorageArea> > m_storageAreaMap;
73 };
74
75 PassRefPtr<StorageManager::SessionStorageNamespace> StorageManager::SessionStorageNamespace::create()
76 {
77     return adoptRef(new SessionStorageNamespace());
78 }
79
80 StorageManager::SessionStorageNamespace::SessionStorageNamespace()
81 {
82 }
83
84 StorageManager::SessionStorageNamespace::~SessionStorageNamespace()
85 {
86 }
87
88 void StorageManager::SessionStorageNamespace::cloneTo(SessionStorageNamespace& newSessionStorageNamespace)
89 {
90     ASSERT(newSessionStorageNamespace.isEmpty());
91
92     // FIXME: Implement.
93 }
94
95 PassRefPtr<StorageManager> StorageManager::create()
96 {
97     return adoptRef(new StorageManager);
98 }
99
100 StorageManager::StorageManager()
101     : m_queue(WorkQueue::create("com.apple.WebKit.StorageManager"))
102 {
103 }
104
105 StorageManager::~StorageManager()
106 {
107 }
108
109 void StorageManager::createSessionStorageNamespace(uint64_t storageNamespaceID)
110 {
111     m_queue->dispatch(bind(&StorageManager::createSessionStorageNamespaceInternal, this, storageNamespaceID));
112 }
113
114 void StorageManager::destroySessionStorageNamespace(uint64_t storageNamespaceID)
115 {
116     m_queue->dispatch(bind(&StorageManager::destroySessionStorageNamespaceInternal, this, storageNamespaceID));
117 }
118
119 void StorageManager::cloneSessionStorageNamespace(uint64_t storageNamespaceID, uint64_t newStorageNamespaceID)
120 {
121     m_queue->dispatch(bind(&StorageManager::cloneSessionStorageNamespaceInternal, this, storageNamespaceID, newStorageNamespaceID));
122 }
123
124 void StorageManager::processWillOpenConnection(WebProcessProxy* webProcessProxy)
125 {
126     webProcessProxy->connection()->addWorkQueueMessageReceiver(Messages::StorageManager::messageReceiverName(), m_queue.get(), this);
127 }
128
129 void StorageManager::processWillCloseConnection(WebProcessProxy* webProcessProxy)
130 {
131     webProcessProxy->connection()->removeWorkQueueMessageReceiver(Messages::StorageManager::messageReceiverName());
132 }
133
134 void StorageManager::createStorageArea(CoreIPC::Connection*, uint64_t storageAreaID, uint64_t storageNamespaceID, const SecurityOriginData&)
135 {
136     UNUSED_PARAM(storageAreaID);
137     UNUSED_PARAM(storageNamespaceID);
138 }
139
140 void StorageManager::destroyStorageArea(CoreIPC::Connection*, uint64_t)
141 {
142 }
143
144 void StorageManager::getValues(CoreIPC::Connection*, uint64_t, HashMap<String, String>&)
145 {
146     // FIXME: Implement this.
147 }
148
149 void StorageManager::setItem(CoreIPC::Connection*, uint64_t storageAreaID, const String& key, const String& value)
150 {
151     // FIXME: Find the right storage area and set the item.
152 }
153
154 void StorageManager::createSessionStorageNamespaceInternal(uint64_t storageNamespaceID)
155 {
156     ASSERT(!m_sessionStorageNamespaces.contains(storageNamespaceID));
157
158     m_sessionStorageNamespaces.set(storageNamespaceID, SessionStorageNamespace::create());
159 }
160
161 void StorageManager::destroySessionStorageNamespaceInternal(uint64_t storageNamespaceID)
162 {
163     ASSERT(m_sessionStorageNamespaces.contains(storageNamespaceID));
164
165     m_sessionStorageNamespaces.remove(storageNamespaceID);
166 }
167
168 void StorageManager::cloneSessionStorageNamespaceInternal(uint64_t storageNamespaceID, uint64_t newStorageNamespaceID)
169 {
170     SessionStorageNamespace* sessionStorageNamespace = m_sessionStorageNamespaces.get(storageNamespaceID).get();
171     ASSERT(sessionStorageNamespace);
172
173     SessionStorageNamespace* newSessionStorageNamespace = m_sessionStorageNamespaces.get(newStorageNamespaceID).get();
174     ASSERT(newSessionStorageNamespace);
175
176     sessionStorageNamespace->cloneTo(*newSessionStorageNamespace);
177 }
178
179 } // namespace WebKit