Changeset 240363 in webkit
- Timestamp:
- Jan 23, 2019 3:34:22 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 19 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r240360 r240363 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 1 43 2019-01-23 Brent Fulgham <bfulgham@apple.com> 2 44 -
trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.cpp
r239671 r240363 42 42 43 43 configuration->m_shouldHaveLegacyDataStore = true; 44 configuration->m_maximumProcessCount = 1;45 44 configuration->m_cacheModel = WebKit::CacheModel::DocumentViewer; 46 45 … … 91 90 92 91 copy->m_shouldHaveLegacyDataStore = this->m_shouldHaveLegacyDataStore; 93 copy->m_maximumProcessCount = this->m_maximumProcessCount;94 92 copy->m_cacheModel = this->m_cacheModel; 95 93 copy->m_diskCacheDirectory = this->m_diskCacheDirectory; … … 134 132 #endif 135 133 copy->m_customWebContentServiceBundleIdentifier = this->m_customWebContentServiceBundleIdentifier; 134 copy->m_usesSingleWebProcess = m_usesSingleWebProcess; 136 135 137 136 return copy; -
trunk/Source/WebKit/UIProcess/API/APIProcessPoolConfiguration.h
r239671 r240363 57 57 void setShouldHaveLegacyDataStore(bool shouldHaveLegacyDataStore) { m_shouldHaveLegacyDataStore = shouldHaveLegacyDataStore; } 58 58 59 unsigned maximumProcessCount() const { return m_maximumProcessCount; }60 void set MaximumProcessCount(unsigned maximumProcessCount) { m_maximumProcessCount = maximumProcessCount; }59 bool usesSingleWebProcess() const { return m_usesSingleWebProcess; } 60 void setUsesSingleWebProcess(bool enabled) { m_usesSingleWebProcess = enabled; } 61 61 62 62 bool isAutomaticProcessWarmingEnabled() const … … 188 188 bool m_shouldHaveLegacyDataStore { false }; 189 189 190 unsigned m_maximumProcessCount { 0 };191 190 bool m_diskCacheSpeculativeValidationEnabled { false }; 192 191 WebKit::CacheModel m_cacheModel { WebKit::CacheModel::PrimaryWebBrowser }; … … 225 224 WTF::String m_customWebContentServiceBundleIdentifier; 226 225 bool m_isJITEnabled { true }; 226 bool m_usesSingleWebProcess { false }; 227 227 228 228 #if PLATFORM(IOS_FAMILY) -
trunk/Source/WebKit/UIProcess/API/C/WKContext.cpp
r239631 r240363 327 327 } 328 328 329 void WKContextSetMaximumNumberOfProcesses(WKContextRef contextRef, unsigned numberOfProcesses) 330 { 331 WebKit::toImpl(contextRef)->setMaximumNumberOfProcesses(numberOfProcesses); 332 } 333 334 unsigned WKContextGetMaximumNumberOfProcesses(WKContextRef contextRef) 335 { 336 return WebKit::toImpl(contextRef)->maximumNumberOfProcesses(); 329 void WKContextSetMaximumNumberOfProcesses(WKContextRef, unsigned) 330 { 331 // Deprecated. 332 } 333 334 unsigned WKContextGetMaximumNumberOfProcesses(WKContextRef) 335 { 336 // Deprecated. 337 return std::numeric_limits<unsigned>::max(); 337 338 } 338 339 … … 406 407 } 407 408 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 408 419 void WKContextSetCustomWebContentServiceBundleIdentifier(WKContextRef contextRef, WKStringRef name) 409 420 { -
trunk/Source/WebKit/UIProcess/API/C/WKContext.h
r239631 r240363 132 132 WK_EXPORT void WKContextSetProcessModel(WKContextRef, WKProcessModel); 133 133 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); 136 139 137 140 WK_EXPORT void WKContextStartMemorySampler(WKContextRef context, WKDoubleRef interval); -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPool.mm
r238937 r240363 198 198 { 199 199 _processPool->registerURLSchemeAsCanDisplayOnlyIfCanRequest(scheme); 200 }201 202 - (void)_setMaximumNumberOfProcesses:(NSUInteger)value203 {204 _processPool->setMaximumNumberOfProcesses(value);205 200 } 206 201 -
trunk/Source/WebKit/UIProcess/API/Cocoa/WKProcessPoolPrivate.h
r238937 r240363 115 115 - (void)_setAllowsAnySSLCertificateForServiceWorker:(BOOL)allows WK_API_AVAILABLE(macosx(10.13.4), ios(11.3)); 116 116 - (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));118 117 - (void)_getActivePagesOriginsInWebProcessForTesting:(pid_t)pid completionHandler:(void(^)(NSArray<NSString *> *))completionHandler WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA)); 119 118 - (BOOL)_networkProcessHasEntitlementForTesting:(NSString *)entitlement WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA)); -
trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.h
r238820 r240363 35 35 36 36 @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)); 38 39 @property (nonatomic, nullable, copy) NSString *customWebContentServiceBundleIdentifier WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA)); 39 40 -
trunk/Source/WebKit/UIProcess/API/Cocoa/_WKProcessPoolConfiguration.mm
r239671 r240363 65 65 - (NSUInteger)maximumProcessCount 66 66 { 67 return _processPoolConfiguration->maximumProcessCount(); 67 // Deprecated. 68 return NSUIntegerMax; 68 69 } 69 70 70 71 - (void)setMaximumProcessCount:(NSUInteger)maximumProcessCount 71 72 { 72 _processPoolConfiguration->setMaximumProcessCount(maximumProcessCount);73 // Deprecated. 73 74 } 74 75 … … 291 292 } 292 293 294 - (BOOL)usesSingleWebProcess 295 { 296 return _processPoolConfiguration->usesSingleWebProcess(); 297 } 298 299 - (void)setUsesSingleWebProcess:(BOOL)enabled 300 { 301 _processPoolConfiguration->setUsesSingleWebProcess(enabled); 302 } 303 293 304 - (BOOL)suppressesConnectionTerminationOnSystemChange 294 305 { … … 345 356 - (NSString *)description 346 357 { 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]; 348 359 349 360 if (!_processPoolConfiguration->injectedBundlePath().isEmpty()) -
trunk/Source/WebKit/UIProcess/API/glib/WebKitWebContext.cpp
r239671 r240363 335 335 API::ProcessPoolConfiguration configuration; 336 336 configuration.setInjectedBundlePath(WebCore::FileSystem::stringFromFileSystemRepresentation(bundleFilename.get())); 337 configuration.setMaximumProcessCount(1);338 337 configuration.setDiskCacheSpeculativeValidationEnabled(true); 339 338 … … 1496 1495 1497 1496 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 }1506 1497 } 1507 1498 … … 1546 1537 1547 1538 context->priv->processCountLimit = limit; 1548 if (context->priv->processModel != WEBKIT_PROCESS_MODEL_SHARED_SECONDARY_PROCESS)1549 context->priv->processPool->setMaximumNumberOfProcesses(limit);1550 1539 } 1551 1540 -
trunk/Source/WebKit/UIProcess/WebProcessPool.cpp
r240360 r240363 405 405 } 406 406 407 void WebProcessPool::setMaximumNumberOfProcesses(unsigned maximumNumberOfProcesses)408 {409 m_configuration->setMaximumProcessCount(maximumNumberOfProcesses);410 }411 412 407 void WebProcessPool::setCustomWebContentServiceBundleIdentifier(const String& customWebContentServiceBundleIdentifier) 413 408 { … … 1087 1082 WebProcessProxy& WebProcessPool::createNewWebProcessRespectingProcessCountLimit(WebsiteDataStore& websiteDataStore) 1088 1083 { 1089 // FIXME: https://bugs.webkit.org/show_bug.cgi?id=1686761090 // Once WebsiteDataStores are truly per-view instead of per-process, remove this nonsense.1084 if (!usesSingleWebProcess()) 1085 return createNewWebProcess(websiteDataStore); 1091 1086 1092 1087 #if PLATFORM(COCOA) … … 1096 1091 #endif 1097 1092 1098 if (m_processes.size() < maximumNumberOfProcesses())1099 return createNewWebProcess(websiteDataStore);1100 1101 WebProcessProxy* processToReuse = nullptr;1102 1093 for (auto& process : m_processes) { 1103 1094 if (mustMatchDataStore && &process->websiteDataStore() != &websiteDataStore) … … 1107 1098 continue; 1108 1099 #endif 1109 // Choose the process with fewest pages. 1110 if (!processToReuse || processToReuse->pageCount() > process->pageCount()) 1111 processToReuse = process.get(); 1112 } 1113 return processToReuse ? *processToReuse : createNewWebProcess(websiteDataStore); 1100 return *process; 1101 } 1102 return createNewWebProcess(websiteDataStore); 1114 1103 } 1115 1104 … … 1297 1286 void WebProcessPool::didReachGoodTimeToPrewarm() 1298 1287 { 1299 if (!configuration().isAutomaticProcessWarmingEnabled() || !configuration().processSwapsOnNavigation() )1288 if (!configuration().isAutomaticProcessWarmingEnabled() || !configuration().processSwapsOnNavigation() || usesSingleWebProcess()) 1300 1289 return; 1301 1290 … … 2158 2147 }; 2159 2148 2149 if (usesSingleWebProcess()) 2150 return completionHandler(page.process(), nullptr, "Single WebProcess mode is enabled"_s); 2151 2160 2152 if (processSwapRequestedByClient == ProcessSwapRequestedByClient::Yes) 2161 2153 return completionHandler(createNewProcess(), nullptr, "Process swap was requested by the client"_s); -
trunk/Source/WebKit/UIProcess/WebProcessPool.h
r240343 r240363 154 154 void setLegacyCustomProtocolManagerClient(std::unique_ptr<API::CustomProtocolManagerClient>&&); 155 155 156 void setMaximumNumberOfProcesses(unsigned); // Can only be called when there are no processes running.157 unsigned maximumNumberOfProcesses() const { return !m_configuration->maximumProcessCount() ? UINT_MAX : m_configuration->maximumProcessCount(); }158 159 156 void setCustomWebContentServiceBundleIdentifier(const String&); 160 157 const String& customWebContentServiceBundleIdentifier() { return m_configuration->customWebContentServiceBundleIdentifier(); } … … 517 514 void languageChanged(); 518 515 516 bool usesSingleWebProcess() const { return m_configuration->usesSingleWebProcess(); } 517 519 518 #if PLATFORM(IOS_FAMILY) 520 519 String cookieStorageDirectory() const; -
trunk/Tools/ChangeLog
r240361 r240363 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 Update existing API tests to stop using deprecated API. 10 11 * MiniBrowser/mac/AppDelegate.m: 12 (defaultConfiguration): 13 * TestWebKitAPI/Tests/WebKit/UserMedia.cpp: 14 (TestWebKitAPI::TEST): 15 * TestWebKitAPI/Tests/WebKitCocoa/ResponsivenessTimer.mm: 16 (TestWebKitAPI::TEST): 17 * TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm: 18 * TestWebKitAPI/Tests/WebKitCocoa/UserContentController.mm: 19 (TEST): 20 * TestWebKitAPI/Tests/WebKitCocoa/WKProcessPoolConfiguration.mm: 21 (TEST): 22 1 23 2019-01-23 Aakash Jain <aakash_jain@apple.com> 2 24 -
trunk/Tools/MiniBrowser/mac/AppDelegate.m
r239855 r240363 101 101 processConfiguration.diskCacheSpeculativeValidationEnabled = ![SettingsController shared].networkCacheSpeculativeRevalidationDisabled; 102 102 if ([SettingsController shared].perWindowWebProcessesDisabled) 103 processConfiguration. maximumProcessCount = 1;103 processConfiguration.usesSingleWebProcess = YES; 104 104 if ([SettingsController shared].processSwapOnWindowOpenWithOpenerEnabled) 105 105 processConfiguration.processSwapsOnWindowOpenWithOpener = true; -
trunk/Tools/TestWebKitAPI/Tests/WebKit/UserMedia.cpp
r239643 r240363 107 107 { 108 108 auto context = adoptWK(WKContextCreateWithConfiguration(nullptr)); 109 WKContextSetMaximumNumberOfProcesses(context.get(), 1);110 109 111 110 WKRetainPtr<WKPageGroupRef> pageGroup(AdoptWK, WKPageGroupCreateWithIdentifier(Util::toWK("GetUserMedia").get())); … … 132 131 133 132 // Load a second page in same process. 134 PlatformWebView webView2( context.get(), pageGroup.get());133 PlatformWebView webView2(webView.page()); 135 134 WKPageSetPageUIClient(webView2.page(), &uiClient.base); 136 135 WKPageNavigationClientV0 navigationClient; -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ResponsivenessTimer.mm
r235391 r240363 61 61 auto processPoolConfiguration = adoptNS([_WKProcessPoolConfiguration new]); 62 62 auto processPool = adoptNS([[WKProcessPool alloc] _initWithConfiguration:processPoolConfiguration.get()]); 63 [processPool _setMaximumNumberOfProcesses:1];64 63 auto delegate = adoptNS([ResponsivenessTimerDelegate new]); 65 64 -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/ServiceWorkerBasic.mm
r239534 r240363 971 971 auto pool = configuration.processPool; 972 972 [pool _registerURLSchemeServiceWorkersCanHandle:@"sw"]; 973 [pool _setMaximumNumberOfProcesses:5];974 973 975 974 configuration.websiteDataStore = (WKWebsiteDataStore *)WKContextGetWebsiteDataStore(context.get()); … … 1250 1249 [newConfiguration.get().websiteDataStore _setServiceWorkerRegistrationDirectory: @"~/nonexistingfolder"]; 1251 1250 1252 [newConfiguration.get().processPool _setMaximumNumberOfProcesses:1];1253 1254 1251 webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:newConfiguration.get()]); 1255 1252 request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"sw://host/regularPageWithoutConnection.html"]]; … … 1262 1259 1263 1260 webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:newConfiguration.get()]); 1264 EXPECT_EQ( 1u, webView.get().configuration.processPool._webProcessCountIgnoringPrewarmed);1261 EXPECT_EQ(2u, webView.get().configuration.processPool._webProcessCountIgnoringPrewarmed); 1265 1262 request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"sw://host/regularPageWithConnection.html"]]; 1266 1263 [webView loadRequest:request]; … … 1269 1266 1270 1267 // Make sure that loading the simple page did not start the service worker process. 1271 EXPECT_EQ( 1u, webView.get().configuration.processPool._webProcessCountIgnoringPrewarmed);1268 EXPECT_EQ(2u, webView.get().configuration.processPool._webProcessCountIgnoringPrewarmed); 1272 1269 1273 1270 [[configuration websiteDataStore] removeDataOfTypes:[WKWebsiteDataStore allWebsiteDataTypes] modifiedSince:[NSDate distantPast] completionHandler:^() { -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/UserContentController.mm
r237266 r240363 238 238 RetainPtr<WKWebViewConfiguration> configuration = adoptNS([[WKWebViewConfiguration alloc] init]); 239 239 RetainPtr<_WKProcessPoolConfiguration> processPoolConfiguration = adoptNS([[_WKProcessPoolConfiguration alloc] init]); 240 [processPoolConfiguration setMaximumProcessCount:1];241 240 [configuration setProcessPool:[[[WKProcessPool alloc] _initWithConfiguration:processPoolConfiguration.get()] autorelease]]; 242 241 -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WKProcessPoolConfiguration.mm
r238076 r240363 37 37 38 38 [configuration setInjectedBundleURL:[NSURL fileURLWithPath:@"/path/to/injected.wkbundle"]]; 39 [configuration setMaximumProcessCount:42];40 39 [configuration setCustomWebContentServiceBundleIdentifier:@"org.webkit.WebContent.custom"]; 41 40 [configuration setIgnoreSynchronousMessagingTimeoutsForTesting:YES]; … … 66 65 67 66 EXPECT_TRUE([[configuration injectedBundleURL] isEqual:[copy injectedBundleURL]]); 68 EXPECT_EQ([configuration maximumProcessCount], [copy maximumProcessCount]);69 67 EXPECT_TRUE([[configuration customWebContentServiceBundleIdentifier] isEqual:[copy customWebContentServiceBundleIdentifier]]); 70 68 EXPECT_EQ([configuration ignoreSynchronousMessagingTimeoutsForTesting], [copy ignoreSynchronousMessagingTimeoutsForTesting]);
Note: See TracChangeset
for help on using the changeset viewer.