Changeset 163132 in webkit


Ignore:
Timestamp:
Jan 30, 2014 4:23:23 PM (10 years ago)
Author:
andersca@apple.com
Message:

Add a webView:didStartProvisionalNavigation: delegate method
https://bugs.webkit.org/show_bug.cgi?id=127965

Reviewed by Dan Bernstein.

Source/WebKit2:

  • UIProcess/API/APILoaderClient.h:

(API::LoaderClient::didStartProvisionalLoadForFrame):

  • UIProcess/API/C/WKPage.cpp:

(WKPageSetPageLoaderClient):

  • UIProcess/API/Cocoa/WKNavigationDelegate.h:
  • UIProcess/API/Cocoa/WKWebView.mm:

(-[WKWebView initWithFrame:configuration:]):

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

(WebKit::NavigationState::createLoaderClient):
(WebKit::NavigationState::createPolicyClient):
(WebKit::NavigationState::setNavigationDelegate):
(WebKit::NavigationState::LoaderClient::LoaderClient):
(WebKit::NavigationState::LoaderClient::~LoaderClient):
(WebKit::NavigationState::LoaderClient::didStartProvisionalLoadForFrame):

  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::didStartProvisionalLoadForFrame):

  • UIProcess/WebPageProxy.h:
  • UIProcess/WebPageProxy.messages.in:
  • WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:

(WebKit::WebFrameLoaderClient::dispatchDidStartProvisionalLoad):

Tools:

  • TestWebKitAPI/Tests/WebKit2Cocoa/Navigation.mm:

(-[NavigationDelegate webView:didStartProvisionalNavigation:]):
(TEST):

