WebKit Bugzilla
Attachment 348835 Details for
Bug 189263
: Add process pool configuration flag to turn on automatic process pre-warming
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
bug-189263-20180904115127.patch (text/plain), 51.87 KB, created by
Chris Dumez
on 2018-09-04 11:51:28 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Chris Dumez
Created:
2018-09-04 11:51:28 PDT
Size:
51.87 KB
patch
obsolete
>Subversion Revision: 235577 >diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index fc03a5651c260cacf00093a99c5a2ac8f0c75343..b35d75f4bdbbdfd23a8e12e2b8b49fb9356a1fb9 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,51 @@ >+2018-09-04 Chris Dumez <cdumez@apple.com> >+ >+ Add process pool configuration flag to turn on automatic process pre-warming >+ https://bugs.webkit.org/show_bug.cgi?id=189263 >+ <rdar://problem/44101941> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Add process pool configuration flag to turn on automatic process pre-warming and disassociate >+ it from the warmInitialProcess() SPI. >+ >+ For now, turning on "process swap on navigation" via experimental features also turns on >+ automatic process pre-warming. >+ >+ * UIProcess/API/APIProcessPoolConfiguration.cpp: >+ (API::ProcessPoolConfiguration::copy): >+ * UIProcess/API/APIProcessPoolConfiguration.h: >+ * UIProcess/API/C/WKContext.cpp: >+ (WKContextSetPrewarmsProcessesAutomatically): >+ (WKContextWarmInitialProcess): >+ * UIProcess/API/C/WKContextPrivate.h: >+ * UIProcess/API/Cocoa/WKProcessPool.mm: >+ (-[WKProcessPool _warmInitialProcess]): >+ (-[WKProcessPool _hasPrewarmedWebProcess]): >+ (-[WKProcessPool _webProcessCountIgnoringPrewarmed]): >+ * UIProcess/API/Cocoa/WKProcessPoolPrivate.h: >+ * UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h: >+ * UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm: >+ (-[_WKProcessPoolConfiguration setPrewarmsProcessesAutomatically:]): >+ (-[_WKProcessPoolConfiguration prewarmsProcessesAutomatically]): >+ * UIProcess/ServiceWorkerProcessProxy.cpp: >+ (WebKit::ServiceWorkerProcessProxy::ServiceWorkerProcessProxy): >+ * UIProcess/WebProcessPool.cpp: >+ (WebKit::WebProcessPool::setMaximumNumberOfProcesses): >+ (WebKit::WebProcessPool::createNewWebProcess): >+ (WebKit::WebProcessPool::tryTakePrewarmedProcess): >+ (WebKit::WebProcessPool::prewarmProcess): >+ (WebKit::WebProcessPool::disconnectProcess): >+ (WebKit::WebProcessPool::createWebPage): >+ (WebKit::WebProcessPool::didReachGoodTimeToPrewarm): >+ * UIProcess/WebProcessPool.h: >+ (WebKit::WebProcessPool::sendToOneProcess): >+ * UIProcess/WebProcessProxy.cpp: >+ (WebKit::WebProcessProxy::create): >+ (WebKit::WebProcessProxy::WebProcessProxy): >+ (WebKit::m_isInPrewarmedPool): >+ * UIProcess/WebProcessProxy.h: >+ > 2018-08-31 John Wilander <wilander@apple.com> > > Storage Access API: Maintain access through same-site navigations >diff --git a/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp b/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp >index 8b4991a87adc65e9b194e058471fb2cba3dea482..c113ed831e652c35f51dde455428459bd875db6b 100644 >--- a/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp >+++ b/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp >@@ -89,7 +89,6 @@ Ref<ProcessPoolConfiguration> ProcessPoolConfiguration::copy() > > 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; >@@ -123,6 +122,7 @@ Ref<ProcessPoolConfiguration> ProcessPoolConfiguration::copy() > copy->m_processSwapsOnNavigation = this->m_processSwapsOnNavigation; > copy->m_alwaysKeepAndReuseSwappedProcesses = this->m_alwaysKeepAndReuseSwappedProcesses; > copy->m_processSwapsOnWindowOpenWithOpener = this->m_processSwapsOnWindowOpenWithOpener; >+ copy->m_isAutomaticProcessWarmingEnabled = this->m_isAutomaticProcessWarmingEnabled; > #if ENABLE(PROXIMITY_NETWORKING) > copy->m_wirelessContextIdentifier = this->m_wirelessContextIdentifier; > #endif >diff --git a/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h b/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h >index 558722ee0f2191976d664d2cadc6ccb10a3eb63e..45b1b7506a545bc95c25bcbb0643b3c3e5d27142 100644 >--- a/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h >+++ b/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h >@@ -53,8 +53,8 @@ public: > unsigned maximumProcessCount() const { return m_maximumProcessCount; } > void setMaximumProcessCount(unsigned maximumProcessCount) { m_maximumProcessCount = maximumProcessCount; } > >- unsigned maximumPrewarmedProcessCount() const { return m_maximumPrewarmedProcessCount; } >- void setMaximumPrewarmedProcessCount(unsigned maximumPrewarmedProcessCount) { m_maximumPrewarmedProcessCount = maximumPrewarmedProcessCount; } >+ bool isAutomaticProcessWarmingEnabled() const { return m_isAutomaticProcessWarmingEnabled; } >+ void setIsAutomaticProcessWarmingEnabled(bool value) { m_isAutomaticProcessWarmingEnabled = value; } > > bool diskCacheSpeculativeValidationEnabled() const { return m_diskCacheSpeculativeValidationEnabled; } > void setDiskCacheSpeculativeValidationEnabled(bool enabled) { m_diskCacheSpeculativeValidationEnabled = enabled; } >@@ -167,7 +167,6 @@ private: > 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 }; >@@ -199,6 +198,7 @@ private: > bool m_processSwapsOnNavigation { false }; > bool m_alwaysKeepAndReuseSwappedProcesses { false }; > bool m_processSwapsOnWindowOpenWithOpener { false }; >+ bool m_isAutomaticProcessWarmingEnabled { false }; > WTF::String m_customWebContentServiceBundleIdentifier; > > #if PLATFORM(IOS) >diff --git a/Source/WebKit/UIProcess/API/C/WKContext.cpp b/Source/WebKit/UIProcess/API/C/WKContext.cpp >index c8a6c35b5bdc3e1987b4b013f5cf26410d482979..28d878ef3689804e05d8079be637d013c91a4b23 100644 >--- a/Source/WebKit/UIProcess/API/C/WKContext.cpp >+++ b/Source/WebKit/UIProcess/API/C/WKContext.cpp >@@ -402,9 +402,9 @@ void WKContextSetCanHandleHTTPSServerTrustEvaluation(WKContextRef contextRef, bo > toImpl(contextRef)->setCanHandleHTTPSServerTrustEvaluation(value); > } > >-void WKContextSetMaximumNumberOfPrewarmedProcesses(WKContextRef contextRef, unsigned value) >+void WKContextSetPrewarmsProcessesAutomatically(WKContextRef contextRef, bool value) > { >- toImpl(contextRef)->setMaximumNumberOfPrewarmedProcesses(value); >+ toImpl(contextRef)->configuration().setIsAutomaticProcessWarmingEnabled(value); > } > > void WKContextSetCustomWebContentServiceBundleIdentifier(WKContextRef contextRef, WKStringRef name) >@@ -515,7 +515,7 @@ void WKContextSetHTTPPipeliningEnabled(WKContextRef contextRef, bool enabled) > > void WKContextWarmInitialProcess(WKContextRef contextRef) > { >- toImpl(contextRef)->warmInitialProcess(); >+ toImpl(contextRef)->prewarmProcess(); > } > > void WKContextGetStatistics(WKContextRef contextRef, void* context, WKContextGetStatisticsFunction callback) >diff --git a/Source/WebKit/UIProcess/API/C/WKContextPrivate.h b/Source/WebKit/UIProcess/API/C/WKContextPrivate.h >index 4ab5a9407bb6b7da7cd65b630441c05a9729568b..ca457d7ffb5c6d858070d238ba1287ad1926d480 100644 >--- a/Source/WebKit/UIProcess/API/C/WKContextPrivate.h >+++ b/Source/WebKit/UIProcess/API/C/WKContextPrivate.h >@@ -69,7 +69,7 @@ WK_EXPORT void WKContextSetDomainRelaxationForbiddenForURLScheme(WKContextRef co > > WK_EXPORT void WKContextSetCanHandleHTTPSServerTrustEvaluation(WKContextRef context, bool value); > >-WK_EXPORT void WKContextSetMaximumNumberOfPrewarmedProcesses(WKContextRef context, unsigned count); >+WK_EXPORT void WKContextSetPrewarmsProcessesAutomatically(WKContextRef context, bool value); > > WK_EXPORT void WKContextSetDiskCacheSpeculativeValidationEnabled(WKContextRef context, bool value); > >diff --git a/Source/WebKit/UIProcess/API/Cocoa/WKProcessPool.mm b/Source/WebKit/UIProcess/API/Cocoa/WKProcessPool.mm >index e390b9d355644556a1572f67a7061b54b2b6daf3..95cd752465f6880757a81e475fec738bd3e94115 100644 >--- a/Source/WebKit/UIProcess/API/Cocoa/WKProcessPool.mm >+++ b/Source/WebKit/UIProcess/API/Cocoa/WKProcessPool.mm >@@ -207,11 +207,6 @@ - (void)_setMaximumNumberOfProcesses:(NSUInteger)value > _processPool->setMaximumNumberOfProcesses(value); > } > >-- (void)_setMaximumNumberOfPrewarmedProcesses:(NSUInteger)value >-{ >- _processPool->setMaximumNumberOfPrewarmedProcesses(value); >-} >- > - (void)_setCanHandleHTTPSServerTrustEvaluation:(BOOL)value > { > _processPool->setCanHandleHTTPSServerTrustEvaluation(value); >@@ -403,7 +398,7 @@ - (void)_setAutomationDelegate:(id <_WKAutomationDelegate>)automationDelegate > > - (void)_warmInitialProcess > { >- _processPool->warmInitialProcess(); >+ _processPool->prewarmProcess(); > } > > - (void)_automationCapabilitiesDidChange >@@ -484,19 +479,18 @@ - (void)_makeNextNetworkProcessLaunchFailForTesting > _processPool->setShouldMakeNextNetworkProcessLaunchFailForTesting(true); > } > >-- (size_t)_prewarmedWebProcessCount >+- (BOOL)_hasPrewarmedWebProcess > { >- size_t result = 0; > for (auto& process : _processPool->processes()) { >- if (process->isInPrewarmedPool()) >- ++result; >+ if (process->isPrewarmed()) >+ return YES; > } >- return result; >+ return NO; > } > > - (size_t)_webProcessCountIgnoringPrewarmed > { >- return [self _webProcessCount] - [self _prewarmedWebProcessCount]; >+ return [self _webProcessCount] - ([self _hasPrewarmedWebProcess] ? 1 : 0); > } > > - (size_t)_webPageContentProcessCount >diff --git a/Source/WebKit/UIProcess/API/Cocoa/WKProcessPoolPrivate.h b/Source/WebKit/UIProcess/API/Cocoa/WKProcessPoolPrivate.h >index 364535a5f273d6aba1a9b07f91c5a6d70dc834cd..bc3ec826f6f186a3c8bd9ce2598eee9ff4495ed5 100644 >--- a/Source/WebKit/UIProcess/API/Cocoa/WKProcessPoolPrivate.h >+++ b/Source/WebKit/UIProcess/API/Cocoa/WKProcessPoolPrivate.h >@@ -93,7 +93,7 @@ > > // Test only. > - (size_t)_webProcessCount WK_API_AVAILABLE(macosx(10.13), ios(11.0)); >-- (size_t)_prewarmedWebProcessCount WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA)); >+- (BOOL)_hasPrewarmedWebProcess WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA)); > - (size_t)_webProcessCountIgnoringPrewarmed WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA)); > - (size_t)_pluginProcessCount WK_API_AVAILABLE(macosx(10.13.4), ios(11.3)); > - (size_t)_serviceWorkerProcessCount WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA)); >@@ -113,7 +113,6 @@ > - (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)); >diff --git a/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h b/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h >index 9549bdcc53572eaefcad859a2cc7382d4e82faf3..daa800f26b29ea4945c096a569e508599ad25a86 100644 >--- a/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h >+++ b/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h >@@ -35,7 +35,6 @@ WK_CLASS_AVAILABLE(macosx(10.10), ios(8.0)) > > @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, nullable, copy) NSString *customWebContentServiceBundleIdentifier WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA)); > > @property (nonatomic) BOOL ignoreSynchronousMessagingTimeoutsForTesting WK_API_AVAILABLE(macosx(10.12), ios(10.0)); >@@ -66,6 +65,7 @@ WK_CLASS_AVAILABLE(macosx(10.10), ios(8.0)) > @property (nonatomic) BOOL processSwapsOnNavigation WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA)); > @property (nonatomic) BOOL alwaysKeepAndReuseSwappedProcesses WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA)); > @property (nonatomic) BOOL processSwapsOnWindowOpenWithOpener WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA)); >+@property (nonatomic) BOOL prewarmsProcessesAutomatically WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA)); > @property (nonatomic) BOOL pageCacheEnabled WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA)); > @property (nonatomic) BOOL suppressesConnectionTerminationOnSystemChange WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA)); > >diff --git a/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm b/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm >index f2fd5def8cb645e846b58eea560e1d6853d471c1..5910007fa64db39d33748221d5d312ff0178937e 100644 >--- a/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm >+++ b/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm >@@ -250,14 +250,14 @@ - (BOOL)processSwapsOnNavigation > return _processPoolConfiguration->processSwapsOnNavigation(); > } > >-- (void)setMaximumPrewarmedProcessCount:(NSUInteger)count >+- (void)setPrewarmsProcessesAutomatically:(BOOL)prewarms > { >- _processPoolConfiguration->setMaximumPrewarmedProcessCount(count); >+ _processPoolConfiguration->setIsAutomaticProcessWarmingEnabled(prewarms); > } > >-- (NSUInteger)maximumPrewarmedProcessCount >+- (BOOL)prewarmsProcessesAutomatically > { >- return _processPoolConfiguration->maximumPrewarmedProcessCount(); >+ return _processPoolConfiguration->isAutomaticProcessWarmingEnabled(); > } > > - (void)setAlwaysKeepAndReuseSwappedProcesses:(BOOL)swaps >diff --git a/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.cpp b/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.cpp >index f3cb27d6ff9deba13a6338318d850c1da4ac7fdf..9e284b7efd563d624c5de326f4bab67d6a4c06d0 100644 >--- a/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.cpp >+++ b/Source/WebKit/UIProcess/ServiceWorkerProcessProxy.cpp >@@ -49,7 +49,7 @@ Ref<ServiceWorkerProcessProxy> ServiceWorkerProcessProxy::create(WebProcessPool& > } > > ServiceWorkerProcessProxy::ServiceWorkerProcessProxy(WebProcessPool& pool, const SecurityOriginData& securityOrigin, WebsiteDataStore& store) >- : WebProcessProxy { pool, store, IsInPrewarmedPool::No } >+ : WebProcessProxy { pool, store, IsPrewarmed::No } > , m_securityOrigin(securityOrigin) > , m_serviceWorkerPageID(generatePageID()) > { >diff --git a/Source/WebKit/UIProcess/WebProcessPool.cpp b/Source/WebKit/UIProcess/WebProcessPool.cpp >index db93351ce935ece55e1800229007b77b256dc9f7..411fe61252f9dca9b6e95b4e2c99e5fcedb9bb32 100644 >--- a/Source/WebKit/UIProcess/WebProcessPool.cpp >+++ b/Source/WebKit/UIProcess/WebProcessPool.cpp >@@ -337,7 +337,7 @@ WebProcessPool::~WebProcessPool() > while (!m_processes.isEmpty()) { > auto& process = m_processes.first(); > >- ASSERT(process->isInPrewarmedPool()); >+ ASSERT(process->isPrewarmed()); > // We need to be the only one holding a reference to the pre-warmed process so that it gets destroyed. > // WebProcessProxies currently always expect to have a WebProcessPool. > ASSERT(process->hasOneRef()); >@@ -400,22 +400,9 @@ void WebProcessPool::setLegacyCustomProtocolManagerClient(std::unique_ptr<API::C > > void WebProcessPool::setMaximumNumberOfProcesses(unsigned maximumNumberOfProcesses) > { >- // Guard against API misuse. >- 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); >-} >- > void WebProcessPool::setCustomWebContentServiceBundleIdentifier(const String& customWebContentServiceBundleIdentifier) > { > // Guard against API misuse. >@@ -781,14 +768,16 @@ void WebProcessPool::resolvePathsForSandboxExtensions() > platformResolvePathsForSandboxExtensions(); > } > >-WebProcessProxy& WebProcessPool::createNewWebProcess(WebsiteDataStore& websiteDataStore, WebProcessProxy::IsInPrewarmedPool isInPrewarmedPool) >+WebProcessProxy& WebProcessPool::createNewWebProcess(WebsiteDataStore& websiteDataStore, WebProcessProxy::IsPrewarmed isPrewarmed) > { >- auto processProxy = WebProcessProxy::create(*this, websiteDataStore, isInPrewarmedPool); >+ auto processProxy = WebProcessProxy::create(*this, websiteDataStore, isPrewarmed); > auto& process = processProxy.get(); > initializeNewWebProcess(process, websiteDataStore); > m_processes.append(WTFMove(processProxy)); >- if (isInPrewarmedPool == WebProcessProxy::IsInPrewarmedPool::Yes) >- ++m_prewarmedProcessCount; >+ if (isPrewarmed == WebProcessProxy::IsPrewarmed::Yes) { >+ ASSERT(!m_prewarmedProcess); >+ m_prewarmedProcess = &process; >+ } > > if (m_serviceWorkerProcessesTerminationTimer.isActive()) > m_serviceWorkerProcessesTerminationTimer.stop(); >@@ -798,22 +787,15 @@ WebProcessProxy& WebProcessPool::createNewWebProcess(WebsiteDataStore& websiteDa > > RefPtr<WebProcessProxy> WebProcessPool::tryTakePrewarmedProcess(WebsiteDataStore& websiteDataStore) > { >- if (!m_prewarmedProcessCount) >+ if (!m_prewarmedProcess) > return nullptr; > >- for (const auto& process : m_processes) { >- if (process->isInPrewarmedPool()) { >- --m_prewarmedProcessCount; >- process->markIsNoLongerInPrewarmedPool(); >- if (&process->websiteDataStore() != &websiteDataStore) >- process->send(Messages::WebProcess::AddWebsiteDataStore(websiteDataStore.parameters()), 0); >- return process.get(); >- } >- } >+ ASSERT(m_prewarmedProcess->isPrewarmed()); >+ m_prewarmedProcess->markIsNoLongerInPrewarmedPool(); >+ if (&m_prewarmedProcess->websiteDataStore() != &websiteDataStore) >+ m_prewarmedProcess->send(Messages::WebProcess::AddWebsiteDataStore(websiteDataStore.parameters()), 0); > >- ASSERT_NOT_REACHED(); >- m_prewarmedProcessCount = 0; >- return nullptr; >+ return std::exchange(m_prewarmedProcess, nullptr); > } > > #if PLATFORM(MAC) >@@ -1003,24 +985,15 @@ void WebProcessPool::initializeNewWebProcess(WebProcessProxy& process, WebsiteDa > #endif > } > >-void WebProcessPool::warmInitialProcess() >+void WebProcessPool::prewarmProcess() > { >- 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()) >+ if (m_prewarmedProcess) > return; > > if (!m_websiteDataStore) > m_websiteDataStore = API::WebsiteDataStore::defaultDataStore().ptr(); >- createNewWebProcess(m_websiteDataStore->websiteDataStore(), WebProcessProxy::IsInPrewarmedPool::Yes); >+ >+ createNewWebProcess(m_websiteDataStore->websiteDataStore(), WebProcessProxy::IsPrewarmed::Yes); > } > > void WebProcessPool::enableProcessTermination() >@@ -1076,8 +1049,10 @@ void WebProcessPool::disconnectProcess(WebProcessProxy* process) > { > ASSERT(m_processes.contains(process)); > >- if (process->isInPrewarmedPool()) >- --m_prewarmedProcessCount; >+ if (m_prewarmedProcess == process) { >+ ASSERT(m_prewarmedProcess->isPrewarmed()); >+ m_prewarmedProcess = nullptr; >+ } > > // FIXME (Multi-WebProcess): <rdar://problem/12239765> Some of the invalidation calls of the other supplements are still necessary in multi-process mode, but they should only affect data structures pertaining to the process being disconnected. > // Clearing everything causes assertion failures, so it's less trouble to skip that for now. >@@ -1180,8 +1155,12 @@ Ref<WebPageProxy> WebProcessPool::createWebPage(PageClient& pageClient, Ref<API: > #endif > > auto page = process->createWebPage(pageClient, WTFMove(pageConfiguration)); >- if (page->preferences().processSwapOnNavigationEnabled()) >+ if (page->preferences().processSwapOnNavigationEnabled()) { > m_configuration->setProcessSwapsOnNavigation(true); >+ // FIXME: For now, turning on PSON from the experimental features menu also turns on >+ // automatic process warming until clients can be updated. >+ m_configuration->setIsAutomaticProcessWarmingEnabled(true); >+ } > > return page; > } >@@ -1326,15 +1305,10 @@ void WebProcessPool::postMessageToInjectedBundle(const String& messageName, API: > > void WebProcessPool::didReachGoodTimeToPrewarm() > { >- unsigned maxPrewarmed = maximumNumberOfPrewarmedProcesses(); >- if (!maxPrewarmed) >+ if (!configuration().isAutomaticProcessWarmingEnabled()) > return; > >- if (!m_websiteDataStore) >- m_websiteDataStore = API::WebsiteDataStore::defaultDataStore().ptr(); >- >- while (m_prewarmedProcessCount < maxPrewarmed) >- createNewWebProcess(m_websiteDataStore->websiteDataStore(), WebProcessProxy::IsInPrewarmedPool::Yes); >+ prewarmProcess(); > } > > void WebProcessPool::populateVisitedLinks() >diff --git a/Source/WebKit/UIProcess/WebProcessPool.h b/Source/WebKit/UIProcess/WebProcessPool.h >index a12d645f3173d13d80adeb5e733d4cc18955ecac..a93998ea1fa088884c0a341dde4b591733293cf5 100644 >--- a/Source/WebKit/UIProcess/WebProcessPool.h >+++ b/Source/WebKit/UIProcess/WebProcessPool.h >@@ -156,9 +156,6 @@ public: > 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(); } >- > void setCustomWebContentServiceBundleIdentifier(const String&); > const String& customWebContentServiceBundleIdentifier() { return m_configuration->customWebContentServiceBundleIdentifier(); } > >@@ -297,7 +294,7 @@ public: > void allowSpecificHTTPSCertificateForHost(const WebCertificateInfo*, const String& host); > > WebProcessProxy& createNewWebProcessRespectingProcessCountLimit(WebsiteDataStore&); // Will return an existing one if limit is met. >- void warmInitialProcess(); >+ void prewarmProcess(); > > bool shouldTerminate(WebProcessProxy*); > >@@ -474,7 +471,7 @@ private: > > RefPtr<WebProcessProxy> tryTakePrewarmedProcess(WebsiteDataStore&); > >- WebProcessProxy& createNewWebProcess(WebsiteDataStore&, WebProcessProxy::IsInPrewarmedPool = WebProcessProxy::IsInPrewarmedPool::No); >+ WebProcessProxy& createNewWebProcess(WebsiteDataStore&, WebProcessProxy::IsPrewarmed = WebProcessProxy::IsPrewarmed::No); > void initializeNewWebProcess(WebProcessProxy&, WebsiteDataStore&); > > void requestWebContentStatistics(StatisticsRequest*); >@@ -537,7 +534,7 @@ private: > IPC::MessageReceiverMap m_messageReceiverMap; > > Vector<RefPtr<WebProcessProxy>> m_processes; >- unsigned m_prewarmedProcessCount { 0 }; >+ WebProcessProxy* m_prewarmedProcess { nullptr }; > > WebProcessProxy* m_processWithPageCache { nullptr }; > #if ENABLE(SERVICE_WORKER) >@@ -771,7 +768,7 @@ void WebProcessPool::sendToOneProcess(T&& message) > } > > if (!messageSent) { >- warmInitialProcess(); >+ prewarmProcess(); > RefPtr<WebProcessProxy> process = m_processes.last(); > if (process->canSendMessage()) > process->send(std::forward<T>(message), 0); >diff --git a/Source/WebKit/UIProcess/WebProcessProxy.cpp b/Source/WebKit/UIProcess/WebProcessProxy.cpp >index 4f6e3f1b78ddafc859f42659e9365d966d6acf9f..e4f47d930a7bed4c1b621dff9db3198d80cf4ce8 100644 >--- a/Source/WebKit/UIProcess/WebProcessProxy.cpp >+++ b/Source/WebKit/UIProcess/WebProcessProxy.cpp >@@ -116,18 +116,18 @@ static WebProcessProxy::WebPageProxyMap& globalPageMap() > return pageMap; > } > >-Ref<WebProcessProxy> WebProcessProxy::create(WebProcessPool& processPool, WebsiteDataStore& websiteDataStore, IsInPrewarmedPool isInPrewarmedPool) >+Ref<WebProcessProxy> WebProcessProxy::create(WebProcessPool& processPool, WebsiteDataStore& websiteDataStore, IsPrewarmed isPrewarmed) > { >- auto proxy = adoptRef(*new WebProcessProxy(processPool, websiteDataStore, isInPrewarmedPool)); >+ auto proxy = adoptRef(*new WebProcessProxy(processPool, websiteDataStore, isPrewarmed)); > proxy->connect(); > return proxy; > } > >-WebProcessProxy::WebProcessProxy(WebProcessPool& processPool, WebsiteDataStore& websiteDataStore, IsInPrewarmedPool isInPrewarmedPool) >+WebProcessProxy::WebProcessProxy(WebProcessPool& processPool, WebsiteDataStore& websiteDataStore, IsPrewarmed isPrewarmed) > : ChildProcessProxy(processPool.alwaysRunsAtBackgroundPriority()) > , m_responsivenessTimer(*this) > , m_backgroundResponsivenessTimer(*this) >- , m_processPool(processPool, isInPrewarmedPool == IsInPrewarmedPool::Yes ? IsWeak::Yes : IsWeak::No) >+ , m_processPool(processPool, isPrewarmed == IsPrewarmed::Yes ? IsWeak::Yes : IsWeak::No) > , m_mayHaveUniversalFileReadSandboxExtension(false) > , m_numberOfTimesSuddenTerminationWasDisabled(0) > , m_throttler(*this, processPool.shouldTakeUIBackgroundAssertion()) >@@ -137,7 +137,7 @@ WebProcessProxy::WebProcessProxy(WebProcessPool& processPool, WebsiteDataStore& > #if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM) > , m_userMediaCaptureManagerProxy(std::make_unique<UserMediaCaptureManagerProxy>(*this)) > #endif >- , m_isInPrewarmedPool(isInPrewarmedPool == IsInPrewarmedPool::Yes) >+ , m_isPrewarmed(isPrewarmed == IsPrewarmed::Yes) > { > RELEASE_ASSERT(isMainThreadOrCheckDisabled()); > >@@ -447,9 +447,9 @@ void WebProcessProxy::suspendedPageWasDestroyed(SuspendedPageProxy& suspendedPag > > void WebProcessProxy::markIsNoLongerInPrewarmedPool() > { >- ASSERT(m_isInPrewarmedPool); >+ ASSERT(m_isPrewarmed); > >- m_isInPrewarmedPool = false; >+ m_isPrewarmed = false; > RELEASE_ASSERT(m_processPool); > m_processPool.setIsWeak(IsWeak::No); > } >diff --git a/Source/WebKit/UIProcess/WebProcessProxy.h b/Source/WebKit/UIProcess/WebProcessProxy.h >index 6c18e8666ade10c487b6f667656be657917d30c2..7d8085b345f5eeebad2d3cbc8ace71c3063cb3e1 100644 >--- a/Source/WebKit/UIProcess/WebProcessProxy.h >+++ b/Source/WebKit/UIProcess/WebProcessProxy.h >@@ -97,12 +97,12 @@ public: > typedef HashMap<uint64_t, WebPageProxy*> WebPageProxyMap; > typedef HashMap<uint64_t, RefPtr<API::UserInitiatedAction>> UserInitiatedActionMap; > >- enum class IsInPrewarmedPool { >+ enum class IsPrewarmed { > No, > Yes > }; > >- static Ref<WebProcessProxy> create(WebProcessPool&, WebsiteDataStore&, IsInPrewarmedPool); >+ static Ref<WebProcessProxy> create(WebProcessPool&, WebsiteDataStore&, IsPrewarmed); > ~WebProcessProxy(); > > WebConnection* webConnection() const { return m_webConnection.get(); } >@@ -218,7 +218,7 @@ public: > void releaseBackgroundActivityTokenForFullscreenInput(); > #endif > >- bool isInPrewarmedPool() const { return m_isInPrewarmedPool; } >+ bool isPrewarmed() const { return m_isPrewarmed; } > void markIsNoLongerInPrewarmedPool(); > > #if PLATFORM(COCOA) >@@ -232,7 +232,7 @@ public: > > protected: > static uint64_t generatePageID(); >- WebProcessProxy(WebProcessPool&, WebsiteDataStore&, IsInPrewarmedPool); >+ WebProcessProxy(WebProcessPool&, WebsiteDataStore&, IsPrewarmed); > > // ChildProcessProxy > void getLaunchOptions(ProcessLauncher::LaunchOptions&) override; >@@ -392,7 +392,7 @@ private: > HashMap<uint64_t, CompletionHandler<void(WebCore::MessagePortChannelProvider::HasActivity)>> m_localPortActivityCompletionHandlers; > > bool m_hasCommittedAnyProvisionalLoads { false }; >- bool m_isInPrewarmedPool; >+ bool m_isPrewarmed; > > #if PLATFORM(WATCHOS) > ProcessThrottler::BackgroundActivityToken m_backgroundActivityTokenForFullscreenFormControls; >diff --git a/Tools/ChangeLog b/Tools/ChangeLog >index e0b637225f0ab1b36f2d32d826e31d570c78fe5e..6f571bc180cbe454d950a91ca3ed5b5d92685ec3 100644 >--- a/Tools/ChangeLog >+++ b/Tools/ChangeLog >@@ -1,3 +1,19 @@ >+2018-09-04 Chris Dumez <cdumez@apple.com> >+ >+ Add process pool configuration flag to turn on automatic process pre-warming >+ https://bugs.webkit.org/show_bug.cgi?id=189263 >+ <rdar://problem/44101941> >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Add API test coverage. >+ >+ * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj: >+ * TestWebKitAPI/Tests/WebKitCocoa/ProcessPreWarming.mm: Renamed from Tools/TestWebKitAPI/Tests/WebKitCocoa/InitialWarmedProcessUsed.mm. >+ (TEST): >+ * TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm: >+ * TestWebKitAPI/Tests/WebKitCocoa/SetMaximumPrewarmedProcessCount.mm: Removed. >+ > 2018-08-31 Wenson Hsieh <wenson_hsieh@apple.com> > > [iOS] Consolidate the implementations of readString, stringForType, and readURL in PlatformPasteboardIOS.mm >diff --git a/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj b/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj >index cc640c5874cc6d4a57a80878e0a450db2f5aac9e..2b3af048aa50e6cf73a15b24997cab582aa97eb9 100644 >--- a/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj >+++ b/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj >@@ -156,7 +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 */; }; >+ 41882F0321010C0D002FF288 /* ProcessPreWarming.mm in Sources */ = {isa = PBXBuildFile; fileRef = 41882F0221010A70002FF288 /* ProcessPreWarming.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 */; }; >@@ -201,7 +201,6 @@ > 518EE51920A78CE500E024F3 /* DoubleDefersLoadingPlugin.mm in Sources */ = {isa = PBXBuildFile; fileRef = 518EE51720A78CDF00E024F3 /* DoubleDefersLoadingPlugin.mm */; }; > 518EE51B20A78D0000E024F3 /* DoAfterNextPresentationUpdateAfterCrash.mm in Sources */ = {isa = PBXBuildFile; fileRef = 518EE51A20A78CFB00E024F3 /* DoAfterNextPresentationUpdateAfterCrash.mm */; }; > 518EE51D20A78D3600E024F3 /* DecidePolicyForNavigationAction.mm in Sources */ = {isa = PBXBuildFile; fileRef = 518EE51C20A78D3300E024F3 /* DecidePolicyForNavigationAction.mm */; }; >- 5198A2401EA7E59F008910B7 /* InitialWarmedProcessUsed.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5198A23F1EA7E595008910B7 /* InitialWarmedProcessUsed.mm */; }; > 51A5877D1D1B49CD004BA9AF /* IndexedDBMultiProcess-3.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 51A5877C1D1B3D8D004BA9AF /* IndexedDBMultiProcess-3.html */; }; > 51A587851D2739E3004BA9AF /* IndexedDBDatabaseProcessKill-1.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 51A587821D272EB5004BA9AF /* IndexedDBDatabaseProcessKill-1.html */; }; > 51A587861D273AA9004BA9AF /* IndexedDBDatabaseProcessKill.mm in Sources */ = {isa = PBXBuildFile; fileRef = 51A587841D272EF3004BA9AF /* IndexedDBDatabaseProcessKill.mm */; }; >@@ -1421,7 +1420,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>"; }; >+ 41882F0221010A70002FF288 /* ProcessPreWarming.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ProcessPreWarming.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>"; }; >@@ -1480,7 +1479,6 @@ > 518EE51720A78CDF00E024F3 /* DoubleDefersLoadingPlugin.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DoubleDefersLoadingPlugin.mm; sourceTree = "<group>"; }; > 518EE51A20A78CFB00E024F3 /* DoAfterNextPresentationUpdateAfterCrash.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DoAfterNextPresentationUpdateAfterCrash.mm; sourceTree = "<group>"; }; > 518EE51C20A78D3300E024F3 /* DecidePolicyForNavigationAction.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DecidePolicyForNavigationAction.mm; sourceTree = "<group>"; }; >- 5198A23F1EA7E595008910B7 /* InitialWarmedProcessUsed.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = InitialWarmedProcessUsed.mm; sourceTree = "<group>"; }; > 51A5877C1D1B3D8D004BA9AF /* IndexedDBMultiProcess-3.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "IndexedDBMultiProcess-3.html"; sourceTree = "<group>"; }; > 51A587821D272EB5004BA9AF /* IndexedDBDatabaseProcessKill-1.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = "IndexedDBDatabaseProcessKill-1.html"; sourceTree = "<group>"; }; > 51A587841D272EF3004BA9AF /* IndexedDBDatabaseProcessKill.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = IndexedDBDatabaseProcessKill.mm; sourceTree = "<group>"; }; >@@ -2337,7 +2335,6 @@ > 51BCEE491C84F4AF0042C82E /* IndexedDBMultiProcess.mm */, > 51B1EE8D1C80F5880064FB98 /* IndexedDBPersistence.mm */, > 57599E201F07191700A3FB8C /* IndexedDBStructuredCloneBackwardCompatibility.mm */, >- 5198A23F1EA7E595008910B7 /* InitialWarmedProcessUsed.mm */, > 79C5D430209D768300F1E7CA /* InjectedBundleNodeHandleIsTextField.mm */, > 2DB0232E1E4E871800707123 /* InteractionDeadlockAfterCrash.mm */, > 5C69BDD41F82A7EB000F4F4B /* JavaScriptDuringNavigation.mm */, >@@ -2374,6 +2371,7 @@ > C95501BE19AD2FAF0049BE3E /* Preferences.mm */, > CD227E43211A4D5D00D285AF /* PreferredAudioBufferSize.mm */, > 7C1AF7931E8DCBAB002645B9 /* PrepareForMoveToWindow.mm */, >+ 41882F0221010A70002FF288 /* ProcessPreWarming.mm */, > 518C1152205B04F9001FF4AE /* ProcessSwapOnNavigation.mm */, > 5798E2AF1CAF5C2800C5CBA0 /* ProvisionalURLNotChange.mm */, > A1C4FB6C1BACCE50003742D0 /* QuickLook.mm */, >@@ -2393,7 +2391,6 @@ > 5CA985512113CB8C0057EB6B /* SafeBrowsing.mm */, > CE0947362063223B003C9BA0 /* SchemeRegistry.mm */, > 51EB12931FDF050500A5A1BD /* ServiceWorkerBasic.mm */, >- 41882F0221010A70002FF288 /* SetMaximumPrewarmedProcessCount.mm */, > 5CCB10DF2134579D00AC5AF0 /* ShouldGoToBackForwardListItem.mm */, > 37BCA61B1B596BA9002012CA /* ShouldOpenExternalURLsInNewWindowActions.mm */, > 2D9A53AE1B31FA8D0074D5AA /* ShrinkToFit.mm */, >@@ -3810,7 +3807,6 @@ > 7C83E0BE1D0A651300FEBCF3 /* IndexedDBMultiProcess.mm in Sources */, > 7C83E0BF1D0A652200FEBCF3 /* IndexedDBPersistence.mm in Sources */, > 57599E211F07191900A3FB8C /* IndexedDBStructuredCloneBackwardCompatibility.mm in Sources */, >- 5198A2401EA7E59F008910B7 /* InitialWarmedProcessUsed.mm in Sources */, > 7A95BDE11E9BEC5F00865498 /* InjectedBundleAppleEvent.cpp in Sources */, > 7CCE7EFB1A411AE600447C4C /* InjectedBundleBasic.cpp in Sources */, > 83148B06202AC6A400BADE99 /* InjectedBundleDisableOverrideBuiltinsBehavior.cpp in Sources */, >@@ -3908,6 +3904,7 @@ > A1EC11881F42541200D0146E /* PreviewLoader.cpp in Sources */, > 7CCE7F0C1A411AE600447C4C /* PrivateBrowsingPushStateNoHistoryCallback.cpp in Sources */, > 4647B1261EBA3B850041D7EF /* ProcessDidTerminate.cpp in Sources */, >+ 41882F0321010C0D002FF288 /* ProcessPreWarming.mm in Sources */, > 518C1153205B0504001FF4AE /* ProcessSwapOnNavigation.mm in Sources */, > 7C83E0C11D0A652F00FEBCF3 /* ProvisionalURLNotChange.mm in Sources */, > 7CCE7EC81A411A7E00447C4C /* PublicSuffix.mm in Sources */, >@@ -3942,7 +3939,6 @@ > 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 */, >diff --git a/Tools/TestWebKitAPI/Tests/WebKitCocoa/InitialWarmedProcessUsed.mm b/Tools/TestWebKitAPI/Tests/WebKitCocoa/InitialWarmedProcessUsed.mm >deleted file mode 100644 >index a31ec4640e24c9db415c81e5e30252126bd8dfba..0000000000000000000000000000000000000000 >--- a/Tools/TestWebKitAPI/Tests/WebKitCocoa/InitialWarmedProcessUsed.mm >+++ /dev/null >@@ -1,63 +0,0 @@ >-/* >- * 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 "TestNavigationDelegate.h" >- >-#import <WebKit/WKProcessPoolPrivate.h> >-#import <wtf/RetainPtr.h> >- >-#if WK_API_ENABLED >- >-static NSString *loadableURL = @"data:text/html,no%20error%20A"; >- >-TEST(WKProcessPool, InitialWarmedProcessUsed) >-{ >- 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.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(static_cast<size_t>(1), [pool _prewarmedWebProcessCount]); >- EXPECT_EQ(static_cast<size_t>(2), [pool _webPageContentProcessCount]); >-} >- >-#endif >diff --git a/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessPreWarming.mm b/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessPreWarming.mm >new file mode 100644 >index 0000000000000000000000000000000000000000..710a7a1c8b8af628189cf00db23a2afa066e4025 >--- /dev/null >+++ b/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessPreWarming.mm >@@ -0,0 +1,108 @@ >+/* >+ * 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 "TestNavigationDelegate.h" >+#import <WebKit/WKProcessPoolPrivate.h> >+#import <WebKit/_WKProcessPoolConfiguration.h> >+#import <wtf/RetainPtr.h> >+ >+#if WK_API_ENABLED >+ >+static NSString *loadableURL = @"data:text/html,no%20error%20A"; >+ >+TEST(WKProcessPool, WarmInitialProcess) >+{ >+ auto pool = adoptNS([[WKProcessPool alloc] init]); >+ >+ EXPECT_FALSE([pool _hasPrewarmedWebProcess]); >+ >+ [pool _warmInitialProcess]; >+ >+ EXPECT_TRUE([pool _hasPrewarmedWebProcess]); >+ >+ [pool _warmInitialProcess]; // No-op. >+ >+ EXPECT_TRUE([pool _hasPrewarmedWebProcess]); >+} >+ >+TEST(WKProcessPool, InitialWarmedProcessUsed) >+{ >+ auto pool = adoptNS([[WKProcessPool alloc] init]); >+ [pool _warmInitialProcess]; >+ >+ EXPECT_TRUE([pool _hasPrewarmedWebProcess]); >+ EXPECT_EQ(1U, [pool _webPageContentProcessCount]); >+ >+ auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]); >+ 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_FALSE([pool _hasPrewarmedWebProcess]); >+ EXPECT_EQ(1U, [pool _webPageContentProcessCount]); >+ >+ [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:loadableURL]]]; >+ [webView _test_waitForDidFinishNavigation]; >+ >+ EXPECT_FALSE([pool _hasPrewarmedWebProcess]); >+ EXPECT_EQ(1U, [pool _webPageContentProcessCount]); >+} >+ >+TEST(WKProcessPool, AutomaticProcessWarming) >+{ >+ auto processPoolConfiguration = adoptNS([[_WKProcessPoolConfiguration alloc] init]); >+ processPoolConfiguration.get().prewarmsProcessesAutomatically = YES; >+ auto pool = adoptNS([[WKProcessPool alloc] _initWithConfiguration:processPoolConfiguration.get()]); >+ >+ EXPECT_FALSE([pool _hasPrewarmedWebProcess]); >+ >+ auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]); >+ configuration.get().processPool = pool.get(); >+ configuration.get().websiteDataStore = [WKWebsiteDataStore nonPersistentDataStore]; >+ >+ auto webView1 = adoptNS([[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 800, 600) configuration:configuration.get()]); >+ EXPECT_FALSE([pool _hasPrewarmedWebProcess]); >+ EXPECT_EQ(1U, [pool _webPageContentProcessCount]); >+ >+ [webView1 loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:loadableURL]]]; >+ [webView1 _test_waitForDidFinishNavigation]; >+ >+ while (![pool _hasPrewarmedWebProcess]) >+ TestWebKitAPI::Util::sleep(0.01); >+ >+ EXPECT_TRUE([pool _hasPrewarmedWebProcess]); >+ EXPECT_EQ(2U, [pool _webPageContentProcessCount]); >+ >+ auto webView2 = adoptNS([[WKWebView alloc] initWithFrame:CGRectMake(0, 0, 800, 600) configuration:configuration.get()]); >+ EXPECT_FALSE([pool _hasPrewarmedWebProcess]); >+ EXPECT_EQ(2U, [pool _webPageContentProcessCount]); >+} >+ >+#endif >diff --git a/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm b/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm >index f87d6ce08c8bb1139f4962434ce24f0ddd9c4492..5c47f6f927698b9c046159d308e0562a633450f3 100644 >--- a/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm >+++ b/Tools/TestWebKitAPI/Tests/WebKitCocoa/ProcessSwapOnNavigation.mm >@@ -278,7 +278,7 @@ TEST(ProcessSwap, Basic) > { > auto processPoolConfiguration = adoptNS([[_WKProcessPoolConfiguration alloc] init]); > processPoolConfiguration.get().processSwapsOnNavigation = YES; >- processPoolConfiguration.get().maximumPrewarmedProcessCount = 1; >+ processPoolConfiguration.get().prewarmsProcessesAutomatically = YES; > auto processPool = adoptNS([[WKProcessPool alloc] _initWithConfiguration:processPoolConfiguration.get()]); > > auto webViewConfiguration = adoptNS([[WKWebViewConfiguration alloc] init]); >@@ -325,7 +325,7 @@ TEST(ProcessSwap, NoSwappingForeTLDPlus2) > { > auto processPoolConfiguration = adoptNS([[_WKProcessPoolConfiguration alloc] init]); > processPoolConfiguration.get().processSwapsOnNavigation = YES; >- processPoolConfiguration.get().maximumPrewarmedProcessCount = 1; >+ processPoolConfiguration.get().prewarmsProcessesAutomatically = YES; > auto processPool = adoptNS([[WKProcessPool alloc] _initWithConfiguration:processPoolConfiguration.get()]); > > auto webViewConfiguration = adoptNS([[WKWebViewConfiguration alloc] init]); >@@ -925,7 +925,7 @@ TEST(ProcessSwap, NumberOfPrewarmedProcesses) > { > auto processPoolConfiguration = adoptNS([[_WKProcessPoolConfiguration alloc] init]); > [processPoolConfiguration setProcessSwapsOnNavigation:YES]; >- [processPoolConfiguration setMaximumPrewarmedProcessCount:1]; >+ [processPoolConfiguration setPrewarmsProcessesAutomatically:YES]; > auto processPool = adoptNS([[WKProcessPool alloc] _initWithConfiguration:processPoolConfiguration.get()]); > > auto webViewConfiguration = adoptNS([[WKWebViewConfiguration alloc] init]); >@@ -944,7 +944,7 @@ TEST(ProcessSwap, NumberOfPrewarmedProcesses) > > EXPECT_EQ(2u, [processPool _webProcessCount]); > EXPECT_EQ(1u, [processPool _webProcessCountIgnoringPrewarmed]); >- EXPECT_EQ(1u, [processPool _prewarmedWebProcessCount]); >+ EXPECT_TRUE([processPool _hasPrewarmedWebProcess]); > > request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"pson://www.google.com/main.html"]]; > [webView loadRequest:request]; >@@ -953,7 +953,7 @@ TEST(ProcessSwap, NumberOfPrewarmedProcesses) > > EXPECT_EQ(3u, [processPool _webProcessCount]); > EXPECT_EQ(2u, [processPool _webProcessCountIgnoringPrewarmed]); >- EXPECT_EQ(1u, [processPool _prewarmedWebProcessCount]); >+ EXPECT_TRUE([processPool _hasPrewarmedWebProcess]); > } > > static const char* visibilityBytes = R"PSONRESOURCE( >diff --git a/Tools/TestWebKitAPI/Tests/WebKitCocoa/SetMaximumPrewarmedProcessCount.mm b/Tools/TestWebKitAPI/Tests/WebKitCocoa/SetMaximumPrewarmedProcessCount.mm >deleted file mode 100644 >index abc54f87f35f980fe6c7277fa5b21623c2f8b1cc..0000000000000000000000000000000000000000 >--- a/Tools/TestWebKitAPI/Tests/WebKitCocoa/SetMaximumPrewarmedProcessCount.mm >+++ /dev/null >@@ -1,60 +0,0 @@ >-/* >- * 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
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 189263
: 348835