Changeset 272990 in webkit
- Timestamp:
- Feb 17, 2021 1:38:47 AM (3 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r272989 r272990 1 2021-02-17 Chris Dumez <cdumez@apple.com> 2 3 Regression(r268097): Calling processDidTerminate delegate asynchronously is risky compatibility-wise 4 https://bugs.webkit.org/show_bug.cgi?id=222011 5 6 Reviewed by Carlos Garcia Campos. 7 8 Calling processDidTerminate delegate asynchronously like we did in r268097 is risky compatibility-wise. 9 This caused breakage in at least 2 client applications. While this can be dealt with on the client side, 10 it would be better to fix what r268097 was trying to fix without making the delegate call asynchronous. 11 The reason calling the delegate asynchronously is risky is because some view state may have time to get 12 reset by the time the client gets notified on the crash, potentially confusing the crash handling logic 13 in the client. 14 15 No new tests, covered by WKNavigation.ReloadRelatedViewsInProcessDidTerminate API test that is 16 still passing even though the delegate call is no longer asynchronous. 17 18 * UIProcess/WebPageProxy.cpp: 19 (WebKit::WebPageProxy::commitProvisionalPage): 20 (WebKit::WebPageProxy::resetStateAfterProcessTermination): 21 (WebKit::WebPageProxy::dispatchProcessDidTerminate): 22 * UIProcess/WebPageProxy.h: 23 * UIProcess/WebProcessProxy.cpp: 24 (WebKit::WebProcessProxy::processDidTerminateOrFailedToLaunch): 25 (WebKit::WebProcessProxy::requestTermination): 26 1 27 2021-02-17 Youenn Fablet <youenn@apple.com> 2 28 -
trunk/Source/WebKit/UIProcess/WebPageProxy.cpp
r272925 r272990 3344 3344 send(Messages::WebPage::UnfreezeLayerTreeDueToSwipeAnimation()); 3345 3345 3346 processDidTerminate(ProcessTerminationReason::NavigationSwap);3346 resetStateAfterProcessTermination(ProcessTerminationReason::NavigationSwap); 3347 3347 3348 3348 m_process->removeMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_webPageID); … … 7238 7238 } 7239 7239 7240 void WebPageProxy:: processDidTerminate(ProcessTerminationReason reason)7240 void WebPageProxy::resetStateAfterProcessTermination(ProcessTerminationReason reason) 7241 7241 { 7242 7242 if (reason != ProcessTerminationReason::NavigationSwap) … … 7265 7265 // If it does *during* process swapping, and the client triggers a reload, that causes bizarre WebKit re-entry. 7266 7266 // FIXME: This might have to change 7267 if (reason != ProcessTerminationReason::NavigationSwap) {7267 if (reason != ProcessTerminationReason::NavigationSwap) 7268 7268 navigationState().clearAllNavigations(); 7269 dispatchProcessDidTerminate(reason);7270 }7271 7269 7272 7270 if (m_controlledByAutomation) { … … 7302 7300 RELEASE_LOG_ERROR_IF_ALLOWED(Loading, "dispatchProcessDidTerminate: reason = %d", reason); 7303 7301 7304 // We notify the client asynchronously because several pages may share the same process 7305 // and we want to make sure all pages are aware their process has crashed before the 7306 // the client reacts to the process termination. 7307 RunLoop::main().dispatch([this, weakThis = makeWeakPtr(*this), reason] { 7308 if (!weakThis) 7309 return; 7310 7311 bool handledByClient = false; 7312 if (m_loaderClient) 7313 handledByClient = reason != ProcessTerminationReason::RequestedByClient && m_loaderClient->processDidCrash(*this); 7314 else 7315 handledByClient = m_navigationClient->processDidTerminate(*this, reason); 7316 7317 if (!handledByClient && shouldReloadAfterProcessTermination(reason)) 7318 tryReloadAfterProcessTermination(); 7319 }); 7302 bool handledByClient = false; 7303 if (m_loaderClient) 7304 handledByClient = reason != ProcessTerminationReason::RequestedByClient && m_loaderClient->processDidCrash(*this); 7305 else 7306 handledByClient = m_navigationClient->processDidTerminate(*this, reason); 7307 7308 if (!handledByClient && shouldReloadAfterProcessTermination(reason)) 7309 tryReloadAfterProcessTermination(); 7320 7310 } 7321 7311 -
trunk/Source/WebKit/UIProcess/WebPageProxy.h
r272925 r272990 1177 1177 void processDidBecomeUnresponsive(); 1178 1178 void processDidBecomeResponsive(); 1179 void processDidTerminate(ProcessTerminationReason);1179 void resetStateAfterProcessTermination(ProcessTerminationReason); 1180 1180 void provisionalProcessDidTerminate(); 1181 1181 void dispatchProcessDidTerminate(ProcessTerminationReason); -
trunk/Source/WebKit/UIProcess/WebProcessProxy.cpp
r272550 r272990 886 886 887 887 for (auto& page : pages) 888 page-> processDidTerminate(ProcessTerminationReason::Crash);888 page->resetStateAfterProcessTermination(ProcessTerminationReason::Crash); 889 889 890 890 for (auto& provisionalPage : provisionalPages) { … … 892 892 provisionalPage->processDidTerminate(); 893 893 } 894 895 for (auto& page : pages) 896 page->dispatchProcessDidTerminate(ProcessTerminationReason::Crash); 894 897 895 898 m_sleepDisablers.clear(); … … 1255 1258 1256 1259 for (auto& page : pages) 1257 page-> processDidTerminate(reason);1260 page->resetStateAfterProcessTermination(reason); 1258 1261 1259 1262 for (auto& provisionalPage : provisionalPages) { … … 1261 1264 provisionalPage->processDidTerminate(); 1262 1265 } 1266 1267 for (auto& page : pages) 1268 page->dispatchProcessDidTerminate(reason); 1263 1269 } 1264 1270
Note: See TracChangeset
for help on using the changeset viewer.