Changeset 212832 in webkit
- Timestamp:
- Feb 22, 2017, 9:15:45 AM (8 years ago)
- Location:
- trunk/Source/WebKit2
- Files:
-
- 11 edited
- 2 moved
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit2/CMakeLists.txt
r212724 r212832 274 274 Shared/WebsiteData/WebsiteData.cpp 275 275 276 UIProcess/BackgroundProcessResponsivenessTimer.cpp 276 277 UIProcess/ChildProcessProxy.cpp 277 278 UIProcess/DrawingAreaProxy.cpp … … 286 287 UIProcess/StatisticsRequest.cpp 287 288 UIProcess/TextCheckerCompletion.cpp 288 UIProcess/UnresponsiveWebProcessTerminator.cpp289 289 UIProcess/UserMediaPermissionCheckProxy.cpp 290 290 UIProcess/UserMediaPermissionRequestManagerProxy.cpp -
trunk/Source/WebKit2/ChangeLog
r212816 r212832 1 2017-02-22 Chris Dumez <cdumez@apple.com> 2 3 [WK2] Call processDidBecomeUnresponsive delegate when a background process is unresponsive 4 https://bugs.webkit.org/show_bug.cgi?id=168683 5 <rdar://problem/30558745> 6 7 Reviewed by Dan Bernstein. 8 9 Call processDidBecomeUnresponsive delegate when a background process is unresponsive 10 instead of killing it on WebKit side. This gives the client the choice about what it 11 wants to do about this process. 12 13 * UIProcess/API/APIProcessPoolConfiguration.cpp: 14 (API::ProcessPoolConfiguration::copy): 15 * UIProcess/API/APIProcessPoolConfiguration.h: 16 * UIProcess/API/C/WKContext.cpp: 17 * UIProcess/API/C/WKContextPrivate.h: 18 * UIProcess/BackgroundProcessResponsivenessTimer.cpp: Renamed from Source/WebKit2/UIProcess/UnresponsiveWebProcessTerminator.cpp. 19 (WebKit::BackgroundProcessResponsivenessTimer::BackgroundProcessResponsivenessTimer): 20 (WebKit::BackgroundProcessResponsivenessTimer::updateState): 21 (WebKit::BackgroundProcessResponsivenessTimer::timerFired): 22 * UIProcess/BackgroundProcessResponsivenessTimer.h: Renamed from Source/WebKit2/UIProcess/UnresponsiveWebProcessTerminator.h. 23 * UIProcess/WebPageProxy.cpp: 24 (WebKit::WebPageProxy::reattachToWebProcess): 25 (WebKit::WebPageProxy::dispatchActivityStateChange): 26 (WebKit::WebPageProxy::terminateProcess): 27 * UIProcess/WebPageProxy.h: 28 * UIProcess/WebProcessProxy.cpp: 29 (WebKit::m_backgroundResponsivenessTimer): 30 * UIProcess/WebProcessProxy.h: 31 * WebKit2.xcodeproj/project.pbxproj: 32 1 33 2017-02-22 Carlos Garcia Campos <cgarcia@igalia.com> 2 34 -
trunk/Source/WebKit2/UIProcess/API/APIProcessPoolConfiguration.cpp
r212619 r212832 97 97 copy->m_cacheModel = this->m_cacheModel; 98 98 copy->m_diskCacheSpeculativeValidationEnabled = this->m_diskCacheSpeculativeValidationEnabled; 99 copy->m_unresponsiveBackgroundProcessesTerminationEnabled = this->m_unresponsiveBackgroundProcessesTerminationEnabled;100 99 copy->m_diskCacheSizeOverride = this->m_diskCacheSizeOverride; 101 100 copy->m_applicationCacheDirectory = this->m_applicationCacheDirectory; -
trunk/Source/WebKit2/UIProcess/API/APIProcessPoolConfiguration.h
r212619 r212832 55 55 bool diskCacheSpeculativeValidationEnabled() const { return m_diskCacheSpeculativeValidationEnabled; } 56 56 void setDiskCacheSpeculativeValidationEnabled(bool enabled) { m_diskCacheSpeculativeValidationEnabled = enabled; } 57 58 bool unresponsiveBackgroundProcessesTerminationEnabled() const { return m_unresponsiveBackgroundProcessesTerminationEnabled; }59 void setUnresponsiveBackgroundProcessesTerminationEnabled(bool enabled) { m_unresponsiveBackgroundProcessesTerminationEnabled = enabled; }60 57 61 58 WebKit::CacheModel cacheModel() const { return m_cacheModel; } … … 125 122 unsigned m_maximumProcessCount { 0 }; 126 123 bool m_diskCacheSpeculativeValidationEnabled { false }; 127 bool m_unresponsiveBackgroundProcessesTerminationEnabled { false };128 124 WebKit::CacheModel m_cacheModel { WebKit::CacheModelPrimaryWebBrowser }; 129 125 int64_t m_diskCacheSizeOverride { -1 }; -
trunk/Source/WebKit2/UIProcess/API/C/WKContext.cpp
r212619 r212832 398 398 } 399 399 400 void WKContextSetUnresponsiveBackgroundProcessesTerminationEnabled(WKContextRef contextRef, bool value)401 {402 toImpl(contextRef)->configuration().setUnresponsiveBackgroundProcessesTerminationEnabled(value);403 }404 405 400 WKCookieManagerRef WKContextGetCookieManager(WKContextRef contextRef) 406 401 { -
trunk/Source/WebKit2/UIProcess/API/C/WKContextPrivate.h
r212619 r212832 63 63 WK_EXPORT void WKContextSetDiskCacheSpeculativeValidationEnabled(WKContextRef context, bool value); 64 64 65 WK_EXPORT void WKContextSetUnresponsiveBackgroundProcessesTerminationEnabled(WKContextRef context, bool value);66 67 65 WK_EXPORT void WKContextSetIconDatabasePath(WKContextRef context, WKStringRef iconDatabasePath); 68 66 -
trunk/Source/WebKit2/UIProcess/BackgroundProcessResponsivenessTimer.cpp
r212831 r212832 25 25 26 26 #include "config.h" 27 #include " UnresponsiveWebProcessTerminator.h"27 #include "BackgroundProcessResponsivenessTimer.h" 28 28 29 29 #include "Logging.h" … … 34 34 static const std::chrono::seconds maximumInterval { 8h }; 35 35 36 UnresponsiveWebProcessTerminator::UnresponsiveWebProcessTerminator(WebProcessProxy& webProcessProxy)36 BackgroundProcessResponsivenessTimer::BackgroundProcessResponsivenessTimer(WebProcessProxy& webProcessProxy) 37 37 : m_webProcessProxy(webProcessProxy) 38 38 , m_interval(initialInterval) 39 , m_timer(RunLoop::main(), this, & UnresponsiveWebProcessTerminator::timerFired)39 , m_timer(RunLoop::main(), this, &BackgroundProcessResponsivenessTimer::timerFired) 40 40 { 41 41 } 42 42 43 void UnresponsiveWebProcessTerminator::updateState()43 void BackgroundProcessResponsivenessTimer::updateState() 44 44 { 45 45 if (!shouldBeActive()) { … … 55 55 } 56 56 57 static Vector<RefPtr<WebPageProxy>> pagesCopy(WTF::IteratorRange<WebProcessProxy::WebPageProxyMap::const_iterator::Values> pages) 58 { 59 Vector<RefPtr<WebPageProxy>> vector; 60 for (auto& page : pages) 61 vector.append(page); 62 return vector; 63 } 64 65 void UnresponsiveWebProcessTerminator::timerFired() 57 void BackgroundProcessResponsivenessTimer::timerFired() 66 58 { 67 59 ASSERT(shouldBeActive()); 60 // WebProcessProxy::responsive() takes care of calling processDidBecomeUnresponsive for us. 68 61 m_webProcessProxy.isResponsive([this](bool processIsResponsive) { 69 62 if (processIsResponsive) { … … 74 67 } 75 68 76 RELEASE_LOG_ERROR(PerformanceLogging, " Killing a background WebProcess because it is notresponsive");77 for (auto& page : pagesCopy(m_webProcessProxy.pages()))78 page->terminateProcess(WebPageProxy::TerminationReason::UnresponsiveWhileInBackground);69 RELEASE_LOG_ERROR(PerformanceLogging, "Notified the client that a background WebProcess has become unresponsive"); 70 WTFLogAlways("Notified the client that a background WebProcess has become unresponsive"); 71 m_interval = initialInterval; 79 72 }); 80 73 } -
trunk/Source/WebKit2/UIProcess/BackgroundProcessResponsivenessTimer.h
r212831 r212832 31 31 namespace WebKit { 32 32 33 class UnresponsiveWebProcessTerminator {33 class BackgroundProcessResponsivenessTimer { 34 34 public: 35 explicit UnresponsiveWebProcessTerminator(WebProcessProxy&);35 explicit BackgroundProcessResponsivenessTimer(WebProcessProxy&); 36 36 void updateState(); 37 37 … … 42 42 WebProcessProxy& m_webProcessProxy; 43 43 std::chrono::seconds m_interval; 44 RunLoop::Timer< UnresponsiveWebProcessTerminator> m_timer;44 RunLoop::Timer<BackgroundProcessResponsivenessTimer> m_timer; 45 45 }; 46 46 -
trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp
r212810 r212832 713 713 714 714 m_isValid = true; 715 m_wasKilledForBeingUnresponsiveWhileInBackground = false;716 715 m_process->removeWebPage(m_pageID); 717 716 m_process->removeMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_pageID); … … 1515 1514 } 1516 1515 1517 void WebPageProxy::reloadAfterBeingKilledInBackground()1518 {1519 ASSERT(!isValid());1520 1521 RELEASE_LOG_IF_ALLOWED("%p - Reloading tab that was killed in the background", this);1522 1523 // Only report as a crash if the page was ever visible, otherwise silently reload.1524 if (m_hasEverBeenVisible)1525 processDidCrash();1526 else1527 reattachToWebProcessForReload();1528 }1529 1530 1516 void WebPageProxy::dispatchActivityStateChange() 1531 1517 { … … 1534 1520 #endif 1535 1521 1536 if (!isValid()) { 1537 if (m_potentiallyChangedActivityStateFlags & ActivityState::IsVisible && m_wasKilledForBeingUnresponsiveWhileInBackground) 1538 reloadAfterBeingKilledInBackground(); 1539 return; 1540 } 1522 if (!isValid()) 1523 return; 1541 1524 1542 1525 // If the visibility state may have changed, then so may the visually idle & occluded agnostic state. … … 1577 1560 1578 1561 if (changed & ActivityState::IsVisible) { 1579 if (isViewVisible()) { 1580 m_hasEverBeenVisible = true; 1562 if (isViewVisible()) 1581 1563 m_visiblePageToken = m_process->visiblePageToken(); 1582 }else {1564 else { 1583 1565 m_visiblePageToken = nullptr; 1584 1566 … … 2395 2377 } 2396 2378 2397 void WebPageProxy::terminateProcess( TerminationReason terminationReason)2379 void WebPageProxy::terminateProcess() 2398 2380 { 2399 2381 // NOTE: This uses a check of m_isValid rather than calling isValid() since … … 2404 2386 m_process->requestTermination(); 2405 2387 resetStateAfterProcessExited(); 2406 m_wasKilledForBeingUnresponsiveWhileInBackground = terminationReason == TerminationReason::UnresponsiveWhileInBackground;2407 2388 } 2408 2389 -
trunk/Source/WebKit2/UIProcess/WebPageProxy.h
r212669 r212832 676 676 double estimatedProgress() const; 677 677 678 enum class TerminationReason { UnresponsiveWhileInBackground, Other }; 679 void terminateProcess(TerminationReason = TerminationReason::Other); 678 void terminateProcess(); 680 679 681 680 SessionState sessionState(const std::function<bool (WebBackForwardListItem&)>& = nullptr) const; … … 1576 1575 void viewDidLeaveWindow(); 1577 1576 void viewDidEnterWindow(); 1578 void reloadAfterBeingKilledInBackground();1579 1577 1580 1578 #if PLATFORM(MAC) … … 1951 1949 bool m_needsHiddenContentEditableQuirk { false }; 1952 1950 bool m_needsPlainTextQuirk { false }; 1953 bool m_hasEverBeenVisible { false };1954 1951 1955 1952 #if ENABLE(MEDIA_SESSION) … … 1977 1974 1978 1975 bool m_isUsingHighPerformanceWebGL { false }; 1979 bool m_wasKilledForBeingUnresponsiveWhileInBackground { false };1980 1976 1981 1977 WeakPtrFactory<WebPageProxy> m_weakPtrFactory; -
trunk/Source/WebKit2/UIProcess/WebProcessProxy.cpp
r212766 r212832 30 30 #include "APIPageGroupHandle.h" 31 31 #include "APIPageHandle.h" 32 #include "BackgroundProcessResponsivenessTimer.h" 32 33 #include "DataReference.h" 33 34 #include "DownloadProxyMap.h" … … 37 38 #include "TextChecker.h" 38 39 #include "TextCheckerState.h" 39 #include "UnresponsiveWebProcessTerminator.h"40 40 #include "UserData.h" 41 41 #include "WebBackForwardListItem.h" … … 104 104 , m_isResponsive(NoOrMaybe::Maybe) 105 105 , m_visiblePageCounter([this](RefCounterEvent) { updateBackgroundResponsivenessTimer(); }) 106 , m_backgroundResponsivenessTimer( processPool.configuration().unresponsiveBackgroundProcessesTerminationEnabled() ? std::make_unique<UnresponsiveWebProcessTerminator>(*this) : nullptr)106 , m_backgroundResponsivenessTimer(std::make_unique<BackgroundProcessResponsivenessTimer>(*this)) 107 107 { 108 108 WebPasteboardProxy::singleton().addWebProcessProxy(*this); -
trunk/Source/WebKit2/UIProcess/WebProcessProxy.h
r212766 r212832 55 55 namespace WebKit { 56 56 57 class BackgroundProcessResponsivenessTimer; 57 58 class NetworkProcessProxy; 58 class UnresponsiveWebProcessTerminator;59 59 class WebBackForwardListItem; 60 60 class WebPageGroup; … … 256 256 257 257 VisibleWebPageCounter m_visiblePageCounter; 258 std::unique_ptr< UnresponsiveWebProcessTerminator> m_backgroundResponsivenessTimer;258 std::unique_ptr<BackgroundProcessResponsivenessTimer> m_backgroundResponsivenessTimer; 259 259 }; 260 260 -
trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj
r212757 r212832 899 899 41FAF5F91E3C1025001AE678 /* LibWebRTCResolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41FAF5F71E3C0B47001AE678 /* LibWebRTCResolver.cpp */; }; 900 900 4450AEC01DC3FAE5009943F2 /* SharedMemoryCocoa.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4450AEBF1DC3FAE5009943F2 /* SharedMemoryCocoa.cpp */; }; 901 46A2B6081E5676A600C3DEDA /* UnresponsiveWebProcessTerminator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 46A2B6061E5675A200C3DEDA /* UnresponsiveWebProcessTerminator.cpp */; };902 46A2B6091E5676A600C3DEDA /* UnresponsiveWebProcessTerminator.h in Headers */ = {isa = PBXBuildFile; fileRef = 46A2B6071E5675A200C3DEDA /* UnresponsiveWebProcessTerminator.h */; };901 46A2B6081E5676A600C3DEDA /* BackgroundProcessResponsivenessTimer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 46A2B6061E5675A200C3DEDA /* BackgroundProcessResponsivenessTimer.cpp */; }; 902 46A2B6091E5676A600C3DEDA /* BackgroundProcessResponsivenessTimer.h in Headers */ = {isa = PBXBuildFile; fileRef = 46A2B6071E5675A200C3DEDA /* BackgroundProcessResponsivenessTimer.h */; }; 903 903 4A3CC18A19B063E700D14AEF /* UserMediaPermissionRequestManagerProxy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A410F3919AF7B04002EBAB5 /* UserMediaPermissionRequestManagerProxy.cpp */; }; 904 904 4A3CC18B19B0640F00D14AEF /* UserMediaPermissionRequestManagerProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A410F3A19AF7B04002EBAB5 /* UserMediaPermissionRequestManagerProxy.h */; }; … … 3062 3062 41FAF5F71E3C0B47001AE678 /* LibWebRTCResolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LibWebRTCResolver.cpp; path = Network/webrtc/LibWebRTCResolver.cpp; sourceTree = "<group>"; }; 3063 3063 4450AEBF1DC3FAE5009943F2 /* SharedMemoryCocoa.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SharedMemoryCocoa.cpp; path = cocoa/SharedMemoryCocoa.cpp; sourceTree = "<group>"; }; 3064 46A2B6061E5675A200C3DEDA /* UnresponsiveWebProcessTerminator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UnresponsiveWebProcessTerminator.cpp; sourceTree = "<group>"; };3065 46A2B6071E5675A200C3DEDA /* UnresponsiveWebProcessTerminator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnresponsiveWebProcessTerminator.h; sourceTree = "<group>"; };3064 46A2B6061E5675A200C3DEDA /* BackgroundProcessResponsivenessTimer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BackgroundProcessResponsivenessTimer.cpp; sourceTree = "<group>"; }; 3065 46A2B6071E5675A200C3DEDA /* BackgroundProcessResponsivenessTimer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BackgroundProcessResponsivenessTimer.h; sourceTree = "<group>"; }; 3066 3066 4A410F3519AF7AC3002EBAB5 /* WKUserMediaPermissionRequest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKUserMediaPermissionRequest.cpp; sourceTree = "<group>"; }; 3067 3067 4A410F3619AF7AC3002EBAB5 /* WKUserMediaPermissionRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKUserMediaPermissionRequest.h; sourceTree = "<group>"; }; … … 6480 6480 1A53C2A31A325691004E8C70 /* WebsiteData */, 6481 6481 7CD102D91866770600ED429D /* AutoCorrectionCallback.h */, 6482 46A2B6061E5675A200C3DEDA /* BackgroundProcessResponsivenessTimer.cpp */, 6483 46A2B6071E5675A200C3DEDA /* BackgroundProcessResponsivenessTimer.h */, 6482 6484 E1513C64166EABB200149FCB /* ChildProcessProxy.cpp */, 6483 6485 E1513C65166EABB200149FCB /* ChildProcessProxy.h */, … … 6515 6517 1BB417C912C00CCA002BE67B /* TextCheckerCompletion.cpp */, 6516 6518 1CC417C912C00CCA002BE67B /* TextCheckerCompletion.h */, 6517 46A2B6061E5675A200C3DEDA /* UnresponsiveWebProcessTerminator.cpp */,6518 46A2B6071E5675A200C3DEDA /* UnresponsiveWebProcessTerminator.h */,6519 6519 07297F9C1C17BBEA003F0735 /* UserMediaPermissionCheckProxy.cpp */, 6520 6520 07297F9D1C17BBEA003F0735 /* UserMediaPermissionCheckProxy.h */, … … 8028 8028 1A5705111BE410E600874AF1 /* BlockSPI.h in Headers */, 8029 8029 BC3065FA1259344E00E71278 /* CacheModel.h in Headers */, 8030 46A2B6091E5676A600C3DEDA /* UnresponsiveWebProcessTerminator.h in Headers */,8030 46A2B6091E5676A600C3DEDA /* BackgroundProcessResponsivenessTimer.h in Headers */, 8031 8031 1AA2E51D12E4C05E00BC4966 /* CGUtilities.h in Headers */, 8032 8032 1A2D956F12848564001EB962 /* ChildProcess.h in Headers */, … … 9715 9715 5C20CB9D1BB0DCFA00895BB1 /* NetworkSessionCocoa.mm in Sources */, 9716 9716 31A2EC551489982E00810D71 /* NotificationPermissionRequest.cpp in Sources */, 9717 46A2B6081E5676A600C3DEDA /* UnresponsiveWebProcessTerminator.cpp in Sources */,9717 46A2B6081E5676A600C3DEDA /* BackgroundProcessResponsivenessTimer.cpp in Sources */, 9718 9718 3131261E148FF82C00BA2A39 /* NotificationPermissionRequestManager.cpp in Sources */, 9719 9719 31A2EC501489980500810D71 /* NotificationPermissionRequestManagerProxy.cpp in Sources */,
Note:
See TracChangeset
for help on using the changeset viewer.