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