Location:
trunk
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r163131 r163132  
     12014-01-30  Anders Carlsson  <andersca@apple.com>
     2
     3        Add a webView:didStartProvisionalNavigation: delegate method
     4        https://bugs.webkit.org/show_bug.cgi?id=127965
     5
     6        Reviewed by Dan Bernstein.
     7
     8        * UIProcess/API/APILoaderClient.h:
     9        (API::LoaderClient::didStartProvisionalLoadForFrame):
     10        * UIProcess/API/C/WKPage.cpp:
     11        (WKPageSetPageLoaderClient):
     12        * UIProcess/API/Cocoa/WKNavigationDelegate.h:
     13        * UIProcess/API/Cocoa/WKWebView.mm:
     14        (-[WKWebView initWithFrame:configuration:]):
     15        * UIProcess/Cocoa/NavigationState.h:
     16        * UIProcess/Cocoa/NavigationState.mm:
     17        (WebKit::NavigationState::createLoaderClient):
     18        (WebKit::NavigationState::createPolicyClient):
     19        (WebKit::NavigationState::setNavigationDelegate):
     20        (WebKit::NavigationState::LoaderClient::LoaderClient):
     21        (WebKit::NavigationState::LoaderClient::~LoaderClient):
     22        (WebKit::NavigationState::LoaderClient::didStartProvisionalLoadForFrame):
     23        * UIProcess/WebPageProxy.cpp:
     24        (WebKit::WebPageProxy::didStartProvisionalLoadForFrame):
     25        * UIProcess/WebPageProxy.h:
     26        * UIProcess/WebPageProxy.messages.in:
     27        * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
     28        (WebKit::WebFrameLoaderClient::dispatchDidStartProvisionalLoad):
     29
    1302014-01-30  Brady Eidson  <beidson@apple.com>
    231
  • trunk/Source/WebKit2/UIProcess/API/APILoaderClient.h

    r162883 r163132  
    5454    virtual ~LoaderClient() { }
    5555
    56     virtual void didStartProvisionalLoadForFrame(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, API::Object*) { }
     56    virtual void didStartProvisionalLoadForFrame(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, uint64_t navigationID, API::Object*) { }
    5757    virtual void didReceiveServerRedirectForProvisionalLoadForFrame(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, API::Object*) { }
    5858    virtual void didFailProvisionalLoadWithErrorForFrame(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, const WebCore::ResourceError&, API::Object*) { }
  • trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp

    r163123 r163132  
    693693
    694694    private:
    695         virtual void didStartProvisionalLoadForFrame(WebPageProxy* page, WebFrameProxy* frame, API::Object* userData) override
     695        virtual void didStartProvisionalLoadForFrame(WebPageProxy* page, WebFrameProxy* frame, uint64_t navigationID, API::Object* userData) override
    696696        {
    697697            if (!m_client.didStartProvisionalLoadForFrame)
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKNavigationDelegate.h

    r163112 r163132  
    5252- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicyDecision))decisionHandler;
    5353
     54- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation;
     55
    5456@end
    5557
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm

    r163108 r163132  
    121121
    122122    _page->setPolicyClient(_navigationState->createPolicyClient());
     123    _page->setLoaderClient(_navigationState->createLoaderClient());
    123124
    124125    return self;
  • trunk/Source/WebKit2/UIProcess/Cocoa/NavigationState.h

    r163129 r163132  
    3333#import <wtf/HashMap.h>
    3434#import <wtf/RetainPtr.h>
     35#import "APILoaderClient.h"
    3536#import "APIPolicyClient.h"
    3637#import "WeakObjCPtr.h"
     
    4849
    4950    std::unique_ptr<API::PolicyClient> createPolicyClient();
     51    std::unique_ptr<API::LoaderClient> createLoaderClient();
    5052
    5153    RetainPtr<id <WKNavigationDelegate> > navigationDelegate();
     
    6971    };
    7072
     73    class LoaderClient : public API::LoaderClient {
     74    public:
     75        explicit LoaderClient(NavigationState&);
     76        ~LoaderClient();
     77
     78    private:
     79        virtual void didStartProvisionalLoadForFrame(WebPageProxy*, WebFrameProxy*, uint64_t navigationID, API::Object*) override;
     80
     81        NavigationState& m_navigationState;
     82    };
     83
    7184    struct {
    7285        bool webViewDecidePolicyForNavigationActionDecisionHandler : 1;
    7386        bool webViewDecidePolicyForNavigationResponseDecisionHandler : 1;
     87
     88        bool webViewDidStartProvisionalNavigation : 1;
    7489    } m_navigationDelegateMethods;
    7590
  • trunk/Source/WebKit2/UIProcess/Cocoa/NavigationState.mm

    r163129 r163132  
    3131#import "WKNavigationDelegate.h"
    3232#import "WKNavigationInternal.h"
     33#import "WebFrameProxy.h"
    3334
    3435namespace WebKit {
     
    4142NavigationState::~NavigationState()
    4243{
     44}
     45
     46std::unique_ptr<API::LoaderClient> NavigationState::createLoaderClient()
     47{
     48    return std::make_unique<LoaderClient>(*this);
     49}
     50
     51std::unique_ptr<API::PolicyClient> NavigationState::createPolicyClient()
     52{
     53    return std::make_unique<PolicyClient>(*this);
    4354}
    4455
     
    5465    m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandler = [delegate respondsToSelector:@selector(webView:decidePolicyForNavigationAction:decisionHandler:)];
    5566    m_navigationDelegateMethods.webViewDecidePolicyForNavigationResponseDecisionHandler = [delegate respondsToSelector:@selector(webView:decidePolicyForNavigationResponse:decisionHandler:)];
     67
     68    m_navigationDelegateMethods.webViewDidStartProvisionalNavigation = [delegate respondsToSelector:@selector(webView:didStartProvisionalNavigation:)];
    5669}
    5770
     
    6780
    6881    return navigation;
    69 }
    70 
    71 std::unique_ptr<API::PolicyClient> NavigationState::createPolicyClient()
    72 {
    73     return std::make_unique<PolicyClient>(*this);
    7482}
    7583
     
    152160}
    153161
     162NavigationState::LoaderClient::LoaderClient(NavigationState& navigationState)
     163    : m_navigationState(navigationState)
     164{
     165}
     166
     167NavigationState::LoaderClient::~LoaderClient()
     168{
     169}
     170
     171void NavigationState::LoaderClient::didStartProvisionalLoadForFrame(WebPageProxy*, WebFrameProxy* webFrameProxy, uint64_t navigationID, API::Object*)
     172{
     173    if (!webFrameProxy->isMainFrame())
     174        return;
     175
     176    if (!m_navigationState.m_navigationDelegateMethods.webViewDidStartProvisionalNavigation)
     177        return;
     178
     179    auto navigationDelegate = m_navigationState.m_navigationDelegate.get();
     180    if (!navigationDelegate)
     181        return;
     182
     183    // FIXME: We should assert that navigationID is not zero here, but it's currently zero for navigations originating from the web process.
     184    WKNavigation *navigation = nil;
     185    if (navigationID)
     186        navigation = m_navigationState.m_navigations.get(navigationID).get();
     187
     188    [navigationDelegate.get() webView:m_navigationState.m_webView didStartProvisionalNavigation:navigation];
     189}
     190
    154191} // namespace WebKit
    155192
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp

    r163125 r163132  
    20982098}
    20992099
    2100 void WebPageProxy::didStartProvisionalLoadForFrame(uint64_t frameID, const String& url, const String& unreachableURL, IPC::MessageDecoder& decoder)
     2100void WebPageProxy::didStartProvisionalLoadForFrame(uint64_t frameID, uint64_t navigationID, const String& url, const String& unreachableURL, IPC::MessageDecoder& decoder)
    21012101{
    21022102    auto transaction = m_pageLoadState.transaction();
     
    21222122
    21232123    m_pageLoadState.commitChanges();
    2124     m_loaderClient->didStartProvisionalLoadForFrame(this, frame, userData.get());
     2124    m_loaderClient->didStartProvisionalLoadForFrame(this, frame, navigationID, userData.get());
    21252125}
    21262126
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.h

    r163079 r163132  
    898898    void didCreateSubframe(uint64_t frameID);
    899899
    900     void didStartProvisionalLoadForFrame(uint64_t frameID, const String& url, const String& unreachableURL, IPC::MessageDecoder&);
     900    void didStartProvisionalLoadForFrame(uint64_t frameID, uint64_t navigationID, const String& url, const String& unreachableURL, IPC::MessageDecoder&);
    901901    void didReceiveServerRedirectForProvisionalLoadForFrame(uint64_t frameID, const String&, IPC::MessageDecoder&);
    902902    void didFailProvisionalLoadForFrame(uint64_t frameID, const WebCore::ResourceError&, IPC::MessageDecoder&);
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in

    r162951 r163132  
    131131    DidReceiveServerRedirectForProvisionalLoadForFrame(uint64_t frameID, String url, WebKit::InjectedBundleUserMessageEncoder userData) Variadic
    132132    DidRemoveFrameFromHierarchy(uint64_t frameID, WebKit::InjectedBundleUserMessageEncoder userData) Variadic
    133     DidStartProvisionalLoadForFrame(uint64_t frameID, String url, String unreachableURL, WebKit::InjectedBundleUserMessageEncoder userData) Variadic
     133    DidStartProvisionalLoadForFrame(uint64_t frameID, uint64_t navigationID, String url, String unreachableURL, WebKit::InjectedBundleUserMessageEncoder userData) Variadic
    134134    DidReceiveTitleForFrame(uint64_t frameID, String title, WebKit::InjectedBundleUserMessageEncoder userData) Variadic
    135135    DidDisplayInsecureContentForFrame(uint64_t frameID, WebKit::InjectedBundleUserMessageEncoder userData) Variadic
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp

    r162990 r163132  
    3939#include "WebContextMessages.h"
    4040#include "WebCoreArgumentCoders.h"
     41#include "WebDocumentLoader.h"
    4142#include "WebErrors.h"
    4243#include "WebEvent.h"
     
    395396    webPage->sandboxExtensionTracker().didStartProvisionalLoad(m_frame);
    396397
    397     DocumentLoader* provisionalLoader = m_frame->coreFrame()->loader().provisionalDocumentLoader();
    398     const String& url = provisionalLoader->url().string();
     398    WebDocumentLoader& provisionalLoader = static_cast<WebDocumentLoader&>(*m_frame->coreFrame()->loader().provisionalDocumentLoader());
     399    const String& url = provisionalLoader.url().string();
    399400    RefPtr<API::Object> userData;
    400401
     
    402403    webPage->injectedBundleLoaderClient().didStartProvisionalLoadForFrame(webPage, m_frame, userData);
    403404
    404     String unreachableURL = provisionalLoader->unreachableURL().string();
     405    String unreachableURL = provisionalLoader.unreachableURL().string();
    405406
    406407    // Notify the UIProcess.
    407     webPage->send(Messages::WebPageProxy::DidStartProvisionalLoadForFrame(m_frame->frameID(), url, unreachableURL, InjectedBundleUserMessageEncoder(userData.get())));
     408    webPage->send(Messages::WebPageProxy::DidStartProvisionalLoadForFrame(m_frame->frameID(), provisionalLoader.navigationID(), url, unreachableURL, InjectedBundleUserMessageEncoder(userData.get())));
    408409}
    409410
  • trunk/Tools/ChangeLog

    r163117 r163132  
     12014-01-30  Anders Carlsson  <andersca@apple.com>
     2
     3        Add a webView:didStartProvisionalNavigation: delegate method
     4        https://bugs.webkit.org/show_bug.cgi?id=127965
     5
     6        Reviewed by Dan Bernstein.
     7
     8        * TestWebKitAPI/Tests/WebKit2Cocoa/Navigation.mm:
     9        (-[NavigationDelegate webView:didStartProvisionalNavigation:]):
     10        (TEST):
     11
    1122014-01-30  Chris Fleizach  <cfleizach@apple.com>
    213
  • trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/Navigation.mm

    r163098 r163132  
    3030#import <WebKit2/WKWebView.h>
    3131#import <wtf/RetainPtr.h>
     32#import "PlatformUtilities.h"
    3233#import "Test.h"
    3334
     
    3738@end
    3839
     40static bool isDone;
     41static RetainPtr<WKNavigation> currentNavigation;
     42
    3943@implementation NavigationDelegate
     44
     45- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation
     46{
     47    EXPECT_EQ(currentNavigation, navigation);
     48    EXPECT_NOT_NULL(navigation.request);
     49
     50    isDone = true;
     51}
     52
    4053@end
    4154
     
    5972    RetainPtr<WKWebView> webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
    6073
     74    RetainPtr<NavigationDelegate> delegate = adoptNS([[NavigationDelegate alloc] init]);
     75    [webView setNavigationDelegate:delegate.get()];
     76
    6177    NSURLRequest *request = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"simple" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]];
    6278
    63     WKNavigation *navigation = [webView loadRequest:request];
    64     ASSERT_NOT_NULL(navigation);
    65     ASSERT_TRUE([navigation.request isEqual:request]);
     79    currentNavigation = [webView loadRequest:request];
     80    ASSERT_NOT_NULL(currentNavigation);
     81    ASSERT_TRUE([[currentNavigation request] isEqual:request]);
     82
     83    TestWebKitAPI::Util::run(&isDone);
    6684}
    6785
Note: See TracChangeset for help on using the changeset viewer.