Skip to content

Commit 4259815

Browse files
committed
Deprecate API to limit the maximum number of WebProcesses
https://bugs.webkit.org/show_bug.cgi?id=193725 <rdar://problem/47464879> Reviewed by Geoff Garen. Source/WebKit: Deprecate API to limit the maximum number of WebProcesses and make it a no-op. It adds complexity and is not safe (conflicts with PSON). Add a new usesSingleWebProcess SPI to _WKProcessPoolConfiguration to be used by Minibrowser / Safari in order to disable process per tab (can be useful for debugging). Note that enabling the single WebProcess mode will disable PSON and process prewarming. * UIProcess/API/APIProcessPoolConfiguration.cpp: (API::ProcessPoolConfiguration::createWithLegacyOptions): (API::ProcessPoolConfiguration::copy): * UIProcess/API/APIProcessPoolConfiguration.h: * UIProcess/API/C/WKContext.cpp: (WKContextSetMaximumNumberOfProcesses): (WKContextGetMaximumNumberOfProcesses): * UIProcess/API/C/WKContext.h: * UIProcess/API/Cocoa/WKProcessPool.mm: * UIProcess/API/Cocoa/WKProcessPoolPrivate.h: * UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h: * UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm: (-[_WKProcessPoolConfiguration maximumProcessCount]): (-[_WKProcessPoolConfiguration setMaximumProcessCount:]): (-[_WKProcessPoolConfiguration usesSingleWebProcess]): (-[_WKProcessPoolConfiguration setUsesSingleWebProcess:]): (-[_WKProcessPoolConfiguration description]): * UIProcess/API/glib/WebKitWebContext.cpp: (webkitWebContextConstructed): (webkit_web_context_set_process_model): (webkit_web_context_set_web_process_count_limit): * UIProcess/WebProcessPool.cpp: (WebKit::WebProcessPool::createNewWebProcessRespectingProcessCountLimit): (WebKit::WebProcessPool::didReachGoodTimeToPrewarm): (WebKit::WebProcessPool::processForNavigationInternal): * UIProcess/WebProcessPool.h: Tools: Update existing API tests to stop using deprecated API. * MiniBrowser/mac/AppDelegate.m: (defaultConfiguration): * TestWebKitAPI/Tests/WebKit/UserMedia.cpp: (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WebKitCocoa/ResponsivenessTimer.mm: (TestWebKitAPI::TEST): * TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm: * TestWebKitAPI/Tests/WebKitCocoa/UserContentController.mm: (TEST): * TestWebKitAPI/Tests/WebKitCocoa/WKProcessPoolConfiguration.mm: (TEST): Canonical link: https://commits.webkit.org/208261@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@240363 268f45cc-cd09-0410-ab3c-d52691b4dbfc
1 parent 1f5b63d commit 4259815

19 files changed

Lines changed: 118 additions & 63 deletions

‎Source/WebKit/ChangeLog‎

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,45 @@
1+
2019-01-23 Chris Dumez <cdumez@apple.com>
2+
3+
Deprecate API to limit the maximum number of WebProcesses
4+
https://bugs.webkit.org/show_bug.cgi?id=193725
5+
<rdar://problem/47464879>
6+
7+
Reviewed by Geoff Garen.
8+
9+
Deprecate API to limit the maximum number of WebProcesses and make it a no-op. It adds
10+
complexity and is not safe (conflicts with PSON).
11+
12+
Add a new usesSingleWebProcess SPI to _WKProcessPoolConfiguration to be used by
13+
Minibrowser / Safari in order to disable process per tab (can be useful for debugging).
14+
Note that enabling the single WebProcess mode will disable PSON and process prewarming.
15+
16+
* UIProcess/API/APIProcessPoolConfiguration.cpp:
17+
(API::ProcessPoolConfiguration::createWithLegacyOptions):
18+
(API::ProcessPoolConfiguration::copy):
19+
* UIProcess/API/APIProcessPoolConfiguration.h:
20+
* UIProcess/API/C/WKContext.cpp:
21+
(WKContextSetMaximumNumberOfProcesses):
22+
(WKContextGetMaximumNumberOfProcesses):
23+
* UIProcess/API/C/WKContext.h:
24+
* UIProcess/API/Cocoa/WKProcessPool.mm:
25+
* UIProcess/API/Cocoa/WKProcessPoolPrivate.h:
26+
* UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h:
27+
* UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm:
28+
(-[_WKProcessPoolConfiguration maximumProcessCount]):
29+
(-[_WKProcessPoolConfiguration setMaximumProcessCount:]):
30+
(-[_WKProcessPoolConfiguration usesSingleWebProcess]):
31+
(-[_WKProcessPoolConfiguration setUsesSingleWebProcess:]):
32+
(-[_WKProcessPoolConfiguration description]):
33+
* UIProcess/API/glib/WebKitWebContext.cpp:
34+
(webkitWebContextConstructed):
35+
(webkit_web_context_set_process_model):
36+
(webkit_web_context_set_web_process_count_limit):
37+
* UIProcess/WebProcessPool.cpp:
38+
(WebKit::WebProcessPool::createNewWebProcessRespectingProcessCountLimit):
39+
(WebKit::WebProcessPool::didReachGoodTimeToPrewarm):
40+
(WebKit::WebProcessPool::processForNavigationInternal):
41+
* UIProcess/WebProcessPool.h:
42+
143
2019-01-23 Brent Fulgham <bfulgham@apple.com>
244

