aedb08a7f8742510db6302b7065bfbe7dbb75456
[WebKit.git] / Source / WebCore / platform / network / NetworkStorageSession.h
1 /*
2  * Copyright (C) 2012 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 #include "CredentialStorage.h"
29 #include "SessionID.h"
30 #include <wtf/text/WTFString.h>
31
32 #if PLATFORM(COCOA) || USE(CFURLCONNECTION)
33 #include "CFNetworkSPI.h"
34 #include <wtf/RetainPtr.h>
35 #endif
36
37 #if USE(SOUP)
38 #include <wtf/Function.h>
39 #include <wtf/glib/GRefPtr.h>
40 typedef struct _SoupCookieJar SoupCookieJar;
41 #endif
42
43 namespace WebCore {
44
45 class NetworkingContext;
46 class ResourceRequest;
47 class SoupNetworkSession;
48
49 class NetworkStorageSession {
50     WTF_MAKE_NONCOPYABLE(NetworkStorageSession); WTF_MAKE_FAST_ALLOCATED;
51 public:
52     WEBCORE_EXPORT static NetworkStorageSession& defaultStorageSession();
53     WEBCORE_EXPORT static NetworkStorageSession* storageSession(SessionID);
54     WEBCORE_EXPORT static void ensurePrivateBrowsingSession(SessionID, const String& identifierBase = String());
55     WEBCORE_EXPORT static void destroySession(SessionID);
56     WEBCORE_EXPORT static void forEach(std::function<void(const WebCore::NetworkStorageSession&)>);
57
58     WEBCORE_EXPORT static void switchToNewTestingSession();
59
60     SessionID sessionID() const { return m_sessionID; }
61     CredentialStorage& credentialStorage() { return m_credentialStorage; }
62
63 #if PLATFORM(COCOA) || USE(CFURLCONNECTION)
64     NetworkStorageSession(SessionID, RetainPtr<CFURLStorageSessionRef>);
65
66     // May be null, in which case a Foundation default should be used.
67     CFURLStorageSessionRef platformSession() { return m_platformSession.get(); }
68     WEBCORE_EXPORT RetainPtr<CFHTTPCookieStorageRef> cookieStorage() const;
69     WEBCORE_EXPORT static void setCookieStoragePartitioningEnabled(bool);
70 #elif USE(SOUP)
71     NetworkStorageSession(SessionID, std::unique_ptr<SoupNetworkSession>&&);
72     ~NetworkStorageSession();
73
74     SoupNetworkSession* soupNetworkSession() const { return m_session.get(); };
75     SoupNetworkSession& getOrCreateSoupNetworkSession() const;
76     SoupCookieJar* cookieStorage() const;
77     void setCookieStorage(SoupCookieJar*);
78     void setCookieObserverHandler(Function<void ()>&&);
79     void getCredentialFromPersistentStorage(const ProtectionSpace&, Function<void (Credential&&)> completionHandler);
80     void saveCredentialToPersistentStorage(const ProtectionSpace&, const Credential&);
81 #else
82     NetworkStorageSession(SessionID, NetworkingContext*);
83     ~NetworkStorageSession();
84
85     NetworkingContext* context() const;
86 #endif
87
88 private:
89     static HashMap<SessionID, std::unique_ptr<NetworkStorageSession>>& globalSessionMap();
90     SessionID m_sessionID;
91
92 #if PLATFORM(COCOA) || USE(CFURLCONNECTION)
93     RetainPtr<CFURLStorageSessionRef> m_platformSession;
94 #elif USE(SOUP)
95     static void cookiesDidChange(NetworkStorageSession*);
96
97     mutable std::unique_ptr<SoupNetworkSession> m_session;
98     GRefPtr<SoupCookieJar> m_cookieStorage;
99     Function<void ()> m_cookieObserverHandler;
100 #if USE(LIBSECRET)
101     Function<void (Credential&&)> m_persisentStorageCompletionHandler;
102     GRefPtr<GCancellable> m_persisentStorageCancellable;
103 #endif
104 #else
105     RefPtr<NetworkingContext> m_context;
106 #endif
107
108     CredentialStorage m_credentialStorage;
109 };
110
111 WEBCORE_EXPORT String cookieStoragePartition(const ResourceRequest&);
112 String cookieStoragePartition(const URL& firstPartyForCookies, const URL& resource);
113
114 }