Changeset 226610 in webkit


Ignore:
Timestamp:
Jan 8, 2018, 7:27:20 PM (7 years ago)
Author:
achristensen@apple.com
Message:

Add WKNavigationDelegate SPI exposing WebProcess crash reason
https://bugs.webkit.org/show_bug.cgi?id=181410
<rdar://problem/36167199>

Reviewed by Wenson Hsieh.

Source/WebKit:

We exposed it in the C SPI.

  • UIProcess/API/Cocoa/WKNavigationDelegatePrivate.h:
  • UIProcess/Cocoa/NavigationState.h:
  • UIProcess/Cocoa/NavigationState.mm:

(WebKit::NavigationState::setNavigationDelegate):
(WebKit::toWKProcessTerminationReason):
(WebKit::NavigationState::NavigationClient::processDidTerminate):

Tools:

  • TestWebKitAPI/Tests/WebKitCocoa/Navigation.mm:

(-[CrashReasonDelegate _webView:webContentProcessDidTerminateWithReason:]):
(TEST):

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r226609 r226610  
     12018-01-08  Alex Christensen  <achristensen@webkit.org>
     2
     3        Add WKNavigationDelegate SPI exposing WebProcess crash reason
     4        https://bugs.webkit.org/show_bug.cgi?id=181410
     5        <rdar://problem/36167199>
     6
     7        Reviewed by Wenson Hsieh.
     8
     9        We exposed it in the C SPI.
     10
     11        * UIProcess/API/Cocoa/WKNavigationDelegatePrivate.h:
     12        * UIProcess/Cocoa/NavigationState.h:
     13        * UIProcess/Cocoa/NavigationState.mm:
     14        (WebKit::NavigationState::setNavigationDelegate):
     15        (WebKit::toWKProcessTerminationReason):
     16        (WebKit::NavigationState::NavigationClient::processDidTerminate):
     17
    1182018-01-08  Alex Christensen  <achristensen@webkit.org>
    219
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKNavigationDelegatePrivate.h

    r226609 r226610  
    4949#endif
    5050
     51typedef NS_ENUM(NSInteger, _WKProcessTerminationReason) {
     52    _WKProcessTerminationReasonExceededMemoryLimit,
     53    _WKProcessTerminationReasonExceededCPULimit,
     54    _WKProcessTerminationReasonRequestedByClient,
     55    _WKProcessTerminationReasonCrash,
     56} WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
     57
    5158static const WKNavigationActionPolicy _WKNavigationActionPolicyDownload = (WKNavigationActionPolicy)(WKNavigationActionPolicyAllow + 1);
    5259static const WKNavigationActionPolicy WK_API_AVAILABLE(macosx(10.11), ios(9.0)) _WKNavigationActionPolicyAllowWithoutTryingAppLink = (WKNavigationActionPolicy)(WKNavigationActionPolicyAllow + 2);
     
    9097
    9198- (void)_webView:(WKWebView *)webView URL:(NSURL *)url contentRuleListIdentifiers:(NSArray<NSString *> *)identifiers notifications:(NSArray<NSString *> *)notifications WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
     99- (void)_webView:(WKWebView *)webView webContentProcessDidTerminateWithReason:(_WKProcessTerminationReason)reason WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
    92100
    93101#if TARGET_OS_IPHONE
  • trunk/Source/WebKit/UIProcess/Cocoa/NavigationState.h

    r226609 r226610  
    199199        bool webViewDidReceiveAuthenticationChallengeCompletionHandler : 1;
    200200        bool webViewWebContentProcessDidTerminate : 1;
     201        bool webViewWebContentProcessDidTerminateWithReason : 1;
    201202        bool webViewCanAuthenticateAgainstProtectionSpace : 1;
    202203        bool webViewDidReceiveAuthenticationChallenge : 1;
  • trunk/Source/WebKit/UIProcess/Cocoa/NavigationState.mm

    r226609 r226610  
    163163    m_navigationDelegateMethods.webViewDidReceiveAuthenticationChallengeCompletionHandler = [delegate respondsToSelector:@selector(webView:didReceiveAuthenticationChallenge:completionHandler:)];
    164164    m_navigationDelegateMethods.webViewWebContentProcessDidTerminate = [delegate respondsToSelector:@selector(webViewWebContentProcessDidTerminate:)];
     165    m_navigationDelegateMethods.webViewWebContentProcessDidTerminateWithReason = [delegate respondsToSelector:@selector(_webView:webContentProcessDidTerminateWithReason:)];
    165166    m_navigationDelegateMethods.webViewCanAuthenticateAgainstProtectionSpace = [delegate respondsToSelector:@selector(_webView:canAuthenticateAgainstProtectionSpace:)];
    166167    m_navigationDelegateMethods.webViewDidReceiveAuthenticationChallenge = [delegate respondsToSelector:@selector(_webView:didReceiveAuthenticationChallenge:)];
     
    940941}
    941942
    942 void NavigationState::NavigationClient::processDidTerminate(WebPageProxy& page, ProcessTerminationReason)
    943 {
    944     if (!m_navigationState.m_navigationDelegateMethods.webViewWebContentProcessDidTerminate && !m_navigationState.m_navigationDelegateMethods.webViewWebProcessDidCrash)
    945         return;
    946 
    947     auto navigationDelegate = m_navigationState.m_navigationDelegate.get();
    948     if (!navigationDelegate)
    949         return;
     943static _WKProcessTerminationReason wkProcessTerminationReason(ProcessTerminationReason reason)
     944{
     945    switch (reason) {
     946    case ProcessTerminationReason::ExceededMemoryLimit:
     947        return _WKProcessTerminationReasonExceededMemoryLimit;
     948    case ProcessTerminationReason::ExceededCPULimit:
     949        return _WKProcessTerminationReasonExceededCPULimit;
     950    case ProcessTerminationReason::RequestedByClient:
     951        return _WKProcessTerminationReasonRequestedByClient;
     952    case ProcessTerminationReason::Crash:
     953        return _WKProcessTerminationReasonCrash;
     954    }
     955    ASSERT_NOT_REACHED();
     956    return _WKProcessTerminationReasonCrash;
     957}
     958
     959void NavigationState::NavigationClient::processDidTerminate(WebPageProxy& page, ProcessTerminationReason reason)
     960{
     961    if (!m_navigationState.m_navigationDelegateMethods.webViewWebContentProcessDidTerminate
     962        && !m_navigationState.m_navigationDelegateMethods.webViewWebContentProcessDidTerminateWithReason
     963        && !m_navigationState.m_navigationDelegateMethods.webViewWebProcessDidCrash)
     964        return;
     965
     966    auto navigationDelegate = m_navigationState.m_navigationDelegate.get();
     967    if (!navigationDelegate)
     968        return;
     969
     970    if (m_navigationState.m_navigationDelegateMethods.webViewWebContentProcessDidTerminateWithReason) {
     971        [static_cast<id <WKNavigationDelegatePrivate>>(navigationDelegate.get()) _webView:m_navigationState.m_webView webContentProcessDidTerminateWithReason:wkProcessTerminationReason(reason)];
     972        return;
     973    }
    950974
    951975    // We prefer webViewWebContentProcessDidTerminate: over _webViewWebProcessDidCrash:.
     
    955979    }
    956980
    957     if (m_navigationState.m_navigationDelegateMethods.webViewWebProcessDidCrash)
    958         [static_cast<id <WKNavigationDelegatePrivate>>(navigationDelegate.get()) _webViewWebProcessDidCrash:m_navigationState.m_webView];
     981    ASSERT(m_navigationState.m_navigationDelegateMethods.webViewWebProcessDidCrash);
     982    [static_cast<id <WKNavigationDelegatePrivate>>(navigationDelegate.get()) _webViewWebProcessDidCrash:m_navigationState.m_webView];
    959983}
    960984
  • trunk/Tools/ChangeLog

    r226607 r226610  
     12018-01-08  Alex Christensen  <achristensen@webkit.org>
     2
     3        Add WKNavigationDelegate SPI exposing WebProcess crash reason
     4        https://bugs.webkit.org/show_bug.cgi?id=181410
     5        <rdar://problem/36167199>
     6
     7        Reviewed by Wenson Hsieh.
     8
     9        * TestWebKitAPI/Tests/WebKitCocoa/Navigation.mm:
     10        (-[CrashReasonDelegate _webView:webContentProcessDidTerminateWithReason:]):
     11        (TEST):
     12
    1132018-01-08  Alex Christensen  <achristensen@webkit.org>
    214
  • trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/Navigation.mm

    r222944 r226610  
    145145}
    146146
     147@interface CrashReasonDelegate : NSObject <WKNavigationDelegate>
     148@end
     149
     150@implementation CrashReasonDelegate
     151
     152- (void)_webView:(WKWebView *)webView webContentProcessDidTerminateWithReason:(_WKProcessTerminationReason)reason
     153{
     154    EXPECT_EQ(reason, _WKProcessTerminationReasonRequestedByClient);
     155    isDone = true;
     156}
     157
     158@end
     159
     160TEST(WKNavigation, CrashReason)
     161{
     162    auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
     163   
     164    auto delegate = adoptNS([[CrashReasonDelegate alloc] init]);
     165    [webView setNavigationDelegate:delegate.get()];
     166   
     167    [webView loadHTMLString:@"<html>start the web process</html>" baseURL:[NSURL URLWithString:@"https://webkit.org/"]];
     168    [webView _killWebContentProcessAndResetState];
     169   
     170    TestWebKitAPI::Util::run(&isDone);
     171}
     172
    147173@interface DecidePolicyForPageCacheNavigationDelegate : NSObject <WKNavigationDelegate>
    148174@property (nonatomic) BOOL decidedPolicyForBackForwardNavigation;
Note: See TracChangeset for help on using the changeset viewer.