345
Switch NetworkStorageSession portions of ResourceLoadStatistics to Async message passing style

‎Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ Ref<ProcessPoolConfiguration> ProcessPoolConfiguration::createWithLegacyOptions(
4141
auto configuration = ProcessPoolConfiguration::createWithWebsiteDataStoreConfiguration(WebsiteDataStore::legacyDefaultDataStoreConfiguration());
4242

4343
configuration->m_shouldHaveLegacyDataStore = true;
44-
configuration->m_maximumProcessCount = 1;
4544
configuration->m_cacheModel = WebKit::CacheModel::DocumentViewer;
4645

4746
return configuration;
@@ -90,7 +89,6 @@ Ref<ProcessPoolConfiguration> ProcessPoolConfiguration::copy()
9089
auto copy = this->create();
9190

9291
copy->m_shouldHaveLegacyDataStore = this->m_shouldHaveLegacyDataStore;
93-
copy->m_maximumProcessCount = this->m_maximumProcessCount;
9492
copy->m_cacheModel = this->m_cacheModel;
9593
copy->m_diskCacheDirectory = this->m_diskCacheDirectory;
9694
copy->m_diskCacheSpeculativeValidationEnabled = this->m_diskCacheSpeculativeValidationEnabled;
@@ -133,6 +131,7 @@ Ref<ProcessPoolConfiguration> ProcessPoolConfiguration::copy()
133131
copy->m_suppressesConnectionTerminationOnSystemChange = this->m_suppressesConnectionTerminationOnSystemChange;
134132
#endif
135133
copy->m_customWebContentServiceBundleIdentifier = this->m_customWebContentServiceBundleIdentifier;
134+
copy->m_usesSingleWebProcess = m_usesSingleWebProcess;
136135

137136
return copy;
138137
}

‎Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ class ProcessPoolConfiguration final : public ObjectImpl<Object::Type::ProcessPo
5656
bool shouldHaveLegacyDataStore() const { return m_shouldHaveLegacyDataStore; }
5757
void setShouldHaveLegacyDataStore(bool shouldHaveLegacyDataStore) { m_shouldHaveLegacyDataStore = shouldHaveLegacyDataStore; }
5858

59-
unsigned maximumProcessCount() const { return m_maximumProcessCount; }
60-
void setMaximumProcessCount(unsigned maximumProcessCount) { m_maximumProcessCount = maximumProcessCount; }
59+
bool usesSingleWebProcess() const { return m_usesSingleWebProcess; }
60+
void setUsesSingleWebProcess(bool enabled) { m_usesSingleWebProcess = enabled; }
6161

6262
bool isAutomaticProcessWarmingEnabled() const
6363
{
@@ -187,7 +187,6 @@ class ProcessPoolConfiguration final : public ObjectImpl<Object::Type::ProcessPo
187187
private:
188188
bool m_shouldHaveLegacyDataStore { false };
189189

190-
unsigned m_maximumProcessCount { 0 };
191190
bool m_diskCacheSpeculativeValidationEnabled { false };
192191
WebKit::CacheModel m_cacheModel { WebKit::CacheModel::PrimaryWebBrowser };
193192

@@ -224,6 +223,7 @@ class ProcessPoolConfiguration final : public ObjectImpl<Object::Type::ProcessPo
224223
bool m_clientWouldBenefitFromAutomaticProcessPrewarming { false };
225224
WTF::String m_customWebContentServiceBundleIdentifier;
226225
bool m_isJITEnabled { true };
226+
bool m_usesSingleWebProcess { false };
227227

228228
#if PLATFORM(IOS_FAMILY)
229229
WTF::String m_ctDataConnectionServiceType;

‎Source/WebKit/UIProcess/API/C/WKContext.cpp‎

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -326,14 +326,15 @@ WKCacheModel WKContextGetCacheModel(WKContextRef contextRef)
326326
return WebKit::toAPI(WebKit::toImpl(contextRef)->cacheModel());
327327
}
328328

329-
void WKContextSetMaximumNumberOfProcesses(WKContextRef contextRef, unsigned numberOfProcesses)
329+
void WKContextSetMaximumNumberOfProcesses(WKContextRef, unsigned)
330330
{
331-
WebKit::toImpl(contextRef)->setMaximumNumberOfProcesses(numberOfProcesses);
331+
// Deprecated.
332332
}
333333

