Changeset 212832 in webkit


Ignore:
Timestamp:
Feb 22, 2017, 9:15:45 AM (8 years ago)
Author:
Chris Dumez
Message:

[WK2] Call processDidBecomeUnresponsive delegate when a background process is unresponsive
https://bugs.webkit.org/show_bug.cgi?id=168683
<rdar://problem/30558745>

Reviewed by Dan Bernstein.

Call processDidBecomeUnresponsive delegate when a background process is unresponsive
instead of killing it on WebKit side. This gives the client the choice about what it
wants to do about this process.

  • UIProcess/API/APIProcessPoolConfiguration.cpp:

(API::ProcessPoolConfiguration::copy):

  • UIProcess/API/APIProcessPoolConfiguration.h:
  • UIProcess/API/C/WKContext.cpp:
  • UIProcess/API/C/WKContextPrivate.h:
  • UIProcess/BackgroundProcessResponsivenessTimer.cpp: Renamed from Source/WebKit2/UIProcess/UnresponsiveWebProcessTerminator.cpp.

(WebKit::BackgroundProcessResponsivenessTimer::BackgroundProcessResponsivenessTimer):
(WebKit::BackgroundProcessResponsivenessTimer::updateState):
(WebKit::BackgroundProcessResponsivenessTimer::timerFired):

  • UIProcess/BackgroundProcessResponsivenessTimer.h: Renamed from Source/WebKit2/UIProcess/UnresponsiveWebProcessTerminator.h.
  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::reattachToWebProcess):
(WebKit::WebPageProxy::dispatchActivityStateChange):
(WebKit::WebPageProxy::terminateProcess):

  • UIProcess/WebPageProxy.h:
  • UIProcess/WebProcessProxy.cpp:

(WebKit::m_backgroundResponsivenessTimer):

  • UIProcess/WebProcessProxy.h:
  • WebKit2.xcodeproj/project.pbxproj:
