Diff
Modified: trunk/Source/WebKit/ChangeLog (234559 => 234560)
--- trunk/Source/WebKit/ChangeLog 2018-08-03 21:35:49 UTC (rev 234559)
+++ trunk/Source/WebKit/ChangeLog 2018-08-03 22:50:15 UTC (rev 234560)
@@ -1,3 +1,37 @@
+2018-08-03 Ben Richards <[email protected]>
+
+ Add configuration for automatic process pre-warming
+ https://bugs.webkit.org/show_bug.cgi?id=187108
+
+ Reviewed by Ryosuke Niwa.
+
+ Added configurations to allow setting the maximum number of processes that should be automatically prewarmed.
+
+ * UIProcess/API/APIProcessPoolConfiguration.cpp:
+ (API::ProcessPoolConfiguration::copy):
+ * UIProcess/API/APIProcessPoolConfiguration.h:
+ * UIProcess/API/C/WKContext.cpp:
+ (WKContextSetMaximumNumberOfPrewarmedProcesses):
+ * UIProcess/API/C/WKContextPrivate.h:
+ * UIProcess/API/Cocoa/WKProcessPool.mm:
+ (-[WKProcessPool _setMaximumNumberOfPrewarmedProcesses:]):
+ * UIProcess/API/Cocoa/WKProcessPoolPrivate.h:
+ * UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h:
+ * UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm:
+ (-[_WKProcessPoolConfiguration setMaximumPrewarmedProcessCount:]):
+ (-[_WKProcessPoolConfiguration maximumPrewarmedProcessCount]):
+ * UIProcess/WebPageProxy.cpp:
+ (WebKit::WebPageProxy::didFinishLoadForFrame): Moved call to notifyProcessPoolToPrewarm from didFirstVisuallyNonEmptyLayoutForFrame to here.
+ This is to try to ensure that frame loading and prewarming don't happen at the same time as this would be heavy for some devices.
+ (WebKit::WebPageProxy::didFirstVisuallyNonEmptyLayoutForFrame):
+ * UIProcess/WebProcessPool.cpp:
+ (WebKit::WebProcessPool::setMaximumNumberOfProcesses): Condition changed so that calling setMaximumNumberOfProcesses after warmInitialProcess
+ doesn't result in a crash.
+ (WebKit::WebProcessPool::setMaximumNumberOfPrewarmedProcesses):
+ (WebKit::WebProcessPool::warmInitialProcess):
+ (WebKit::WebProcessPool::didReachGoodTimeToPrewarm):
+ * UIProcess/WebProcessPool.h:
+
2018-08-03 Alex Christensen <[email protected]>
Check with SafeBrowsing during navigation in WKWebView
Modified: trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp (234559 => 234560)
--- trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp 2018-08-03 21:35:49 UTC (rev 234559)
+++ trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp 2018-08-03 22:50:15 UTC (rev 234560)
@@ -98,6 +98,7 @@
copy->m_shouldHaveLegacyDataStore = this->m_shouldHaveLegacyDataStore;
copy->m_maximumProcessCount = this->m_maximumProcessCount;
+ copy->m_maximumPrewarmedProcessCount = this->m_maximumPrewarmedProcessCount;
copy->m_cacheModel = this->m_cacheModel;
copy->m_diskCacheDirectory = this->m_diskCacheDirectory;
copy->m_diskCacheSpeculativeValidationEnabled = this->m_diskCacheSpeculativeValidationEnabled;
Modified: trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h (234559 => 234560)
--- trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h 2018-08-03 21:35:49 UTC (rev 234559)
+++ trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h 2018-08-03 22:50:15 UTC (rev 234560)
@@ -51,8 +51,11 @@
void setShouldHaveLegacyDataStore(bool shouldHaveLegacyDataStore) { m_shouldHaveLegacyDataStore = shouldHaveLegacyDataStore; }
unsigned maximumProcessCount() const { return m_maximumProcessCount; }
- void setMaximumProcessCount(unsigned maximumProcessCount) { m_maximumProcessCount = maximumProcessCount; }
+ void setMaximumProcessCount(unsigned maximumProcessCount) { m_maximumProcessCount = maximumProcessCount; }
+ unsigned maximumPrewarmedProcessCount() const { return m_maximumPrewarmedProcessCount; }
+ void setMaximumPrewarmedProcessCount(unsigned maximumPrewarmedProcessCount) { m_maximumPrewarmedProcessCount = maximumPrewarmedProcessCount; }
+
bool diskCacheSpeculativeValidationEnabled() const { return m_diskCacheSpeculativeValidationEnabled; }
void setDiskCacheSpeculativeValidationEnabled(bool enabled) { m_diskCacheSpeculativeValidationEnabled = enabled; }
@@ -161,6 +164,7 @@
bool m_shouldHaveLegacyDataStore { false };
unsigned m_maximumProcessCount { 0 };
+ unsigned m_maximumPrewarmedProcessCount { 0 };
bool m_diskCacheSpeculativeValidationEnabled { false };
WebKit::CacheModel m_cacheModel { WebKit::CacheModelPrimaryWebBrowser };
int64_t m_diskCacheSizeOverride { -1 };
Modified: trunk/Source/WebKit/UIProcess/API/C/WKContext.cpp (234559 => 234560)
--- trunk/Source/WebKit/UIProcess/API/C/WKContext.cpp 2018-08-03 21:35:49 UTC (rev 234559)
+++ trunk/Source/WebKit/UIProcess/API/C/WKContext.cpp 2018-08-03 22:50:15 UTC (rev 234560)
@@ -402,6 +402,11 @@
toImpl(contextRef)->setCanHandleHTTPSServerTrustEvaluation(value);
}
+void WKContextSetMaximumNumberOfPrewarmedProcesses(WKContextRef contextRef, unsigned value)
+{
+ toImpl(contextRef)->setMaximumNumberOfPrewarmedProcesses(value);
+}
+
void WKContextSetDiskCacheSpeculativeValidationEnabled(WKContextRef contextRef, bool value)
{
toImpl(contextRef)->configuration().setDiskCacheSpeculativeValidationEnabled(value);
Modified: trunk/Source/WebKit/UIProcess/API/C/WKContextPrivate.h (234559 => 234560)
--- trunk/Source/WebKit/UIProcess/API/C/WKContextPrivate.h 2018-08-03 21:35:49 UTC (rev 234559)
+++ trunk/Source/WebKit/UIProcess/API/C/WKContextPrivate.h 2018-08-03 22:50:15 UTC (rev 234560)
@@ -69,6 +69,8 @@
WK_EXPORT void WKContextSetCanHandleHTTPSServerTrustEvaluation(WKContextRef context, bool value);
+WK_EXPORT void WKContextSetMaximumNumberOfPrewarmedProcesses(WKContextRef context, unsigned count);
+
WK_EXPORT void WKContextSetDiskCacheSpeculativeValidationEnabled(WKContextRef context, bool value);
WK_EXPORT void WKContextSetIconDatabasePath(WKContextRef context, WKStringRef iconDatabasePath);
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPool.mm (234559 => 234560)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPool.mm 2018-08-03 21:35:49 UTC (rev 234559)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPool.mm 2018-08-03 22:50:15 UTC (rev 234560)
@@ -201,6 +201,11 @@
_processPool->setMaximumNumberOfProcesses(value);
}
+- (void)_setMaximumNumberOfPrewarmedProcesses:(NSUInteger)value
+{
+ _processPool->setMaximumNumberOfPrewarmedProcesses(value);
+}
+
- (void)_setCanHandleHTTPSServerTrustEvaluation:(BOOL)value
{
_processPool->setCanHandleHTTPSServerTrustEvaluation(value);
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPoolPrivate.h (234559 => 234560)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPoolPrivate.h 2018-08-03 21:35:49 UTC (rev 234559)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPoolPrivate.h 2018-08-03 22:50:15 UTC (rev 234560)
@@ -111,6 +111,7 @@
- (void)_setAllowsAnySSLCertificateForServiceWorker:(BOOL)allows WK_API_AVAILABLE(macosx(10.13.4), ios(11.3));
- (void)_registerURLSchemeServiceWorkersCanHandle:(NSString *)scheme WK_API_AVAILABLE(macosx(10.13.4), ios(11.3));
- (void)_setMaximumNumberOfProcesses:(NSUInteger)value WK_API_AVAILABLE(macosx(10.13.4), ios(11.3));
+- (void)_setMaximumNumberOfPrewarmedProcesses:(NSUInteger)value WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
@property (nonatomic, getter=_isCookieStoragePartitioningEnabled, setter=_setCookieStoragePartitioningEnabled:) BOOL _cookieStoragePartitioningEnabled WK_API_DEPRECATED("Partitioned cookies are no longer supported", macosx(10.12.3, WK_MAC_TBA), ios(10.3, WK_IOS_TBA));
@property (nonatomic, getter=_isStorageAccessAPIEnabled, setter=_setStorageAccessAPIEnabled:) BOOL _storageAccessAPIEnabled WK_API_AVAILABLE(macosx(10.13.4), ios(11.3));
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h (234559 => 234560)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h 2018-08-03 21:35:49 UTC (rev 234559)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h 2018-08-03 22:50:15 UTC (rev 234560)
@@ -35,6 +35,7 @@
@property (nonatomic, copy) NSURL *injectedBundleURL;
@property (nonatomic) NSUInteger maximumProcessCount;
+@property (nonatomic) NSUInteger maximumPrewarmedProcessCount WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
@property (nonatomic) BOOL ignoreSynchronousMessagingTimeoutsForTesting WK_API_AVAILABLE(macosx(10.12), ios(10.0));
@property (nonatomic) BOOL attrStyleEnabled WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm (234559 => 234560)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm 2018-08-03 21:35:49 UTC (rev 234559)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm 2018-08-03 22:50:15 UTC (rev 234560)
@@ -259,6 +259,16 @@
return _processPoolConfiguration->processSwapsOnNavigation();
}
+- (void)setMaximumPrewarmedProcessCount:(NSUInteger)count
+{
+ _processPoolConfiguration->setMaximumPrewarmedProcessCount(count);
+}
+
+- (NSUInteger)maximumPrewarmedProcessCount
+{
+ return _processPoolConfiguration->maximumPrewarmedProcessCount();
+}
+
- (void)setAlwaysKeepAndReuseSwappedProcesses:(BOOL)swaps
{
_processPoolConfiguration->setAlwaysKeepAndReuseSwappedProcesses(swaps);
Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (234559 => 234560)
--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp 2018-08-03 21:35:49 UTC (rev 234559)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp 2018-08-03 22:50:15 UTC (rev 234560)
@@ -3782,6 +3782,8 @@
m_pageClient.didFinishLoadForMainFrame();
resetRecentCrashCountSoon();
+
+ notifyProcessPoolToPrewarm();
}
m_isLoadingAlternateHTMLStringForFailingProvisionalLoad = false;
@@ -3921,10 +3923,8 @@
m_loaderClient->didFirstVisuallyNonEmptyLayoutForFrame(*this, *frame, m_process->transformHandlesToObjects(userData.object()).get());
- if (frame->isMainFrame()) {
+ if (frame->isMainFrame())
m_pageClient.didFirstVisuallyNonEmptyLayoutForMainFrame();
- notifyProcessPoolToPrewarm();
- }
}
void WebPageProxy::didLayoutForCustomContentProvider()
Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.cpp (234559 => 234560)
--- trunk/Source/WebKit/UIProcess/WebProcessPool.cpp 2018-08-03 21:35:49 UTC (rev 234559)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.cpp 2018-08-03 22:50:15 UTC (rev 234560)
@@ -403,12 +403,21 @@
void WebProcessPool::setMaximumNumberOfProcesses(unsigned maximumNumberOfProcesses)
{
// Guard against API misuse.
- if (!m_processes.isEmpty())
+ if (m_processes.size() != m_prewarmedProcessCount)
CRASH();
m_configuration->setMaximumProcessCount(maximumNumberOfProcesses);
}
+void WebProcessPool::setMaximumNumberOfPrewarmedProcesses(unsigned maximumNumberOfProcesses)
+{
+ // Guard against API misuse.
+ if (m_processes.size())
+ CRASH();
+
+ m_configuration->setMaximumPrewarmedProcessCount(maximumNumberOfProcesses);
+}
+
IPC::Connection* WebProcessPool::networkingProcessConnection()
{
return m_networkProcess->connection();
@@ -997,11 +1006,16 @@
void WebProcessPool::warmInitialProcess()
{
- if (m_prewarmedProcessCount) {
+ unsigned maxPrewarmed = maximumNumberOfPrewarmedProcesses();
+ if (maxPrewarmed && m_prewarmedProcessCount >= maxPrewarmed) {
ASSERT(!m_processes.isEmpty());
return;
}
+ // FIXME: This should be removed after Safari has been patched to use setMaximumNumberOfPrewarmedProcesses
+ if (!maxPrewarmed)
+ m_configuration->setMaximumPrewarmedProcessCount(1);
+
if (m_processes.size() >= maximumNumberOfProcesses())
return;
@@ -1313,12 +1327,14 @@
void WebProcessPool::didReachGoodTimeToPrewarm()
{
- if (!m_configuration->processSwapsOnNavigation())
+ unsigned maxPrewarmed = maximumNumberOfPrewarmedProcesses();
+ if (!maxPrewarmed)
return;
+
if (!m_websiteDataStore)
m_websiteDataStore = API::WebsiteDataStore::defaultDataStore().ptr();
- static constexpr size_t maxPrewarmCount = 1;
- while (m_prewarmedProcessCount < maxPrewarmCount)
+
+ while (m_prewarmedProcessCount < maxPrewarmed)
createNewWebProcess(m_websiteDataStore->websiteDataStore(), WebProcessProxy::IsInPrewarmedPool::Yes);
}
Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.h (234559 => 234560)
--- trunk/Source/WebKit/UIProcess/WebProcessPool.h 2018-08-03 21:35:49 UTC (rev 234559)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.h 2018-08-03 22:50:15 UTC (rev 234560)
@@ -156,6 +156,9 @@
void setMaximumNumberOfProcesses(unsigned); // Can only be called when there are no processes running.
unsigned maximumNumberOfProcesses() const { return !m_configuration->maximumProcessCount() ? UINT_MAX : m_configuration->maximumProcessCount(); }
+ void setMaximumNumberOfPrewarmedProcesses(unsigned); // Can only be called when there are no processes running.
+ unsigned maximumNumberOfPrewarmedProcesses() const { return m_configuration->maximumPrewarmedProcessCount(); }
+
const Vector<RefPtr<WebProcessProxy>>& processes() const { return m_processes; }
// WebProcess or NetworkProcess as approporiate for current process model. The connection must be non-null.
Modified: trunk/Tools/ChangeLog (234559 => 234560)
--- trunk/Tools/ChangeLog 2018-08-03 21:35:49 UTC (rev 234559)
+++ trunk/Tools/ChangeLog 2018-08-03 22:50:15 UTC (rev 234560)
@@ -1,3 +1,19 @@
+2018-08-03 Ben Richards <[email protected]>
+
+ Add configuration for automatic process pre-warming
+ https://bugs.webkit.org/show_bug.cgi?id=187108
+
+ Reviewed by Ryosuke Niwa.
+
+ Added new test case for setting maximum prewarmed process count and updated test case for process swap on navigation to set the maximum prewarmed process count to be 1 where relevant.
+
+ * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+ * TestWebKitAPI/Tests/WebKitCocoa/InitialWarmedProcessUsed.mm:
+ (TEST):
+ * TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm:
+ * TestWebKitAPI/Tests/WebKitCocoa/SetMaximumPrewarmedProcessCount.mm:
+ (TEST):
+
2018-08-03 Aakash Jain <[email protected]>
[ews-build] Add build step to Check Patch Relevance
Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (234559 => 234560)
--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj 2018-08-03 21:35:49 UTC (rev 234559)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj 2018-08-03 22:50:15 UTC (rev 234560)
@@ -156,6 +156,7 @@
3FCC4FE81EC4E8CA0076E37C /* PictureInPictureDelegate.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 3FCC4FE61EC4E87E0076E37C /* PictureInPictureDelegate.html */; };
4135FB842011FAA700332139 /* InjectInternals_Bundle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4135FB832011FAA300332139 /* InjectInternals_Bundle.cpp */; };
4135FB852011FABF00332139 /* libWebCoreTestSupport.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4135FB862011FABF00332139 /* libWebCoreTestSupport.dylib */; };
+ 41882F0321010C0D002FF288 /* SetMaximumPrewarmedProcessCount.mm in Sources */ = {isa = PBXBuildFile; fileRef = 41882F0221010A70002FF288 /* SetMaximumPrewarmedProcessCount.mm */; };
4433A396208044140091ED57 /* SynchronousTimeoutTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 4433A395208044130091ED57 /* SynchronousTimeoutTests.mm */; };
44817A2F1F0486BF00003810 /* WKRequestActivatedElementInfo.mm in Sources */ = {isa = PBXBuildFile; fileRef = 44817A2E1F0486BF00003810 /* WKRequestActivatedElementInfo.mm */; };
448D7E471EA6C55500ECC756 /* EnvironmentUtilitiesTest.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 448D7E451EA6C55500ECC756 /* EnvironmentUtilitiesTest.cpp */; };
@@ -1398,6 +1399,7 @@
3FCC4FE61EC4E87E0076E37C /* PictureInPictureDelegate.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = PictureInPictureDelegate.html; sourceTree = "<group>"; };
4135FB832011FAA300332139 /* InjectInternals_Bundle.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = InjectInternals_Bundle.cpp; path = Tests/InjectInternals_Bundle.cpp; sourceTree = SOURCE_ROOT; };
4135FB862011FABF00332139 /* libWebCoreTestSupport.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; path = libWebCoreTestSupport.dylib; sourceTree = BUILT_PRODUCTS_DIR; };
+ 41882F0221010A70002FF288 /* SetMaximumPrewarmedProcessCount.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = SetMaximumPrewarmedProcessCount.mm; sourceTree = "<group>"; };
41973B5A1AF2286A006C7B36 /* FileSystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FileSystem.cpp; sourceTree = "<group>"; };
41973B5C1AF22875006C7B36 /* SharedBuffer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SharedBuffer.cpp; sourceTree = "<group>"; };
440A1D3814A0103A008A66F2 /* URL.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = URL.cpp; sourceTree = "<group>"; };
@@ -2346,6 +2348,7 @@
F4D2986D20FEE7370092D636 /* RunScriptAfterDocumentLoad.mm */,
CE0947362063223B003C9BA0 /* SchemeRegistry.mm */,
51EB12931FDF050500A5A1BD /* ServiceWorkerBasic.mm */,
+ 41882F0221010A70002FF288 /* SetMaximumPrewarmedProcessCount.mm */,
37BCA61B1B596BA9002012CA /* ShouldOpenExternalURLsInNewWindowActions.mm */,
2D9A53AE1B31FA8D0074D5AA /* ShrinkToFit.mm */,
2DFF7B6C1DA487AF00814614 /* SnapshotStore.mm */,
@@ -3880,6 +3883,7 @@
51EB12941FDF052500A5A1BD /* ServiceWorkerBasic.mm in Sources */,
7CCE7ECB1A411A7E00447C4C /* SetAndUpdateCacheModel.mm in Sources */,
7CCE7ECC1A411A7E00447C4C /* SetDocumentURI.mm in Sources */,
+ 41882F0321010C0D002FF288 /* SetMaximumPrewarmedProcessCount.mm in Sources */,
CE6E81A020A6935F00E2C80F /* SetTimeoutFunction.mm in Sources */,
7C83E0521D0A641800FEBCF3 /* SharedBuffer.cpp in Sources */,
A17991881E1C994E00A505ED /* SharedBuffer.mm in Sources */,
Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/InitialWarmedProcessUsed.mm (234559 => 234560)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/InitialWarmedProcessUsed.mm 2018-08-03 21:35:49 UTC (rev 234559)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/InitialWarmedProcessUsed.mm 2018-08-03 22:50:15 UTC (rev 234560)
@@ -37,18 +37,27 @@
TEST(WKProcessPool, InitialWarmedProcessUsed)
{
- auto *pool = [WKProcessPool _sharedProcessPool];
+ auto pool = adoptNS([[WKProcessPool alloc] init]);
+ [pool _setMaximumNumberOfPrewarmedProcesses:1];
[pool _warmInitialProcess];
+ EXPECT_EQ(static_cast<size_t>(1), [pool _prewarmedWebProcessCount]);
+ EXPECT_EQ(static_cast<size_t>(1), [pool _webPageContentProcessCount]);
+
auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
- configuration.get().processPool = pool;
+ configuration.get().processPool = pool.get();
configuration.get().websiteDataStore = [WKWebsiteDataStore nonPersistentDataStore];
auto webView = adoptNS([[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 800, 600) configuration:configuration.get()]);
+
+ EXPECT_EQ(static_cast<size_t>(0), [pool _prewarmedWebProcessCount]);
+ EXPECT_EQ(static_cast<size_t>(1), [pool _webPageContentProcessCount]);
+
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:loadableURL]]];
[webView _test_waitForDidFinishNavigation];
- EXPECT_EQ([pool _webPageContentProcessCount], static_cast<size_t>(1));
+ EXPECT_EQ(static_cast<size_t>(1), [pool _prewarmedWebProcessCount]);
+ EXPECT_EQ(static_cast<size_t>(2), [pool _webPageContentProcessCount]);
}
#endif
Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm (234559 => 234560)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm 2018-08-03 21:35:49 UTC (rev 234559)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm 2018-08-03 22:50:15 UTC (rev 234560)
@@ -282,6 +282,7 @@
{
auto processPoolConfiguration = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
processPoolConfiguration.get().processSwapsOnNavigation = YES;
+ processPoolConfiguration.get().maximumPrewarmedProcessCount = 1;
auto processPool = adoptNS([[WKProcessPool alloc] _initWithConfiguration:processPoolConfiguration.get()]);
auto webViewConfiguration = adoptNS([[WKWebViewConfiguration alloc] init]);
@@ -900,6 +901,7 @@
{
auto processPoolConfiguration = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
[processPoolConfiguration setProcessSwapsOnNavigation:YES];
+ [processPoolConfiguration setMaximumPrewarmedProcessCount:1];
auto processPool = adoptNS([[WKProcessPool alloc] _initWithConfiguration:processPoolConfiguration.get()]);
auto webViewConfiguration = adoptNS([[WKWebViewConfiguration alloc] init]);
@@ -1090,7 +1092,7 @@
auto webViewConfiguration = adoptNS([[WKWebViewConfiguration alloc] init]);
[webViewConfiguration setProcessPool:processPool.get()];
webViewConfiguration.get().preferences._developerExtrasEnabled = YES;
-
+
RetainPtr<PSONScheme> handler = adoptNS([[PSONScheme alloc] init]);
[webViewConfiguration setURLSchemeHandler:handler.get() forURLScheme:@"PSON1"];
[webViewConfiguration setURLSchemeHandler:handler.get() forURLScheme:@"PSON2"];
@@ -1475,7 +1477,7 @@
TestWebKitAPI::Util::run(&done);
done = false;
auto pid3 = [webView _webProcessIdentifier];
-
+
EXPECT_EQ(3, numberOfDecidePolicyCalls);
EXPECT_EQ(2u, seenPIDs.size());
EXPECT_NE(pid1, pid3);
Copied: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/SetMaximumPrewarmedProcessCount.mm (from rev 234559, trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/InitialWarmedProcessUsed.mm) (0 => 234560)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/SetMaximumPrewarmedProcessCount.mm (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/SetMaximumPrewarmedProcessCount.mm 2018-08-03 22:50:15 UTC (rev 234560)
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "config.h"
+
+#import "PlatformUtilities.h"
+#import "Test.h"
+#import <WebKit/WKProcessPoolPrivate.h>
+#import <WebKit/_WKProcessPoolConfiguration.h>
+#import <wtf/RetainPtr.h>
+
+#if WK_API_ENABLED
+
+TEST(WKProcessPool, SetMaximumPrewarmedProcessCount)
+{
+ auto processPoolConfiguration = adoptNS([[_WKProcessPoolConfiguration alloc] init]);
+ [processPoolConfiguration setMaximumPrewarmedProcessCount:2];
+ auto processPool = adoptNS([[WKProcessPool alloc] _initWithConfiguration:processPoolConfiguration.get()]);
+
+ EXPECT_EQ(0u, [processPool _prewarmedWebProcessCount]);
+
+ [processPool _warmInitialProcess];
+
+ EXPECT_EQ(1u, [processPool _prewarmedWebProcessCount]);
+
+ [processPool _warmInitialProcess];
+
+ EXPECT_EQ(2u, [processPool _prewarmedWebProcessCount]);
+
+ [processPool _warmInitialProcess];
+
+ EXPECT_EQ(2u, [processPool _prewarmedWebProcessCount]);
+
+ // Test to make sure this doesn't cause a crash
+ [processPool _setMaximumNumberOfProcesses:1];
+}
+
+#endif