334-
unsigned WKContextGetMaximumNumberOfProcesses(WKContextRef contextRef)
334+
unsigned WKContextGetMaximumNumberOfProcesses(WKContextRef)
335335
{
336-
return WebKit::toImpl(contextRef)->maximumNumberOfProcesses();
336+
// Deprecated.
337+
return std::numeric_limits<unsigned>::max();
337338
}
338339

339340
void WKContextSetAlwaysUsesComplexTextCodePath(WKContextRef contextRef, bool alwaysUseComplexTextCodePath)
@@ -405,6 +406,16 @@ void WKContextSetPrewarmsProcessesAutomatically(WKContextRef contextRef, bool va
405406
WebKit::toImpl(contextRef)->configuration().setIsAutomaticProcessWarmingEnabled(value);
406407
}
407408

409+
void WKContextSetUsesSingleWebProcess(WKContextRef contextRef, bool value)
410+
{
411+
WebKit::toImpl(contextRef)->configuration().setUsesSingleWebProcess(value);
412+
}
413+
414+
bool WKContextGetUsesSingleWebProcess(WKContextRef contextRef)
415+
{
416+
return WebKit::toImpl(contextRef)->configuration().usesSingleWebProcess();
417+
}
418+
408419
void WKContextSetCustomWebContentServiceBundleIdentifier(WKContextRef contextRef, WKStringRef name)
409420
{
410421
WebKit::toImpl(contextRef)->setCustomWebContentServiceBundleIdentifier(WebKit::toImpl(name)->string());

‎Source/WebKit/UIProcess/API/C/WKContext.h‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,11 @@ WK_EXPORT WKCacheModel WKContextGetCacheModel(WKContextRef context);
131131
// FIXME: Move these to WKDeprecatedFunctions.cpp once support for Mavericks has been dropped.
132132
WK_EXPORT void WKContextSetProcessModel(WKContextRef, WKProcessModel);
133133

134-
WK_EXPORT void WKContextSetMaximumNumberOfProcesses(WKContextRef context, unsigned numberOfProcesses);
135-
WK_EXPORT unsigned WKContextGetMaximumNumberOfProcesses(WKContextRef context);
134+
WK_EXPORT void WKContextSetMaximumNumberOfProcesses(WKContextRef context, unsigned numberOfProcesses) WK_C_API_DEPRECATED;
135+
WK_EXPORT unsigned WKContextGetMaximumNumberOfProcesses(WKContextRef context) WK_C_API_DEPRECATED;
136+
137+
WK_EXPORT void WKContextSetUsesSingleWebProcess(WKContextRef, bool);
138+
WK_EXPORT bool WKContextGetUsesSingleWebProcess(WKContextRef);
136139

137140
WK_EXPORT void WKContextStartMemorySampler(WKContextRef context, WKDoubleRef interval);
138141
WK_EXPORT void WKContextStopMemorySampler(WKContextRef context);

‎Source/WebKit/UIProcess/API/Cocoa/WKProcessPool.mm‎

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -199,11 +199,6 @@ - (void)_registerURLSchemeAsCanDisplayOnlyIfCanRequest:(NSString *)scheme
199199
_processPool->registerURLSchemeAsCanDisplayOnlyIfCanRequest(scheme);
200200
}
201201

