[Cocoa] Remove interfaces in the To Be Removed groups
[WebKit-https.git] / Source / WebKit2 / UIProcess / API / Cocoa / WKProcessPool.mm
1 /*
2  * Copyright (C) 2014 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 #import "config.h"
27 #import "WKProcessPoolInternal.h"
28
29 #if WK_API_ENABLED
30
31 #import "CacheModel.h"
32 #import "DownloadClient.h"
33 #import "HistoryClient.h"
34 #import "ProcessModel.h"
35 #import "WKObject.h"
36 #import "WeakObjCPtr.h"
37 #import "WebCertificateInfo.h"
38 #import "WebContext.h"
39 #import "WebCookieManagerProxy.h"
40 #import "WebProcessMessages.h"
41 #import "_WKDownloadDelegate.h"
42 #import "_WKProcessPoolConfiguration.h"
43 #import <WebCore/CertificateInfo.h>
44 #import <wtf/RetainPtr.h>
45
46 #if PLATFORM(IOS)
47 #import <WebCore/WebCoreThreadSystemInterface.h>
48 #import "WKGeolocationProviderIOS.h"
49 #endif
50
51 #if __has_include(<CFNetwork/CFNSURLConnection.h>)
52 #import <CFNetwork/CFNSURLConnection.h>
53 #else
54 enum : NSUInteger {
55     NSHTTPCookieAcceptPolicyExclusivelyFromMainDocumentDomain = 3,
56 };
57 #endif
58
59 @implementation WKProcessPool {
60     WebKit::WeakObjCPtr<id <_WKDownloadDelegate>> _downloadDelegate;
61
62 #if PLATFORM(IOS)
63     RetainPtr<WKGeolocationProviderIOS> _geolocationProvider;
64 #endif // PLATFORM(IOS)
65 }
66
67 - (instancetype)init
68 {
69     return [self _initWithConfiguration:adoptNS([[_WKProcessPoolConfiguration alloc] init]).get()];
70 }
71
72 - (void)dealloc
73 {
74     _context->~WebContext();
75
76     [super dealloc];
77 }
78
79 - (NSString *)description
80 {
81     return [NSString stringWithFormat:@"<%@: %p; configuration = %@>", NSStringFromClass(self.class), self, _configuration.get()];
82 }
83
84 - (_WKProcessPoolConfiguration *)_configuration
85 {
86     return [[_configuration copy] autorelease];
87 }
88
89 - (API::Object&)_apiObject
90 {
91     return *_context;
92 }
93
94 #if PLATFORM(IOS)
95 - (WKGeolocationProviderIOS *)_geolocationProvider
96 {
97     if (!_geolocationProvider)
98         _geolocationProvider = adoptNS([[WKGeolocationProviderIOS alloc] initWithContext:_context.get()]);
99     return _geolocationProvider.get();
100 }
101 #endif // PLATFORM(IOS)
102
103 @end
104
105 @implementation WKProcessPool (WKPrivate)
106
107 - (instancetype)_initWithConfiguration:(_WKProcessPoolConfiguration *)configuration
108 {
109     if (!(self = [super init]))
110         return nil;
111
112     _configuration = adoptNS([configuration copy]);
113
114 #if PLATFORM(IOS)
115     // FIXME: Remove once <rdar://problem/15256572> is fixed.
116     InitWebCoreThreadSystemInterface();
117 #endif
118
119     String bundlePath;
120     if (NSURL *bundleURL = [_configuration injectedBundleURL]) {
121         if (!bundleURL.isFileURL)
122             [NSException raise:NSInvalidArgumentException format:@"Injected Bundle URL must be a file URL"];
123
124         bundlePath = bundleURL.path;
125     }
126
127     API::Object::constructInWrapper<WebKit::WebContext>(self, bundlePath);
128     _context->setHistoryClient(std::make_unique<WebKit::HistoryClient>());
129     _context->setUsesNetworkProcess(true);
130     _context->setProcessModel(WebKit::ProcessModelMultipleSecondaryProcesses);
131
132     // FIXME: Add a way to configure the cache model, see <rdar://problem/16206857>.
133     _context->setCacheModel(WebKit::CacheModelPrimaryWebBrowser);
134
135     return self;
136 }
137
138 - (void)_setAllowsSpecificHTTPSCertificate:(NSArray *)certificateChain forHost:(NSString *)host
139 {
140     _context->allowSpecificHTTPSCertificateForHost(WebKit::WebCertificateInfo::create(WebCore::CertificateInfo((CFArrayRef)certificateChain)).get(), host);
141 }
142
143 static WebKit::HTTPCookieAcceptPolicy toHTTPCookieAcceptPolicy(NSHTTPCookieAcceptPolicy policy)
144 {
145     switch (static_cast<NSUInteger>(policy)) {
146     case NSHTTPCookieAcceptPolicyAlways:
147         return WebKit::HTTPCookieAcceptPolicyAlways;
148     case NSHTTPCookieAcceptPolicyNever:
149         return WebKit::HTTPCookieAcceptPolicyNever;
150     case NSHTTPCookieAcceptPolicyOnlyFromMainDocumentDomain:
151         return WebKit::HTTPCookieAcceptPolicyOnlyFromMainDocumentDomain;
152     case NSHTTPCookieAcceptPolicyExclusivelyFromMainDocumentDomain:
153         return WebKit::HTTPCookieAcceptPolicyExclusivelyFromMainDocumentDomain;
154     }
155
156     ASSERT_NOT_REACHED();
157     return WebKit::HTTPCookieAcceptPolicyAlways;
158 }
159
160 - (void)_setCookieAcceptPolicy:(NSHTTPCookieAcceptPolicy)policy
161 {
162     _context->supplement<WebKit::WebCookieManagerProxy>()->setHTTPCookieAcceptPolicy(toHTTPCookieAcceptPolicy(policy));
163 }
164
165 - (id)_objectForBundleParameter:(NSString *)parameter
166 {
167     return [_context->bundleParameters() objectForKey:parameter];
168 }
169
170 - (void)_setObject:(id <NSCopying, NSSecureCoding>)object forBundleParameter:(NSString *)parameter
171 {
172     auto copy = adoptNS([(NSObject *)object copy]);
173
174     auto data = adoptNS([[NSMutableData alloc] init]);
175     auto keyedArchiver = adoptNS([[NSKeyedArchiver alloc] initForWritingWithMutableData:data.get()]);
176     [keyedArchiver setRequiresSecureCoding:YES];
177
178     @try {
179         [keyedArchiver encodeObject:copy.get() forKey:@"parameter"];
180         [keyedArchiver finishEncoding];
181     } @catch (NSException *exception) {
182         LOG_ERROR("Failed to encode bundle parameter: %@", exception);
183     }
184
185     if (copy)
186         [_context->ensureBundleParameters() setObject:copy.get() forKey:parameter];
187     else
188         [_context->ensureBundleParameters() removeObjectForKey:parameter];
189
190     _context->sendToAllProcesses(Messages::WebProcess::SetInjectedBundleParameter(parameter, IPC::DataReference(static_cast<const uint8_t*>([data bytes]), [data length])));
191 }
192
193 - (id <_WKDownloadDelegate>)_downloadDelegate
194 {
195     return _downloadDelegate.getAutoreleased();
196 }
197
198 - (void)_setDownloadDelegate:(id <_WKDownloadDelegate>)downloadDelegate
199 {
200     _downloadDelegate = downloadDelegate;
201     _context->setDownloadClient(std::make_unique<WebKit::DownloadClient>(downloadDelegate));
202 }
203
204 @end
205
206 #endif // WK_API_ENABLED