Skip to content
  • akling@apple.com's avatar
    Unload event listeners should prevent Safari from insta-killing the web process on last tab close. · d40ce33a
    akling@apple.com authored
    <http://webkit.org/b/115988>
    <rdar://problem/13870943>
    
    Reviewed by Anders Carlsson.
    
    Source/WebCore:
    
    Add two methods to Chrome (and ChromeClient):
    
        - enableSuddenTermination()
        - disableSuddenTermination()
    
    ..and call these from DOMWindow instead of the free global functions.
    
    For WebKit1, it just calls the NSProcessInfo methods to keep behavior the same.
    For WebKit2, the new methods plumb through the information to the UI process.
    
    Also updated the DOMWindow logic to think in terms of per-DOMWindow sudden termination counters
    instead of a process-global one, since that gets confusing in a WK2 world.
    When a DOMWindow transitions between having/not having unload/beforeunload event listeners,
    we send a notification to the Chrome.
    
    * WebCore.exp.in:
    * WebCore.xcodeproj/project.pbxproj:
    * page/Chrome.h:
    (WebCore::Chrome::enableSuddenTermination):
    (WebCore::Chrome::disableSuddenTermination):
    * page/ChromeClient.h:
    (WebCore::ChromeClient::enableSuddenTermination):
    (WebCore::ChromeClient::disableSuddenTermination):
    * page/DOMWindow.cpp:
    (WebCore::addUnloadEventListener):
    (WebCore::removeUnloadEventListener):
    (WebCore::removeAllUnloadEventListeners):
    (WebCore::addBeforeUnloadEventListener):
    (WebCore::removeBeforeUnloadEventListener):
    (WebCore::removeAllBeforeUnloadEventListeners):
    (WebCore::DOMWindow::dispatchAllPendingBeforeUnloadEvents):
    (WebCore::DOMWindow::dispatchAllPendingUnloadEvents):
    (WebCore::DOMWindow::enableSuddenTermination):
    (WebCore::DOMWindow::disableSuddenTermination):
    * page/DOMWindow.h:
    (DOMWindow):
    
    Source/WebKit/mac:
    
    * WebCoreSupport/WebChromeClient.h:
    * WebCoreSupport/WebChromeClient.mm:
    (WebChromeClient::enableSuddenTermination):
    (WebChromeClient::disableSuddenTermination):
    
    Source/WebKit2:
    
    Let WebCore control the UI process's suppression of the sudden termination mechanism.
    This is implemented by having WebChromeClient push Enable/DisableSuddenTermination messages
    over to the UI process where the appropriate NSProcessInfo calls are made.
    
    We also use this information when deciding whether to insta-kill a web process when its last
    page is closed. This mechanism is re-usable in WebCore to protect against sudden termination
    by the UI process.
    
    * UIProcess/WebProcessProxy.cpp:
    (WebKit::WebProcessProxy::WebProcessProxy):
    (WebKit::WebProcessProxy::removeWebPage):
    (WebKit::WebProcessProxy::enableSuddenTermination):
    (WebKit::WebProcessProxy::disableSuddenTermination):
    * UIProcess/WebProcessProxy.h:
    (WebProcessProxy):
    * UIProcess/WebProcessProxy.messages.in:
    * WebProcess/WebCoreSupport/WebChromeClient.cpp:
    (WebKit::WebChromeClient::enableSuddenTermination):
    (WebKit::WebChromeClient::disableSuddenTermination):
    * WebProcess/WebCoreSupport/WebChromeClient.h:
    (WebChromeClient):
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@149971 268f45cc-cd09-0410-ab3c-d52691b4dbfc
    d40ce33a