202-
- (void)_setMaximumNumberOfProcesses:(NSUInteger)value
203-
{
204-
_processPool->setMaximumNumberOfProcesses(value);
205-
}
206-
207202
- (void)_setCanHandleHTTPSServerTrustEvaluation:(BOOL)value
208203
{
209204
_processPool->setCanHandleHTTPSServerTrustEvaluation(value);

‎Source/WebKit/UIProcess/API/Cocoa/WKProcessPoolPrivate.h‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,6 @@
114114
// Test only.
115115
- (void)_setAllowsAnySSLCertificateForServiceWorker:(BOOL)allows WK_API_AVAILABLE(macosx(10.13.4), ios(11.3));
116116
- (void)_registerURLSchemeServiceWorkersCanHandle:(NSString *)scheme WK_API_AVAILABLE(macosx(10.13.4), ios(11.3));
117-
- (void)_setMaximumNumberOfProcesses:(NSUInteger)value WK_API_AVAILABLE(macosx(10.13.4), ios(11.3));
118117
- (void)_getActivePagesOriginsInWebProcessForTesting:(pid_t)pid completionHandler:(void(^)(NSArray<NSString *> *))completionHandler WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
119118
- (BOOL)_networkProcessHasEntitlementForTesting:(NSString *)entitlement WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
120119

‎Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,8 @@ WK_CLASS_AVAILABLE(macosx(10.10), ios(8.0))
3434
@interface _WKProcessPoolConfiguration : NSObject <NSCopying>
3535

3636
@property (nonatomic, copy) NSURL *injectedBundleURL;
37-
@property (nonatomic) NSUInteger maximumProcessCount;
37+
@property (nonatomic) NSUInteger maximumProcessCount WK_API_DEPRECATED("It is no longer possible to limit the number of processes", macosx(WK_MAC_TBA, WK_MAC_TBA), ios(WK_IOS_TBA, WK_IOS_TBA));
38+
@property (nonatomic) BOOL usesSingleWebProcess WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
3839
@property (nonatomic, nullable, copy) NSString *customWebContentServiceBundleIdentifier WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
3940

4041
@property (nonatomic) BOOL ignoreSynchronousMessagingTimeoutsForTesting WK_API_AVAILABLE(macosx(10.12), ios(10.0));

‎Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm‎

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,13 @@ - (void)setInjectedBundleURL:(NSURL *)injectedBundleURL
6464

6565
- (NSUInteger)maximumProcessCount
6666
{
67-
return _processPoolConfiguration->maximumProcessCount();
67+
// Deprecated.
68+
return NSUIntegerMax;
6869
}
6970

7071
- (void)setMaximumProcessCount:(NSUInteger)maximumProcessCount
7172
{
72-
_processPoolConfiguration->setMaximumProcessCount(maximumProcessCount);
73+
// Deprecated.
7374
}
7475

7576
- (NSInteger)diskCacheSizeOverride
@@ -290,6 +291,16 @@ - (void)setPageCacheEnabled:(BOOL)enabled
290291
_processPoolConfiguration->setCacheModel(WebKit::CacheModel::PrimaryWebBrowser);
291292
}
292293

294+
- (BOOL)usesSingleWebProcess
295+
{
296+
return _processPoolConfiguration->usesSingleWebProcess();
297+
}
298+
299+
- (void)setUsesSingleWebProcess:(BOOL)enabled
300+
{
301+
_processPoolConfiguration->setUsesSingleWebProcess(enabled);
302+
}
303+
293304
- (BOOL)suppressesConnectionTerminationOnSystemChange
294305
{
295306
return _processPoolConfiguration->suppressesConnectionTerminationOnSystemChange();
@@ -344,7 +355,7 @@ - (void)setShouldTakeUIBackgroundAssertion:(BOOL)shouldTakeUIBackgroundAssertion
344355

345356
- (NSString *)description
346357
{
347-
NSString *description = [NSString stringWithFormat:@"<%@: %p; maximumProcessCount = %lu", NSStringFromClass(self.class), self, static_cast<unsigned long>([self maximumProcessCount])];
358+
NSString *description = [NSString stringWithFormat:@"<%@: %p", NSStringFromClass(self.class), self];
348359

349360
if (!_processPoolConfiguration->injectedBundlePath().isEmpty())
350361
return [description stringByAppendingFormat:@"; injectedBundleURL: \"%@\">", [self injectedBundleURL]];

‎Source/WebKit/UIProcess/API/glib/WebKitWebContext.cpp‎

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,6 @@ static void webkitWebContextConstructed(GObject* object)
334334

335335
API::ProcessPoolConfiguration configuration;
336336
configuration.setInjectedBundlePath(WebCore::FileSystem::stringFromFileSystemRepresentation(bundleFilename.get()));
337-
configuration.setMaximumProcessCount(1);
338337
configuration.setDiskCacheSpeculativeValidationEnabled(true);
339338

340339
WebKitWebContext* webContext = WEBKIT_WEB_CONTEXT(object);
@@ -1495,14 +1494,6 @@ void webkit_web_context_set_process_model(WebKitWebContext* context, WebKitProce
14951494
return;
14961495

14971496
context->priv->processModel = processModel;
1498-
switch (context->priv->processModel) {
1499-
case WEBKIT_PROCESS_MODEL_SHARED_SECONDARY_PROCESS:
1500-
context->priv->processPool->setMaximumNumberOfProcesses(1);
1501-
break;
1502-
case WEBKIT_PROCESS_MODEL_MULTIPLE_SECONDARY_PROCESSES:
1503-
context->priv->processPool->setMaximumNumberOfProcesses(context->priv->processCountLimit);
1504-
break;
1505-
}
15061497
}
15071498

15081499
/**
@@ -1545,8 +1536,6 @@ void webkit_web_context_set_web_process_count_limit(WebKitWebContext* context, g
15451536
return;
15461537

15471538
context->priv->processCountLimit = limit;
1548-
if (context->priv->processModel != WEBKIT_PROCESS_MODEL_SHARED_SECONDARY_PROCESS)
1549-
context->priv->processPool->setMaximumNumberOfProcesses(limit);
15501539
}
15511540

15521541
/**

0 commit comments

Comments
 (0)