Location:
trunk/Source/WebKit2
Files:
11 edited
2 moved

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/CMakeLists.txt

    r212724 r212832  
    274274    Shared/WebsiteData/WebsiteData.cpp
    275275
     276    UIProcess/BackgroundProcessResponsivenessTimer.cpp
    276277    UIProcess/ChildProcessProxy.cpp
    277278    UIProcess/DrawingAreaProxy.cpp
     
    286287    UIProcess/StatisticsRequest.cpp
    287288    UIProcess/TextCheckerCompletion.cpp
    288     UIProcess/UnresponsiveWebProcessTerminator.cpp
    289289    UIProcess/UserMediaPermissionCheckProxy.cpp
    290290    UIProcess/UserMediaPermissionRequestManagerProxy.cpp
  • trunk/Source/WebKit2/ChangeLog

    r212816 r212832  
     12017-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
    1332017-02-22  Carlos Garcia Campos  <cgarcia@igalia.com>
    234
  • trunk/Source/WebKit2/UIProcess/API/APIProcessPoolConfiguration.cpp

    r212619 r212832  
    9797    copy->m_cacheModel = this->m_cacheModel;
    9898    copy->m_diskCacheSpeculativeValidationEnabled = this->m_diskCacheSpeculativeValidationEnabled;
    99     copy->m_unresponsiveBackgroundProcessesTerminationEnabled = this->m_unresponsiveBackgroundProcessesTerminationEnabled;
    10099    copy->m_diskCacheSizeOverride = this->m_diskCacheSizeOverride;
    101100    copy->m_applicationCacheDirectory = this->m_applicationCacheDirectory;
  • trunk/Source/WebKit2/UIProcess/API/APIProcessPoolConfiguration.h

    r212619 r212832  
    5555    bool diskCacheSpeculativeValidationEnabled() const { return m_diskCacheSpeculativeValidationEnabled; }
    5656    void setDiskCacheSpeculativeValidationEnabled(bool enabled) { m_diskCacheSpeculativeValidationEnabled = enabled; }
    57 
    58     bool unresponsiveBackgroundProcessesTerminationEnabled() const { return m_unresponsiveBackgroundProcessesTerminationEnabled; }
    59     void setUnresponsiveBackgroundProcessesTerminationEnabled(bool enabled) { m_unresponsiveBackgroundProcessesTerminationEnabled = enabled; }
    6057
    6158    WebKit::CacheModel cacheModel() const { return m_cacheModel; }
     
    125122    unsigned m_maximumProcessCount { 0 };
    126123    bool m_diskCacheSpeculativeValidationEnabled { false };
    127     bool m_unresponsiveBackgroundProcessesTerminationEnabled { false };
    128124    WebKit::CacheModel m_cacheModel { WebKit::CacheModelPrimaryWebBrowser };
    129125    int64_t m_diskCacheSizeOverride { -1 };
  • trunk/Source/WebKit2/UIProcess/API/C/WKContext.cpp

    r212619 r212832  
    398398}
    399399
    400 void WKContextSetUnresponsiveBackgroundProcessesTerminationEnabled(WKContextRef contextRef, bool value)
    401 {
    402     toImpl(contextRef)->configuration().setUnresponsiveBackgroundProcessesTerminationEnabled(value);
    403 }
    404 
    405400WKCookieManagerRef WKContextGetCookieManager(WKContextRef contextRef)
    406401{
  • trunk/Source/WebKit2/UIProcess/API/C/WKContextPrivate.h

    r212619 r212832  
    6363WK_EXPORT void WKContextSetDiskCacheSpeculativeValidationEnabled(WKContextRef context, bool value);
    6464
    65 WK_EXPORT void WKContextSetUnresponsiveBackgroundProcessesTerminationEnabled(WKContextRef context, bool value);
    66 
    6765WK_EXPORT void WKContextSetIconDatabasePath(WKContextRef context, WKStringRef iconDatabasePath);
    6866
  • trunk/Source/WebKit2/UIProcess/BackgroundProcessResponsivenessTimer.cpp

    r212831 r212832  
    2525
    2626#include "config.h"
    27 #include "UnresponsiveWebProcessTerminator.h"
     27#include "BackgroundProcessResponsivenessTimer.h"
    2828
    2929#include "Logging.h"
     
    3434static const std::chrono::seconds maximumInterval { 8h };
    3535
    36 UnresponsiveWebProcessTerminator::UnresponsiveWebProcessTerminator(WebProcessProxy& webProcessProxy)
     36BackgroundProcessResponsivenessTimer::BackgroundProcessResponsivenessTimer(WebProcessProxy& webProcessProxy)
    3737    : m_webProcessProxy(webProcessProxy)
    3838    , m_interval(initialInterval)
    39     , m_timer(RunLoop::main(), this, &UnresponsiveWebProcessTerminator::timerFired)
     39    , m_timer(RunLoop::main(), this, &BackgroundProcessResponsivenessTimer::timerFired)
    4040{
    4141}
    4242
    43 void UnresponsiveWebProcessTerminator::updateState()
     43void BackgroundProcessResponsivenessTimer::updateState()
    4444{
    4545    if (!shouldBeActive()) {
     
    5555}
    5656
    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()
     57void BackgroundProcessResponsivenessTimer::timerFired()
    6658{
    6759    ASSERT(shouldBeActive());
     60    // WebProcessProxy::responsive() takes care of calling processDidBecomeUnresponsive for us.
    6861    m_webProcessProxy.isResponsive([this](bool processIsResponsive) {
    6962        if (processIsResponsive) {
     
    7467        }
    7568
    76         RELEASE_LOG_ERROR(PerformanceLogging, "Killing a background WebProcess because it is not responsive");
    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;
    7972    });
    8073}
  • trunk/Source/WebKit2/UIProcess/BackgroundProcessResponsivenessTimer.h

    r212831 r212832  
    3131namespace WebKit {
    3232
    33 class UnresponsiveWebProcessTerminator {
     33class BackgroundProcessResponsivenessTimer {
    3434public:
    35     explicit UnresponsiveWebProcessTerminator(WebProcessProxy&);
     35    explicit BackgroundProcessResponsivenessTimer(WebProcessProxy&);
    3636    void updateState();
    3737
     
    4242    WebProcessProxy& m_webProcessProxy;
    4343    std::chrono::seconds m_interval;
    44     RunLoop::Timer<UnresponsiveWebProcessTerminator> m_timer;
     44    RunLoop::Timer<BackgroundProcessResponsivenessTimer> m_timer;
    4545};
    4646
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp

    r212810 r212832  
    713713
    714714    m_isValid = true;
    715     m_wasKilledForBeingUnresponsiveWhileInBackground = false;
    716715    m_process->removeWebPage(m_pageID);
    717716    m_process->removeMessageReceiver(Messages::WebPageProxy::messageReceiverName(), m_pageID);
     
    15151514}
    15161515
    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     else
    1527         reattachToWebProcessForReload();
    1528 }
    1529 
    15301516void WebPageProxy::dispatchActivityStateChange()
    15311517{
     
    15341520#endif
    15351521
    1536     if (!isValid()) {
    1537         if (m_potentiallyChangedActivityStateFlags & ActivityState::IsVisible && m_wasKilledForBeingUnresponsiveWhileInBackground)
    1538             reloadAfterBeingKilledInBackground();
    1539         return;
    1540     }
     1522    if (!isValid())
     1523        return;
    15411524
    15421525    // If the visibility state may have changed, then so may the visually idle & occluded agnostic state.
     
    15771560
    15781561    if (changed & ActivityState::IsVisible) {
    1579         if (isViewVisible()) {
    1580             m_hasEverBeenVisible = true;
     1562        if (isViewVisible())
    15811563            m_visiblePageToken = m_process->visiblePageToken();
    1582         } else {
     1564        else {
    15831565            m_visiblePageToken = nullptr;
    15841566
     
    23952377}
    23962378
    2397 void WebPageProxy::terminateProcess(TerminationReason terminationReason)
     2379void WebPageProxy::terminateProcess()
    23982380{
    23992381    // NOTE: This uses a check of m_isValid rather than calling isValid() since
     
    24042386    m_process->requestTermination();
    24052387    resetStateAfterProcessExited();
    2406     m_wasKilledForBeingUnresponsiveWhileInBackground = terminationReason == TerminationReason::UnresponsiveWhileInBackground;
    24072388}
    24082389
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.h

    r212669 r212832  
    676676    double estimatedProgress() const;
    677677
    678     enum class TerminationReason { UnresponsiveWhileInBackground, Other };
    679     void terminateProcess(TerminationReason = TerminationReason::Other);
     678    void terminateProcess();
    680679
    681680    SessionState sessionState(const std::function<bool (WebBackForwardListItem&)>& = nullptr) const;
     
    15761575    void viewDidLeaveWindow();
    15771576    void viewDidEnterWindow();
    1578     void reloadAfterBeingKilledInBackground();
    15791577
    15801578#if PLATFORM(MAC)
     
    19511949    bool m_needsHiddenContentEditableQuirk { false };
    19521950    bool m_needsPlainTextQuirk { false };
    1953     bool m_hasEverBeenVisible { false };
    19541951
    19551952#if ENABLE(MEDIA_SESSION)
     
    19771974
    19781975    bool m_isUsingHighPerformanceWebGL { false };
    1979     bool m_wasKilledForBeingUnresponsiveWhileInBackground { false };
    19801976       
    19811977    WeakPtrFactory<WebPageProxy> m_weakPtrFactory;
  • trunk/Source/WebKit2/UIProcess/WebProcessProxy.cpp

    r212766 r212832  
    3030#include "APIPageGroupHandle.h"
    3131#include "APIPageHandle.h"
     32#include "BackgroundProcessResponsivenessTimer.h"
    3233#include "DataReference.h"
    3334#include "DownloadProxyMap.h"
     
    3738#include "TextChecker.h"
    3839#include "TextCheckerState.h"
    39 #include "UnresponsiveWebProcessTerminator.h"
    4040#include "UserData.h"
    4141#include "WebBackForwardListItem.h"
     
    104104    , m_isResponsive(NoOrMaybe::Maybe)
    105105    , 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))
    107107{
    108108    WebPasteboardProxy::singleton().addWebProcessProxy(*this);
  • trunk/Source/WebKit2/UIProcess/WebProcessProxy.h

    r212766 r212832  
    5555namespace WebKit {
    5656
     57class BackgroundProcessResponsivenessTimer;
    5758class NetworkProcessProxy;
    58 class UnresponsiveWebProcessTerminator;
    5959class WebBackForwardListItem;
    6060class WebPageGroup;
     
    256256
    257257    VisibleWebPageCounter m_visiblePageCounter;
    258     std::unique_ptr<UnresponsiveWebProcessTerminator> m_backgroundResponsivenessTimer;
     258    std::unique_ptr<BackgroundProcessResponsivenessTimer> m_backgroundResponsivenessTimer;
    259259};
    260260
  • trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj

    r212757 r212832  
    899899                41FAF5F91E3C1025001AE678 /* LibWebRTCResolver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41FAF5F71E3C0B47001AE678 /* LibWebRTCResolver.cpp */; };
    900900                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 */; };
    903903                4A3CC18A19B063E700D14AEF /* UserMediaPermissionRequestManagerProxy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4A410F3919AF7B04002EBAB5 /* UserMediaPermissionRequestManagerProxy.cpp */; };
    904904                4A3CC18B19B0640F00D14AEF /* UserMediaPermissionRequestManagerProxy.h in Headers */ = {isa = PBXBuildFile; fileRef = 4A410F3A19AF7B04002EBAB5 /* UserMediaPermissionRequestManagerProxy.h */; };
     
    30623062                41FAF5F71E3C0B47001AE678 /* LibWebRTCResolver.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LibWebRTCResolver.cpp; path = Network/webrtc/LibWebRTCResolver.cpp; sourceTree = "<group>"; };
    30633063                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>"; };
    30663066                4A410F3519AF7AC3002EBAB5 /* WKUserMediaPermissionRequest.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKUserMediaPermissionRequest.cpp; sourceTree = "<group>"; };
    30673067                4A410F3619AF7AC3002EBAB5 /* WKUserMediaPermissionRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKUserMediaPermissionRequest.h; sourceTree = "<group>"; };
     
    64806480                                1A53C2A31A325691004E8C70 /* WebsiteData */,
    64816481                                7CD102D91866770600ED429D /* AutoCorrectionCallback.h */,
     6482                                46A2B6061E5675A200C3DEDA /* BackgroundProcessResponsivenessTimer.cpp */,
     6483                                46A2B6071E5675A200C3DEDA /* BackgroundProcessResponsivenessTimer.h */,
    64826484                                E1513C64166EABB200149FCB /* ChildProcessProxy.cpp */,
    64836485                                E1513C65166EABB200149FCB /* ChildProcessProxy.h */,
     
    65156517                                1BB417C912C00CCA002BE67B /* TextCheckerCompletion.cpp */,
    65166518                                1CC417C912C00CCA002BE67B /* TextCheckerCompletion.h */,
    6517                                 46A2B6061E5675A200C3DEDA /* UnresponsiveWebProcessTerminator.cpp */,
    6518                                 46A2B6071E5675A200C3DEDA /* UnresponsiveWebProcessTerminator.h */,
    65196519                                07297F9C1C17BBEA003F0735 /* UserMediaPermissionCheckProxy.cpp */,
    65206520                                07297F9D1C17BBEA003F0735 /* UserMediaPermissionCheckProxy.h */,
     
    80288028                                1A5705111BE410E600874AF1 /* BlockSPI.h in Headers */,
    80298029                                BC3065FA1259344E00E71278 /* CacheModel.h in Headers */,
    8030                                 46A2B6091E5676A600C3DEDA /* UnresponsiveWebProcessTerminator.h in Headers */,
     8030                                46A2B6091E5676A600C3DEDA /* BackgroundProcessResponsivenessTimer.h in Headers */,
    80318031                                1AA2E51D12E4C05E00BC4966 /* CGUtilities.h in Headers */,
    80328032                                1A2D956F12848564001EB962 /* ChildProcess.h in Headers */,
     
    97159715                                5C20CB9D1BB0DCFA00895BB1 /* NetworkSessionCocoa.mm in Sources */,
    97169716                                31A2EC551489982E00810D71 /* NotificationPermissionRequest.cpp in Sources */,
    9717                                 46A2B6081E5676A600C3DEDA /* UnresponsiveWebProcessTerminator.cpp in Sources */,
     9717                                46A2B6081E5676A600C3DEDA /* BackgroundProcessResponsivenessTimer.cpp in Sources */,
    97189718                                3131261E148FF82C00BA2A39 /* NotificationPermissionRequestManager.cpp in Sources */,
    97199719                                31A2EC501489980500810D71 /* NotificationPermissionRequestManagerProxy.cpp in Sources */,
Note: See TracChangeset for help on using the changeset viewer.