[iOS] Upstream PLATFORM(IOS) changes to Source/WebKit/
[WebKit-https.git] / Source / WebKit / mac / WebCoreSupport / WebFrameNetworkingContext.mm
1 /*
2  * Copyright (C) 2013 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 "WebViewPrivate.h"
27 #include "WebFrameInternal.h"
28 #include <WebFrameNetworkingContext.h>
29 #include <WebCore/FrameLoader.h>
30 #include <WebCore/FrameLoaderClient.h>
31 #include <WebCore/NetworkStorageSession.h>
32 #include <WebCore/Page.h>
33 #include <WebCore/ResourceError.h>
34 #include <WebCore/Settings.h>
35 #include <wtf/NeverDestroyed.h>
36
37 #if PLATFORM(IOS)
38 #import <CFNetwork/CFHTTPCookiesPriv.h>
39 #import <WebCore/WebCoreThread.h>
40 #import <WebKit/WebFrameLoadDelegate.h>
41 #endif
42
43 using namespace WebCore;
44
45 static std::unique_ptr<NetworkStorageSession>& privateSession()
46 {
47     static NeverDestroyed<std::unique_ptr<NetworkStorageSession>> session;
48     return session;
49 }
50
51 void WebFrameNetworkingContext::ensurePrivateBrowsingSession()
52 {
53     ASSERT(isMainThread());
54
55     if (privateSession())
56         return;
57
58     privateSession() = NetworkStorageSession::createPrivateBrowsingSession([[NSBundle mainBundle] bundleIdentifier]);
59 }
60
61 void WebFrameNetworkingContext::destroyPrivateBrowsingSession()
62 {
63     ASSERT(isMainThread());
64
65     privateSession() = nullptr;
66 }
67
68 #if PLATFORM(IOS)
69 void WebFrameNetworkingContext::clearPrivateBrowsingSessionCookieStorage()
70 {
71     ASSERT(isMainThread());
72     ASSERT(privateSession());
73
74     CFHTTPCookieStorageDeleteAllCookies(privateSession()->cookieStorage().get());
75 }
76 #endif
77
78 bool WebFrameNetworkingContext::needsSiteSpecificQuirks() const
79 {
80     return frame() && frame()->settings().needsSiteSpecificQuirks();
81 }
82
83 bool WebFrameNetworkingContext::localFileContentSniffingEnabled() const
84 {
85     return frame() && frame()->settings().localFileContentSniffingEnabled();
86 }
87
88 SchedulePairHashSet* WebFrameNetworkingContext::scheduledRunLoopPairs() const
89 {
90     if (!frame() || !frame()->page())
91         return 0;
92     return frame()->page()->scheduledRunLoopPairs();
93 }
94
95 RetainPtr<CFDataRef> WebFrameNetworkingContext::sourceApplicationAuditData() const
96 {
97     if (!frame() || !frame()->page())
98         return 0;
99     
100     WebView *webview = kit(frame()->page());
101     
102     if (!webview)
103         return 0;
104     return reinterpret_cast<CFDataRef>(webview._sourceApplicationAuditData);
105 }
106
107 ResourceError WebFrameNetworkingContext::blockedError(const ResourceRequest& request) const
108 {
109     return frame()->loader().client().blockedError(request);
110 }
111
112 NetworkStorageSession& WebFrameNetworkingContext::storageSession() const
113 {
114     ASSERT(isMainThread());
115
116     if (frame() && frame()->settings().privateBrowsingEnabled())
117         return *privateSession();
118
119     return NetworkStorageSession::defaultStorageSession();
120 }