Changeset 163108 in webkit


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

Begin fleshing out the navigation delegate
https://bugs.webkit.org/show_bug.cgi?id=127939

Reviewed by Dan Bernstein.

  • UIProcess/API/APIPolicyClient.h:

(API::PolicyClient::decidePolicyForNavigationAction):
Pass the listener as a RefPtr.

  • UIProcess/API/C/WKPage.cpp:

(WKPageSetPagePolicyClient):
Update for API::PolicyClient changes.

  • UIProcess/API/Cocoa/WKNavigationDelegate.h:

Add new delegate.

  • UIProcess/API/Cocoa/WKWebView.mm:

(-[WKWebView initWithFrame:configuration:]):
Set a policy client on the page.

  • UIProcess/Cocoa/NavigationState.h:

Add a new PolicyClient class.

  • UIProcess/Cocoa/NavigationState.mm:

(WebKit::NavigationState::NavigationState):
Initialize m_navigationDelegateMethods.

(WebKit::NavigationState::navigationDelegate):
m_delegate was renamed to m_navigationDelegate.

(WebKit::NavigationState::setNavigationDelegate):
Update m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandler.

(WebKit::NavigationState::createPolicyClient):
New helper function for creating a new policy client.

(WebKit::NavigationState::PolicyClient::decidePolicyForNavigationAction):
Call the navigation delegate method.

  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::decidePolicyForNavigationAction):
Use std::move to hand off the listener to the client.

