- Revision
- 234313
- Author
- [email protected]
- Date
- 2018-07-27 10:02:52 -0700 (Fri, 27 Jul 2018)
Log Message
Begin making WKWebViewConfiguration a wrapper around an API::PageConfiguration
https://bugs.webkit.org/show_bug.cgi?id=188030
Reviewed by Sam Weinig.
Eventually WKWebViewConfiguration should become just a API::ObjectStorage<API::PageConfiguration>.
The transition includes adding fields that exist in WKWebViewConfiguration to API::PageConfiguration
and making WKWebViewConfiguration's getters and setters just call API::PageConfiguration's corresponding methods
instead of having an ivar for each value then copying it to an API::PageConfiguration we construct in
the WKWebView constructor. To transition incrementally, I've added a RefPtr<API::PageConfiguration> ivar to
WKWebViewConfiguration and moved a few ivars to use the values stored in that API::PageConfiguration instead.
I've arbitrarily chosen _treatsSHA1SignedCertificatesAsInsecure and _urlSchemeHandlers as the first two
properties to transition, and I'll continue transitioning each ivar in small, easy-to-review bunches.
* UIProcess/API/APIPageConfiguration.cpp:
(API::PageConfiguration::copy const):
(API::PageConfiguration::urlSchemeHandlerForURLScheme):
(API::PageConfiguration::setURLSchemeHandlerForURLScheme):
* UIProcess/API/APIPageConfiguration.h:
(API::PageConfiguration::urlSchemeHandlers):
* UIProcess/API/Cocoa/WKWebView.mm:
(-[WKWebView _initializeWithConfiguration:]):
* UIProcess/API/Cocoa/WKWebViewConfiguration.mm:
(-[WKWebViewConfiguration init]):
(-[WKWebViewConfiguration copyWithZone:]):
(-[WKWebViewConfiguration setURLSchemeHandler:forURLScheme:]):
(-[WKWebViewConfiguration urlSchemeHandlerForURLScheme:]):
(-[WKWebViewConfiguration copyPageConfiguration]):
(-[WKWebViewConfiguration _treatsSHA1SignedCertificatesAsInsecure]):
(-[WKWebViewConfiguration _setTreatsSHA1SignedCertificatesAsInsecure:]):
(-[WKWebViewConfiguration _urlSchemeHandlers]): Deleted.
* UIProcess/API/Cocoa/WKWebViewConfigurationInternal.h:
Modified Paths
Diff
Modified: trunk/Source/WebKit/ChangeLog (234312 => 234313)
--- trunk/Source/WebKit/ChangeLog 2018-07-27 16:58:20 UTC (rev 234312)
+++ trunk/Source/WebKit/ChangeLog 2018-07-27 17:02:52 UTC (rev 234313)
@@ -1,3 +1,38 @@
+2018-07-27 Alex Christensen <[email protected]>
+
+ Begin making WKWebViewConfiguration a wrapper around an API::PageConfiguration
+ https://bugs.webkit.org/show_bug.cgi?id=188030
+
+ Reviewed by Sam Weinig.
+
+ Eventually WKWebViewConfiguration should become just a API::ObjectStorage<API::PageConfiguration>.
+ The transition includes adding fields that exist in WKWebViewConfiguration to API::PageConfiguration
+ and making WKWebViewConfiguration's getters and setters just call API::PageConfiguration's corresponding methods
+ instead of having an ivar for each value then copying it to an API::PageConfiguration we construct in
+ the WKWebView constructor. To transition incrementally, I've added a RefPtr<API::PageConfiguration> ivar to
+ WKWebViewConfiguration and moved a few ivars to use the values stored in that API::PageConfiguration instead.
+ I've arbitrarily chosen _treatsSHA1SignedCertificatesAsInsecure and _urlSchemeHandlers as the first two
+ properties to transition, and I'll continue transitioning each ivar in small, easy-to-review bunches.
+
+ * UIProcess/API/APIPageConfiguration.cpp:
+ (API::PageConfiguration::copy const):
+ (API::PageConfiguration::urlSchemeHandlerForURLScheme):
+ (API::PageConfiguration::setURLSchemeHandlerForURLScheme):
+ * UIProcess/API/APIPageConfiguration.h:
+ (API::PageConfiguration::urlSchemeHandlers):
+ * UIProcess/API/Cocoa/WKWebView.mm:
+ (-[WKWebView _initializeWithConfiguration:]):
+ * UIProcess/API/Cocoa/WKWebViewConfiguration.mm:
+ (-[WKWebViewConfiguration init]):
+ (-[WKWebViewConfiguration copyWithZone:]):
+ (-[WKWebViewConfiguration setURLSchemeHandler:forURLScheme:]):
+ (-[WKWebViewConfiguration urlSchemeHandlerForURLScheme:]):
+ (-[WKWebViewConfiguration copyPageConfiguration]):
+ (-[WKWebViewConfiguration _treatsSHA1SignedCertificatesAsInsecure]):
+ (-[WKWebViewConfiguration _setTreatsSHA1SignedCertificatesAsInsecure:]):
+ (-[WKWebViewConfiguration _urlSchemeHandlers]): Deleted.
+ * UIProcess/API/Cocoa/WKWebViewConfigurationInternal.h:
+
2018-07-27 Chris Dumez <[email protected]>
Loading a file URL and then issuing a reload right away causes the load to fail due to sandboxing
Modified: trunk/Source/WebKit/UIProcess/API/APIPageConfiguration.cpp (234312 => 234313)
--- trunk/Source/WebKit/UIProcess/API/APIPageConfiguration.cpp 2018-07-27 16:58:20 UTC (rev 234312)
+++ trunk/Source/WebKit/UIProcess/API/APIPageConfiguration.cpp 2018-07-27 17:02:52 UTC (rev 234313)
@@ -31,6 +31,7 @@
#include "WebPageProxy.h"
#include "WebPreferences.h"
#include "WebProcessPool.h"
+#include "WebURLSchemeHandler.h"
#include "WebUserContentControllerProxy.h"
#if ENABLE(APPLICATION_MANIFEST)
@@ -81,6 +82,8 @@
#if ENABLE(APPLICATION_MANIFEST)
copy->m_applicationManifest = this->m_applicationManifest;
#endif
+ for (auto& pair : this->m_urlSchemeHandlers)
+ copy->m_urlSchemeHandlers.set(pair.key, pair.value.copyRef());
return copy;
}
@@ -174,6 +177,16 @@
m_sessionID = sessionID;
}
+RefPtr<WebKit::WebURLSchemeHandler> PageConfiguration::urlSchemeHandlerForURLScheme(const WTF::String& scheme)
+{
+ return m_urlSchemeHandlers.get(scheme);
+}
+
+void PageConfiguration::setURLSchemeHandlerForURLScheme(Ref<WebKit::WebURLSchemeHandler>&& handler, const WTF::String& scheme)
+{
+ m_urlSchemeHandlers.set(scheme, WTFMove(handler));
+}
+
#if ENABLE(APPLICATION_MANIFEST)
const ApplicationManifest* PageConfiguration::applicationManifest() const
{
Modified: trunk/Source/WebKit/UIProcess/API/APIPageConfiguration.h (234312 => 234313)
--- trunk/Source/WebKit/UIProcess/API/APIPageConfiguration.h 2018-07-27 16:58:20 UTC (rev 234312)
+++ trunk/Source/WebKit/UIProcess/API/APIPageConfiguration.h 2018-07-27 17:02:52 UTC (rev 234313)
@@ -23,8 +23,7 @@
* THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef APIPageConfiguration_h
-#define APIPageConfiguration_h
+#pragma once
#include "APIObject.h"
#include "WebPreferencesStore.h"
@@ -38,6 +37,7 @@
class WebPageProxy;
class WebPreferences;
class WebProcessPool;
+class WebURLSchemeHandler;
class WebUserContentControllerProxy;
}
@@ -115,6 +115,10 @@
void setApplicationManifest(ApplicationManifest*);
#endif
+ RefPtr<WebKit::WebURLSchemeHandler> urlSchemeHandlerForURLScheme(const WTF::String&);
+ void setURLSchemeHandlerForURLScheme(Ref<WebKit::WebURLSchemeHandler>&&, const WTF::String&);
+ const HashMap<WTF::String, Ref<WebKit::WebURLSchemeHandler>>& urlSchemeHandlers() { return m_urlSchemeHandlers; }
+
private:
RefPtr<WebKit::WebProcessPool> m_processPool;
@@ -130,14 +134,14 @@
// Once we get rid of it we should get rid of this configuration parameter as well.
PAL::SessionID m_sessionID;
- bool m_treatsSHA1SignedCertificatesAsInsecure = true;
+ bool m_treatsSHA1SignedCertificatesAsInsecure { true };
#if PLATFORM(IOS)
- bool m_alwaysRunsAtForegroundPriority = false;
+ bool m_alwaysRunsAtForegroundPriority { false };
#endif
- bool m_initialCapitalizationEnabled = true;
- bool m_waitsForPaintAfterViewDidMoveToWindow = true;
- bool m_drawsBackground = true;
- bool m_controlledByAutomation = false;
+ bool m_initialCapitalizationEnabled { true };
+ bool m_waitsForPaintAfterViewDidMoveToWindow { true };
+ bool m_drawsBackground { true };
+ bool m_controlledByAutomation { false };
std::optional<double> m_cpuLimit;
WTF::String m_overrideContentSecurityPolicy;
@@ -145,9 +149,8 @@
#if ENABLE(APPLICATION_MANIFEST)
RefPtr<ApplicationManifest> m_applicationManifest;
#endif
+
+ HashMap<WTF::String, Ref<WebKit::WebURLSchemeHandler>> m_urlSchemeHandlers;
};
} // namespace API
-
-
-#endif // APIPageConfiguration_h
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm (234312 => 234313)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm 2018-07-27 16:58:20 UTC (rev 234312)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebView.mm 2018-07-27 17:02:52 UTC (rev 234313)
@@ -506,7 +506,7 @@
WebKit::WebProcessPool& processPool = *[_configuration processPool]->_processPool;
processPool.setResourceLoadStatisticsEnabled(configuration.websiteDataStore._resourceLoadStatisticsEnabled);
- auto pageConfiguration = API::PageConfiguration::create();
+ auto pageConfiguration = [configuration copyPageConfiguration];
pageConfiguration->setProcessPool(&processPool);
pageConfiguration->setPreferences([_configuration preferences]->_preferences.get());
@@ -516,7 +516,6 @@
pageConfiguration->setUserContentController([_configuration userContentController]->_userContentControllerProxy.get());
pageConfiguration->setVisitedLinkStore([_configuration _visitedLinkStore]->_visitedLinkStore.get());
pageConfiguration->setWebsiteDataStore([_configuration websiteDataStore]->_websiteDataStore.get());
- pageConfiguration->setTreatsSHA1SignedCertificatesAsInsecure([_configuration _treatsSHA1SignedCertificatesAsInsecure]);
if (NSString *overrideContentSecurityPolicy = configuration._overrideContentSecurityPolicy)
pageConfiguration->setOverrideContentSecurityPolicy(overrideContentSecurityPolicy);
@@ -631,7 +630,7 @@
static uint32_t programSDKVersion = dyld_get_program_sdk_version();
_allowsLinkPreview = programSDKVersion >= firstSDKVersionWithLinkPreviewEnabledByDefault;
- _contentView = adoptNS([[WKContentView alloc] initWithFrame:bounds processPool:processPool configuration:WTFMove(pageConfiguration) webView:self]);
+ _contentView = adoptNS([[WKContentView alloc] initWithFrame:bounds processPool:processPool configuration:pageConfiguration.copyRef() webView:self]);
_page = [_contentView page];
[self _dispatchSetDeviceOrientation:deviceOrientation()];
@@ -678,7 +677,7 @@
#endif
#if PLATFORM(MAC)
- _impl = std::make_unique<WebKit::WebViewImpl>(self, self, processPool, WTFMove(pageConfiguration));
+ _impl = std::make_unique<WebKit::WebViewImpl>(self, self, processPool, pageConfiguration.copyRef());
_page = &_impl->page();
_impl->setAutomaticallyAdjustsContentInsets(true);
@@ -709,9 +708,8 @@
[self _setUpSQLiteDatabaseTrackerClient];
#endif
- auto *handlers = _configuration.get()._urlSchemeHandlers;
- for (NSString *key in handlers)
- _page->setURLSchemeHandlerForScheme(WebKit::WebURLSchemeHandlerCocoa::create(handlers[key]), key);
+ for (auto& pair : pageConfiguration->urlSchemeHandlers())
+ _page->setURLSchemeHandlerForScheme(WebKit::WebURLSchemeHandlerCocoa::create(static_cast<WebKit::WebURLSchemeHandlerCocoa&>(pair.value.get()).apiHandler()), pair.key);
pageToViewMap().add(_page.get(), self);
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewConfiguration.mm (234312 => 234313)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewConfiguration.mm 2018-07-27 16:58:20 UTC (rev 234312)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewConfiguration.mm 2018-07-27 17:02:52 UTC (rev 234313)
@@ -38,6 +38,7 @@
#import "WKWebView.h"
#import "WKWebViewContentProviderRegistry.h"
#import "WebKit2Initialize.h"
+#import "WebURLSchemeHandlerCocoa.h"
#import "_WKVisitedLinkStore.h"
#import "_WKWebsiteDataStoreInternal.h"
#import <WebCore/RuntimeApplicationChecks.h>
@@ -104,6 +105,7 @@
#endif
@implementation WKWebViewConfiguration {
+ RefPtr<API::PageConfiguration> _pageConfiguration;
LazyInitialized<RetainPtr<WKProcessPool>> _processPool;
LazyInitialized<RetainPtr<WKPreferences>> _preferences;
LazyInitialized<RetainPtr<WKUserContentController>> _userContentController;
@@ -113,9 +115,7 @@
WeakObjCPtr<WKWebView> _alternateWebViewForNavigationGestures;
RetainPtr<NSString> _groupIdentifier;
LazyInitialized<RetainPtr<NSString>> _applicationNameForUserAgent;
- LazyInitialized<RetainPtr<NSMutableDictionary<NSString *, id <WKURLSchemeHandler>>>> _urlSchemeHandlers;
NSTimeInterval _incrementalRenderingSuppressionTimeout;
- BOOL _treatsSHA1SignedCertificatesAsInsecure;
BOOL _respectsImageOrientation;
BOOL _printsBackgrounds;
BOOL _allowsJavaScriptMarkup;
@@ -178,6 +178,8 @@
WebKit::InitializeWebKit2();
+ _pageConfiguration = API::PageConfiguration::create();
+
#if PLATFORM(IOS)
#if !PLATFORM(WATCHOS)
_allowsPictureInPictureMediaPlayback = YES;
@@ -230,7 +232,6 @@
_convertsPositionStyleOnCopy = NO;
_allowsMetaRefresh = YES;
_allowUniversalAccessFromFileURLs = NO;
- _treatsSHA1SignedCertificatesAsInsecure = YES;
_needsStorageAccessFromFileURLsQuirk = YES;
#if PLATFORM(IOS)
@@ -339,6 +340,7 @@
{
WKWebViewConfiguration *configuration = [(WKWebViewConfiguration *)[[self class] allocWithZone:zone] init];
+ configuration->_pageConfiguration = _pageConfiguration->copy();
configuration.processPool = self.processPool;
configuration.preferences = self.preferences;
configuration.userContentController = self.userContentController;
@@ -346,7 +348,6 @@
configuration._visitedLinkStore = self._visitedLinkStore;
configuration._relatedWebView = _relatedWebView.get().get();
configuration._alternateWebViewForNavigationGestures = _alternateWebViewForNavigationGestures.get().get();
- configuration->_treatsSHA1SignedCertificatesAsInsecure = _treatsSHA1SignedCertificatesAsInsecure;
#if PLATFORM(IOS)
configuration._contentProviderRegistry = self._contentProviderRegistry;
#endif
@@ -408,7 +409,6 @@
configuration->_needsStorageAccessFromFileURLsQuirk = self->_needsStorageAccessFromFileURLsQuirk;
configuration->_overrideContentSecurityPolicy = adoptNS([self->_overrideContentSecurityPolicy copyWithZone:zone]);
- configuration->_urlSchemeHandlers.set(adoptNS([self._urlSchemeHandlers mutableCopyWithZone:zone]));
configuration->_mediaContentTypesRequiringHardwareSupport = adoptNS([self._mediaContentTypesRequiringHardwareSupport copyWithZone:zone]);
configuration->_legacyEncryptedMediaAPIEnabled = self->_legacyEncryptedMediaAPIEnabled;
configuration->_allowMediaContentTypesRequiringHardwareSupportAsFallback = self->_allowMediaContentTypesRequiringHardwareSupportAsFallback;
@@ -493,8 +493,6 @@
- (void)setURLSchemeHandler:(id <WKURLSchemeHandler>)urlSchemeHandler forURLScheme:(NSString *)urlScheme
{
- auto *urlSchemeHandlers = _urlSchemeHandlers.get([] { return adoptNS([[NSMutableDictionary alloc] init]); });
-
if ([WKWebView handlesURLScheme:urlScheme])
[NSException raise:NSInvalidArgumentException format:@"'%@' is a URL scheme that WKWebView handles natively", urlScheme];
@@ -502,10 +500,10 @@
if (!canonicalScheme)
[NSException raise:NSInvalidArgumentException format:@"'%@' is not a valid URL scheme", urlScheme];
- if ([urlSchemeHandlers objectForKey:(NSString *)canonicalScheme.value()])
+ if (_pageConfiguration->urlSchemeHandlerForURLScheme(*canonicalScheme))
[NSException raise:NSInvalidArgumentException format:@"URL scheme '%@' already has a registered URL scheme handler", urlScheme];
- [urlSchemeHandlers setObject:urlSchemeHandler forKey:(NSString *)canonicalScheme.value()];
+ _pageConfiguration->setURLSchemeHandlerForURLScheme(WebKit::WebURLSchemeHandlerCocoa::create(urlSchemeHandler), *canonicalScheme);
}
- (nullable id <WKURLSchemeHandler>)urlSchemeHandlerForURLScheme:(NSString *)urlScheme
@@ -514,8 +512,8 @@
if (!canonicalScheme)
return nil;
- auto *urlSchemeHandlers = _urlSchemeHandlers.get([] { return adoptNS([[NSMutableDictionary alloc] init]); });
- return [urlSchemeHandlers objectForKey:(NSString *)canonicalScheme.value()];
+ auto handler = _pageConfiguration->urlSchemeHandlerForURLScheme(*canonicalScheme);
+ return handler ? static_cast<WebKit::WebURLSchemeHandlerCocoa*>(handler.get())->apiHandler() : nil;
}
#pragma clang diagnostic push
@@ -533,11 +531,6 @@
#pragma clang diagnostic pop
-- (NSMutableDictionary<NSString *, id <WKURLSchemeHandler>> *)_urlSchemeHandlers
-{
- return _urlSchemeHandlers.get([] { return adoptNS([[NSMutableDictionary alloc] init]); });
-}
-
#if PLATFORM(IOS)
- (WKWebViewContentProviderRegistry *)_contentProviderRegistry
{
@@ -550,6 +543,11 @@
}
#endif
+- (Ref<API::PageConfiguration>)copyPageConfiguration
+{
+ return _pageConfiguration->copy();
+}
+
@end
@implementation WKWebViewConfiguration (WKPrivate)
@@ -586,12 +584,12 @@
- (BOOL)_treatsSHA1SignedCertificatesAsInsecure
{
- return _treatsSHA1SignedCertificatesAsInsecure;
+ return _pageConfiguration->treatsSHA1SignedCertificatesAsInsecure();
}
- (void)_setTreatsSHA1SignedCertificatesAsInsecure:(BOOL)insecure
{
- _treatsSHA1SignedCertificatesAsInsecure = insecure;
+ _pageConfiguration->setTreatsSHA1SignedCertificatesAsInsecure(insecure);
}
- (BOOL)_respectsImageOrientation
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewConfigurationInternal.h (234312 => 234313)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewConfigurationInternal.h 2018-07-27 16:58:20 UTC (rev 234312)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKWebViewConfigurationInternal.h 2018-07-27 17:02:52 UTC (rev 234313)
@@ -23,7 +23,9 @@
* THE POSSIBILITY OF SUCH DAMAGE.
*/
+#import "APIPageConfiguration.h"
#import "WKWebViewConfigurationPrivate.h"
+#import <wtf/Ref.h>
#if WK_API_ENABLED
@@ -32,12 +34,12 @@
@interface WKWebViewConfiguration ()
-@property (nonatomic, readonly) NSMutableDictionary<NSString *, id <WKURLSchemeHandler>> *_urlSchemeHandlers;
-
#if PLATFORM(IOS)
@property (nonatomic, setter=_setContentProviderRegistry:) WKWebViewContentProviderRegistry *_contentProviderRegistry;
#endif
+- (Ref<API::PageConfiguration>)copyPageConfiguration;
+
@end
#endif