Changeset 160495 in webkit


Ignore:
Timestamp:
Dec 12, 2013 10:41:55 AM (10 years ago)
Author:
mitz@apple.com
Message:

[Cocoa] Navigation action information for policy decisions is missing the original request
https://bugs.webkit.org/show_bug.cgi?id=125612

Reviewed by Anders Carlsson.

  • Platform/CoreIPC/HandleMessage.h:

(CoreIPC::callMemberFunction): Added template with additional message parameter.

  • UIProcess/API/C/WKPagePolicyClientInternal.h: Added. Defines a new version of the client

interface with a new version of the policy decision callback.

  • UIProcess/API/Cocoa/WKBrowsingContextController.mm:

(setUpPagePolicyClient): Use the new internal version of the client. Pass the original
request in the action information dictionary under a new key.

  • UIProcess/API/Cocoa/WKBrowsingContextPolicyDelegate.h: Declared new action information

key.

  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::decidePolicyForNavigationAction): Added originalRequest parameter,
which is passed to the policy client.

  • UIProcess/WebPageProxy.h:
  • UIProcess/WebPageProxy.messages.in: Added originalRequest parameter in

DecidePolicyForNavigationAction.

  • UIProcess/WebPolicyClient.cpp:

(WebKit::WebPolicyClient::decidePolicyForNavigationAction): Pass the original request to
the client.

  • UIProcess/WebPolicyClient.h:
  • WebKit2.xcodeproj/project.pbxproj: Added reference to new file.
  • WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:

(WebKit::WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction): Send the original
request from the navigation action to the UI process.

