Changeset 171027 in webkit


Ignore:
Timestamp:
Jul 12, 2014 1:40:17 PM (10 years ago)
Author:
mitz@apple.com
Message:

[Cocoa] Client is not notified of same-document navigations
https://bugs.webkit.org/show_bug.cgi?id=134855

Reviewed by Sam Weinig.

  • UIProcess/API/APILoaderClient.h:

(API::LoaderClient::didSameDocumentNavigationForFrame): Added navigationID parameter.

  • UIProcess/API/C/WKPage.cpp:

(WKPageSetPageLoaderClient): Ditto.

  • UIProcess/API/Cocoa/WKNavigationDelegatePrivate.h: Added new enum and delegate method.
  • UIProcess/Cocoa/NavigationState.h: Declare override of

API::LoaderClient::didSameDocumentNavigationForFrame. Added flag in
m_navigationDelegateMethods struct.

  • UIProcess/Cocoa/NavigationState.mm:

(WebKit::NavigationState::setNavigationDelegate): Initialize new m_navigationDelegateMethods
flag.
(WebKit::toWKSameDocumentNavigationType): Added this helper to convert from internal to API
values.
(WebKit::NavigationState::LoaderClient::didSameDocumentNavigationForFrame): Override to call
the delegate method, if implemented.

  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::didSameDocumentNavigationForFrame): Added navigationID parameter,
which is forwarded to the client.

  • UIProcess/WebPageProxy.h: Added navigationID parameter.
  • UIProcess/WebPageProxy.messages.in: Ditto.
  • WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:

(WebKit::WebFrameLoaderClient::dispatchDidChangeLocationWithinPage): Send the navigation ID.
(WebKit::WebFrameLoaderClient::dispatchDidPushStateWithinPage): Ditto.
(WebKit::WebFrameLoaderClient::dispatchDidReplaceStateWithinPage): Ditto.
(WebKit::WebFrameLoaderClient::dispatchDidPopStateWithinPage): Ditto.

