2 * Copyright (C) 2011, 2013 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
27 #include "WebCookieManagerProxy.h"
30 #include "APISecurityOrigin.h"
31 #include "NetworkProcessMessages.h"
32 #include "OptionalCallbackID.h"
33 #include "WebCookieManagerMessages.h"
34 #include "WebCookieManagerProxyMessages.h"
35 #include "WebProcessPool.h"
36 #include <WebCore/Cookie.h>
37 #include <WebCore/SecurityOriginData.h>
39 using namespace WebCore;
43 const char* WebCookieManagerProxy::supplementName()
45 return "WebCookieManagerProxy";
48 Ref<WebCookieManagerProxy> WebCookieManagerProxy::create(WebProcessPool* processPool)
50 return adoptRef(*new WebCookieManagerProxy(processPool));
53 WebCookieManagerProxy::WebCookieManagerProxy(WebProcessPool* processPool)
54 : WebContextSupplement(processPool)
56 , m_cookiePersistentStorageType(SoupCookiePersistentStorageSQLite)
59 WebContextSupplement::processPool()->addMessageReceiver(Messages::WebCookieManagerProxy::messageReceiverName(), *this);
62 WebCookieManagerProxy::~WebCookieManagerProxy()
64 ASSERT(m_cookieObservers.isEmpty());
67 void WebCookieManagerProxy::initializeClient(const WKCookieManagerClientBase* client)
69 m_client.initialize(client);
72 // WebContextSupplement
74 void WebCookieManagerProxy::processPoolDestroyed()
76 m_callbacks.invalidate(CallbackBase::Error::OwnerWasInvalidated);
78 Vector<Observer*> observers;
79 for (auto& observerSet : m_cookieObservers.values()) {
80 for (auto* observer : observerSet)
81 observers.append(observer);
84 for (auto* observer : observers)
85 observer->managerDestroyed();
87 ASSERT(m_cookieObservers.isEmpty());
90 void WebCookieManagerProxy::processDidClose(WebProcessProxy*)
92 m_callbacks.invalidate(CallbackBase::Error::ProcessExited);
95 void WebCookieManagerProxy::processDidClose(NetworkProcessProxy*)
97 m_callbacks.invalidate(CallbackBase::Error::ProcessExited);
100 void WebCookieManagerProxy::refWebContextSupplement()
105 void WebCookieManagerProxy::derefWebContextSupplement()
107 API::Object::deref();
110 void WebCookieManagerProxy::getHostnamesWithCookies(PAL::SessionID sessionID, Function<void (API::Array*, CallbackBase::Error)>&& callbackFunction)
112 auto callbackID = m_callbacks.put(WTFMove(callbackFunction), processPool()->ensureNetworkProcess().throttler().backgroundActivityToken());
113 processPool()->sendToNetworkingProcess(Messages::WebCookieManager::GetHostnamesWithCookies(sessionID, callbackID));
116 void WebCookieManagerProxy::didGetHostnamesWithCookies(const Vector<String>& hostnames, WebKit::CallbackID callbackID)
118 auto callback = m_callbacks.take<ArrayCallback>(callbackID);
120 // FIXME: Log error or assert.
124 callback->performCallbackWithReturnValue(API::Array::createStringArray(hostnames).ptr());
127 void WebCookieManagerProxy::deleteCookiesForHostname(PAL::SessionID sessionID, const String& hostname)
129 processPool()->sendToNetworkingProcessRelaunchingIfNecessary(Messages::WebCookieManager::DeleteCookiesForHostname(sessionID, hostname));
132 void WebCookieManagerProxy::deleteAllCookies(PAL::SessionID sessionID)
134 processPool()->sendToNetworkingProcessRelaunchingIfNecessary(Messages::WebCookieManager::DeleteAllCookies(sessionID));
137 void WebCookieManagerProxy::deleteCookie(PAL::SessionID sessionID, const Cookie& cookie, Function<void (CallbackBase::Error)>&& callbackFunction)
139 auto callbackID = m_callbacks.put(WTFMove(callbackFunction), processPool()->ensureNetworkProcess().throttler().backgroundActivityToken());
140 processPool()->sendToNetworkingProcess(Messages::WebCookieManager::DeleteCookie(sessionID, cookie, callbackID));
143 void WebCookieManagerProxy::deleteAllCookiesModifiedSince(PAL::SessionID sessionID, WallTime time, Function<void (CallbackBase::Error)>&& callbackFunction)
145 auto callbackID = m_callbacks.put(WTFMove(callbackFunction), processPool()->ensureNetworkProcess().throttler().backgroundActivityToken());
146 processPool()->sendToNetworkingProcess(Messages::WebCookieManager::DeleteAllCookiesModifiedSince(sessionID, time, callbackID));
149 void WebCookieManagerProxy::setCookie(PAL::SessionID sessionID, const Cookie& cookie, Function<void (CallbackBase::Error)>&& callbackFunction)
151 auto callbackID = m_callbacks.put(WTFMove(callbackFunction), processPool()->ensureNetworkProcess().throttler().backgroundActivityToken());
152 processPool()->sendToNetworkingProcess(Messages::WebCookieManager::SetCookie(sessionID, cookie, callbackID));
155 void WebCookieManagerProxy::setCookies(PAL::SessionID sessionID, const Vector<Cookie>& cookies, const URL& url, const URL& mainDocumentURL, Function<void (CallbackBase::Error)>&& callbackFunction)
157 auto callbackID = m_callbacks.put(WTFMove(callbackFunction), processPool()->ensureNetworkProcess().throttler().backgroundActivityToken());
158 processPool()->sendToNetworkingProcess(Messages::WebCookieManager::SetCookies(sessionID, cookies, url, mainDocumentURL, callbackID));
161 void WebCookieManagerProxy::getAllCookies(PAL::SessionID sessionID, Function<void (const Vector<Cookie>&, CallbackBase::Error)>&& callbackFunction)
163 auto callbackID = m_callbacks.put(WTFMove(callbackFunction), processPool()->ensureNetworkProcess().throttler().backgroundActivityToken());
164 processPool()->sendToNetworkingProcess(Messages::WebCookieManager::GetAllCookies(sessionID, callbackID));
167 void WebCookieManagerProxy::getCookies(PAL::SessionID sessionID, const URL& url, Function<void (const Vector<Cookie>&, CallbackBase::Error)>&& callbackFunction)
169 auto callbackID = m_callbacks.put(WTFMove(callbackFunction), processPool()->ensureNetworkProcess().throttler().backgroundActivityToken());
170 processPool()->sendToNetworkingProcess(Messages::WebCookieManager::GetCookies(sessionID, url, callbackID));
173 void WebCookieManagerProxy::didSetCookies(WebKit::CallbackID callbackID)
175 m_callbacks.take<VoidCallback>(callbackID)->performCallback();
178 void WebCookieManagerProxy::didGetCookies(const Vector<Cookie>& cookies, WebKit::CallbackID callbackID)
180 m_callbacks.take<GetCookiesCallback>(callbackID)->performCallbackWithReturnValue(cookies);
183 void WebCookieManagerProxy::didDeleteCookies(WebKit::CallbackID callbackID)
185 m_callbacks.take<VoidCallback>(callbackID)->performCallback();
188 void WebCookieManagerProxy::startObservingCookieChanges(PAL::SessionID sessionID)
190 processPool()->sendToNetworkingProcessRelaunchingIfNecessary(Messages::WebCookieManager::StartObservingCookieChanges(sessionID));
193 void WebCookieManagerProxy::stopObservingCookieChanges(PAL::SessionID sessionID)
195 processPool()->sendToNetworkingProcessRelaunchingIfNecessary(Messages::WebCookieManager::StopObservingCookieChanges(sessionID));
199 void WebCookieManagerProxy::setCookieObserverCallback(PAL::SessionID sessionID, WTF::Function<void ()>&& callback)
202 m_legacyCookieObservers.set(sessionID, WTFMove(callback));
204 m_legacyCookieObservers.remove(sessionID);
207 void WebCookieManagerProxy::registerObserver(PAL::SessionID sessionID, Observer& observer)
209 auto result = m_cookieObservers.set(sessionID, HashSet<Observer*>());
210 result.iterator->value.add(&observer);
212 if (result.isNewEntry)
213 startObservingCookieChanges(sessionID);
216 void WebCookieManagerProxy::unregisterObserver(PAL::SessionID sessionID, Observer& observer)
218 auto iterator = m_cookieObservers.find(sessionID);
219 if (iterator == m_cookieObservers.end())
222 iterator->value.remove(&observer);
223 if (!iterator->value.isEmpty())
226 m_cookieObservers.remove(iterator);
227 stopObservingCookieChanges(sessionID);
230 void WebCookieManagerProxy::cookiesDidChange(PAL::SessionID sessionID)
232 m_client.cookiesDidChange(this);
233 auto legacyIterator = m_legacyCookieObservers.find(sessionID);
234 if (legacyIterator != m_legacyCookieObservers.end())
235 ((*legacyIterator).value)();
237 auto iterator = m_cookieObservers.find(sessionID);
238 if (iterator == m_cookieObservers.end())
241 for (auto* observer : iterator->value)
242 observer->cookiesDidChange();
245 void WebCookieManagerProxy::setHTTPCookieAcceptPolicy(PAL::SessionID, HTTPCookieAcceptPolicy policy, Function<void (CallbackBase::Error)>&& callbackFunction)
248 if (!processPool()->isUsingTestingNetworkSession())
249 persistHTTPCookieAcceptPolicy(policy);
252 processPool()->setInitialHTTPCookieAcceptPolicy(policy);
255 auto callbackID = m_callbacks.put(WTFMove(callbackFunction), processPool()->ensureNetworkProcess().throttler().backgroundActivityToken());
256 processPool()->sendToNetworkingProcess(Messages::WebCookieManager::SetHTTPCookieAcceptPolicy(policy, OptionalCallbackID(callbackID)));
259 void WebCookieManagerProxy::getHTTPCookieAcceptPolicy(PAL::SessionID, Function<void (HTTPCookieAcceptPolicy, CallbackBase::Error)>&& callbackFunction)
261 auto callbackID = m_callbacks.put(WTFMove(callbackFunction), processPool()->ensureNetworkProcess().throttler().backgroundActivityToken());
262 processPool()->sendToNetworkingProcess(Messages::WebCookieManager::GetHTTPCookieAcceptPolicy(callbackID));
265 void WebCookieManagerProxy::didGetHTTPCookieAcceptPolicy(uint32_t policy, WebKit::CallbackID callbackID)
267 m_callbacks.take<HTTPCookieAcceptPolicyCallback>(callbackID)->performCallbackWithReturnValue(policy);
270 void WebCookieManagerProxy::didSetHTTPCookieAcceptPolicy(WebKit::CallbackID callbackID)
272 m_callbacks.take<VoidCallback>(callbackID)->performCallback();
275 void WebCookieManagerProxy::setStorageAccessAPIEnabled(bool enabled)
278 processPool()->sendToNetworkingProcess(Messages::NetworkProcess::SetStorageAccessAPIEnabled(enabled));
280 UNUSED_PARAM(enabled);
284 } // namespace WebKit