Add a separate class for networking related storage
[WebKit-https.git] / Source / WebCore / platform / network / cf / NetworkStorageSessionCFNet.cpp
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 #include "config.h"
27 #include "NetworkStorageSession.h"
28
29 #include <wtf/MainThread.h>
30 #include <wtf/PassOwnPtr.h>
31
32 #if PLATFORM(MAC)
33 #include "WebCoreSystemInterface.h"
34 #else
35 #include <WebKitSystemInterface/WebKitSystemInterface.h>
36 #endif
37
38 namespace WebCore {
39
40 NetworkStorageSession::NetworkStorageSession(CFURLStorageSessionRef platformSession)
41     : m_platformSession(platformSession)
42     , m_isPrivate(false)
43 {
44 }
45
46 static OwnPtr<NetworkStorageSession>& defaultNetworkStorageSession()
47 {
48     ASSERT(isMainThread());
49     DEFINE_STATIC_LOCAL(OwnPtr<NetworkStorageSession>, session, ());
50     return session;
51 }
52
53 void NetworkStorageSession::switchToNewTestingSession()
54 {
55     // Set a private session for testing to avoid interfering with global cookies. This should be different from private browsing session.
56     // FIXME: It looks like creating a new session with the same identifier may be just creating a reference to the same storage. See <rdar://problem/11571450> and <rdar://problem/12384380>.
57 #if PLATFORM(MAC)
58     defaultNetworkStorageSession() = adoptPtr(new NetworkStorageSession(wkCreatePrivateStorageSession(CFSTR("Private WebKit Session"))));
59 #else
60     defaultNetworkStorageSession() = adoptPtr(new NetworkStorageSession(wkCreatePrivateStorageSession(CFSTR("Private WebKit Session"), defaultNetworkStorageSession()->platformSession())));
61 #endif
62 }
63
64 #if PLATFORM(WIN)
65 static RetainPtr<CFHTTPCookieStorageRef>& cookieStorageOverride()
66 {
67     DEFINE_STATIC_LOCAL(RetainPtr<CFHTTPCookieStorageRef>, cookieStorage, ());
68     return cookieStorage;
69 }
70
71 void overrideCookieStorage(CFHTTPCookieStorageRef cookieStorage)
72 {
73     ASSERT(isMainThread());
74     // FIXME: Why don't we retain it? The only caller is an API method that takes cookie storage as a raw argument.
75     cookieStorageOverride().adoptCF(cookieStorage);
76 }
77
78 CFHTTPCookieStorageRef overridenCookieStorage()
79 {
80     return cookieStorageOverride().get();
81 }
82 #endif
83
84 NetworkStorageSession& NetworkStorageSession::defaultStorageSession()
85 {
86     if (!defaultNetworkStorageSession())
87         defaultNetworkStorageSession() = adoptPtr(new NetworkStorageSession(0));
88     return *defaultNetworkStorageSession();
89 }
90
91 PassOwnPtr<NetworkStorageSession> NetworkStorageSession::createPrivateBrowsingSession(const String& identifierBase)
92 {
93     RetainPtr<CFStringRef> cfIdentifier = String(identifierBase + ".PrivateBrowsing").createCFString();
94
95 #if PLATFORM(MAC)
96     OwnPtr<NetworkStorageSession> session = adoptPtr(new NetworkStorageSession(wkCreatePrivateStorageSession(cfIdentifier.get())));
97 #else
98     OwnPtr<NetworkStorageSession> session = adoptPtr(new NetworkStorageSession(wkCreatePrivateStorageSession(cfIdentifier.get(), defaultNetworkStorageSession()->platformSession())));
99 #endif
100     session->m_isPrivate = true;
101
102     return session.release();
103 }
104
105 RetainPtr<CFHTTPCookieStorageRef> NetworkStorageSession::cookieStorage() const
106 {
107 #if PLATFORM(WIN)
108     if (RetainPtr<CFHTTPCookieStorageRef>& override = cookieStorageOverride())
109         return override;
110 #endif
111
112     if (m_platformSession)
113         return RetainPtr<CFHTTPCookieStorageRef>(AdoptCF, wkCopyHTTPCookieStorage(m_platformSession.get()));
114
115 #if USE(CFNETWORK)
116     return wkGetDefaultHTTPCookieStorage();
117 #else
118     // When using NSURLConnection, we also use its shared cookie storage.
119     return 0;
120 #endif
121 }
122
123 }