Location:
trunk/Source/WebKit2
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r171024 r171027  
     12014-07-12  Dan Bernstein  <mitz@apple.com>
     2
     3        [Cocoa] Client is not notified of same-document navigations
     4        https://bugs.webkit.org/show_bug.cgi?id=134855
     5
     6        Reviewed by Sam Weinig.
     7
     8        * UIProcess/API/APILoaderClient.h:
     9        (API::LoaderClient::didSameDocumentNavigationForFrame): Added navigationID parameter.
     10
     11        * UIProcess/API/C/WKPage.cpp:
     12        (WKPageSetPageLoaderClient): Ditto.
     13
     14        * UIProcess/API/Cocoa/WKNavigationDelegatePrivate.h: Added new enum and delegate method.
     15
     16        * UIProcess/Cocoa/NavigationState.h: Declare override of
     17        API::LoaderClient::didSameDocumentNavigationForFrame. Added flag in
     18        m_navigationDelegateMethods struct.
     19        * UIProcess/Cocoa/NavigationState.mm:
     20        (WebKit::NavigationState::setNavigationDelegate): Initialize new m_navigationDelegateMethods
     21        flag.
     22        (WebKit::toWKSameDocumentNavigationType): Added this helper to convert from internal to API
     23        values.
     24        (WebKit::NavigationState::LoaderClient::didSameDocumentNavigationForFrame): Override to call
     25        the delegate method, if implemented.
     26
     27        * UIProcess/WebPageProxy.cpp:
     28        (WebKit::WebPageProxy::didSameDocumentNavigationForFrame): Added navigationID parameter,
     29        which is forwarded to the client.
     30        * UIProcess/WebPageProxy.h: Added navigationID parameter.
     31        * UIProcess/WebPageProxy.messages.in: Ditto.
     32
     33        * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
     34        (WebKit::WebFrameLoaderClient::dispatchDidChangeLocationWithinPage): Send the navigation ID.
     35        (WebKit::WebFrameLoaderClient::dispatchDidPushStateWithinPage): Ditto.
     36        (WebKit::WebFrameLoaderClient::dispatchDidReplaceStateWithinPage): Ditto.
     37        (WebKit::WebFrameLoaderClient::dispatchDidPopStateWithinPage): Ditto.
     38
    1392014-07-12  Oliver Hunt  <oliver@apple.com>
    240
  • trunk/Source/WebKit2/UIProcess/API/APILoaderClient.h

    r170673 r171027  
    6363    virtual void didFinishLoadForFrame(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, uint64_t, API::Object*) { }
    6464    virtual void didFailLoadWithErrorForFrame(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, uint64_t, const WebCore::ResourceError&, API::Object*) { }
    65     virtual void didSameDocumentNavigationForFrame(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, WebKit::SameDocumentNavigationType, API::Object*) { }
     65    virtual void didSameDocumentNavigationForFrame(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, uint64_t, WebKit::SameDocumentNavigationType, API::Object*) { }
    6666    virtual void didReceiveTitleForFrame(WebKit::WebPageProxy*, const WTF::String&, WebKit::WebFrameProxy*, API::Object*) { }
    6767    virtual void didFirstLayoutForFrame(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, API::Object*) { }
  • trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp

    r170856 r171027  
    836836        }
    837837
    838         virtual void didSameDocumentNavigationForFrame(WebPageProxy* page, WebFrameProxy* frame, SameDocumentNavigationType type, API::Object* userData) override
     838        virtual void didSameDocumentNavigationForFrame(WebPageProxy* page, WebFrameProxy* frame, uint64_t, SameDocumentNavigationType type, API::Object* userData) override
    839839        {
    840840            if (!m_client.didSameDocumentNavigationForFrame)
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKNavigationDelegatePrivate.h

    r170157 r171027  
    3535static const WKNavigationResponsePolicy _WKNavigationResponsePolicyBecomeDownload = (WKNavigationResponsePolicy)(WKNavigationResponsePolicyAllow + 1);
    3636
     37typedef NS_ENUM(NSInteger, _WKSameDocumentNavigationType) {
     38    _WKSameDocumentNavigationTypeAnchorNavigation,
     39    _WKSameDocumentNavigationTypeSessionStatePush,
     40    _WKSameDocumentNavigationTypeSessionStateReplace,
     41    _WKSameDocumentNavigationTypeSessionStatePop,
     42} WK_AVAILABLE(10_10, 8_0);
     43
    3744@protocol WKNavigationDelegatePrivate <WKNavigationDelegate>
    3845
     
    4249
    4350- (void)_webView:(WKWebView *)webView navigationDidFinishDocumentLoad:(WKNavigation *)navigation;
     51- (void)_webView:(WKWebView *)webView navigation:(WKNavigation *)navigation didSameDocumentNavigation:(_WKSameDocumentNavigationType)navigationType;
    4452
    4553- (void)_webView:(WKWebView *)webView renderingProgressDidChange:(_WKRenderingProgressEvents)progressEvents;
  • trunk/Source/WebKit2/UIProcess/Cocoa/NavigationState.h

    r170776 r171027  
    103103        virtual void didFinishLoadForFrame(WebPageProxy*, WebFrameProxy*, uint64_t navigationID, API::Object*) override;
    104104        virtual void didFailLoadWithErrorForFrame(WebPageProxy*, WebFrameProxy*, uint64_t navigationID, const WebCore::ResourceError&, API::Object*) override;
     105        virtual void didSameDocumentNavigationForFrame(WebPageProxy*, WebFrameProxy*, uint64_t navigationID, SameDocumentNavigationType, API::Object*) override;
    105106        virtual void didDestroyNavigation(WebKit::WebPageProxy*, uint64_t navigationID) override;
    106107        virtual void didLayout(WebKit::WebPageProxy*, WebCore::LayoutMilestones, API::Object*) override;
     
    150151        bool webViewDidFinishNavigation : 1;
    151152        bool webViewDidFailNavigationWithError : 1;
     153        bool webViewNavigationDidSameDocumentNavigation : 1;
    152154
    153155        bool webViewRenderingProgressDidChange : 1;
  • trunk/Source/WebKit2/UIProcess/Cocoa/NavigationState.mm

    r170845 r171027  
    131131    m_navigationDelegateMethods.webViewNavigationDidFailProvisionalLoadInSubframeWithError = [delegate respondsToSelector:@selector(_webView:navigation:didFailProvisionalLoadInSubframe:withError:)];
    132132    m_navigationDelegateMethods.webViewNavigationDidFinishDocumentLoad = [delegate respondsToSelector:@selector(_webView:navigationDidFinishDocumentLoad:)];
     133    m_navigationDelegateMethods.webViewNavigationDidSameDocumentNavigation = [delegate respondsToSelector:@selector(_webView:navigation:didSameDocumentNavigation:)];
    133134    m_navigationDelegateMethods.webViewRenderingProgressDidChange = [delegate respondsToSelector:@selector(_webView:renderingProgressDidChange:)];
    134135    m_navigationDelegateMethods.webViewDidReceiveAuthenticationChallengeCompletionHandler = [delegate respondsToSelector:@selector(webView:didReceiveAuthenticationChallenge:completionHandler:)];
     
    569570}
    570571
     572static _WKSameDocumentNavigationType toWKSameDocumentNavigationType(SameDocumentNavigationType navigationType)
     573{
     574    switch (navigationType) {
     575    case SameDocumentNavigationAnchorNavigation:
     576        return _WKSameDocumentNavigationTypeAnchorNavigation;
     577    case SameDocumentNavigationSessionStatePush:
     578        return _WKSameDocumentNavigationTypeSessionStatePush;
     579    case SameDocumentNavigationSessionStateReplace:
     580        return _WKSameDocumentNavigationTypeSessionStateReplace;
     581    case SameDocumentNavigationSessionStatePop:
     582        return _WKSameDocumentNavigationTypeSessionStatePop;
     583    }
     584
     585    ASSERT_NOT_REACHED();
     586    return _WKSameDocumentNavigationTypeAnchorNavigation;
     587}
     588
     589void NavigationState::LoaderClient::didSameDocumentNavigationForFrame(WebPageProxy*, WebFrameProxy* webFrameProxy, uint64_t navigationID, SameDocumentNavigationType navigationType, API::Object*)
     590{
     591    if (!webFrameProxy->isMainFrame())
     592        return;
     593
     594    if (!m_navigationState.m_navigationDelegateMethods.webViewNavigationDidSameDocumentNavigation)
     595        return;
     596
     597    auto navigationDelegate = m_navigationState.m_navigationDelegate.get();
     598    if (!navigationDelegate)
     599        return;
     600
     601    // FIXME: We should assert that navigationID is not zero here, but it's currently zero for some navigations through the page cache.
     602    WKNavigation *navigation = nil;
     603    if (navigationID)
     604        navigation = m_navigationState.m_navigations.get(navigationID).get();
     605
     606    [static_cast<id <WKNavigationDelegatePrivate>>(navigationDelegate.get()) _webView:m_navigationState.m_webView navigation:navigation didSameDocumentNavigation:toWKSameDocumentNavigationType(navigationType)];
     607}
     608
    571609void NavigationState::LoaderClient::didDestroyNavigation(WebPageProxy*, uint64_t navigationID)
    572610{
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp

    r170981 r171027  
    26842684}
    26852685
    2686 void WebPageProxy::didSameDocumentNavigationForFrame(uint64_t frameID, uint32_t opaqueSameDocumentNavigationType, const String& url, IPC::MessageDecoder& decoder)
     2686void WebPageProxy::didSameDocumentNavigationForFrame(uint64_t frameID, uint64_t navigationID, uint32_t opaqueSameDocumentNavigationType, const String& url, IPC::MessageDecoder& decoder)
    26872687{
    26882688    RefPtr<API::Object> userData;
     
    27042704
    27052705    m_pageLoadState.commitChanges();
    2706     m_loaderClient->didSameDocumentNavigationForFrame(this, frame, static_cast<SameDocumentNavigationType>(opaqueSameDocumentNavigationType), userData.get());
     2706    m_loaderClient->didSameDocumentNavigationForFrame(this, frame, navigationID, static_cast<SameDocumentNavigationType>(opaqueSameDocumentNavigationType), userData.get());
    27072707}
    27082708
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.h

    r170981 r171027  
    944944    void didFinishLoadForFrame(uint64_t frameID, uint64_t navigationID, IPC::MessageDecoder&);
    945945    void didFailLoadForFrame(uint64_t frameID, uint64_t navigationID, const WebCore::ResourceError&, IPC::MessageDecoder&);
    946     void didSameDocumentNavigationForFrame(uint64_t frameID, uint32_t sameDocumentNavigationType, const String&, IPC::MessageDecoder&);
     946    void didSameDocumentNavigationForFrame(uint64_t frameID, uint64_t navigationID, uint32_t sameDocumentNavigationType, const String&, IPC::MessageDecoder&);
    947947    void didReceiveTitleForFrame(uint64_t frameID, const String&, IPC::MessageDecoder&);
    948948    void didFirstLayoutForFrame(uint64_t frameID, IPC::MessageDecoder&);
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in

    r170782 r171027  
    142142    DidRunInsecureContentForFrame(uint64_t frameID, WebKit::InjectedBundleUserMessageEncoder userData) Variadic
    143143    DidDetectXSSForFrame(uint64_t frameID, WebKit::InjectedBundleUserMessageEncoder userData) Variadic
    144     DidSameDocumentNavigationForFrame(uint64_t frameID, uint32_t type, String url, WebKit::InjectedBundleUserMessageEncoder userData) Variadic
     144    DidSameDocumentNavigationForFrame(uint64_t frameID, uint64_t navigationID, uint32_t type, String url, WebKit::InjectedBundleUserMessageEncoder userData) Variadic
    145145    DidDestroyNavigation(uint64_t navigationID)
    146146
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp

    r171002 r171027  
    329329
    330330    // Notify the UIProcess.
    331     webPage->send(Messages::WebPageProxy::DidSameDocumentNavigationForFrame(m_frame->frameID(), SameDocumentNavigationAnchorNavigation, m_frame->coreFrame()->document()->url().string(), InjectedBundleUserMessageEncoder(userData.get())));
     331    WebDocumentLoader& documentLoader = static_cast<WebDocumentLoader&>(*m_frame->coreFrame()->loader().documentLoader());
     332    webPage->send(Messages::WebPageProxy::DidSameDocumentNavigationForFrame(m_frame->frameID(), documentLoader.navigationID(), SameDocumentNavigationAnchorNavigation, m_frame->coreFrame()->document()->url().string(), InjectedBundleUserMessageEncoder(userData.get())));
    332333}
    333334
     
    344345
    345346    // Notify the UIProcess.
    346     webPage->send(Messages::WebPageProxy::DidSameDocumentNavigationForFrame(m_frame->frameID(), SameDocumentNavigationSessionStatePush, m_frame->coreFrame()->document()->url().string(), InjectedBundleUserMessageEncoder(userData.get())));
     347    WebDocumentLoader& documentLoader = static_cast<WebDocumentLoader&>(*m_frame->coreFrame()->loader().documentLoader());
     348    webPage->send(Messages::WebPageProxy::DidSameDocumentNavigationForFrame(m_frame->frameID(), documentLoader.navigationID(), SameDocumentNavigationSessionStatePush, m_frame->coreFrame()->document()->url().string(), InjectedBundleUserMessageEncoder(userData.get())));
    347349}
    348350
     
    359361
    360362    // Notify the UIProcess.
    361     webPage->send(Messages::WebPageProxy::DidSameDocumentNavigationForFrame(m_frame->frameID(), SameDocumentNavigationSessionStateReplace, m_frame->coreFrame()->document()->url().string(), InjectedBundleUserMessageEncoder(userData.get())));
     363    WebDocumentLoader& documentLoader = static_cast<WebDocumentLoader&>(*m_frame->coreFrame()->loader().documentLoader());
     364    webPage->send(Messages::WebPageProxy::DidSameDocumentNavigationForFrame(m_frame->frameID(), documentLoader.navigationID(), SameDocumentNavigationSessionStateReplace, m_frame->coreFrame()->document()->url().string(), InjectedBundleUserMessageEncoder(userData.get())));
    362365}
    363366
     
    374377
    375378    // Notify the UIProcess.
    376     webPage->send(Messages::WebPageProxy::DidSameDocumentNavigationForFrame(m_frame->frameID(), SameDocumentNavigationSessionStatePop, m_frame->coreFrame()->document()->url().string(), InjectedBundleUserMessageEncoder(userData.get())));
     379    WebDocumentLoader& documentLoader = static_cast<WebDocumentLoader&>(*m_frame->coreFrame()->loader().documentLoader());
     380    webPage->send(Messages::WebPageProxy::DidSameDocumentNavigationForFrame(m_frame->frameID(), documentLoader.navigationID(), SameDocumentNavigationSessionStatePop, m_frame->coreFrame()->document()->url().string(), InjectedBundleUserMessageEncoder(userData.get())));
    377381}
    378382
Note: See TracChangeset for help on using the changeset viewer.