Title: [234560] trunk
Revision
234560
Author
[email protected]
Date
2018-08-03 15:50:15 -0700 (Fri, 03 Aug 2018)

Log Message

Add configuration for automatic process pre-warming
https://bugs.webkit.org/show_bug.cgi?id=187108

Patch by Ben Richards <[email protected]> on 2018-08-03
Reviewed by Ryosuke Niwa.

Source/WebKit:

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:

Tools:

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):

Modified Paths

Added Paths

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
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to