Location:
trunk/Source/WebKit2
Files:
1 added
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r160490 r160495  
     12013-12-12  Dan Bernstein  <mitz@apple.com>
     2
     3        [Cocoa] Navigation action information for policy decisions is missing the original request
     4        https://bugs.webkit.org/show_bug.cgi?id=125612
     5
     6        Reviewed by Anders Carlsson.
     7
     8        * Platform/CoreIPC/HandleMessage.h:
     9        (CoreIPC::callMemberFunction): Added template with additional message parameter.
     10        * UIProcess/API/C/WKPagePolicyClientInternal.h: Added. Defines a new version of the client
     11        interface with a new version of the policy decision callback.
     12        * UIProcess/API/Cocoa/WKBrowsingContextController.mm:
     13        (setUpPagePolicyClient): Use the new internal version of the client. Pass the original
     14        request in the action information dictionary under a new key.
     15        * UIProcess/API/Cocoa/WKBrowsingContextPolicyDelegate.h: Declared new action information
     16        key.
     17        * UIProcess/WebPageProxy.cpp:
     18        (WebKit::WebPageProxy::decidePolicyForNavigationAction): Added originalRequest parameter,
     19        which is passed to the policy client.
     20        * UIProcess/WebPageProxy.h:
     21        * UIProcess/WebPageProxy.messages.in: Added originalRequest parameter in
     22        DecidePolicyForNavigationAction.
     23        * UIProcess/WebPolicyClient.cpp:
     24        (WebKit::WebPolicyClient::decidePolicyForNavigationAction): Pass the original request to
     25        the client.
     26        * UIProcess/WebPolicyClient.h:
     27        * WebKit2.xcodeproj/project.pbxproj: Added reference to new file.
     28        * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
     29        (WebKit::WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction): Send the original
     30        request from the navigation action to the UI process.
     31
    1322013-12-12  Zan Dobersek  <zdobersek@igalia.com>
    233
  • trunk/Source/WebKit2/Platform/CoreIPC/HandleMessage.h

    r159387 r160495  
    365365}
    366366
     367template<typename C, typename MF, typename P1, typename P2, typename P3, typename P4, typename P5, typename P6, typename P7, typename P8, typename R1, typename R2, typename R3>
     368void callMemberFunction(std::tuple<P1, P2, P3, P4, P5, P6, P7, P8>&& args, MessageDecoder& decoder, std::tuple<R1, R2, R3>& replyArgs, C* object, MF function)
     369{
     370    (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), std::get<7>(args), decoder, std::get<0>(replyArgs), std::get<1>(replyArgs), std::get<2>(replyArgs));
     371}
     372
    367373// Main dispatch functions
    368374template<typename T, typename C, typename MF>
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKBrowsingContextController.mm

    r160405 r160495  
    112112NSString * const WKActionMouseButtonKey = @"WKActionMouseButtonKey";
    113113NSString * const WKActionModifierFlagsKey = @"WKActionModifierFlagsKey";
     114NSString * const WKActionOriginalURLRequestKey = @"WKActionOriginalURLRequestKey";
    114115NSString * const WKActionURLRequestKey = @"WKActionURLRequestKey";
    115116NSString * const WKActionURLResponseKey = @"WKActionURLResponseKey";
     
    562563static void setUpPagePolicyClient(WKBrowsingContextController *browsingContext, WebPageProxy& page)
    563564{
    564     WKPagePolicyClientV1 policyClient;
     565    WKPagePolicyClientInternal policyClient;
    565566    memset(&policyClient, 0, sizeof(policyClient));
    566567
    567     policyClient.base.version = 1;
     568    policyClient.base.version = 2;
    568569    policyClient.base.clientInfo = browsingContext;
    569570
    570     policyClient.decidePolicyForNavigationAction = [](WKPageRef page, WKFrameRef frame, WKFrameNavigationType navigationType, WKEventModifiers modifiers, WKEventMouseButton mouseButton, WKFrameRef originatingFrame, WKURLRequestRef request, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo)
     571    policyClient.decidePolicyForNavigationAction = [](WKPageRef page, WKFrameRef frame, WKFrameNavigationType navigationType, WKEventModifiers modifiers, WKEventMouseButton mouseButton, WKFrameRef originatingFrame, WKURLRequestRef originalRequest, WKURLRequestRef request, WKFramePolicyListenerRef listener, WKTypeRef userData, const void* clientInfo)
    571572    {
    572573        WKBrowsingContextController *browsingContext = (WKBrowsingContextController *)clientInfo;
     
    579580                WKActionModifierFlagsKey: @(modifiers),
    580581                WKActionMouseButtonKey: @(mouseButton),
     582                WKActionOriginalURLRequestKey: adoptNS(WKURLRequestCopyNSURLRequest(originalRequest)).get(),
    581583                WKActionURLRequestKey: adoptNS(WKURLRequestCopyNSURLRequest(request)).get()
    582584            };
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKBrowsingContextPolicyDelegate.h

    r159874 r160495  
    3434WK_EXPORT extern NSString * const WKActionMouseButtonKey;         // NSNumber (0 for left button, 1 for middle button, 2 for right button)
    3535WK_EXPORT extern NSString * const WKActionModifierFlagsKey;       // NSNumber (unsigned)
     36WK_EXPORT extern NSString * const WKActionOriginalURLRequestKey;  // NSURLRequest
    3637WK_EXPORT extern NSString * const WKActionURLRequestKey;          // NSURLRequest
    3738WK_EXPORT extern NSString * const WKActionURLResponseKey;         // NSURLResponse
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp

    r160487 r160495  
    24252425
    24262426// PolicyClient
    2427 void 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)
     2427void WebPageProxy::decidePolicyForNavigationAction(uint64_t frameID, uint32_t opaqueNavigationType, uint32_t opaqueModifiers, int32_t opaqueMouseButton, uint64_t originatingFrameID, const WebCore::ResourceRequest& originalRequest, const ResourceRequest& request, uint64_t listenerID, CoreIPC::MessageDecoder& decoder, bool& receivedPolicyAction, uint64_t& policyAction, uint64_t& downloadID)
    24282428{
    24292429    RefPtr<API::Object> userData;
     
    24402440    MESSAGE_CHECK(frame);
    24412441    MESSAGE_CHECK_URL(request.url());
     2442    MESSAGE_CHECK_URL(originalRequest.url());
    24422443
    24432444    NavigationType navigationType = static_cast<NavigationType>(opaqueNavigationType);
     
    24532454    m_syncNavigationActionPolicyActionIsValid = false;
    24542455   
    2455     if (!m_policyClient.decidePolicyForNavigationAction(this, frame, navigationType, modifiers, mouseButton, originatingFrame, request, listener.get(), userData.get()))
     2456    if (!m_policyClient.decidePolicyForNavigationAction(this, frame, navigationType, modifiers, mouseButton, originatingFrame, originalRequest, request, listener.get(), userData.get()))
    24562457        listener->use();
    24572458
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.h

    r160487 r160495  
    899899    void didFinishProgress();
    900900
    901     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);
     901    void decidePolicyForNavigationAction(uint64_t frameID, uint32_t navigationType, uint32_t modifiers, int32_t mouseButton, uint64_t originatingFrameID, const WebCore::ResourceRequest& originalRequest, const WebCore::ResourceRequest& request, uint64_t listenerID, CoreIPC::MessageDecoder&, bool& receivedPolicyAction, uint64_t& policyAction, uint64_t& downloadID);
    902902    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&);
    903903    void decidePolicyForResponse(uint64_t frameID, const WebCore::ResourceResponse&, const WebCore::ResourceRequest&, bool canShowMIMEType, uint64_t listenerID, CoreIPC::MessageDecoder&);
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in

    r160487 r160495  
    104104    # Policy messages
    105105    DecidePolicyForResponseSync(uint64_t frameID, WebCore::ResourceResponse response, WebCore::ResourceRequest request, bool canShowMIMEType, uint64_t listenerID, WebKit::InjectedBundleUserMessageEncoder userData) -> (bool receivedPolicyAction, uint64_t policyAction, uint64_t downloadID) Variadic
    106     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
     106    DecidePolicyForNavigationAction(uint64_t frameID, uint32_t navigationType, uint32_t modifiers, int32_t mouseButton, uint64_t originatingFrameID, WebCore::ResourceRequest originalRequest, WebCore::ResourceRequest request, uint64_t listenerID, WebKit::InjectedBundleUserMessageEncoder userData) -> (bool receivedPolicyAction, uint64_t policyAction, uint64_t downloadID) Variadic
    107107    DecidePolicyForNewWindowAction(uint64_t frameID, uint32_t navigationType, uint32_t modifiers, int32_t mouseButton, WebCore::ResourceRequest request, String frameName, uint64_t listenerID, WebKit::InjectedBundleUserMessageEncoder userData) Variadic
    108108    UnableToImplementPolicy(uint64_t frameID, WebCore::ResourceError error, WebKit::InjectedBundleUserMessageEncoder userData)  Variadic
  • trunk/Source/WebKit2/UIProcess/WebPolicyClient.cpp

    r159988 r160495  
    3535namespace WebKit {
    3636
    37 bool WebPolicyClient::decidePolicyForNavigationAction(WebPageProxy* page, WebFrameProxy* frame, NavigationType type, WebEvent::Modifiers modifiers, WebMouseEvent::Button mouseButton, WebFrameProxy* originatingFrame, 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& originalResourceRequest, const ResourceRequest& resourceRequest, WebFramePolicyListenerProxy* listener, API::Object* userData)
    3838{
    39     if (!m_client.decidePolicyForNavigationAction_deprecatedForUseWithV0 && !m_client.decidePolicyForNavigationAction)
     39    if (!m_client.decidePolicyForNavigationAction_deprecatedForUseWithV0 && !m_client.decidePolicyForNavigationAction_deprecatedForUseWithV1 && !m_client.decidePolicyForNavigationAction)
    4040        return false;
    4141
     42    RefPtr<WebURLRequest> originalRequest = WebURLRequest::create(originalResourceRequest);
    4243    RefPtr<WebURLRequest> request = WebURLRequest::create(resourceRequest);
    4344
    4445    if (m_client.decidePolicyForNavigationAction_deprecatedForUseWithV0)
    4546        m_client.decidePolicyForNavigationAction_deprecatedForUseWithV0(toAPI(page), toAPI(frame), toAPI(type), toAPI(modifiers), toAPI(mouseButton), toAPI(request.get()), toAPI(listener), toAPI(userData), m_client.base.clientInfo);
     47    else if (m_client.decidePolicyForNavigationAction_deprecatedForUseWithV1)
     48        m_client.decidePolicyForNavigationAction_deprecatedForUseWithV1(toAPI(page), toAPI(frame), toAPI(type), toAPI(modifiers), toAPI(mouseButton), toAPI(originatingFrame), toAPI(request.get()), toAPI(listener), toAPI(userData), m_client.base.clientInfo);
    4649    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.base.clientInfo);
     50        m_client.decidePolicyForNavigationAction(toAPI(page), toAPI(frame), toAPI(type), toAPI(modifiers), toAPI(mouseButton), toAPI(originatingFrame), toAPI(originalRequest.get()), toAPI(request.get()), toAPI(listener), toAPI(userData), m_client.base.clientInfo);
    4851
    4952    return true;
  • trunk/Source/WebKit2/UIProcess/WebPolicyClient.h

    r159994 r160495  
    2929#include "APIClient.h"
    3030#include "WKPage.h"
     31#include "WKPagePolicyClientInternal.h"
    3132#include "WebEvent.h"
    3233#include <WebCore/FrameLoaderTypes.h>
     
    3738
    3839template<> struct ClientTraits<WKPagePolicyClientBase> {
    39     typedef std::tuple<WKPagePolicyClientV0, WKPagePolicyClientV1> Versions;
     40    typedef std::tuple<WKPagePolicyClientV0, WKPagePolicyClientV1, WKPagePolicyClientInternal> Versions;
    4041};
    4142}
     
    5556class WebPolicyClient : public API::Client<WKPagePolicyClientBase> {
    5657public:
    57     bool decidePolicyForNavigationAction(WebPageProxy*, WebFrameProxy*, WebCore::NavigationType, WebEvent::Modifiers, WebMouseEvent::Button, WebFrameProxy* originatingFrame, const WebCore::ResourceRequest&, WebFramePolicyListenerProxy*, API::Object* userData);
     58    bool decidePolicyForNavigationAction(WebPageProxy*, WebFrameProxy*, WebCore::NavigationType, WebEvent::Modifiers, WebMouseEvent::Button, WebFrameProxy* originatingFrame, const WebCore::ResourceRequest& originalRequest, const WebCore::ResourceRequest&, WebFramePolicyListenerProxy*, API::Object* userData);
    5859    bool decidePolicyForNewWindowAction(WebPageProxy*, WebFrameProxy*, WebCore::NavigationType, WebEvent::Modifiers, WebMouseEvent::Button, const WebCore::ResourceRequest&, const String& frameName, WebFramePolicyListenerProxy*, API::Object* userData);
    5960    bool decidePolicyForResponse(WebPageProxy*, WebFrameProxy*, const WebCore::ResourceResponse&, const WebCore::ResourceRequest&, bool canShowMIMEType, WebFramePolicyListenerProxy*, API::Object* userData);
  • trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj

    r160487 r160495  
    451451                373CEAD5185417AE008C363D /* WKNSData.mm in Sources */ = {isa = PBXBuildFile; fileRef = 373CEAD3185417AE008C363D /* WKNSData.mm */; };
    452452                373CEAD6185417AE008C363D /* WKNSData.h in Headers */ = {isa = PBXBuildFile; fileRef = 373CEAD4185417AE008C363D /* WKNSData.h */; };
     453                373CEAD81859553F008C363D /* WKPagePolicyClientInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 373CEAD71859553F008C363D /* WKPagePolicyClientInternal.h */; };
    453454                374436881820E7240049579F /* WKObject.mm in Sources */ = {isa = PBXBuildFile; fileRef = 374436871820E7240049579F /* WKObject.mm */; };
    454455                3760881E150413E900FC82C7 /* WebRenderObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 3760881C150413E900FC82C7 /* WebRenderObject.cpp */; };
     
    20032004                373CEAD3185417AE008C363D /* WKNSData.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKNSData.mm; sourceTree = "<group>"; };
    20042005                373CEAD4185417AE008C363D /* WKNSData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKNSData.h; sourceTree = "<group>"; };
     2006                373CEAD71859553F008C363D /* WKPagePolicyClientInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKPagePolicyClientInternal.h; sourceTree = "<group>"; };
    20052007                374436871820E7240049579F /* WKObject.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKObject.mm; sourceTree = "<group>"; };
    20062008                3760881C150413E900FC82C7 /* WebRenderObject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WebRenderObject.cpp; sourceTree = "<group>"; };
     
    46624664                                1AB8A1EB1840080900E9AE69 /* WKPageLoaderClient.h */,
    46634665                                1AB8A1ED18400ACB00E9AE69 /* WKPagePolicyClient.h */,
     4666                                373CEAD71859553F008C363D /* WKPagePolicyClientInternal.h */,
    46644667                                BC177464118B9FF4007D9E9A /* WKPagePrivate.h */,
    46654668                                1AB8A1F118400B6200E9AE69 /* WKPageUIClient.h */,
     
    61856188                                BC407606124FF0270068F20A /* WKString.h in Headers */,
    61866189                                7C9D1537184584DA009D3918 /* WKBrowsingContextGroupInternal.h in Headers */,
     6190                                373CEAD81859553F008C363D /* WKPagePolicyClientInternal.h in Headers */,
    61876191                                BC40761A124FF0370068F20A /* WKStringCF.h in Headers */,
    61886192                                759CCD591808F1690078E8A8 /* WebOriginDataManagerProxyChangeClient.h in Headers */,
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp

    r160487 r160495  
    729729
    730730    // Notify the UIProcess.
    731     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)))
     731    if (!webPage->sendSync(Messages::WebPageProxy::DecidePolicyForNavigationAction(m_frame->frameID(), action->navigationType(), action->modifiers(), action->mouseButton(), originatingFrame ? originatingFrame->frameID() : 0, navigationAction.resourceRequest(), request, listenerID, InjectedBundleUserMessageEncoder(userData.get())), Messages::WebPageProxy::DecidePolicyForNavigationAction::Reply(receivedPolicyAction, policyAction, downloadID)))
    732732        return;
    733733
Note: See TracChangeset for help on using the changeset viewer.