Changeset 159358 in webkit


Ignore:
Timestamp:
Nov 15, 2013 2:22:30 PM (10 years ago)
Author:
mitz@apple.com
Message:

Give the policy client the originating frame of a navigation action
https://bugs.webkit.org/show_bug.cgi?id=124431

Reviewed by Anders Carlsson.

Source/WebKit2:

  • Platform/CoreIPC/HandleMessage.h:

(CoreIPC::callMemberFunction): Added a seventh message parameter to this template.

  • Shared/APIClientTraits.cpp: Defined API traits for WKPagePolicyClient, which now has two

versions.

  • Shared/APIClientTraits.h: Declared APIClientTraits<WKPagePolicyClient>.
  • UIProcess/API/C/WKPage.h: Added an originatingFrame parameter to

WKPageDecidePolicyForNavigationActionCallback and deprecated the old version. Bumped the
policy client version to 1.

  • UIProcess/API/mac/WKBrowsingContextController.mm:

(setUpPagePolicyClient): Include the originating frame’s URL under the a new key in the
action information dictionary.

  • UIProcess/API/mac/WKBrowsingContextPolicyDelegate.h: Declared

WKActionOriginatingFrameURLKey.

  • UIProcess/WebInspectorProxy.cpp:

(WebKit::decidePolicyForNavigationAction): Added originatingFrame parameter.
(WebKit::WebInspectorProxy::createInspectorPage): Updated to the new version of the policy
client interface.

  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::decidePolicyForNavigationAction): Added originatingFrameID parameter
and passing the originating frame to the policy client.

  • UIProcess/WebPageProxy.h:
  • UIProcess/WebPageProxy.messages.in: Added originatingFrameID paremeter to

DecidePolicyForNavigationAction.

  • UIProcess/WebPolicyClient.cpp:

(WebKit::WebPolicyClient::decidePolicyForNavigationAction): Added originatingFrame
parameter, which is passed to the client callback.

  • UIProcess/WebPolicyClient.h:
  • WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:

(WebKit::WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction): Determine the
originating frame for link activation and form submission actions and send its ID in the
DecidePolicyForNavigationAction message.

Tools:

  • MiniBrowser/mac/WK2BrowserWindowController.m:

(decidePolicyForNavigationAction): Added originatingFrame parameter.
(-[WK2BrowserWindowController awakeFromNib]): Updated for the new version of the policy
client.

  • TestWebKitAPI/Tests/WebKit2/DownloadDecideDestinationCrash.cpp:

(TestWebKitAPI::decidePolicyForNavigationAction): Added originatingFrame parameter.
(TestWebKitAPI::setPagePolicyClient): Updated for the new version of the policy client.

  • TestWebKitAPI/Tests/WebKit2/PageLoadBasic.cpp:

(TestWebKitAPI::decidePolicyForNavigationAction): Added originatingFrame parameter.
(TestWebKitAPI::TEST): Updated for the new version of the policy client.

  • WebKitTestRunner/TestController.cpp:

(WTR::TestController::createWebViewWithOptions): Updated for the new version of the policy
client.
(WTR::TestController::decidePolicyForNavigationAction): Added originatingFrame parameter.

  • WebKitTestRunner/TestController.h:
