2 * Copyright (C) 2014, 2015 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
27 #import "WKWebViewConfigurationInternal.h"
31 #import "APIPageConfiguration.h"
32 #import "WKPreferences.h"
33 #import "WKProcessPool.h"
34 #import "WKUserContentController.h"
35 #import "WKWebViewContentProviderRegistry.h"
36 #import "WeakObjCPtr.h"
37 #import "_WKVisitedLinkProvider.h"
38 #import "_WKWebsiteDataStoreInternal.h"
39 #import <wtf/RetainPtr.h>
43 #import <WebCore/Device.h>
46 template<typename T> class LazyInitialized {
48 typedef typename WTF::GetPtrHelper<T>::PtrType PtrType;
53 if (!m_isInitialized) {
55 m_isInitialized = true;
64 m_isInitialized = true;
70 m_isInitialized = true;
79 bool m_isInitialized = false;
83 @implementation WKWebViewConfiguration {
84 LazyInitialized<RetainPtr<WKProcessPool>> _processPool;
85 LazyInitialized<RetainPtr<WKPreferences>> _preferences;
86 LazyInitialized<RetainPtr<WKUserContentController>> _userContentController;
87 LazyInitialized<RetainPtr<_WKVisitedLinkStore>> _visitedLinkStore;
88 LazyInitialized<RetainPtr<WKWebsiteDataStore>> _websiteDataStore;
89 WebKit::WeakObjCPtr<WKWebView> _relatedWebView;
90 WebKit::WeakObjCPtr<WKWebView> _alternateWebViewForNavigationGestures;
91 BOOL _treatsSHA1SignedCertificatesAsInsecure;
92 RetainPtr<NSString> _groupIdentifier;
93 LazyInitialized<RetainPtr<NSString>> _applicationNameForUserAgent;
94 BOOL _respectsImageOrientation;
95 BOOL _printsBackgrounds;
96 CGFloat _incrementalRenderingSuppressionTimeout;
97 BOOL _allowsJavaScriptMarkup;
98 BOOL _convertsPositionStyleOnCopy;
99 BOOL _allowsMetaRefresh;
102 LazyInitialized<RetainPtr<WKWebViewContentProviderRegistry>> _contentProviderRegistry;
103 BOOL _alwaysRunsAtForegroundPriority;
104 BOOL _allowsInlineMediaPlayback;
105 BOOL _inlineMediaPlaybackRequiresPlaysInlineAttribute;
106 BOOL _invisibleAutoplayNotPermitted;
107 BOOL _mediaDataLoadsAutomatically;
108 BOOL _requiresUserActionForAudioPlayback;
111 BOOL _showsURLsInToolTips;
112 BOOL _serviceControlsEnabled;
113 BOOL _imageControlsEnabled;
119 if (!(self = [super init]))
123 _requiresUserActionForMediaPlayback = YES;
124 _requiresUserActionForAudioPlayback = YES;
125 _allowsPictureInPictureMediaPlayback = YES;
126 _allowsInlineMediaPlayback = WebCore::deviceClass() == MGDeviceClassiPad;
127 _inlineMediaPlaybackRequiresPlaysInlineAttribute = !_allowsInlineMediaPlayback;
128 _invisibleAutoplayNotPermitted = YES;
129 _mediaDataLoadsAutomatically = NO;
130 _respectsImageOrientation = YES;
131 _printsBackgrounds = YES;
135 _printsBackgrounds = NO;
136 _respectsImageOrientation = NO;
137 _showsURLsInToolTips = NO;
138 _serviceControlsEnabled = NO;
139 _imageControlsEnabled = NO;
142 #if ENABLE(WIRELESS_PLAYBACK_TARGET)
143 _allowsAirPlayForMediaPlayback = YES;
146 _incrementalRenderingSuppressionTimeout = 5;
147 _allowsJavaScriptMarkup = YES;
148 _convertsPositionStyleOnCopy = NO;
149 _allowsMetaRefresh = YES;
154 - (NSString *)description
156 return [NSString stringWithFormat:@"<%@: %p; processPool = %@; preferences = %@>", NSStringFromClass(self.class), self, self.processPool, self.preferences];
159 - (id)copyWithZone:(NSZone *)zone
161 WKWebViewConfiguration *configuration = [(WKWebViewConfiguration *)[[self class] allocWithZone:zone] init];
163 configuration.processPool = self.processPool;
164 configuration.preferences = self.preferences;
165 configuration.userContentController = self.userContentController;
166 configuration.websiteDataStore = self.websiteDataStore;
167 configuration._visitedLinkStore = self._visitedLinkStore;
168 configuration._relatedWebView = _relatedWebView.get().get();
169 configuration._alternateWebViewForNavigationGestures = _alternateWebViewForNavigationGestures.get().get();
170 configuration->_treatsSHA1SignedCertificatesAsInsecure = _treatsSHA1SignedCertificatesAsInsecure;
172 configuration._contentProviderRegistry = self._contentProviderRegistry;
175 configuration->_suppressesIncrementalRendering = self->_suppressesIncrementalRendering;
176 configuration.applicationNameForUserAgent = self.applicationNameForUserAgent;
178 configuration->_respectsImageOrientation = self->_respectsImageOrientation;
179 configuration->_printsBackgrounds = self->_printsBackgrounds;
180 configuration->_incrementalRenderingSuppressionTimeout = self->_incrementalRenderingSuppressionTimeout;
181 configuration->_allowsJavaScriptMarkup = self->_allowsJavaScriptMarkup;
182 configuration->_convertsPositionStyleOnCopy = self->_convertsPositionStyleOnCopy;
183 configuration->_allowsMetaRefresh = self->_allowsMetaRefresh;
186 configuration->_allowsInlineMediaPlayback = self->_allowsInlineMediaPlayback;
187 configuration->_inlineMediaPlaybackRequiresPlaysInlineAttribute = self->_inlineMediaPlaybackRequiresPlaysInlineAttribute;
188 configuration->_invisibleAutoplayNotPermitted = self->_invisibleAutoplayNotPermitted;
189 configuration->_mediaDataLoadsAutomatically = self->_mediaDataLoadsAutomatically;
190 configuration->_allowsPictureInPictureMediaPlayback = self->_allowsPictureInPictureMediaPlayback;
191 configuration->_alwaysRunsAtForegroundPriority = _alwaysRunsAtForegroundPriority;
192 configuration->_requiresUserActionForMediaPlayback = self->_requiresUserActionForMediaPlayback;
193 configuration->_requiresUserActionForAudioPlayback = self->_requiresUserActionForAudioPlayback;
194 configuration->_selectionGranularity = self->_selectionGranularity;
197 configuration->_showsURLsInToolTips = self->_showsURLsInToolTips;
198 configuration->_serviceControlsEnabled = self->_serviceControlsEnabled;
199 configuration->_imageControlsEnabled = self->_imageControlsEnabled;
201 #if ENABLE(WIRELESS_TARGET_PLAYBACK)
202 configuration->_allowsAirPlayForMediaPlayback = self->_allowsAirPlayForMediaPlayback;
205 return configuration;
208 - (WKProcessPool *)processPool
210 return _processPool.get([] { return adoptNS([[WKProcessPool alloc] init]); });
213 - (void)setProcessPool:(WKProcessPool *)processPool
215 _processPool.set(processPool);
218 - (WKPreferences *)preferences
220 return _preferences.get([] { return adoptNS([[WKPreferences alloc] init]); });
223 - (void)setPreferences:(WKPreferences *)preferences
225 _preferences.set(preferences);
228 - (WKUserContentController *)userContentController
230 return _userContentController.get([] { return adoptNS([[WKUserContentController alloc] init]); });
233 - (void)setUserContentController:(WKUserContentController *)userContentController
235 _userContentController.set(userContentController);
238 - (WKWebsiteDataStore *)websiteDataStore
240 return _websiteDataStore.get([] { return [WKWebsiteDataStore defaultDataStore]; });
243 - (void)setWebsiteDataStore:(WKWebsiteDataStore *)websiteDataStore
245 _websiteDataStore.set(websiteDataStore);
248 static NSString *defaultApplicationNameForUserAgent()
251 return [@"Mobile/" stringByAppendingString:[UIDevice currentDevice].buildVersion];
257 - (NSString *)applicationNameForUserAgent
259 return _applicationNameForUserAgent.get([] { return defaultApplicationNameForUserAgent(); });
262 - (void)setApplicationNameForUserAgent:(NSString *)applicationNameForUserAgent
264 _applicationNameForUserAgent.set(adoptNS([applicationNameForUserAgent copy]));
267 - (_WKVisitedLinkStore *)_visitedLinkStore
269 return _visitedLinkStore.get([] { return adoptNS([[_WKVisitedLinkStore alloc] init]); });
272 - (void)_setVisitedLinkStore:(_WKVisitedLinkStore *)visitedLinkStore
274 _visitedLinkStore.set(visitedLinkStore);
277 #pragma clang diagnostic push
278 #pragma clang diagnostic ignored "-Wdeprecated-declarations"
280 - (_WKWebsiteDataStore *)_websiteDataStore
282 return self.websiteDataStore ? adoptNS([[_WKWebsiteDataStore alloc] initWithDataStore:self.websiteDataStore]).autorelease() : nullptr;
285 - (void)_setWebsiteDataStore:(_WKWebsiteDataStore *)websiteDataStore
287 self.websiteDataStore = websiteDataStore ? websiteDataStore->_dataStore.get() : nullptr;
290 -(_WKVisitedLinkProvider *)_visitedLinkProvider
292 return (_WKVisitedLinkProvider *)self._visitedLinkStore;
295 - (void)_setVisitedLinkProvider:(_WKVisitedLinkProvider *)_visitedLinkProvider
297 self._visitedLinkStore = _visitedLinkProvider;
300 #pragma clang diagnostic pop
303 - (WKWebViewContentProviderRegistry *)_contentProviderRegistry
305 return _contentProviderRegistry.get([] { return adoptNS([[WKWebViewContentProviderRegistry alloc] init]); });
308 - (void)_setContentProviderRegistry:(WKWebViewContentProviderRegistry *)registry
310 _contentProviderRegistry.set(registry);
316 if (!self.processPool)
317 [NSException raise:NSInvalidArgumentException format:@"configuration.processPool is nil"];
319 if (!self.preferences)
320 [NSException raise:NSInvalidArgumentException format:@"configuration.preferences is nil"];
322 if (!self.userContentController)
323 [NSException raise:NSInvalidArgumentException format:@"configuration.userContentController is nil"];
325 if (!self.websiteDataStore)
326 [NSException raise:NSInvalidArgumentException format:@"configuration.websiteDataStore is nil"];
328 if (!self._visitedLinkStore)
329 [NSException raise:NSInvalidArgumentException format:@"configuration._visitedLinkStore is nil"];
332 if (!self._contentProviderRegistry)
333 [NSException raise:NSInvalidArgumentException format:@"configuration._contentProviderRegistry is nil"];
339 @implementation WKWebViewConfiguration (WKPrivate)
341 - (WKWebView *)_relatedWebView
343 return _relatedWebView.getAutoreleased();
346 - (void)_setRelatedWebView:(WKWebView *)relatedWebView
348 _relatedWebView = relatedWebView;
351 - (WKWebView *)_alternateWebViewForNavigationGestures
353 return _alternateWebViewForNavigationGestures.getAutoreleased();
356 - (void)_setAlternateWebViewForNavigationGestures:(WKWebView *)alternateView
358 _alternateWebViewForNavigationGestures = alternateView;
361 - (NSString *)_groupIdentifier
363 return _groupIdentifier.get();
366 - (void)_setGroupIdentifier:(NSString *)groupIdentifier
368 _groupIdentifier = groupIdentifier;
371 - (BOOL)_treatsSHA1SignedCertificatesAsInsecure
373 return _treatsSHA1SignedCertificatesAsInsecure;
376 - (void)_setTreatsSHA1SignedCertificatesAsInsecure:(BOOL)insecure
378 _treatsSHA1SignedCertificatesAsInsecure = insecure;
381 - (BOOL)_respectsImageOrientation
383 return _respectsImageOrientation;
386 - (void)_setRespectsImageOrientation:(BOOL)respectsImageOrientation
388 _respectsImageOrientation = respectsImageOrientation;
391 - (BOOL)_printsBackgrounds
393 return _printsBackgrounds;
396 - (void)_setPrintsBackgrounds:(BOOL)printsBackgrounds
398 _printsBackgrounds = printsBackgrounds;
401 - (CGFloat)_incrementalRenderingSuppressionTimeout
403 return _incrementalRenderingSuppressionTimeout;
406 - (void)_setIncrementalRenderingSuppressionTimeout:(CGFloat)incrementalRenderingSuppressionTimeout
408 _incrementalRenderingSuppressionTimeout = incrementalRenderingSuppressionTimeout;
411 - (BOOL)_allowsJavaScriptMarkup
413 return _allowsJavaScriptMarkup;
416 - (void)_setAllowsJavaScriptMarkup:(BOOL)allowsJavaScriptMarkup
418 _allowsJavaScriptMarkup = allowsJavaScriptMarkup;
421 - (BOOL)_convertsPositionStyleOnCopy
423 return _convertsPositionStyleOnCopy;
426 - (void)_setConvertsPositionStyleOnCopy:(BOOL)convertsPositionStyleOnCopy
428 _convertsPositionStyleOnCopy = convertsPositionStyleOnCopy;
431 - (BOOL)_allowsMetaRefresh
433 return _allowsMetaRefresh;
436 - (void)_setAllowsMetaRefresh:(BOOL)allowsMetaRefresh
438 _allowsMetaRefresh = allowsMetaRefresh;
442 - (BOOL)_alwaysRunsAtForegroundPriority
444 return _alwaysRunsAtForegroundPriority;
447 - (void)_setAlwaysRunsAtForegroundPriority:(BOOL)alwaysRunsAtForegroundPriority
449 _alwaysRunsAtForegroundPriority = alwaysRunsAtForegroundPriority;
452 - (BOOL)_inlineMediaPlaybackRequiresPlaysInlineAttribute
454 return _inlineMediaPlaybackRequiresPlaysInlineAttribute;
457 - (void)_setInlineMediaPlaybackRequiresPlaysInlineAttribute:(BOOL)requires
459 _inlineMediaPlaybackRequiresPlaysInlineAttribute = requires;
462 - (BOOL)_invisibleAutoplayNotPermitted
464 return _invisibleAutoplayNotPermitted;
467 - (void)_setInvisibleAutoplayNotPermitted:(BOOL)notPermitted
469 _invisibleAutoplayNotPermitted = notPermitted;
472 - (BOOL)_mediaDataLoadsAutomatically
474 return _mediaDataLoadsAutomatically;
477 - (void)_setMediaDataLoadsAutomatically:(BOOL)mediaDataLoadsAutomatically
479 _mediaDataLoadsAutomatically = mediaDataLoadsAutomatically;
482 - (BOOL)_requiresUserActionForAudioPlayback
484 return _requiresUserActionForAudioPlayback;
487 - (void)_setRequiresUserActionForAudioPlayback:(BOOL)requiresUserActionForAudioPlayback
489 _requiresUserActionForAudioPlayback = requiresUserActionForAudioPlayback;
492 #endif // PLATFORM(IOS)
495 - (BOOL)_showsURLsInToolTips
497 return _showsURLsInToolTips;
500 - (void)_setShowsURLsInToolTips:(BOOL)showsURLsInToolTips
502 _showsURLsInToolTips = showsURLsInToolTips;
505 - (BOOL)_serviceControlsEnabled
507 return _serviceControlsEnabled;
510 - (void)_setServiceControlsEnabled:(BOOL)serviceControlsEnabled
512 _serviceControlsEnabled = serviceControlsEnabled;
515 - (BOOL)_imageControlsEnabled
517 return _imageControlsEnabled;
520 - (void)_setImageControlsEnabled:(BOOL)imageControlsEnabled
522 _imageControlsEnabled = imageControlsEnabled;
524 #endif // PLATFORM(MAC)
528 @implementation WKWebViewConfiguration (WKDeprecated)
531 - (BOOL)mediaPlaybackAllowsAirPlay
533 return self.allowsAirPlayForMediaPlayback;
536 - (void)setMediaPlaybackAllowsAirPlay:(BOOL)allowed
538 self.allowsAirPlayForMediaPlayback = allowed;
541 - (BOOL)mediaPlaybackRequiresUserAction
543 return self.requiresUserActionForMediaPlayback;
546 - (void)setMediaPlaybackRequiresUserAction:(BOOL)required
548 self.requiresUserActionForMediaPlayback = required;
550 #endif // PLATFORM(IOS)
554 #endif // WK_API_ENABLED