Location:
trunk/Source/WebKit2
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r163103 r163108  
     12014-01-30  Anders Carlsson  <andersca@apple.com>
     2
     3        Begin fleshing out the navigation delegate
     4        https://bugs.webkit.org/show_bug.cgi?id=127939
     5
     6        Reviewed by Dan Bernstein.
     7
     8        * UIProcess/API/APIPolicyClient.h:
     9        (API::PolicyClient::decidePolicyForNavigationAction):
     10        Pass the listener as a RefPtr.
     11
     12        * UIProcess/API/C/WKPage.cpp:
     13        (WKPageSetPagePolicyClient):
     14        Update for API::PolicyClient changes.
     15
     16        * UIProcess/API/Cocoa/WKNavigationDelegate.h:
     17        Add new delegate.
     18
     19        * UIProcess/API/Cocoa/WKWebView.mm:
     20        (-[WKWebView initWithFrame:configuration:]):
     21        Set a policy client on the page.
     22
     23        * UIProcess/Cocoa/NavigationState.h:
     24        Add a new PolicyClient class.
     25
     26        * UIProcess/Cocoa/NavigationState.mm:
     27        (WebKit::NavigationState::NavigationState):
     28        Initialize m_navigationDelegateMethods.
     29
     30        (WebKit::NavigationState::navigationDelegate):
     31        m_delegate was renamed to m_navigationDelegate.
     32
     33        (WebKit::NavigationState::setNavigationDelegate):
     34        Update m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandler.
     35       
     36        (WebKit::NavigationState::createPolicyClient):
     37        New helper function for creating a new policy client.
     38
     39        (WebKit::NavigationState::PolicyClient::decidePolicyForNavigationAction):
     40        Call the navigation delegate method.
     41
     42        * UIProcess/WebPageProxy.cpp:
     43        (WebKit::WebPageProxy::decidePolicyForNavigationAction):
     44        Use std::move to hand off the listener to the client.
     45
    1462014-01-30  Jeremy Jones  <jeremyj@apple.com>
    247
  • trunk/Source/WebKit2/UIProcess/API/APIPolicyClient.h

    r162964 r163108  
    5252    virtual ~PolicyClient() { }
    5353
    54     virtual void decidePolicyForNavigationAction(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, const WebKit::NavigationActionData&, WebKit::WebFrameProxy* originatingFrame, const WebCore::ResourceRequest& originalRequest, const WebCore::ResourceRequest&, WebKit::WebFramePolicyListenerProxy* listener, API::Object* userData) { listener->use(); }
     54    virtual void decidePolicyForNavigationAction(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, const WebKit::NavigationActionData&, WebKit::WebFrameProxy* originatingFrame, const WebCore::ResourceRequest& originalRequest, const WebCore::ResourceRequest&, RefPtr<WebKit::WebFramePolicyListenerProxy> listener, API::Object* userData) { listener->use(); }
    5555    virtual void decidePolicyForNewWindowAction(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, WebCore::NavigationType, WebKit::WebEvent::Modifiers, WebKit::WebMouseEvent::Button, const WebCore::ResourceRequest&, const WTF::String& frameName, WebKit::WebFramePolicyListenerProxy* listener, API::Object* userData) { listener->use(); }
    5656    virtual void decidePolicyForResponse(WebKit::WebPageProxy*, WebKit::WebFrameProxy*, const WebCore::ResourceResponse&, const WebCore::ResourceRequest&, bool canShowMIMEType, WebKit::WebFramePolicyListenerProxy* listener, API::Object* userData) { listener->use(); }
  • trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp

    r163049 r163108  
    994994
    995995    private:
    996         virtual void decidePolicyForNavigationAction(WebPageProxy* page, WebFrameProxy* frame, const NavigationActionData& navigationActionData, WebFrameProxy* originatingFrame, const WebCore::ResourceRequest& originalResourceRequest, const WebCore::ResourceRequest& resourceRequest, WebFramePolicyListenerProxy* listener, API::Object* userData) override
     996        virtual void decidePolicyForNavigationAction(WebPageProxy* page, WebFrameProxy* frame, const NavigationActionData& navigationActionData, WebFrameProxy* originatingFrame, const WebCore::ResourceRequest& originalResourceRequest, const WebCore::ResourceRequest& resourceRequest, RefPtr<WebFramePolicyListenerProxy> listener, API::Object* userData) override
    997997        {
    998998            if (!m_client.decidePolicyForNavigationAction_deprecatedForUseWithV0 && !m_client.decidePolicyForNavigationAction_deprecatedForUseWithV1 && !m_client.decidePolicyForNavigationAction) {
     
    10051005
    10061006            if (m_client.decidePolicyForNavigationAction_deprecatedForUseWithV0)
    1007                 m_client.decidePolicyForNavigationAction_deprecatedForUseWithV0(toAPI(page), toAPI(frame), toAPI(navigationActionData.navigationType), toAPI(navigationActionData.modifiers), toAPI(navigationActionData.mouseButton), toAPI(request.get()), toAPI(listener), toAPI(userData), m_client.base.clientInfo);
     1007                m_client.decidePolicyForNavigationAction_deprecatedForUseWithV0(toAPI(page), toAPI(frame), toAPI(navigationActionData.navigationType), toAPI(navigationActionData.modifiers), toAPI(navigationActionData.mouseButton), toAPI(request.get()), toAPI(listener.get()), toAPI(userData), m_client.base.clientInfo);
    10081008            else if (m_client.decidePolicyForNavigationAction_deprecatedForUseWithV1)
    1009                 m_client.decidePolicyForNavigationAction_deprecatedForUseWithV1(toAPI(page), toAPI(frame), toAPI(navigationActionData.navigationType), toAPI(navigationActionData.modifiers), toAPI(navigationActionData.mouseButton), toAPI(originatingFrame), toAPI(request.get()), toAPI(listener), toAPI(userData), m_client.base.clientInfo);
     1009                m_client.decidePolicyForNavigationAction_deprecatedForUseWithV1(toAPI(page), toAPI(frame), toAPI(navigationActionData.navigationType), toAPI(navigationActionData.modifiers), toAPI(navigationActionData.mouseButton), toAPI(originatingFrame), toAPI(request.get()), toAPI(listener.get()), toAPI(userData), m_client.base.clientInfo);
    10101010            else
    1011                 m_client.decidePolicyForNavigationAction(toAPI(page), toAPI(frame), toAPI(navigationActionData.navigationType), toAPI(navigationActionData.modifiers), toAPI(navigationActionData.mouseButton), toAPI(originatingFrame), toAPI(originalRequest.get()), toAPI(request.get()), toAPI(listener), toAPI(userData), m_client.base.clientInfo);
     1011                m_client.decidePolicyForNavigationAction(toAPI(page), toAPI(frame), toAPI(navigationActionData.navigationType), toAPI(navigationActionData.modifiers), toAPI(navigationActionData.mouseButton), toAPI(originatingFrame), toAPI(originalRequest.get()), toAPI(request.get()), toAPI(listener.get()), toAPI(userData), m_client.base.clientInfo);
    10121012        }
    10131013
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKNavigationDelegate.h

    r163098 r163108  
    2929#if WK_API_ENABLED
    3030
     31@class WKNavigationAction;
     32@class WKWebView;
     33
     34typedef NS_ENUM(NSInteger, WKNavigationPolicyDecision) {
     35    WKNavigationPolicyDecisionCancel,
     36    WKNavigationPolicyDecisionAllow,
     37    WKNavigationPolicyDecisionDownload
     38};
     39
    3140@protocol WKNavigationDelegate <NSObject>
     41
     42@optional
     43
     44- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationPolicyDecision))decisionHandler;
    3245
    3346@end
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm

    r163098 r163108  
    120120#endif
    121121
     122    _page->setPolicyClient(_navigationState->createPolicyClient());
     123
    122124    return self;
    123125}
  • trunk/Source/WebKit2/UIProcess/Cocoa/NavigationState.h

    r163098 r163108  
    3333#import <wtf/HashMap.h>
    3434#import <wtf/RetainPtr.h>
     35#import "APIPolicyClient.h"
    3536#import "WeakObjCPtr.h"
    3637
     
    4647    ~NavigationState();
    4748
     49    std::unique_ptr<API::PolicyClient> createPolicyClient();
     50
    4851    RetainPtr<id <WKNavigationDelegate> > navigationDelegate();
    4952    void setNavigationDelegate(id <WKNavigationDelegate>);
     
    5255
    5356private:
     57    class PolicyClient : public API::PolicyClient {
     58    public:
     59        explicit PolicyClient(NavigationState&);
     60        ~PolicyClient();
     61
     62    private:
     63        // API::PolicyClient
     64        virtual void decidePolicyForNavigationAction(WebPageProxy*, WebFrameProxy*, const NavigationActionData&, WebFrameProxy* originatingFrame, const WebCore::ResourceRequest& originalRequest, const WebCore::ResourceRequest&, RefPtr<WebFramePolicyListenerProxy>, API::Object* userData) override;
     65
     66        NavigationState& m_navigationState;
     67    };
     68
     69    struct {
     70        bool webViewDecidePolicyForNavigationActionDecisionHandler : 1;
     71    } m_navigationDelegateMethods;
     72
     73    WKWebView *m_webView;
     74    WeakObjCPtr<id <WKNavigationDelegate> > m_navigationDelegate;
     75
    5476    HashMap<uint64_t, RetainPtr<WKNavigation>> m_navigations;
    55 
    56     WeakObjCPtr<id <WKNavigationDelegate> > m_delegate;
    5777};
    5878
  • trunk/Source/WebKit2/UIProcess/Cocoa/NavigationState.mm

    r163098 r163108  
    2929#if WK_API_ENABLED
    3030
     31#import "WKNavigationDelegate.h"
    3132#import "WKNavigationInternal.h"
    3233
     
    3435
    3536NavigationState::NavigationState(WKWebView *webView)
     37    : m_navigationDelegateMethods()
    3638{
    3739}
     
    4345RetainPtr<id <WKNavigationDelegate> > NavigationState::navigationDelegate()
    4446{
    45     return m_delegate.get();
     47    return m_navigationDelegate.get();
    4648}
    4749
    4850void NavigationState::setNavigationDelegate(id <WKNavigationDelegate> delegate)
    4951{
    50     m_delegate = delegate;
     52    m_navigationDelegate = delegate;
     53
     54    m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandler = [delegate respondsToSelector:@selector(webView:decidePolicyForNavigationAction:decisionHandler:)];
    5155}
    5256
     
    6468}
    6569
     70std::unique_ptr<API::PolicyClient> NavigationState::createPolicyClient()
     71{
     72    return std::make_unique<PolicyClient>(*this);
     73}
     74
     75NavigationState::PolicyClient::PolicyClient(NavigationState& navigationState)
     76    : m_navigationState(navigationState)
     77{
     78}
     79
     80NavigationState::PolicyClient::~PolicyClient()
     81{
     82}
     83
     84void NavigationState::PolicyClient::decidePolicyForNavigationAction(WebPageProxy*, WebFrameProxy*, const NavigationActionData&, WebFrameProxy* originatingFrame, const WebCore::ResourceRequest& originalRequest, const WebCore::ResourceRequest&, RefPtr<WebFramePolicyListenerProxy> listener, API::Object* userData)
     85{
     86    if (!m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandler) {
     87        // FIXME: <rdar://problem/15949822> Figure out what the "default delegate behavior" should be here.
     88        listener->use();
     89        return;
     90    }
     91
     92    auto navigationDelegate = m_navigationState.m_navigationDelegate.get();
     93    if (!navigationDelegate)
     94        return;
     95
     96    // FIXME: Set up the navigation action object.
     97    WKNavigationAction *navigationAction = nil;
     98
     99    [navigationDelegate.get() webView:m_navigationState.m_webView decidePolicyForNavigationAction:navigationAction decisionHandler:[listener](WKNavigationPolicyDecision policyDecision) {
     100        switch (policyDecision) {
     101        case WKNavigationPolicyDecisionAllow:
     102            listener->use();
     103            break;
     104
     105        case WKNavigationPolicyDecisionCancel:
     106            listener->ignore();
     107            break;
     108
     109        case WKNavigationPolicyDecisionDownload:
     110            listener->download();
     111            break;
     112        }
     113    }];
     114}
     115
    66116} // namespace WebKit
    67117
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp

    r163093 r163108  
    24532453    m_syncNavigationActionPolicyActionIsValid = false;
    24542454
    2455     m_policyClient->decidePolicyForNavigationAction(this, frame, navigationActionData, originatingFrame, originalRequest, request, listener.get(), userData.get());
     2455    m_policyClient->decidePolicyForNavigationAction(this, frame, navigationActionData, originatingFrame, originalRequest, request, std::move(listener), userData.get());
    24562456
    24572457    m_inDecidePolicyForNavigationAction = false;
Note: See TracChangeset for help on using the changeset viewer.