Changeset 222942 in webkit


Ignore:
Timestamp:
Oct 5, 2017 4:14:15 PM (7 years ago)
Author:
achristensen@apple.com
Message:

Add ObjC SPI with userInfo corresponding to WKPageNavigationClient's decidePolicyForNavigationAction, didStartProvisionalNavigation, and didFailNavigation
https://bugs.webkit.org/show_bug.cgi?id=177974
<rdar://problem/22888802>

Reviewed by Tim Horton.

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

(WebKit::NavigationState::setNavigationDelegate):
(WebKit::NavigationState::NavigationClient::decidePolicyForNavigationAction):
(WebKit::NavigationState::NavigationClient::didStartProvisionalNavigation):
(WebKit::NavigationState::NavigationClient::didFailNavigationWithError):

  • UIProcess/Cocoa/UIDelegate.mm:

(WebKit::UIDelegate::ContextMenuClient::menuFromProposedMenu):

Location:
trunk/Source/WebKit
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit/ChangeLog

    r222941 r222942  
     12017-10-05  Alex Christensen  <achristensen@webkit.org>
     2
     3        Add ObjC SPI with userInfo corresponding to WKPageNavigationClient's decidePolicyForNavigationAction, didStartProvisionalNavigation, and didFailNavigation
     4        https://bugs.webkit.org/show_bug.cgi?id=177974
     5        <rdar://problem/22888802>
     6
     7        Reviewed by Tim Horton.
     8
     9        * UIProcess/API/Cocoa/WKNavigationDelegatePrivate.h:
     10        * UIProcess/Cocoa/NavigationState.h:
     11        * UIProcess/Cocoa/NavigationState.mm:
     12        (WebKit::NavigationState::setNavigationDelegate):
     13        (WebKit::NavigationState::NavigationClient::decidePolicyForNavigationAction):
     14        (WebKit::NavigationState::NavigationClient::didStartProvisionalNavigation):
     15        (WebKit::NavigationState::NavigationClient::didFailNavigationWithError):
     16        * UIProcess/Cocoa/UIDelegate.mm:
     17        (WebKit::UIDelegate::ContextMenuClient::menuFromProposedMenu):
     18
    1192017-10-05  John Wilander  <wilander@apple.com>
    220
  • trunk/Source/WebKit/UIProcess/API/Cocoa/WKNavigationDelegatePrivate.h

    r222802 r222942  
    7878- (void)_webViewDidRemoveNavigationGestureSnapshot:(WKWebView *)webView WK_API_AVAILABLE(macosx(10.12), ios(10.0));
    7979- (void)_webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy, _WKWebsitePolicies *))decisionHandler WK_API_AVAILABLE(macosx(10.12.3), ios(10.3));
     80- (void)_webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction userInfo:(id <NSSecureCoding>)userInfo decisionHandler:(void (^)(WKNavigationActionPolicy, _WKWebsitePolicies *))decisionHandler WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
     81- (void)_webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation userInfo:(id <NSSecureCoding>)userInfo WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
     82- (void)_webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error userInfo:(id <NSSecureCoding>)userInfo WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
    8083
    8184- (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));
  • trunk/Source/WebKit/UIProcess/Cocoa/NavigationState.h

    r222802 r222942  
    177177        bool webViewDecidePolicyForNavigationActionDecisionHandler : 1;
    178178        bool webViewDecidePolicyForNavigationActionDecisionHandlerWebsitePolicies : 1;
     179        bool webViewDecidePolicyForNavigationActionUserInfoDecisionHandlerWebsitePolicies : 1;
    179180        bool webViewDecidePolicyForNavigationResponseDecisionHandler : 1;
    180181
    181182        bool webViewDidStartProvisionalNavigation : 1;
     183        bool webViewDidStartProvisionalNavigationUserInfo : 1;
    182184        bool webViewDidReceiveServerRedirectForProvisionalNavigation : 1;
    183185        bool webViewDidFailProvisionalNavigationWithError : 1;
     
    189191        bool webViewDidFinishNavigation : 1;
    190192        bool webViewDidFailNavigationWithError : 1;
     193        bool webViewDidFailNavigationWithErrorUserInfo : 1;
    191194        bool webViewNavigationDidSameDocumentNavigation : 1;
    192195
  • trunk/Source/WebKit/UIProcess/Cocoa/NavigationState.mm

    r222802 r222942  
    142142    m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandler = [delegate respondsToSelector:@selector(webView:decidePolicyForNavigationAction:decisionHandler:)];
    143143    m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandlerWebsitePolicies = [delegate respondsToSelector:@selector(_webView:decidePolicyForNavigationAction:decisionHandler:)];
     144    m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionUserInfoDecisionHandlerWebsitePolicies = [delegate respondsToSelector:@selector(_webView:decidePolicyForNavigationAction:userInfo:decisionHandler:)];
    144145    m_navigationDelegateMethods.webViewDecidePolicyForNavigationResponseDecisionHandler = [delegate respondsToSelector:@selector(webView:decidePolicyForNavigationResponse:decisionHandler:)];
    145146
    146147    m_navigationDelegateMethods.webViewDidStartProvisionalNavigation = [delegate respondsToSelector:@selector(webView:didStartProvisionalNavigation:)];
     148    m_navigationDelegateMethods.webViewDidStartProvisionalNavigationUserInfo = [delegate respondsToSelector:@selector(_webView:didStartProvisionalNavigation:userInfo:)];
    147149    m_navigationDelegateMethods.webViewDidReceiveServerRedirectForProvisionalNavigation = [delegate respondsToSelector:@selector(webView:didReceiveServerRedirectForProvisionalNavigation:)];
    148150    m_navigationDelegateMethods.webViewDidFailProvisionalNavigationWithError = [delegate respondsToSelector:@selector(webView:didFailProvisionalNavigation:withError:)];
     
    150152    m_navigationDelegateMethods.webViewDidFinishNavigation = [delegate respondsToSelector:@selector(webView:didFinishNavigation:)];
    151153    m_navigationDelegateMethods.webViewDidFailNavigationWithError = [delegate respondsToSelector:@selector(webView:didFailNavigation:withError:)];
     154    m_navigationDelegateMethods.webViewDidFailNavigationWithErrorUserInfo = [delegate respondsToSelector:@selector(_webView:didFailNavigation:withError:userInfo:)];
    152155
    153156    m_navigationDelegateMethods.webViewNavigationDidFailProvisionalLoadInSubframeWithError = [delegate respondsToSelector:@selector(_webView:navigation:didFailProvisionalLoadInSubframe:withError:)];
     
    391394}
    392395
    393 void NavigationState::NavigationClient::decidePolicyForNavigationAction(WebPageProxy& webPageProxy, Ref<API::NavigationAction>&& navigationAction, Ref<WebFramePolicyListenerProxy>&& listener, API::Object* userData)
     396void NavigationState::NavigationClient::decidePolicyForNavigationAction(WebPageProxy& webPageProxy, Ref<API::NavigationAction>&& navigationAction, Ref<WebFramePolicyListenerProxy>&& listener, API::Object* userInfo)
    394397{
    395398    String mainFrameURLString = webPageProxy.mainFrame()->url();
    396399
    397400    if (!m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandler
    398         && !m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandlerWebsitePolicies) {
    399         Ref<API::NavigationAction> localNavigationAction = navigationAction.copyRef();
    400         RefPtr<WebFramePolicyListenerProxy> localListener = WTFMove(listener);
    401 
    402         tryAppLink(WTFMove(localNavigationAction), mainFrameURLString, [webPage = RefPtr<WebPageProxy>(&webPageProxy), localListener, localNavigationAction = navigationAction.copyRef()] (bool followedLinkToApp) {
     401        && !m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandlerWebsitePolicies
     402        && !m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionUserInfoDecisionHandlerWebsitePolicies) {
     403        auto completionHandler = [webPage = makeRef(webPageProxy), listener = WTFMove(listener), navigationAction = navigationAction.copyRef()] (bool followedLinkToApp) {
    403404            if (followedLinkToApp) {
    404                 localListener->ignore();
     405                listener->ignore();
    405406                return;
    406407            }
    407408
    408             if (!localNavigationAction->targetFrame()) {
    409                 localListener->use({ });
     409            if (!navigationAction->targetFrame()) {
     410                listener->use({ });
    410411                return;
    411412            }
    412413
    413             RetainPtr<NSURLRequest> nsURLRequest = adoptNS(wrapper(API::URLRequest::create(localNavigationAction->request()).leakRef()));
     414            RetainPtr<NSURLRequest> nsURLRequest = adoptNS(wrapper(API::URLRequest::create(navigationAction->request()).leakRef()));
    414415            if ([NSURLConnection canHandleRequest:nsURLRequest.get()] || webPage->urlSchemeHandlerForScheme([nsURLRequest URL].scheme)) {
    415                 if (localNavigationAction->shouldPerformDownload())
    416                     localListener->download();
     416                if (navigationAction->shouldPerformDownload())
     417                    listener->download();
    417418                else
    418                     localListener->use({ });
     419                    listener->use({ });
    419420                return;
    420421            }
     
    426427                [[NSWorkspace sharedWorkspace] openURL:[nsURLRequest URL]];
    427428#endif
    428             localListener->ignore();
    429         });
    430 
     429            listener->ignore();
     430        };
     431        tryAppLink(WTFMove(navigationAction), mainFrameURLString, WTFMove(completionHandler));
    431432        return;
    432433    }
     
    436437        return;
    437438
    438     bool delegateHasWebsitePolicies = m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandlerWebsitePolicies;
     439    bool delegateHasWebsitePolicies = m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandlerWebsitePolicies || m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionUserInfoDecisionHandlerWebsitePolicies;
    439440   
    440     RefPtr<CompletionHandlerCallChecker> checker = CompletionHandlerCallChecker::create(navigationDelegate.get(), delegateHasWebsitePolicies ? @selector(_webView:decidePolicyForNavigationAction:decisionHandler:) : @selector(webView:decidePolicyForNavigationAction:decisionHandler:));
     441    auto checker = CompletionHandlerCallChecker::create(navigationDelegate.get(), delegateHasWebsitePolicies ? @selector(_webView:decidePolicyForNavigationAction:decisionHandler:) : @selector(webView:decidePolicyForNavigationAction:decisionHandler:));
    441442   
    442443    auto decisionHandlerWithPolicies = [localListener = RefPtr<WebFramePolicyListenerProxy>(WTFMove(listener)), localNavigationAction = navigationAction.copyRef(), checker = WTFMove(checker), mainFrameURLString](WKNavigationActionPolicy actionPolicy, _WKWebsitePolicies *websitePolicies) mutable {
     
    479480    };
    480481   
    481     if (delegateHasWebsitePolicies)
    482         [(id <WKNavigationDelegatePrivate>)navigationDelegate _webView:m_navigationState.m_webView decidePolicyForNavigationAction:wrapper(navigationAction) decisionHandler:BlockPtr<void(WKNavigationActionPolicy, _WKWebsitePolicies *)>::fromCallable(WTFMove(decisionHandlerWithPolicies)).get()];
    483     else {
     482    if (delegateHasWebsitePolicies) {
     483        auto decisionHandler = BlockPtr<void(WKNavigationActionPolicy, _WKWebsitePolicies *)>::fromCallable(WTFMove(decisionHandlerWithPolicies));
     484        if (m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionUserInfoDecisionHandlerWebsitePolicies)
     485            [(id <WKNavigationDelegatePrivate>)navigationDelegate _webView:m_navigationState.m_webView decidePolicyForNavigationAction:wrapper(navigationAction) userInfo:userInfo ? static_cast<id <NSSecureCoding>>(userInfo->wrapper()) : nil decisionHandler:decisionHandler.get()];
     486        else
     487            [(id <WKNavigationDelegatePrivate>)navigationDelegate _webView:m_navigationState.m_webView decidePolicyForNavigationAction:wrapper(navigationAction) decisionHandler:decisionHandler.get()];
     488    } else {
    484489        auto decisionHandlerWithoutPolicies = [decisionHandlerWithPolicies = WTFMove(decisionHandlerWithPolicies)] (WKNavigationActionPolicy actionPolicy) mutable {
    485490            decisionHandlerWithPolicies(actionPolicy, nil);
     
    564569}
    565570
    566 void NavigationState::NavigationClient::didStartProvisionalNavigation(WebPageProxy& page, API::Navigation* navigation, API::Object*)
    567 {
    568     if (!m_navigationState.m_navigationDelegateMethods.webViewDidStartProvisionalNavigation)
     571void NavigationState::NavigationClient::didStartProvisionalNavigation(WebPageProxy& page, API::Navigation* navigation, API::Object* userInfo)
     572{
     573    if (!m_navigationState.m_navigationDelegateMethods.webViewDidStartProvisionalNavigation
     574        && !m_navigationState.m_navigationDelegateMethods.webViewDidStartProvisionalNavigationUserInfo)
    569575        return;
    570576
     
    578584        wkNavigation = wrapper(*navigation);
    579585
    580     [navigationDelegate webView:m_navigationState.m_webView didStartProvisionalNavigation:wkNavigation];
     586    if (m_navigationState.m_navigationDelegateMethods.webViewDidStartProvisionalNavigationUserInfo)
     587        [(id <WKNavigationDelegatePrivate>)navigationDelegate _webView:m_navigationState.m_webView didStartProvisionalNavigation:wkNavigation userInfo:userInfo ? static_cast<id <NSSecureCoding>>(userInfo->wrapper()) : nil];
     588    else
     589        [navigationDelegate webView:m_navigationState.m_webView didStartProvisionalNavigation:wkNavigation];
    581590}
    582591
     
    728737
    729738// FIXME: Shouldn't need to pass the WebFrameProxy in here. At most, a FrameHandle.
    730 void NavigationState::NavigationClient::didFailNavigationWithError(WebPageProxy& page, WebFrameProxy& webFrameProxy, API::Navigation* navigation, const WebCore::ResourceError& error, API::Object* userData)
    731 {
    732     if (!m_navigationState.m_navigationDelegateMethods.webViewDidFailNavigationWithError)
     739void NavigationState::NavigationClient::didFailNavigationWithError(WebPageProxy& page, WebFrameProxy& webFrameProxy, API::Navigation* navigation, const WebCore::ResourceError& error, API::Object* userInfo)
     740{
     741    if (!m_navigationState.m_navigationDelegateMethods.webViewDidFailNavigationWithError
     742        && !m_navigationState.m_navigationDelegateMethods.webViewDidFailNavigationWithErrorUserInfo)
    733743        return;
    734744
     
    743753
    744754    auto errorWithRecoveryAttempter = createErrorWithRecoveryAttempter(m_navigationState.m_webView, webFrameProxy, error);
    745     [navigationDelegate webView:m_navigationState.m_webView didFailNavigation:wkNavigation withError:errorWithRecoveryAttempter.get()];
     755    if (m_navigationState.m_navigationDelegateMethods.webViewDidFailNavigationWithErrorUserInfo)
     756        [(id <WKNavigationDelegatePrivate>)navigationDelegate _webView:m_navigationState.m_webView didFailNavigation:wkNavigation withError:errorWithRecoveryAttempter.get() userInfo:userInfo ? static_cast<id <NSSecureCoding>>(userInfo->wrapper()) : nil];
     757    else
     758        [navigationDelegate webView:m_navigationState.m_webView didFailNavigation:wkNavigation withError:errorWithRecoveryAttempter.get()];
    746759}
    747760
  • trunk/Source/WebKit/UIProcess/Cocoa/UIDelegate.mm

    r222059 r222942  
    189189        return [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView contextMenu:menu forElement:contextMenuElementInfo.get()];
    190190
    191     return [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView contextMenu:menu forElement:contextMenuElementInfo.get() userInfo:static_cast<id <NSSecureCoding>>(userInfo->wrapper())];
     191    return [(id <WKUIDelegatePrivate>)delegate _webView:m_uiDelegate.m_webView contextMenu:menu forElement:contextMenuElementInfo.get() userInfo:userInfo ? static_cast<id <NSSecureCoding>>(userInfo->wrapper()) : nil];
    192192}
    193193#endif
Note: See TracChangeset for help on using the changeset viewer.