Diff
Modified: trunk/Source/WebKit/ChangeLog (279078 => 279079)
--- trunk/Source/WebKit/ChangeLog 2021-06-21 20:44:49 UTC (rev 279078)
+++ trunk/Source/WebKit/ChangeLog 2021-06-21 20:47:29 UTC (rev 279079)
@@ -1,3 +1,25 @@
+2021-06-21 Chris Dumez <cdu...@apple.com>
+
+ [WK2] Don't process-swap on navigations within the same non-HTTP(s) protocol
+ https://bugs.webkit.org/show_bug.cgi?id=227220
+
+ Reviewed by Tim Horton.
+
+ Don't process-swap on navigations within the same non-HTTP(s) protocol. Trying to extract registrable domains
+ from non-HTTP(s) URLs does not make much sense and leads to unexpected process swaps.
+
+ * UIProcess/API/APIProcessPoolConfiguration.cpp:
+ (API::ProcessPoolConfiguration::copy):
+ * UIProcess/API/APIProcessPoolConfiguration.h:
+ * UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h:
+ * UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm:
+ (-[_WKProcessPoolConfiguration setProcessSwapsOnNavigationWithinSameNonHTTPFamilyProtocol:]):
+ (-[_WKProcessPoolConfiguration processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol]):
+ * UIProcess/WebProcessPool.cpp:
+ (WebKit::WebProcessPool::processForNavigationInternal):
+ * UIProcess/WebProcessProxy.cpp:
+ (WebKit::WebProcessProxy::didStartProvisionalLoadForMainFrame):
+
2021-06-21 Megan Gardner <megan_gard...@apple.com>
AppHighlights disappear on page reload
Modified: trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp (279078 => 279079)
--- trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp 2021-06-21 20:44:49 UTC (rev 279078)
+++ trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp 2021-06-21 20:47:29 UTC (rev 279079)
@@ -64,6 +64,7 @@
copy->m_processSwapsOnNavigationFromExperimentalFeatures = this->m_processSwapsOnNavigationFromExperimentalFeatures;
copy->m_alwaysKeepAndReuseSwappedProcesses = this->m_alwaysKeepAndReuseSwappedProcesses;
copy->m_processSwapsOnWindowOpenWithOpener = this->m_processSwapsOnWindowOpenWithOpener;
+ copy->m_processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol = this->m_processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol;
copy->m_isAutomaticProcessWarmingEnabledByClient = this->m_isAutomaticProcessWarmingEnabledByClient;
copy->m_usesWebProcessCache = this->m_usesWebProcessCache;
copy->m_usesBackForwardCache = this->m_usesBackForwardCache;
Modified: trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h (279078 => 279079)
--- trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h 2021-06-21 20:44:49 UTC (rev 279078)
+++ trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h 2021-06-21 20:47:29 UTC (rev 279079)
@@ -128,6 +128,9 @@
bool alwaysKeepAndReuseSwappedProcesses() const { return m_alwaysKeepAndReuseSwappedProcesses; }
void setAlwaysKeepAndReuseSwappedProcesses(bool keepAndReuse) { m_alwaysKeepAndReuseSwappedProcesses = keepAndReuse; }
+ bool processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol() const { return m_processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol; }
+ void setProcessSwapsOnNavigationWithinSameNonHTTPFamilyProtocol(bool swaps) { m_processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol = swaps; }
+
bool processSwapsOnWindowOpenWithOpener() const { return m_processSwapsOnWindowOpenWithOpener; }
void setProcessSwapsOnWindowOpenWithOpener(bool swaps) { m_processSwapsOnWindowOpenWithOpener = swaps; }
@@ -169,6 +172,7 @@
bool m_processSwapsOnNavigationFromExperimentalFeatures { false };
bool m_alwaysKeepAndReuseSwappedProcesses { false };
bool m_processSwapsOnWindowOpenWithOpener { false };
+ bool m_processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol { false };
std::optional<bool> m_isAutomaticProcessWarmingEnabledByClient;
bool m_usesWebProcessCache { false };
bool m_usesBackForwardCache { true };
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h (279078 => 279079)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h 2021-06-21 20:44:49 UTC (rev 279078)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h 2021-06-21 20:47:29 UTC (rev 279079)
@@ -67,6 +67,7 @@
@property (nonatomic) BOOL processSwapsOnNavigation WK_API_AVAILABLE(macos(10.14), ios(12.0));
@property (nonatomic) BOOL alwaysKeepAndReuseSwappedProcesses WK_API_AVAILABLE(macos(10.14), ios(12.0));
@property (nonatomic) BOOL processSwapsOnWindowOpenWithOpener WK_API_AVAILABLE(macos(10.14), ios(12.0));
+@property (nonatomic) BOOL processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
@property (nonatomic) BOOL prewarmsProcessesAutomatically WK_API_AVAILABLE(macos(10.14.4), ios(12.2));
@property (nonatomic) BOOL usesWebProcessCache WK_API_AVAILABLE(macos(10.14.4), ios(12.2));
@property (nonatomic) BOOL pageCacheEnabled WK_API_AVAILABLE(macos(10.14), ios(12.0));
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm (279078 => 279079)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm 2021-06-21 20:44:49 UTC (rev 279078)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm 2021-06-21 20:47:29 UTC (rev 279079)
@@ -285,6 +285,16 @@
return _processPoolConfiguration->processSwapsOnWindowOpenWithOpener();
}
+- (void)setProcessSwapsOnNavigationWithinSameNonHTTPFamilyProtocol:(BOOL)swaps
+{
+ _processPoolConfiguration->setProcessSwapsOnNavigationWithinSameNonHTTPFamilyProtocol(swaps);
+}
+
+- (BOOL)processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol
+{
+ return _processPoolConfiguration->processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol();
+}
+
- (BOOL)pageCacheEnabled
{
return _processPoolConfiguration->usesBackForwardCache();
Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.cpp (279078 => 279079)
--- trunk/Source/WebKit/UIProcess/WebProcessPool.cpp 2021-06-21 20:44:49 UTC (rev 279078)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.cpp 2021-06-21 20:47:29 UTC (rev 279079)
@@ -1844,6 +1844,10 @@
WEBPROCESSPOOL_RELEASE_LOG(ProcessSwapping, "processForNavigationInternal: Using related page's URL as source URL for process swap decision (page=%p)", page.configuration().relatedPage());
}
+ // For non-HTTP(s) URLs, we only swap when navigating to a new scheme, unless processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol is set.
+ if (!m_configuration->processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol() && !sourceURL.protocolIsInHTTPFamily() && sourceURL.protocol() == targetURL.protocol())
+ return completionHandler(WTFMove(sourceProcess), nullptr, "Navigation within the same non-HTTP(s) protocol"_s);
+
if (!sourceURL.isValid() || !targetURL.isValid() || sourceURL.isEmpty() || sourceURL.protocolIsAbout() || targetRegistrableDomain.matches(sourceURL))
return completionHandler(WTFMove(sourceProcess), nullptr, "Navigation is same-site"_s);
Modified: trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp (279078 => 279079)
--- trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp 2021-06-21 20:44:49 UTC (rev 279078)
+++ trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp 2021-06-21 20:47:29 UTC (rev 279079)
@@ -1626,6 +1626,13 @@
if (url.protocolIsAbout())
return;
+ if (!url.protocolIsInHTTPFamily() && !processPool().configuration().processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol()) {
+ // Unless the processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol flag is set, we don't process swap on navigations withing the same
+ // non HTTP(s) protocol. For this reason, we ignore the registrable domain and processes are not eligible for the process cache.
+ m_registrableDomain = WebCore::RegistrableDomain { };
+ return;
+ }
+
auto registrableDomain = WebCore::RegistrableDomain { url };
if (m_registrableDomain && *m_registrableDomain != registrableDomain) {
#if ENABLE(SERVICE_WORKER)
Modified: trunk/Tools/ChangeLog (279078 => 279079)
--- trunk/Tools/ChangeLog 2021-06-21 20:44:49 UTC (rev 279078)
+++ trunk/Tools/ChangeLog 2021-06-21 20:47:29 UTC (rev 279079)
@@ -1,3 +1,14 @@
+2021-06-21 Chris Dumez <cdu...@apple.com>
+
+ [WK2] Don't process-swap on navigations within the same non-HTTP(s) protocol
+ https://bugs.webkit.org/show_bug.cgi?id=227220
+
+ Reviewed by Tim Horton.
+
+ Add API test coverage.
+
+ * TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm:
+
2021-06-21 Alex Christensen <achristen...@webkit.org>
Break ref cycle between API::HTTPCookieStore and WebKit::WebsiteDataStore
Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm (279078 => 279079)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm 2021-06-21 20:44:49 UTC (rev 279078)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm 2021-06-21 20:47:29 UTC (rev 279079)
@@ -506,6 +506,7 @@
processPoolConfiguration.get().processSwapsOnNavigation = YES;
processPoolConfiguration.get().usesWebProcessCache = YES;
processPoolConfiguration.get().prewarmsProcessesAutomatically = YES;
+ processPoolConfiguration.get().processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol = YES;
return processPoolConfiguration;
}
@@ -566,6 +567,57 @@
runBasicTest(SchemeHandlerShouldBeAsync::Yes);
}
+TEST(ProcessSwap, NoProcessSwappingWithinSameNonHTTPFamilyProtocol)
+{
+ auto processPoolConfiguration = psonProcessPoolConfiguration();
+ processPoolConfiguration.get().processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol = NO;
+ auto processPool = adoptNS([[WKProcessPool alloc] _initWithConfiguration:processPoolConfiguration.get()]);
+
+ auto webViewConfiguration = adoptNS([[WKWebViewConfiguration alloc] init]);
+ [webViewConfiguration setProcessPool:processPool.get()];
+ auto handler = adoptNS([[PSONScheme alloc] init]);
+ [webViewConfiguration setURLSchemeHandler:handler.get() forURLScheme:@"CUSTOM"];
+
+ auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:webViewConfiguration.get()]);
+ auto delegate = adoptNS([[PSONNavigationDelegate alloc] init]);
+ [webView setNavigationDelegate:delegate.get()];
+
+ NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"custom://abc/main1.html"]];
+ [webView loadRequest:request];
+ TestWebKitAPI::Util::run(&done);
+ done = false;
+
+ auto pid1 = [webView _webProcessIdentifier];
+
+ request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"custom://def/main2.html"]];
+ [webView loadRequest:request];
+ TestWebKitAPI::Util::run(&done);
+ done = false;
+
+ EXPECT_EQ(pid1, [webView _webProcessIdentifier]);
+
+ request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"custom://ghi/main3.html"]];
+ [webView loadRequest:request];
+ TestWebKitAPI::Util::run(&done);
+ done = false;
+
+ EXPECT_EQ(pid1, [webView _webProcessIdentifier]);
+
+ // Switch to the file protocol.
+ [webView loadRequest:[NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"simple" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]]];
+ TestWebKitAPI::Util::run(&done);
+ done = false;
+
+ auto pid2 = [webView _webProcessIdentifier];
+ EXPECT_NE(pid1, pid2);
+
+ [webView loadRequest:[NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"simple2" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]]];
+ TestWebKitAPI::Util::run(&done);
+ done = false;
+
+ EXPECT_EQ(pid2, [webView _webProcessIdentifier]);
+}
+
TEST(ProcessSwap, LoadAfterPolicyDecision)
{
auto processPoolConfiguration = psonProcessPoolConfiguration();
Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ResourceLoadStatistics.mm (279078 => 279079)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ResourceLoadStatistics.mm 2021-06-21 20:44:49 UTC (rev 279078)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ResourceLoadStatistics.mm 2021-06-21 20:47:29 UTC (rev 279079)
@@ -35,6 +35,7 @@
#import <WebKit/WKWebViewConfigurationPrivate.h>
#import <WebKit/WKWebsiteDataRecordPrivate.h>
#import <WebKit/WKWebsiteDataStorePrivate.h>
+#import <WebKit/_WKProcessPoolConfiguration.h>
#import <WebKit/_WKWebsiteDataStoreConfiguration.h>
#import <wtf/RetainPtr.h>
@@ -1338,11 +1339,16 @@
TEST(ResourceLoadStatistics, BackForwardPerPageData)
{
+ auto processPoolConfiguration = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
+ processPoolConfiguration.get().processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol = YES;
+ auto processPool = adoptNS([[WKProcessPool alloc] _initWithConfiguration:processPoolConfiguration.get()]);
+
auto *dataStore = [WKWebsiteDataStore defaultDataStore];
auto delegate = adoptNS([TestNavigationDelegate new]);
auto schemeHandler = adoptNS([[ResourceLoadStatisticsSchemeHandler alloc] init]);
auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+ [configuration setProcessPool:processPool.get()];
[configuration setURLSchemeHandler:schemeHandler.get() forURLScheme:@"resource-load-statistics"];
auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]);
Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebViewEvaluateJavaScript.mm (279078 => 279079)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebViewEvaluateJavaScript.mm 2021-06-21 20:44:49 UTC (rev 279078)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKWebViewEvaluateJavaScript.mm 2021-06-21 20:47:29 UTC (rev 279079)
@@ -38,10 +38,12 @@
#import <WebKit/WKErrorPrivate.h>
#import <WebKit/WKPreferencesPrivate.h>
#import <WebKit/WKPreferencesRef.h>
+#import <WebKit/WKProcessPoolPrivate.h>
#import <WebKit/WKUserContentControllerPrivate.h>
#import <WebKit/WKWebViewConfigurationPrivate.h>
#import <WebKit/WKWebViewPrivate.h>
#import <WebKit/_WKFrameTreeNode.h>
+#import <WebKit/_WKProcessPoolConfiguration.h>
#import <wtf/RetainPtr.h>
static bool isDone;
@@ -750,6 +752,10 @@
// This test verifies that evaluating _javascript_ in a frame from the previous main navigation results in an error
TEST(EvaluateJavaScript, _javascript_InMissingFrameAfterNavigationError)
{
+ auto processPoolConfiguration = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
+ processPoolConfiguration.get().processSwapsOnNavigationWithinSameNonHTTPFamilyProtocol = YES;
+ auto processPool = adoptNS([[WKProcessPool alloc] _initWithConfiguration:processPoolConfiguration.get()]);
+
allFrames = adoptNS([[NSMutableSet<WKFrameInfo *> alloc] init]);
auto handler = adoptNS([[TestURLSchemeHandler alloc] init]);
@@ -774,6 +780,7 @@
}];
auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
+ [configuration setProcessPool:processPool.get()];
[configuration setURLSchemeHandler:handler.get() forURLScheme:@"framestest"];
[configuration setURLSchemeHandler:handler.get() forURLScheme:@"otherprotocol"];