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