Diff
Modified: trunk/Source/WebKit/ChangeLog (234442 => 234443)
--- trunk/Source/WebKit/ChangeLog 2018-08-01 01:40:40 UTC (rev 234442)
+++ trunk/Source/WebKit/ChangeLog 2018-08-01 02:15:51 UTC (rev 234443)
@@ -1,3 +1,34 @@
+2018-07-31 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/_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-07-31 Stephan Szabo <[email protected]>
[WinCairo] <select> elements do not popup options
Modified: trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp (234442 => 234443)
--- trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp 2018-08-01 01:40:40 UTC (rev 234442)
+++ trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp 2018-08-01 02:15:51 UTC (rev 234443)
@@ -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 (234442 => 234443)
--- trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h 2018-08-01 01:40:40 UTC (rev 234442)
+++ trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h 2018-08-01 02:15:51 UTC (rev 234443)
@@ -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; }
@@ -158,6 +161,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 (234442 => 234443)
--- trunk/Source/WebKit/UIProcess/API/C/WKContext.cpp 2018-08-01 01:40:40 UTC (rev 234442)
+++ trunk/Source/WebKit/UIProcess/API/C/WKContext.cpp 2018-08-01 02:15:51 UTC (rev 234443)
@@ -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 (234442 => 234443)
--- trunk/Source/WebKit/UIProcess/API/C/WKContextPrivate.h 2018-08-01 01:40:40 UTC (rev 234442)
+++ trunk/Source/WebKit/UIProcess/API/C/WKContextPrivate.h 2018-08-01 02:15:51 UTC (rev 234443)
@@ -68,6 +68,8 @@
WK_EXPORT void WKContextSetDomainRelaxationForbiddenForURLScheme(WKContextRef context, WKStringRef urlScheme);
WK_EXPORT void WKContextSetCanHandleHTTPSServerTrustEvaluation(WKContextRef context, bool value);
+
+WK_EXPORT void WKContextSetMaximumNumberOfPrewarmedProcesses(WKContextRef context, unsigned count);
WK_EXPORT void WKContextSetDiskCacheSpeculativeValidationEnabled(WKContextRef context, bool value);
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h (234442 => 234443)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h 2018-08-01 01:40:40 UTC (rev 234442)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h 2018-08-01 02:15:51 UTC (rev 234443)
@@ -35,6 +35,7 @@
@property (nonatomic, copy) NSURL *injectedBundleURL;
@property (nonatomic) NSUInteger maximumProcessCount;
+@property (nonatomic) NSInteger maximumPrewarmedProcessCount;
@property (nonatomic) BOOL ignoreSynchronousMessagingTimeoutsForTesting WK_API_AVAILABLE(macosx(10.12), ios(10.0));
Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm (234442 => 234443)
--- trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm 2018-08-01 01:40:40 UTC (rev 234442)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm 2018-08-01 02:15:51 UTC (rev 234443)
@@ -249,6 +249,16 @@
return _processPoolConfiguration->processSwapsOnNavigation();
}
+- (void)setMaximumPrewarmedProcessCount:(NSInteger)count
+{
+ _processPoolConfiguration->setMaximumPrewarmedProcessCount(count);
+}
+
+- (NSInteger)maximumPrewarmedProcessCount
+{
+ return _processPoolConfiguration->maximumPrewarmedProcessCount();
+}
+
- (void)setAlwaysKeepAndReuseSwappedProcesses:(BOOL)swaps
{
_processPoolConfiguration->setAlwaysKeepAndReuseSwappedProcesses(swaps);
Modified: trunk/Source/WebKit/UIProcess/WebPageProxy.cpp (234442 => 234443)
--- trunk/Source/WebKit/UIProcess/WebPageProxy.cpp 2018-08-01 01:40:40 UTC (rev 234442)
+++ trunk/Source/WebKit/UIProcess/WebPageProxy.cpp 2018-08-01 02:15:51 UTC (rev 234443)
@@ -3781,6 +3781,8 @@
m_pageClient.didFinishLoadForMainFrame();
resetRecentCrashCountSoon();
+
+ notifyProcessPoolToPrewarm();
}
m_isLoadingAlternateHTMLStringForFailingProvisionalLoad = false;
@@ -3920,10 +3922,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 (234442 => 234443)
--- trunk/Source/WebKit/UIProcess/WebProcessPool.cpp 2018-08-01 01:40:40 UTC (rev 234442)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.cpp 2018-08-01 02:15:51 UTC (rev 234443)
@@ -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();
@@ -993,7 +1002,7 @@
void WebProcessPool::warmInitialProcess()
{
- if (m_prewarmedProcessCount) {
+ if (m_prewarmedProcessCount >= maximumNumberOfPrewarmedProcesses()) {
ASSERT(!m_processes.isEmpty());
return;
}
@@ -1309,12 +1318,11 @@
void WebProcessPool::didReachGoodTimeToPrewarm()
{
- if (!m_configuration->processSwapsOnNavigation())
- return;
if (!m_websiteDataStore)
m_websiteDataStore = API::WebsiteDataStore::defaultDataStore().ptr();
- static constexpr size_t maxPrewarmCount = 1;
- while (m_prewarmedProcessCount < maxPrewarmCount)
+
+ unsigned maxPrewarmed = maximumNumberOfPrewarmedProcesses();
+ while (m_prewarmedProcessCount < maxPrewarmed)
createNewWebProcess(m_websiteDataStore->websiteDataStore(), WebProcessProxy::IsInPrewarmedPool::Yes);
}
Modified: trunk/Source/WebKit/UIProcess/WebProcessPool.h (234442 => 234443)
--- trunk/Source/WebKit/UIProcess/WebProcessPool.h 2018-08-01 01:40:40 UTC (rev 234442)
+++ trunk/Source/WebKit/UIProcess/WebProcessPool.h 2018-08-01 02:15:51 UTC (rev 234443)
@@ -155,6 +155,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; }
Modified: trunk/Tools/ChangeLog (234442 => 234443)
--- trunk/Tools/ChangeLog 2018-08-01 01:40:40 UTC (rev 234442)
+++ trunk/Tools/ChangeLog 2018-08-01 02:15:51 UTC (rev 234443)
@@ -1,3 +1,17 @@
+2018-07-31 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/ProcessSwapOnNavigation.mm:
+ * TestWebKitAPI/Tests/WebKitCocoa/SetMaximumPrewarmedProcessCount.mm: Added.
+ (TEST):
+
2018-07-31 John Wilander <[email protected]>
Resource Load Statistics: Remove partitioned cookies for reduced complexity, lower memory footprint, and ability to support more platforms
Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (234442 => 234443)
--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj 2018-08-01 01:40:40 UTC (rev 234442)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj 2018-08-01 02:15:51 UTC (rev 234443)
@@ -154,6 +154,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 */; };
@@ -1391,6 +1392,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>"; };
@@ -2335,6 +2337,7 @@
F4D2986D20FEE7370092D636 /* RunScriptAfterDocumentLoad.mm */,
CE0947362063223B003C9BA0 /* SchemeRegistry.mm */,
51EB12931FDF050500A5A1BD /* ServiceWorkerBasic.mm */,
+ 41882F0221010A70002FF288 /* SetMaximumPrewarmedProcessCount.mm */,
37BCA61B1B596BA9002012CA /* ShouldOpenExternalURLsInNewWindowActions.mm */,
2D9A53AE1B31FA8D0074D5AA /* ShrinkToFit.mm */,
2DFF7B6C1DA487AF00814614 /* SnapshotStore.mm */,
@@ -3863,6 +3866,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/ProcessSwapOnNavigation.mm (234442 => 234443)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm 2018-08-01 01:40:40 UTC (rev 234442)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm 2018-08-01 02:15:51 UTC (rev 234443)
@@ -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);
Added: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/SetMaximumPrewarmedProcessCount.mm (0 => 234443)
--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/SetMaximumPrewarmedProcessCount.mm (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/SetMaximumPrewarmedProcessCount.mm 2018-08-01 02:15:51 UTC (rev 234443)
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) 2018 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:50];
+}
+
+#endif