Changeset 246452 in webkit
- Timestamp:
- Jun 14, 2019 6:07:16 PM (5 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r246449 r246452 1 2019-06-14 Youenn Fablet <youenn@apple.com> 2 3 WebProcessPool::clearWebProcessHasUploads cannot assume its given processIdentifier is valid 4 https://bugs.webkit.org/show_bug.cgi?id=198865 5 <rdar://problem/51618878> 6 7 Reviewed by Brady Eidson. 8 9 NetworkProcess currently instructs UIProcess whether a given WebProcess is doing upload. 10 There is no guarantee though that the WebProcessProxy is still there when the IPC is arriving at UIProcess. 11 Instead, let WebProcess handles its upload state and notify WebProcessPool about its state. 12 Make sure WebProcessProxy unregisters itself in case of crash. 13 In case of NetworkProcess crash, WebProcesses will see all their uploads fail 14 and will notify automatically UIProcess to update their state. 15 16 Since the processID given to WebProcessPool is coming from IPC, we cannot not trust it. 17 Add early return in case of not finding a WebProcessProxy for WebProcessPool clear/set methods. 18 19 * NetworkProcess/NetworkConnectionToWebProcess.cpp: 20 (WebKit::NetworkConnectionToWebProcess::NetworkConnectionToWebProcess): 21 * NetworkProcess/NetworkConnectionToWebProcess.h: 22 * NetworkProcess/NetworkConnectionToWebProcess.messages.in: 23 * NetworkProcess/NetworkResourceLoadMap.cpp: 24 (WebKit::NetworkResourceLoadMap::add): 25 (WebKit::NetworkResourceLoadMap::take): 26 * NetworkProcess/NetworkResourceLoadMap.h: 27 * UIProcess/WebProcessPool.cpp: 28 (WebKit::WebProcessPool::setWebProcessHasUploads): 29 (WebKit::WebProcessPool::clearWebProcessHasUploads): 30 * UIProcess/WebProcessProxy.cpp: 31 (WebKit::WebProcessProxy::~WebProcessProxy): 32 * WebProcess/Network/WebLoaderStrategy.cpp: 33 (WebKit::WebLoaderStrategy::scheduleLoadFromNetworkProcess): 34 (WebKit::WebLoaderStrategy::remove): 35 (WebKit::WebLoaderStrategy::tryLoadingSynchronouslyUsingURLSchemeHandler): 36 * WebProcess/Network/WebLoaderStrategy.h: 37 * WebProcess/WebProcess.cpp: 38 (WebKit::WebProcess::ensureNetworkProcessConnection): 39 1 40 2019-06-14 Youenn Fablet <youenn@apple.com> 2 41 -
trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.cpp
r246388 r246452 84 84 : m_connection(IPC::Connection::createServerConnection(connectionIdentifier, *this)) 85 85 , m_networkProcess(networkProcess) 86 , m_networkResourceLoaders(*this)87 86 #if ENABLE(WEB_RTC) 88 87 , m_mdnsRegister(*this) … … 900 899 #endif 901 900 902 void NetworkConnectionToWebProcess::setWebProcessIdentifier(ProcessIdentifier webProcessIdentifier)903 {904 m_webProcessIdentifier = webProcessIdentifier;905 }906 907 void NetworkConnectionToWebProcess::setConnectionHasUploads()908 {909 ASSERT(!m_connectionHasUploads);910 m_connectionHasUploads = true;911 m_networkProcess->parentProcessConnection()->send(Messages::WebProcessPool::SetWebProcessHasUploads(m_webProcessIdentifier), 0);912 }913 914 void NetworkConnectionToWebProcess::clearConnectionHasUploads()915 {916 ASSERT(m_connectionHasUploads);917 m_connectionHasUploads = false;918 m_networkProcess->parentProcessConnection()->send(Messages::WebProcessPool::ClearWebProcessHasUploads(m_webProcessIdentifier), 0);919 }920 921 901 void NetworkConnectionToWebProcess::webPageWasAdded(PAL::SessionID sessionID, PageIdentifier pageID, WebCore::PageIdentifier oldPageID) 922 902 { -
trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.h
r246388 r246452 143 143 Vector<RefPtr<WebCore::BlobDataFileReference>> resolveBlobReferences(const NetworkResourceLoadParameters&); 144 144 145 void setWebProcessIdentifier(WebCore::ProcessIdentifier);146 void setConnectionHasUploads();147 void clearConnectionHasUploads();148 149 145 void webPageWasAdded(PAL::SessionID, WebCore::PageIdentifier, WebCore::PageIdentifier oldPageID); 150 146 void webPageWasRemoved(PAL::SessionID, WebCore::PageIdentifier); … … 319 315 std::unique_ptr<WebPaymentCoordinatorProxy> m_paymentCoordinator; 320 316 #endif 321 322 WebCore::ProcessIdentifier m_webProcessIdentifier;323 bool m_connectionHasUploads { false };324 317 }; 325 318 -
trunk/Source/WebKit/NetworkProcess/NetworkConnectionToWebProcess.messages.in
r246388 r246452 87 87 #endif 88 88 89 SetWebProcessIdentifier(WebCore::ProcessIdentifier processIdentifier)90 91 89 WebPageWasAdded(PAL::SessionID sessionID, WebCore::PageIdentifier pageID, WebCore::PageIdentifier oldPageID) 92 90 WebPageWasRemoved(PAL::SessionID sessionID, WebCore::PageIdentifier pageID) -
trunk/Source/WebKit/NetworkProcess/NetworkResourceLoadMap.cpp
r244700 r246452 27 27 #include "NetworkResourceLoadMap.h" 28 28 29 #include "NetworkConnectionToWebProcess.h"30 31 29 namespace WebKit { 32 30 33 31 NetworkResourceLoadMap::MapType::AddResult NetworkResourceLoadMap::add(ResourceLoadIdentifier identifier, Ref<NetworkResourceLoader>&& loader) 34 32 { 35 auto result = m_loaders.add(identifier, WTFMove(loader)); 36 ASSERT(result.isNewEntry); 37 38 if (result.iterator->value->originalRequest().hasUpload()) { 39 if (m_loadersWithUploads.isEmpty()) 40 m_connectionToWebProcess.setConnectionHasUploads(); 41 m_loadersWithUploads.add(result.iterator->value.ptr()); 42 } 43 44 return result; 33 ASSERT(!m_loaders.contains(identifier)); 34 return m_loaders.add(identifier, WTFMove(loader)); 45 35 } 46 36 … … 55 45 if (!loader) 56 46 return nullptr; 57 58 if ((*loader)->originalRequest().hasUpload()) {59 m_loadersWithUploads.remove(loader->ptr());60 if (m_loadersWithUploads.isEmpty())61 m_connectionToWebProcess.clearConnectionHasUploads();62 }63 64 47 return WTFMove(*loader); 65 48 } -
trunk/Source/WebKit/NetworkProcess/NetworkResourceLoadMap.h
r244700 r246452 44 44 typedef HashMap<ResourceLoadIdentifier, Ref<NetworkResourceLoader>> MapType; 45 45 46 NetworkResourceLoadMap(NetworkConnectionToWebProcess& connection)47 : m_connectionToWebProcess(connection)48 {49 }50 51 46 bool isEmpty() const { return m_loaders.isEmpty(); } 52 47 bool contains(ResourceLoadIdentifier identifier) const { return m_loaders.contains(identifier); } … … 60 55 61 56 private: 62 NetworkConnectionToWebProcess& m_connectionToWebProcess;63 57 MapType m_loaders; 64 HashSet<NetworkResourceLoader*> m_loadersWithUploads;65 58 }; 66 59 -
trunk/Source/WebKit/UIProcess/WebProcessPool.cpp
r246328 r246452 2532 2532 void WebProcessPool::setWebProcessHasUploads(ProcessIdentifier processID) 2533 2533 { 2534 ASSERT(processID); 2534 2535 auto* process = WebProcessProxy::processForIdentifier(processID); 2535 2536 ASSERT(process); 2537 2538 if (!process) 2539 return; 2536 2540 2537 2541 RELEASE_LOG(ProcessSuspension, "Web process pid %u now has uploads in progress", (unsigned)process->processIdentifier()); … … 2554 2558 void WebProcessPool::clearWebProcessHasUploads(ProcessIdentifier processID) 2555 2559 { 2560 ASSERT(processID); 2556 2561 auto result = m_processesWithUploads.take(processID); 2557 ASSERT_UNUSED(result, result); 2562 ASSERT(result); 2563 if (!result) 2564 return; 2558 2565 2559 2566 auto* process = WebProcessProxy::processForIdentifier(processID); -
trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp
r245868 r246452 169 169 ASSERT(m_pageURLRetainCountMap.isEmpty()); 170 170 171 if (m_processPool) 172 m_processPool->clearWebProcessHasUploads(coreProcessIdentifier()); 173 171 174 auto result = allProcesses().remove(coreProcessIdentifier()); 172 175 ASSERT_UNUSED(result, result); -
trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.cpp
r245979 r246452 42 42 #include "WebPageProxyMessages.h" 43 43 #include "WebProcess.h" 44 #include "WebProcessPoolMessages.h" 44 45 #include "WebResourceLoader.h" 45 46 #include "WebServiceWorkerProvider.h" … … 358 359 } 359 360 360 m_webResourceLoaders.set(identifier, WebResourceLoader::create(resourceLoader, trackingParameters)); 361 auto loader = WebResourceLoader::create(resourceLoader, trackingParameters); 362 if (resourceLoader.originalRequest().hasUpload()) { 363 if (m_loadersWithUploads.isEmpty()) 364 WebProcess::singleton().parentProcessConnection()->send(Messages::WebProcessPool::SetWebProcessHasUploads(Process::identifier()), 0); 365 m_loadersWithUploads.add(loader.ptr()); 366 } 367 368 m_webResourceLoaders.set(identifier, WTFMove(loader)); 361 369 } 362 370 … … 423 431 424 432 WebProcess::singleton().ensureNetworkProcessConnection().connection().send(Messages::NetworkConnectionToWebProcess::RemoveLoadIdentifier(identifier), 0); 433 434 if (m_loadersWithUploads.remove(loader.get()) && m_loadersWithUploads.isEmpty()) 435 WebProcess::singleton().parentProcessConnection()->send(Messages::WebProcessPool::ClearWebProcessHasUploads { Process::identifier() }, 0); 425 436 426 437 // It's possible that this WebResourceLoader might be just about to message back to the NetworkProcess (e.g. ContinueWillSendRequest) … … 555 566 HangDetectionDisabler hangDetectionDisabler; 556 567 568 bool shouldNotifyOfUpload = request.hasUpload() && m_loadersWithUploads.isEmpty(); 569 if (shouldNotifyOfUpload) 570 WebProcess::singleton().parentProcessConnection()->send(Messages::WebProcessPool::SetWebProcessHasUploads { Process::identifier() }, 0); 571 557 572 if (!WebProcess::singleton().ensureNetworkProcessConnection().connection().sendSync(Messages::NetworkConnectionToWebProcess::PerformSynchronousLoad(loadParameters), Messages::NetworkConnectionToWebProcess::PerformSynchronousLoad::Reply(error, response, data), 0)) { 558 573 RELEASE_LOG_ERROR_IF_ALLOWED(sessionID, "loadResourceSynchronously: failed sending synchronous network process message (pageID = %" PRIu64 ", frameID = %" PRIu64 ", resourceID = %lu)", pageID.toUInt64(), frameID, resourceLoadIdentifier); … … 562 577 error = internalError(request.url()); 563 578 } 579 580 if (shouldNotifyOfUpload) 581 WebProcess::singleton().parentProcessConnection()->send(Messages::WebProcessPool::ClearWebProcessHasUploads { Process::identifier() }, 0); 564 582 } 565 583 -
trunk/Source/WebKit/WebProcess/Network/WebLoaderStrategy.h
r245796 r246452 123 123 Vector<Function<void(bool)>> m_onlineStateChangeListeners; 124 124 bool m_isOnLine { true }; 125 HashSet<WebResourceLoader*> m_loadersWithUploads; 125 126 }; 126 127 -
trunk/Source/WebKit/WebProcess/WebProcess.cpp
r246388 r246452 1247 1247 1248 1248 m_networkProcessConnection = NetworkProcessConnection::create(connectionIdentifier); 1249 m_networkProcessConnection->connection().send(Messages::NetworkConnectionToWebProcess::SetWebProcessIdentifier(Process::identifier()), 0);1250 1249 1251 1250 // To recover web storage, network process needs to know active webpages to prepare session storage.
Note: See TracChangeset
for help on using the changeset viewer.