CookieManager only works with the default session
[WebKit-https.git] / Source / WebCore / platform / network / soup / CookieStorageSoup.cpp
1 /*
2  *  Copyright (C) 2012 Igalia S.L.
3  *
4  *  This library is free software; you can redistribute it and/or
5  *  modify it under the terms of the GNU Lesser General Public
6  *  License as published by the Free Software Foundation; either
7  *  version 2 of the License, or (at your option) any later version.
8  *
9  *  This library is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  *  Lesser General Public License for more details.
13  *
14  *  You should have received a copy of the GNU Lesser General Public
15  *  License along with this library; if not, write to the Free Software
16  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
17  */
18
19 #include "config.h"
20 #include "CookieStorage.h"
21
22 #if USE(SOUP)
23
24 #include "NetworkStorageSession.h"
25 #include <libsoup/soup.h>
26 #include <wtf/HashMap.h>
27 #include <wtf/NeverDestroyed.h>
28
29 namespace WebCore {
30
31 static HashMap<SoupCookieJar*, std::function<void ()>>& cookieChangeCallbackMap()
32 {
33     static NeverDestroyed<HashMap<SoupCookieJar*, std::function<void ()>>> map;
34     return map;
35 }
36
37 static void soupCookiesChanged(SoupCookieJar* jar)
38 {
39     if (auto callback = cookieChangeCallbackMap().get(jar))
40         callback();
41 }
42
43 void startObservingCookieChanges(const NetworkStorageSession& storageSession, std::function<void ()>&& callback)
44 {
45     auto* jar = storageSession.cookieStorage();
46     ASSERT(!cookieChangeCallbackMap().contains(jar));
47     cookieChangeCallbackMap().add(jar, WTFMove(callback));
48     g_signal_connect(jar, "changed", G_CALLBACK(soupCookiesChanged), nullptr);
49 }
50
51 void stopObservingCookieChanges(const NetworkStorageSession& storageSession)
52 {
53     auto* jar = storageSession.cookieStorage();
54     ASSERT(cookieChangeCallbackMap().contains(jar));
55     cookieChangeCallbackMap().remove(jar);
56     g_signal_handlers_disconnect_by_func(jar, reinterpret_cast<void*>(soupCookiesChanged), nullptr);
57 }
58
59 }
60
61 #endif