Location:
trunk
Files:
20 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r159353 r159358  
     12013-11-15  Dan Bernstein  <mitz@apple.com>
     2
     3        Give the policy client the originating frame of a navigation action
     4        https://bugs.webkit.org/show_bug.cgi?id=124431
     5
     6        Reviewed by Anders Carlsson.
     7
     8        * Platform/CoreIPC/HandleMessage.h:
     9        (CoreIPC::callMemberFunction): Added a seventh message parameter to this template.
     10
     11        * Shared/APIClientTraits.cpp: Defined API traits for WKPagePolicyClient, which now has two
     12        versions.
     13        * Shared/APIClientTraits.h: Declared APIClientTraits<WKPagePolicyClient>.
     14
     15        * UIProcess/API/C/WKPage.h: Added an originatingFrame parameter to
     16        WKPageDecidePolicyForNavigationActionCallback and deprecated the old version. Bumped the
     17        policy client version to 1.
     18
     19        * UIProcess/API/mac/WKBrowsingContextController.mm:
     20        (setUpPagePolicyClient): Include the originating frame’s URL under the a new key in the
     21        action information dictionary.
     22        * UIProcess/API/mac/WKBrowsingContextPolicyDelegate.h: Declared
     23        WKActionOriginatingFrameURLKey.
     24
     25        * UIProcess/WebInspectorProxy.cpp:
     26        (WebKit::decidePolicyForNavigationAction): Added originatingFrame parameter.
     27        (WebKit::WebInspectorProxy::createInspectorPage): Updated to the new version of the policy
     28        client interface.
     29
     30        * UIProcess/WebPageProxy.cpp:
     31        (WebKit::WebPageProxy::decidePolicyForNavigationAction): Added originatingFrameID parameter
     32        and passing the originating frame to the policy client.
     33        * UIProcess/WebPageProxy.h:
     34        * UIProcess/WebPageProxy.messages.in: Added originatingFrameID paremeter to
     35        DecidePolicyForNavigationAction.
     36
     37        * UIProcess/WebPolicyClient.cpp:
     38        (WebKit::WebPolicyClient::decidePolicyForNavigationAction): Added originatingFrame
     39        parameter, which is passed to the client callback.
     40        * UIProcess/WebPolicyClient.h:
     41
     42        * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
     43        (WebKit::WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction): Determine the
     44        originating frame for link activation and form submission actions and send its ID in the
     45        DecidePolicyForNavigationAction message.
     46
    1472013-11-15  Brady Eidson  <beidson@apple.com>
    248
  • trunk/Source/WebKit2/Platform/CoreIPC/HandleMessage.h

    r156420 r159358  
    359359}
    360360
    361 template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename R1, typename R2, typename R3>
    362 void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6>&& args, MessageDecoder& decoder, std::tuple<R1, R2, R3>& replyArgs, C* object, MF function)
    363 {
    364     (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), decoder, std::get<0>(replyArgs), std::get<1>(replyArgs), std::get<2>(replyArgs));
     361template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename R1, typename R2, typename R3>
     362void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6, P7>&& args, MessageDecoder& decoder, std::tuple<R1, R2, R3>& replyArgs, C* object, MF function)
     363{
     364    (object->*function)(std::get<0>(args), std::get<1>(args), std::get<2>(args), std::get<3>(args), std::get<4>(args), std::get<5>(args), std::get<6>(args), decoder, std::get<0>(replyArgs), std::get<1>(replyArgs), std::get<2>(replyArgs));
    365365}
    366366
  • trunk/Source/WebKit2/Shared/APIClientTraits.cpp

    r158689 r159358  
    7272};
    7373
     74const size_t APIClientTraits<WKPagePolicyClient>::interfaceSizesByVersion[] = {
     75    offsetof(WKPagePolicyClient, decidePolicyForNavigationAction),
     76    sizeof(WKPagePolicyClient)
     77};
     78
    7479const size_t APIClientTraits<WKPageUIClient>::interfaceSizesByVersion[] = {
    7580    offsetof(WKPageUIClient, createNewPage),
  • trunk/Source/WebKit2/Shared/APIClientTraits.h

    r158689 r159358  
    6969};
    7070
     71template<> struct APIClientTraits<WKPagePolicyClient> {
     72    static const size_t interfaceSizesByVersion[2];
     73};
     74
    7175template<> struct APIClientTraits<WKPageUIClient> {
    7276    static const size_t interfaceSizesByVersion[3];
  • trunk/Source/WebKit2/UIProcess/API/C/WKPage.h

    r159059 r159358  
    149149
    150150// Policy Client.
    151 typedef void (*WKPageDecidePolicyForNavigationActionCallback)(WKPageRef page, WKFrameRef frame, WKFrameNavigationType navigationType, WKEventModifiers modifiers, WKEventMouseButton mouseButton, WKURLRequestRef request, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo);
     151typedef void (*WKPageDecidePolicyForNavigationActionCallback)(WKPageRef page, WKFrameRef frame, WKFrameNavigationType navigationType, WKEventModifiers modifiers, WKEventMouseButton mouseButton, WKFrameRef originatingFrame, WKURLRequestRef request, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo);
    152152typedef void (*WKPageDecidePolicyForNewWindowActionCallback)(WKPageRef page, WKFrameRef frame, WKFrameNavigationType navigationType, WKEventModifiers modifiers, WKEventMouseButton mouseButton, WKURLRequestRef request, WKStringRef frameName, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo);
    153153typedef void (*WKPageDecidePolicyForResponseCallback)(WKPageRef page, WKFrameRef frame, WKURLResponseRef response, WKURLRequestRef request, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo);
    154154typedef void (*WKPageUnableToImplementPolicyCallback)(WKPageRef page, WKFrameRef frame, WKErrorRef error, WKTypeRef userData, const void* clientInfo);
    155155
     156// Deprecated
     157typedef void (*WKPageDecidePolicyForNavigationActionCallback_deprecatedForUseWithV0)(WKPageRef page, WKFrameRef frame, WKFrameNavigationType navigationType, WKEventModifiers modifiers, WKEventMouseButton mouseButton, WKURLRequestRef request, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo);
     158
    156159struct WKPagePolicyClient {
    157     int                                                                 version;
    158     const void *                                                        clientInfo;
    159     WKPageDecidePolicyForNavigationActionCallback                       decidePolicyForNavigationAction;
    160     WKPageDecidePolicyForNewWindowActionCallback                        decidePolicyForNewWindowAction;
    161     WKPageDecidePolicyForResponseCallback                               decidePolicyForResponse;
    162     WKPageUnableToImplementPolicyCallback                               unableToImplementPolicy;
     160    int                                                                  version;
     161    const void *                                                         clientInfo;
     162    WKPageDecidePolicyForNavigationActionCallback_deprecatedForUseWithV0 decidePolicyForNavigationAction_deprecatedForUseWithV0;
     163    WKPageDecidePolicyForNewWindowActionCallback                         decidePolicyForNewWindowAction;
     164    WKPageDecidePolicyForResponseCallback                                decidePolicyForResponse;
     165    WKPageUnableToImplementPolicyCallback                                unableToImplementPolicy;
     166
     167    // Version 1
     168    WKPageDecidePolicyForNavigationActionCallback                        decidePolicyForNavigationAction;
    163169};
    164170typedef struct WKPagePolicyClient WKPagePolicyClient;
    165171
    166 enum { kWKPagePolicyClientCurrentVersion = 0 };
     172enum { kWKPagePolicyClientCurrentVersion = 1 };
    167173
    168174// Form Client.
  • trunk/Source/WebKit2/UIProcess/API/mac/WKBrowsingContextController.mm

    r159322 r159358  
    8282NSString * const WKActionURLResponseKey = @"WKActionURLResponseKey";
    8383NSString * const WKActionFrameNameKey = @"WKActionFrameNameKey";
     84NSString * const WKActionOriginatingFrameURLKey = @"WKActionOriginatingFrameURLKey";
    8485
    8586@interface WKBrowsingContextControllerData : NSObject {
     
    623624    policyClient.clientInfo = browsingContext;
    624625
    625     policyClient.decidePolicyForNavigationAction = [](WKPageRef page, WKFrameRef frame, WKFrameNavigationType navigationType, WKEventModifiers modifiers, WKEventMouseButton mouseButton, WKURLRequestRef request, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo)
     626    policyClient.decidePolicyForNavigationAction = [](WKPageRef page, WKFrameRef frame, WKFrameNavigationType navigationType, WKEventModifiers modifiers, WKEventMouseButton mouseButton, WKFrameRef originatingFrame, WKURLRequestRef request, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo)
    626627    {
    627628        WKBrowsingContextController *browsingContext = (WKBrowsingContextController *)clientInfo;
     
    634635                WKActionURLRequestKey: adoptNS(WKURLRequestCopyNSURLRequest(request)).get()
    635636            };
     637
     638            if (originatingFrame) {
     639                actionDictionary = [[actionDictionary mutableCopy] autorelease];
     640                [(NSMutableDictionary *)actionDictionary setObject:[NSURL _web_URLWithWTFString:toImpl(originatingFrame)->url() relativeToURL:nil] forKey:WKActionOriginatingFrameURLKey];
     641            }
    636642           
    637643            [browsingContext.policyDelegate browsingContextController:browsingContext decidePolicyForNavigationAction:actionDictionary decisionHandler:makePolicyDecisionBlock(listener)];
  • trunk/Source/WebKit2/UIProcess/API/mac/WKBrowsingContextPolicyDelegate.h

    r159309 r159358  
    2929
    3030/* Constants for policy action dictionaries */
    31 WK_EXPORT extern NSString * const WKActionIsMainFrameKey;    // NSNumber (BOOL)
    32 WK_EXPORT extern NSString * const WKActionNavigationTypeKey; // NSNumber (WKNavigationType)
    33 WK_EXPORT extern NSString * const WKActionMouseButtonKey;    // NSNumber (0 for left button, 1 for middle button, 2 for right button)
    34 WK_EXPORT extern NSString * const WKActionModifierFlagsKey;  // NSNumber (unsigned)
    35 WK_EXPORT extern NSString * const WKActionURLRequestKey;     // NSURLRequest
    36 WK_EXPORT extern NSString * const WKActionURLResponseKey;    // NSURLResponse
    37 WK_EXPORT extern NSString * const WKActionFrameNameKey;      // NSString
     31WK_EXPORT extern NSString * const WKActionIsMainFrameKey;         // NSNumber (BOOL)
     32WK_EXPORT extern NSString * const WKActionNavigationTypeKey;      // NSNumber (WKNavigationType)
     33WK_EXPORT extern NSString * const WKActionMouseButtonKey;         // NSNumber (0 for left button, 1 for middle button, 2 for right button)
     34WK_EXPORT extern NSString * const WKActionModifierFlagsKey;       // NSNumber (unsigned)
     35WK_EXPORT extern NSString * const WKActionURLRequestKey;          // NSURLRequest
     36WK_EXPORT extern NSString * const WKActionURLResponseKey;         // NSURLResponse
     37WK_EXPORT extern NSString * const WKActionFrameNameKey;           // NSString
     38WK_EXPORT extern NSString * const WKActionOriginatingFrameURLKey; // NSURL
    3839
    3940typedef NS_ENUM(NSUInteger, WKNavigationType) {
  • trunk/Source/WebKit2/UIProcess/WebInspectorProxy.cpp

    r159090 r159358  
    373373}
    374374
    375 static void decidePolicyForNavigationAction(WKPageRef, WKFrameRef frameRef, WKFrameNavigationType, WKEventModifiers, WKEventMouseButton, WKURLRequestRef requestRef, WKFramePolicyListenerRef listenerRef, WKTypeRef, const void* clientInfo)
     375static void decidePolicyForNavigationAction(WKPageRef, WKFrameRef frameRef, WKFrameNavigationType, WKEventModifiers, WKEventMouseButton, WKFrameRef, WKURLRequestRef requestRef, WKFramePolicyListenerRef listenerRef, WKTypeRef, const void* clientInfo)
    376376{
    377377    // Allow non-main frames to navigate anywhere.
     
    442442        kWKPagePolicyClientCurrentVersion,
    443443        this, /* clientInfo */
    444         decidePolicyForNavigationAction,
     444        0, /* decidePolicyForNavigationAction_deprecatedForUseWithV0 */
    445445        0, /* decidePolicyForNewWindowAction */
    446446        0, /* decidePolicyForResponse */
    447         0 /* unableToImplementPolicy */
     447        0, /* unableToImplementPolicy */
     448        decidePolicyForNavigationAction
    448449    };
    449450
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp

    r159333 r159358  
    24042404
    24052405// PolicyClient
    2406 void WebPageProxy::decidePolicyForNavigationAction(uint64_t frameID, uint32_t opaqueNavigationType, uint32_t opaqueModifiers, int32_t opaqueMouseButton, const ResourceRequest& request, uint64_t listenerID, CoreIPC::MessageDecoder& decoder, bool& receivedPolicyAction, uint64_t& policyAction, uint64_t& downloadID)
     2406void WebPageProxy::decidePolicyForNavigationAction(uint64_t frameID, uint32_t opaqueNavigationType, uint32_t opaqueModifiers, int32_t opaqueMouseButton, uint64_t originatingFrameID, const ResourceRequest& request, uint64_t listenerID, CoreIPC::MessageDecoder& decoder, bool& receivedPolicyAction, uint64_t& policyAction, uint64_t& downloadID)
    24072407{
    24082408    RefPtr<API::Object> userData;
     
    24212421    WebEvent::Modifiers modifiers = static_cast<WebEvent::Modifiers>(opaqueModifiers);
    24222422    WebMouseEvent::Button mouseButton = static_cast<WebMouseEvent::Button>(opaqueMouseButton);
     2423    WebFrameProxy* originatingFrame = m_process->webFrame(originatingFrameID);
    24232424   
    24242425    RefPtr<WebFramePolicyListenerProxy> listener = frame->setUpPolicyListenerProxy(listenerID);
     
    24292430    m_syncNavigationActionPolicyActionIsValid = false;
    24302431   
    2431     if (!m_policyClient.decidePolicyForNavigationAction(this, frame, navigationType, modifiers, mouseButton, request, listener.get(), userData.get()))
     2432    if (!m_policyClient.decidePolicyForNavigationAction(this, frame, navigationType, modifiers, mouseButton, originatingFrame, request, listener.get(), userData.get()))
    24322433        listener->use();
    24332434
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.h

    r159234 r159358  
    790790    void didFinishProgress();
    791791
    792     void decidePolicyForNavigationAction(uint64_t frameID, uint32_t navigationType, uint32_t modifiers, int32_t mouseButton, const WebCore::ResourceRequest&, uint64_t listenerID, CoreIPC::MessageDecoder&, bool& receivedPolicyAction, uint64_t& policyAction, uint64_t& downloadID);
     792    void decidePolicyForNavigationAction(uint64_t frameID, uint32_t navigationType, uint32_t modifiers, int32_t mouseButton, uint64_t originatingFrameID, const WebCore::ResourceRequest&, uint64_t listenerID, CoreIPC::MessageDecoder&, bool& receivedPolicyAction, uint64_t& policyAction, uint64_t& downloadID);
    793793    void decidePolicyForNewWindowAction(uint64_t frameID, uint32_t navigationType, uint32_t modifiers, int32_t mouseButton, const WebCore::ResourceRequest&, const String& frameName, uint64_t listenerID, CoreIPC::MessageDecoder&);
    794794    void decidePolicyForResponse(uint64_t frameID, const WebCore::ResourceResponse&, const WebCore::ResourceRequest&, uint64_t listenerID, CoreIPC::MessageDecoder&);
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in

    r159201 r159358  
    9898    # Policy messages
    9999    DecidePolicyForResponseSync(uint64_t frameID, WebCore::ResourceResponse response, WebCore::ResourceRequest request, uint64_t listenerID, WebKit::InjectedBundleUserMessageEncoder userData) -> (bool receivedPolicyAction, uint64_t policyAction, uint64_t downloadID) Variadic
    100     DecidePolicyForNavigationAction(uint64_t frameID, uint32_t navigationType, uint32_t modifiers, int32_t mouseButton, WebCore::ResourceRequest request, uint64_t listenerID, WebKit::InjectedBundleUserMessageEncoder userData) -> (bool receivedPolicyAction, uint64_t policyAction, uint64_t downloadID) Variadic
     100    DecidePolicyForNavigationAction(uint64_t frameID, uint32_t navigationType, uint32_t modifiers, int32_t mouseButton, uint64_t originatingFrameID, WebCore::ResourceRequest request, uint64_t listenerID, WebKit::InjectedBundleUserMessageEncoder userData) -> (bool receivedPolicyAction, uint64_t policyAction, uint64_t downloadID) Variadic
    101101    DecidePolicyForNewWindowAction(uint64_t frameID, uint32_t navigationType, uint32_t modifiers, int32_t mouseButton, WebCore::ResourceRequest request, WTF::String frameName, uint64_t listenerID, WebKit::InjectedBundleUserMessageEncoder userData) Variadic
    102102    UnableToImplementPolicy(uint64_t frameID, WebCore::ResourceError error, WebKit::InjectedBundleUserMessageEncoder userData)  Variadic
  • trunk/Source/WebKit2/UIProcess/WebPolicyClient.cpp

    r159163 r159358  
    3535namespace WebKit {
    3636
    37 bool WebPolicyClient::decidePolicyForNavigationAction(WebPageProxy* page, WebFrameProxy* frame, NavigationType type, WebEvent::Modifiers modifiers, WebMouseEvent::Button mouseButton, const ResourceRequest& resourceRequest, WebFramePolicyListenerProxy* listener, API::Object* userData)
     37bool WebPolicyClient::decidePolicyForNavigationAction(WebPageProxy* page, WebFrameProxy* frame, NavigationType type, WebEvent::Modifiers modifiers, WebMouseEvent::Button mouseButton, WebFrameProxy* originatingFrame, const ResourceRequest& resourceRequest, WebFramePolicyListenerProxy* listener, API::Object* userData)
    3838{
    39     if (!m_client.decidePolicyForNavigationAction)
     39    if (!m_client.decidePolicyForNavigationAction_deprecatedForUseWithV0 && !m_client.decidePolicyForNavigationAction)
    4040        return false;
    4141
    4242    RefPtr<WebURLRequest> request = WebURLRequest::create(resourceRequest);
    4343
    44     m_client.decidePolicyForNavigationAction(toAPI(page), toAPI(frame), toAPI(type), toAPI(modifiers), toAPI(mouseButton), toAPI(request.get()), toAPI(listener), toAPI(userData), m_client.clientInfo);
     44    if (m_client.decidePolicyForNavigationAction_deprecatedForUseWithV0)
     45        m_client.decidePolicyForNavigationAction_deprecatedForUseWithV0(toAPI(page), toAPI(frame), toAPI(type), toAPI(modifiers), toAPI(mouseButton), toAPI(request.get()), toAPI(listener), toAPI(userData), m_client.clientInfo);
     46    else
     47        m_client.decidePolicyForNavigationAction(toAPI(page), toAPI(frame), toAPI(type), toAPI(modifiers), toAPI(mouseButton), toAPI(originatingFrame), toAPI(request.get()), toAPI(listener), toAPI(userData), m_client.clientInfo);
     48
    4549    return true;
    4650}
  • trunk/Source/WebKit2/UIProcess/WebPolicyClient.h

    r159163 r159358  
    5151class WebPolicyClient : public APIClient<WKPagePolicyClient, kWKPagePolicyClientCurrentVersion> {
    5252public:
    53     bool decidePolicyForNavigationAction(WebPageProxy*, WebFrameProxy*, WebCore::NavigationType, WebEvent::Modifiers, WebMouseEvent::Button, const WebCore::ResourceRequest&, WebFramePolicyListenerProxy*, API::Object* userData);
     53    bool decidePolicyForNavigationAction(WebPageProxy*, WebFrameProxy*, WebCore::NavigationType, WebEvent::Modifiers, WebMouseEvent::Button, WebFrameProxy* originatingFrame, const WebCore::ResourceRequest&, WebFramePolicyListenerProxy*, API::Object* userData);
    5454    bool decidePolicyForNewWindowAction(WebPageProxy*, WebFrameProxy*, WebCore::NavigationType, WebEvent::Modifiers, WebMouseEvent::Button, const WebCore::ResourceRequest&, const String& frameName, WebFramePolicyListenerProxy*, API::Object* userData);
    5555    bool decidePolicyForResponse(WebPageProxy*, WebFrameProxy*, const WebCore::ResourceResponse&, const WebCore::ResourceRequest&, WebFramePolicyListenerProxy*, API::Object* userData);
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp

    r159163 r159358  
    677677}
    678678
    679 void WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction(const NavigationAction& navigationAction, const ResourceRequest& request, PassRefPtr<FormState> formState, FramePolicyFunction function)
     679void WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction(const NavigationAction& navigationAction, const ResourceRequest& request, PassRefPtr<FormState> prpFormState, FramePolicyFunction function)
    680680{
    681681    WebPage* webPage = m_frame->page();
     
    690690
    691691    RefPtr<API::Object> userData;
     692    RefPtr<FormState> formState = prpFormState;
    692693
    693694    RefPtr<InjectedBundleNavigationAction> action = InjectedBundleNavigationAction::create(m_frame, navigationAction, formState);
     
    705706    uint64_t downloadID;
    706707
     708    RefPtr<WebFrame> originatingFrame;
     709    switch (action->navigationType()) {
     710    case NavigationTypeLinkClicked:
     711        originatingFrame = action->hitTestResult()->frame();
     712        break;
     713    case NavigationTypeFormSubmitted:
     714    case NavigationTypeFormResubmitted:
     715        if (formState) {
     716            if (WebFrameLoaderClient* originatingFrameLoaderClient = toWebFrameLoaderClient(formState->sourceDocument()->frame()->loader().client()))
     717                originatingFrame = originatingFrameLoaderClient->webFrame();
     718        }
     719        break;
     720    case NavigationTypeBackForward:
     721    case NavigationTypeReload:
     722    case NavigationTypeOther:
     723        break;
     724    }
     725
    707726    // Notify the UIProcess.
    708     if (!webPage->sendSync(Messages::WebPageProxy::DecidePolicyForNavigationAction(m_frame->frameID(), action->navigationType(), action->modifiers(), action->mouseButton(), request, listenerID, InjectedBundleUserMessageEncoder(userData.get())), Messages::WebPageProxy::DecidePolicyForNavigationAction::Reply(receivedPolicyAction, policyAction, downloadID)))
     727    if (!webPage->sendSync(Messages::WebPageProxy::DecidePolicyForNavigationAction(m_frame->frameID(), action->navigationType(), action->modifiers(), action->mouseButton(), originatingFrame ? originatingFrame->frameID() : 0, request, listenerID, InjectedBundleUserMessageEncoder(userData.get())), Messages::WebPageProxy::DecidePolicyForNavigationAction::Reply(receivedPolicyAction, policyAction, downloadID)))
    709728        return;
    710729
  • trunk/Tools/ChangeLog

    r159352 r159358  
     12013-11-15  Dan Bernstein  <mitz@apple.com>
     2
     3        Give the policy client the originating frame of a navigation action
     4        https://bugs.webkit.org/show_bug.cgi?id=124431
     5
     6        Reviewed by Anders Carlsson.
     7
     8        * MiniBrowser/mac/WK2BrowserWindowController.m:
     9        (decidePolicyForNavigationAction): Added originatingFrame parameter.
     10        (-[WK2BrowserWindowController awakeFromNib]): Updated for the new version of the policy
     11        client.
     12
     13        * TestWebKitAPI/Tests/WebKit2/DownloadDecideDestinationCrash.cpp:
     14        (TestWebKitAPI::decidePolicyForNavigationAction): Added originatingFrame parameter.
     15        (TestWebKitAPI::setPagePolicyClient): Updated for the new version of the policy client.
     16
     17        * TestWebKitAPI/Tests/WebKit2/PageLoadBasic.cpp:
     18        (TestWebKitAPI::decidePolicyForNavigationAction): Added originatingFrame parameter.
     19        (TestWebKitAPI::TEST): Updated for the new version of the policy client.
     20
     21        * WebKitTestRunner/TestController.cpp:
     22        (WTR::TestController::createWebViewWithOptions): Updated for the new version of the policy
     23        client.
     24        (WTR::TestController::decidePolicyForNavigationAction): Added originatingFrame parameter.
     25        * WebKitTestRunner/TestController.h:
     26
    1272013-11-15  Tim Horton  <timothy_horton@apple.com>
    228
  • trunk/Tools/MiniBrowser/mac/WK2BrowserWindowController.m

    r159059 r159358  
    415415// MARK: Policy Client Callbacks
    416416
    417 static void decidePolicyForNavigationAction(WKPageRef page, WKFrameRef frame, WKFrameNavigationType navigationType, WKEventModifiers modifiers, WKEventMouseButton mouseButton, WKURLRequestRef request, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo)
     417static void decidePolicyForNavigationAction(WKPageRef page, WKFrameRef frame, WKFrameNavigationType navigationType, WKEventModifiers modifiers, WKEventMouseButton mouseButton, WKFrameRef originatingFrame, WKURLRequestRef request, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo)
    418418{
    419419    LOG(@"decidePolicyForNavigationAction");
     
    671671        kWKPagePolicyClientCurrentVersion,
    672672        self,       /* clientInfo */
    673         decidePolicyForNavigationAction,
     673        0,          /* decidePolicyForNavigationAction_deprecatedForUseWithV0 */
    674674        decidePolicyForNewWindowAction,
    675675        decidePolicyForResponse,
    676         0           /* unableToImplementPolicy */
     676        0,          /* unableToImplementPolicy */
     677        decidePolicyForNavigationAction,
    677678    };
    678679    WKPageSetPagePolicyClient(_webView.pageRef, &policyClient);
  • trunk/Tools/TestWebKitAPI/Tests/WebKit2/DownloadDecideDestinationCrash.cpp

    r95188 r159358  
    3333static bool didDecideDestination;
    3434
    35 static void decidePolicyForNavigationAction(WKPageRef, WKFrameRef, WKFrameNavigationType, WKEventModifiers, WKEventMouseButton, WKURLRequestRef, WKFramePolicyListenerRef listener, WKTypeRef, const void*)
     35static void decidePolicyForNavigationAction(WKPageRef, WKFrameRef, WKFrameNavigationType, WKEventModifiers, WKEventMouseButton, WKFrameRef, WKURLRequestRef, WKFramePolicyListenerRef listener, WKTypeRef, const void*)
    3636{
    3737    WKFramePolicyListenerDownload(listener);
     
    5858    WKPagePolicyClient policyClient;
    5959    memset(&policyClient, 0, sizeof(policyClient));
     60    policyClient.version = 1;
    6061    policyClient.decidePolicyForNavigationAction = decidePolicyForNavigationAction;
    6162
  • trunk/Tools/TestWebKitAPI/Tests/WebKit2/PageLoadBasic.cpp

    r116626 r159358  
    8686}
    8787
    88 static void decidePolicyForNavigationAction(WKPageRef page, WKFrameRef frame, WKFrameNavigationType navigationType, WKEventModifiers modifiers, WKEventMouseButton mouseButton, WKURLRequestRef request, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo)
     88static void decidePolicyForNavigationAction(WKPageRef page, WKFrameRef frame, WKFrameNavigationType navigationType, WKEventModifiers modifiers, WKEventMouseButton mouseButton, WKFrameRef originatingFrame, WKURLRequestRef request, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo)
    8989{
    9090    State* state = reinterpret_cast<State*>(const_cast<void*>(clientInfo));
     
    129129    memset(&policyClient, 0, sizeof(policyClient));
    130130
    131     policyClient.version = 0;
     131    policyClient.version = 1;
    132132    policyClient.clientInfo = &state;
    133133    policyClient.decidePolicyForNavigationAction = decidePolicyForNavigationAction;
  • trunk/Tools/WebKitTestRunner/TestController.cpp

    r158447 r159358  
    489489        kWKPagePolicyClientCurrentVersion,
    490490        this,
    491         decidePolicyForNavigationAction,
     491        0, // decidePolicyForNavigationAction_deprecatedForUseWithV0
    492492        0, // decidePolicyForNewWindowAction
    493493        decidePolicyForResponse,
    494494        0, // unableToImplementPolicy
     495        decidePolicyForNavigationAction,
    495496    };
    496497    WKPageSetPagePolicyClient(m_mainWebView->page(), &pagePolicyClient);
     
    12171218}
    12181219
    1219 void TestController::decidePolicyForNavigationAction(WKPageRef, WKFrameRef, WKFrameNavigationType, WKEventModifiers, WKEventMouseButton, WKURLRequestRef, WKFramePolicyListenerRef listener, WKTypeRef, const void* clientInfo)
     1220void TestController::decidePolicyForNavigationAction(WKPageRef, WKFrameRef, WKFrameNavigationType, WKEventModifiers, WKEventMouseButton, WKFrameRef, WKURLRequestRef, WKFramePolicyListenerRef listener, WKTypeRef, const void* clientInfo)
    12201221{
    12211222    static_cast<TestController*>(const_cast<void*>(clientInfo))->decidePolicyForNavigationAction(listener);
  • trunk/Tools/WebKitTestRunner/TestController.h

    r158326 r159358  
    153153
    154154    // WKPagePolicyClient
    155     static void decidePolicyForNavigationAction(WKPageRef, WKFrameRef, WKFrameNavigationType, WKEventModifiers, WKEventMouseButton, WKURLRequestRef, WKFramePolicyListenerRef, WKTypeRef, const void*);
     155    static void decidePolicyForNavigationAction(WKPageRef, WKFrameRef, WKFrameNavigationType, WKEventModifiers, WKEventMouseButton, WKFrameRef, WKURLRequestRef, WKFramePolicyListenerRef, WKTypeRef, const void*);
    156156    void decidePolicyForNavigationAction(WKFramePolicyListenerRef);
    157157
Note: See TracChangeset for help on using the changeset viewer.