Changeset 214201 in webkit


Ignore:
Timestamp:
Mar 20, 2017 6:13:50 PM (7 years ago)
Author:
achristensen@apple.com
Message:

WebPageProxy DecidePolicyForNavigationAction and DecidePolicyForResponseSync should be Delayed reply messages
https://bugs.webkit.org/show_bug.cgi?id=167183
<rdar://problem/30203539>

Reviewed by Andy Estes.

Source/WebKit2:

Before this patch, the WKNavigationDelegate's decidePolicyForNavigationAction must synchronously call the decisionHandler.
If it stores the decisionHandler and calls it after decidePolicyForNavigationAction returns, we can get incorrect behavior.
This can be seen when the _WKWebsitePolicies given to the decisionHandler had no effect.
Now, we will have the WebProcess waiting on the UIProcess to respond to the Delayed reply before continuing.
This will not be a regression because currently everybody is either calling the decisionHandler immediately or getting incorrect behavior,
and the behavior will be the same if the decisionHandler is called immediately. It is possible that we could make the WebProcess
not wait on the response, but we would need to make WebCore's loading truly asynchronous first
(getting rid of ResourceHandleClient's synchronous methods).

Covered by making an API test asynchronously call the decisionHandler.

  • UIProcess/API/C/WKPage.cpp:

(WKPageSetPageNavigationClient):

  • UIProcess/WebPageProxy.cpp:

(WebKit::WebPageProxy::receivedPolicyDecision):
(WebKit::WebPageProxy::decidePolicyForNavigationAction):
(WebKit::WebPageProxy::decidePolicyForResponseSync):

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

(WebKit::WebFrameLoaderClient::dispatchDecidePolicyForResponse):
(WebKit::WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction):

Tools:

  • TestWebKitAPI/Tests/WebKit2Cocoa/WebsitePolicies.mm:

(-[WebsitePoliciesDelegate _webView:decidePolicyForNavigationAction:decisionHandler:]):

Location:
trunk
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r214197 r214201  
     12017-03-20  Alex Christensen  <achristensen@webkit.org>
     2
     3        WebPageProxy DecidePolicyForNavigationAction and DecidePolicyForResponseSync should be Delayed reply messages
     4        https://bugs.webkit.org/show_bug.cgi?id=167183
     5        <rdar://problem/30203539>
     6
     7        Reviewed by Andy Estes.
     8
     9        Before this patch, the WKNavigationDelegate's decidePolicyForNavigationAction must synchronously call the decisionHandler.
     10        If it stores the decisionHandler and calls it after decidePolicyForNavigationAction returns, we can get incorrect behavior.
     11        This can be seen when the _WKWebsitePolicies given to the decisionHandler had no effect.
     12        Now, we will have the WebProcess waiting on the UIProcess to respond to the Delayed reply before continuing.
     13        This will not be a regression because currently everybody is either calling the decisionHandler immediately or getting incorrect behavior,
     14        and the behavior will be the same if the decisionHandler is called immediately. It is possible that we could make the WebProcess
     15        not wait on the response, but we would need to make WebCore's loading truly asynchronous first
     16        (getting rid of ResourceHandleClient's synchronous methods).
     17
     18        Covered by making an API test asynchronously call the decisionHandler.
     19
     20        * UIProcess/API/C/WKPage.cpp:
     21        (WKPageSetPageNavigationClient):
     22        * UIProcess/WebPageProxy.cpp:
     23        (WebKit::WebPageProxy::receivedPolicyDecision):
     24        (WebKit::WebPageProxy::decidePolicyForNavigationAction):
     25        (WebKit::WebPageProxy::decidePolicyForResponseSync):
     26        * UIProcess/WebPageProxy.h:
     27        * UIProcess/WebPageProxy.messages.in:
     28        * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
     29        (WebKit::WebFrameLoaderClient::dispatchDecidePolicyForResponse):
     30        (WebKit::WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction):
     31
    1322017-03-20  Alex Christensen  <achristensen@webkit.org>
    233
  • trunk/Source/WebKit2/UIProcess/API/C/WKPage.cpp

    r214113 r214201  
    22662266        void decidePolicyForNavigationAction(WebPageProxy& page, API::NavigationAction& navigationAction, Ref<WebKit::WebFramePolicyListenerProxy>&& listener, API::Object* userData) override
    22672267        {
    2268             if (!m_client.decidePolicyForNavigationAction)
    2269                 return;
     2268            if (!m_client.decidePolicyForNavigationAction) {
     2269                listener->use({ });
     2270                return;
     2271            }
    22702272            m_client.decidePolicyForNavigationAction(toAPI(&page), toAPI(&navigationAction), toAPI(listener.ptr()), toAPI(userData), m_client.base.clientInfo);
    22712273        }
     
    22732275        void decidePolicyForNavigationResponse(WebPageProxy& page, API::NavigationResponse& navigationResponse, Ref<WebKit::WebFramePolicyListenerProxy>&& listener, API::Object* userData) override
    22742276        {
    2275             if (!m_client.decidePolicyForNavigationResponse)
    2276                 return;
     2277            if (!m_client.decidePolicyForNavigationResponse) {
     2278                listener->use({ });
     2279                return;
     2280            }
    22772281            m_client.decidePolicyForNavigationResponse(toAPI(&page), toAPI(&navigationResponse), toAPI(listener.ptr()), toAPI(userData), m_client.base.clientInfo);
    22782282        }
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.cpp

    r214113 r214201  
    385385    , m_isInPrintingMode(false)
    386386    , m_isPerformingDOMPrintOperation(false)
    387     , m_inDecidePolicyForResponseSync(false)
    388     , m_decidePolicyForResponseRequest(0)
    389     , m_syncMimeTypePolicyActionIsValid(false)
    390     , m_syncMimeTypePolicyAction(PolicyUse)
    391     , m_syncMimeTypePolicyDownloadID(0)
    392     , m_inDecidePolicyForNavigationAction(false)
    393     , m_syncNavigationActionPolicyActionIsValid(false)
    394     , m_syncNavigationActionPolicyAction(PolicyUse)
    395     , m_syncNavigationActionPolicyDownloadID(0)
    396387    , m_processingMouseMoveEvent(false)
    397388    , m_pageID(pageID)
     
    22992290    if (action == PolicyDownload) {
    23002291        // Create a download proxy.
    2301         // FIXME: We should ensure that the downloadRequest is never empty.
    2302         const ResourceRequest& downloadRequest = m_decidePolicyForResponseRequest ? *m_decidePolicyForResponseRequest : ResourceRequest();
    2303         DownloadProxy* download = m_process->processPool().createDownloadProxy(downloadRequest);
     2292        DownloadProxy* download = m_process->processPool().createDownloadProxy(m_decidePolicyForResponseRequest);
    23042293        downloadID = download->downloadID();
    23052294        handleDownloadRequest(download);
     2295        m_decidePolicyForResponseRequest = { };
    23062296    }
    23072297
    23082298    // If we received a policy decision while in decidePolicyForResponse the decision will
    23092299    // be sent back to the web process by decidePolicyForResponse.
    2310     if (m_inDecidePolicyForResponseSync) {
    2311         m_syncMimeTypePolicyActionIsValid = true;
    2312         m_syncMimeTypePolicyAction = action;
    2313         m_syncMimeTypePolicyDownloadID = downloadID;
     2300    if (m_responsePolicyReply) {
     2301        m_responsePolicyReply->send(action, downloadID);
     2302        ASSERT(!m_newNavigationID);
     2303        m_responsePolicyReply = nullptr;
    23142304        return;
    23152305    }
     
    23172307    // If we received a policy decision while in decidePolicyForNavigationAction the decision will
    23182308    // be sent back to the web process by decidePolicyForNavigationAction.
    2319     if (m_inDecidePolicyForNavigationAction) {
    2320         m_syncNavigationActionPolicyActionIsValid = true;
    2321         m_syncNavigationActionPolicyAction = action;
    2322         m_syncNavigationActionPolicyDownloadID = downloadID;
    2323         m_syncNavigationActionPolicyWebsitePolicies = websitePolicies;
     2309    if (m_navigationActionPolicyReply) {
     2310        m_navigationActionPolicyReply->send(m_newNavigationID, action, downloadID, websitePolicies);
     2311        m_newNavigationID = 0;
     2312        m_navigationActionPolicyReply = nullptr;
    23242313        return;
    23252314    }
     
    36493638}
    36503639
    3651 void WebPageProxy::decidePolicyForNavigationAction(uint64_t frameID, const SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const NavigationActionData& navigationActionData, uint64_t originatingFrameID, const SecurityOriginData& originatingFrameSecurityOrigin, const WebCore::ResourceRequest& originalRequest, const ResourceRequest& request, uint64_t listenerID, const UserData& userData, bool& receivedPolicyAction, uint64_t& newNavigationID, uint64_t& policyAction, DownloadID& downloadID, WebsitePolicies& websitePolicies)
     3640void WebPageProxy::decidePolicyForNavigationAction(uint64_t frameID, const SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const NavigationActionData& navigationActionData, uint64_t originatingFrameID, const SecurityOriginData& originatingFrameSecurityOrigin, const WebCore::ResourceRequest& originalRequest, const ResourceRequest& request, uint64_t listenerID, const UserData& userData, Ref<Messages::WebPageProxy::DecidePolicyForNavigationAction::DelayedReply>&& reply)
    36523641{
    36533642    PageClientProtector protector(m_pageClient);
     
    36653654    WebFrameProxy* originatingFrame = m_process->webFrame(originatingFrameID);
    36663655   
     3656    m_newNavigationID = 0;
    36673657    Ref<WebFramePolicyListenerProxy> listener = frame->setUpPolicyListenerProxy(listenerID);
    36683658    if (!navigationID && frame->isMainFrame()) {
    36693659        auto navigation = m_navigationState->createLoadRequestNavigation(request);
    3670         newNavigationID = navigation->navigationID();
     3660        m_newNavigationID = navigation->navigationID();
    36713661        listener->setNavigation(WTFMove(navigation));
    36723662    }
     
    36743664#if ENABLE(CONTENT_FILTERING)
    36753665    if (frame->didHandleContentFilterUnblockNavigation(request)) {
    3676         receivedPolicyAction = true;
    3677         policyAction = PolicyIgnore;
    3678         return;
    3679     }
    3680 #endif
    3681 
    3682     ASSERT(!m_inDecidePolicyForNavigationAction);
    3683 
    3684     m_inDecidePolicyForNavigationAction = true;
    3685     m_syncNavigationActionPolicyActionIsValid = false;
     3666        reply->send(m_newNavigationID, PolicyIgnore, { }, { });
     3667        m_newNavigationID = 0;
     3668        return;
     3669    }
     3670#endif
     3671
    36863672#if ENABLE(DOWNLOAD_ATTRIBUTE)
    36873673    m_syncNavigationActionHasDownloadAttribute = !navigationActionData.downloadAttribute.isNull();
    36883674#endif
     3675    m_navigationActionPolicyReply = WTFMove(reply);
    36893676
    36903677    if (m_navigationClient) {
     
    37103697
    37113698    m_shouldSuppressAppLinksInNextNavigationPolicyDecision = false;
    3712     m_inDecidePolicyForNavigationAction = false;
    3713 
    3714     // Check if we received a policy decision already. If we did, we can just pass it back.
    3715     receivedPolicyAction = m_syncNavigationActionPolicyActionIsValid;
    3716     if (m_syncNavigationActionPolicyActionIsValid) {
    3717         policyAction = m_syncNavigationActionPolicyAction;
    3718         downloadID = m_syncNavigationActionPolicyDownloadID;
    3719         websitePolicies = m_syncNavigationActionPolicyWebsitePolicies;
    3720     }
    37213699}
    37223700
     
    37643742}
    37653743
    3766 void WebPageProxy::decidePolicyForResponseSync(uint64_t frameID, const SecurityOriginData& frameSecurityOrigin, const ResourceResponse& response, const ResourceRequest& request, bool canShowMIMEType, uint64_t listenerID, const UserData& userData, bool& receivedPolicyAction, uint64_t& policyAction, DownloadID& downloadID)
     3744void WebPageProxy::decidePolicyForResponseSync(uint64_t frameID, const SecurityOriginData& frameSecurityOrigin, const ResourceResponse& response, const ResourceRequest& request, bool canShowMIMEType, uint64_t listenerID, const UserData& userData, Ref<Messages::WebPageProxy::DecidePolicyForResponseSync::DelayedReply>&& reply)
    37673745{
    37683746    PageClientProtector protector(m_pageClient);
    37693747
    3770     ASSERT(!m_inDecidePolicyForResponseSync);
    3771 
    3772     m_inDecidePolicyForResponseSync = true;
    3773     m_decidePolicyForResponseRequest = &request;
    3774     m_syncMimeTypePolicyActionIsValid = false;
     3748    m_decidePolicyForResponseRequest = request;
     3749    m_responsePolicyReply = WTFMove(reply);
    37753750
    37763751    decidePolicyForResponse(frameID, frameSecurityOrigin, response, request, canShowMIMEType, listenerID, userData);
    3777 
    3778     m_inDecidePolicyForResponseSync = false;
    3779     m_decidePolicyForResponseRequest = 0;
    3780 
    3781     // Check if we received a policy decision already. If we did, we can just pass it back.
    3782     receivedPolicyAction = m_syncMimeTypePolicyActionIsValid;
    3783     if (m_syncMimeTypePolicyActionIsValid) {
    3784         policyAction = m_syncMimeTypePolicyAction;
    3785         downloadID = m_syncMimeTypePolicyDownloadID;
    3786     }
    37873752}
    37883753
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.h

    r214113 r214201  
    12621262    void didDestroyNavigation(uint64_t navigationID);
    12631263
    1264     void decidePolicyForNavigationAction(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const NavigationActionData&, uint64_t originatingFrameID, const WebCore::SecurityOriginData& originatingFrameSecurityOrigin, const WebCore::ResourceRequest& originalRequest, const WebCore::ResourceRequest&, uint64_t listenerID, const UserData&, bool& receivedPolicyAction, uint64_t& newNavigationID, uint64_t& policyAction, DownloadID&, WebsitePolicies&);
     1264    void decidePolicyForNavigationAction(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const NavigationActionData&, uint64_t originatingFrameID, const WebCore::SecurityOriginData& originatingFrameSecurityOrigin, const WebCore::ResourceRequest& originalRequest, const WebCore::ResourceRequest&, uint64_t listenerID, const UserData&, Ref<Messages::WebPageProxy::DecidePolicyForNavigationAction::DelayedReply>&&);
    12651265    void decidePolicyForNewWindowAction(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, const NavigationActionData&, const WebCore::ResourceRequest&, const String& frameName, uint64_t listenerID, const UserData&);
    12661266    void decidePolicyForResponse(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, const WebCore::ResourceResponse&, const WebCore::ResourceRequest&, bool canShowMIMEType, uint64_t listenerID, const UserData&);
    1267     void decidePolicyForResponseSync(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, const WebCore::ResourceResponse&, const WebCore::ResourceRequest&, bool canShowMIMEType, uint64_t listenerID, const UserData&, bool& receivedPolicyAction, uint64_t& policyAction, DownloadID&);
     1267    void decidePolicyForResponseSync(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, const WebCore::ResourceResponse&, const WebCore::ResourceRequest&, bool canShowMIMEType, uint64_t listenerID, const UserData&, Ref<Messages::WebPageProxy::DecidePolicyForResponseSync::DelayedReply>&&);
    12681268    void unableToImplementPolicy(uint64_t frameID, const WebCore::ResourceError&, const UserData&);
    12691269
     
    17761776    bool m_isPerformingDOMPrintOperation;
    17771777
    1778     bool m_inDecidePolicyForResponseSync;
    1779     const WebCore::ResourceRequest* m_decidePolicyForResponseRequest;
    1780     bool m_syncMimeTypePolicyActionIsValid;
    1781     WebCore::PolicyAction m_syncMimeTypePolicyAction;
    1782     DownloadID m_syncMimeTypePolicyDownloadID;
    1783 
    1784     bool m_inDecidePolicyForNavigationAction;
    1785     bool m_syncNavigationActionPolicyActionIsValid;
    1786     WebCore::PolicyAction m_syncNavigationActionPolicyAction;
    1787     DownloadID m_syncNavigationActionPolicyDownloadID;
    1788     WebsitePolicies m_syncNavigationActionPolicyWebsitePolicies;
     1778    RefPtr<Messages::WebPageProxy::DecidePolicyForNavigationAction::DelayedReply> m_navigationActionPolicyReply;
     1779    uint64_t m_newNavigationID { 0 };
     1780    RefPtr<Messages::WebPageProxy::DecidePolicyForResponseSync::DelayedReply> m_responsePolicyReply;
     1781    WebCore::ResourceRequest m_decidePolicyForResponseRequest;
     1782
    17891783    bool m_shouldSuppressAppLinksInNextNavigationPolicyDecision { false };
    17901784
  • trunk/Source/WebKit2/UIProcess/WebPageProxy.messages.in

    r213903 r214201  
    101101
    102102    # Policy messages
    103     DecidePolicyForResponseSync(uint64_t frameID, struct WebCore::SecurityOriginData frameSecurityOrigin, WebCore::ResourceResponse response, WebCore::ResourceRequest request, bool canShowMIMEType, uint64_t listenerID, WebKit::UserData userData) -> (bool receivedPolicyAction, uint64_t policyAction, WebKit::DownloadID downloadID)
    104     DecidePolicyForNavigationAction(uint64_t frameID, struct WebCore::SecurityOriginData frameSecurityOrigin, uint64_t navigationID, struct WebKit::NavigationActionData navigationActionData, uint64_t originatingFrameID, struct WebCore::SecurityOriginData originatingFrameSecurityOrigin, WebCore::ResourceRequest originalRequest, WebCore::ResourceRequest request, uint64_t listenerID, WebKit::UserData userData) -> (bool receivedPolicyAction, uint64_t newNavigationID, uint64_t policyAction, WebKit::DownloadID downloadID, struct WebKit::WebsitePolicies websitePolicies)
     103    DecidePolicyForResponseSync(uint64_t frameID, struct WebCore::SecurityOriginData frameSecurityOrigin, WebCore::ResourceResponse response, WebCore::ResourceRequest request, bool canShowMIMEType, uint64_t listenerID, WebKit::UserData userData) -> (uint64_t policyAction, WebKit::DownloadID downloadID) Delayed
     104    DecidePolicyForNavigationAction(uint64_t frameID, struct WebCore::SecurityOriginData frameSecurityOrigin, uint64_t navigationID, struct WebKit::NavigationActionData navigationActionData, uint64_t originatingFrameID, struct WebCore::SecurityOriginData originatingFrameSecurityOrigin, WebCore::ResourceRequest originalRequest, WebCore::ResourceRequest request, uint64_t listenerID, WebKit::UserData userData) -> (uint64_t newNavigationID, uint64_t policyAction, WebKit::DownloadID downloadID, struct WebKit::WebsitePolicies websitePolicies) Delayed
    105105    DecidePolicyForNewWindowAction(uint64_t frameID, struct WebCore::SecurityOriginData frameSecurityOrigin, struct WebKit::NavigationActionData navigationActionData, WebCore::ResourceRequest request, String frameName, uint64_t listenerID, WebKit::UserData userData)
    106106    UnableToImplementPolicy(uint64_t frameID, WebCore::ResourceError error, WebKit::UserData userData)
  • trunk/Source/WebKit2/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp

    r213656 r214201  
    686686
    687687    uint64_t listenerID = m_frame->setUpPolicyListener(WTFMove(function));
    688     bool receivedPolicyAction;
    689688    uint64_t policyAction;
    690689    DownloadID downloadID;
     
    692691    Ref<WebFrame> protect(*m_frame);
    693692    WebCore::Frame* coreFrame = m_frame->coreFrame();
    694     if (!webPage->sendSync(Messages::WebPageProxy::DecidePolicyForResponseSync(m_frame->frameID(), SecurityOriginData::fromFrame(coreFrame), response, request, canShowMIMEType, listenerID, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())), Messages::WebPageProxy::DecidePolicyForResponseSync::Reply(receivedPolicyAction, policyAction, downloadID), Seconds::infinity(), IPC::SendSyncOption::InformPlatformProcessWillSuspend)) {
     693    if (!webPage->sendSync(Messages::WebPageProxy::DecidePolicyForResponseSync(m_frame->frameID(), SecurityOriginData::fromFrame(coreFrame), response, request, canShowMIMEType, listenerID, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())), Messages::WebPageProxy::DecidePolicyForResponseSync::Reply(policyAction, downloadID), Seconds::infinity(), IPC::SendSyncOption::InformPlatformProcessWillSuspend)) {
    695694        m_frame->didReceivePolicyDecision(listenerID, PolicyIgnore, 0, { });
    696695        return;
     
    698697
    699698    // We call this synchronously because CFNetwork can only convert a loading connection to a download from its didReceiveResponse callback.
    700     if (receivedPolicyAction)
    701         m_frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), 0, downloadID);
     699    m_frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), 0, downloadID);
    702700}
    703701
     
    764762   
    765763    uint64_t listenerID = m_frame->setUpPolicyListener(WTFMove(function));
    766     bool receivedPolicyAction;
    767764    uint64_t newNavigationID;
    768765    uint64_t policyAction;
     
    809806    WebCore::Frame* originatingCoreFrame = originatingFrame ? originatingFrame->coreFrame() : nullptr;
    810807    WebsitePolicies websitePolicies;
    811     if (!webPage->sendSync(Messages::WebPageProxy::DecidePolicyForNavigationAction(m_frame->frameID(), SecurityOriginData::fromFrame(coreFrame), documentLoader->navigationID(), navigationActionData, originatingFrame ? originatingFrame->frameID() : 0, SecurityOriginData::fromFrame(originatingCoreFrame), navigationAction.resourceRequest(), request, listenerID, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())), Messages::WebPageProxy::DecidePolicyForNavigationAction::Reply(receivedPolicyAction, newNavigationID, policyAction, downloadID, websitePolicies))) {
     808    if (!webPage->sendSync(Messages::WebPageProxy::DecidePolicyForNavigationAction(m_frame->frameID(), SecurityOriginData::fromFrame(coreFrame), documentLoader->navigationID(), navigationActionData, originatingFrame ? originatingFrame->frameID() : 0, SecurityOriginData::fromFrame(originatingCoreFrame), navigationAction.resourceRequest(), request, listenerID, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())), Messages::WebPageProxy::DecidePolicyForNavigationAction::Reply(newNavigationID, policyAction, downloadID, websitePolicies))) {
    812809        m_frame->didReceivePolicyDecision(listenerID, PolicyIgnore, 0, { });
    813810        return;
     
    836833
    837834    // We call this synchronously because WebCore cannot gracefully handle a frame load without a synchronous navigation policy reply.
    838     if (receivedPolicyAction)
    839         m_frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), newNavigationID, downloadID);
     835    m_frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), newNavigationID, downloadID);
    840836}
    841837
  • trunk/Tools/ChangeLog

    r214192 r214201  
     12017-03-20  Alex Christensen  <achristensen@webkit.org>
     2
     3        WebPageProxy DecidePolicyForNavigationAction and DecidePolicyForResponseSync should be Delayed reply messages
     4        https://bugs.webkit.org/show_bug.cgi?id=167183
     5        <rdar://problem/30203539>
     6
     7        Reviewed by Andy Estes.
     8
     9        * TestWebKitAPI/Tests/WebKit2Cocoa/WebsitePolicies.mm:
     10        (-[WebsitePoliciesDelegate _webView:decidePolicyForNavigationAction:decisionHandler:]):
     11
    1122017-03-20  Jonathan Bedard  <jbedard@apple.com>
    213
  • trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/WebsitePolicies.mm

    r213656 r214201  
    3434#import <WebKit/_WKUserContentExtensionStorePrivate.h>
    3535#import <WebKit/_WKWebsitePolicies.h>
     36#import <wtf/MainThread.h>
    3637#import <wtf/RetainPtr.h>
    3738
     
    108109        break;
    109110    case 2:
    110         // Verify disabling content blockers works correctly.
    111         websitePolicies.contentBlockersEnabled = false;
    112         break;
     111        {
     112            // Verify disabling content blockers works correctly.
     113            websitePolicies.contentBlockersEnabled = false;
     114           
     115            // Verify calling the decisionHandler asynchronously works correctly.
     116            auto decisionHandlerCopy = Block_copy(decisionHandler);
     117            callOnMainThread([decisionHandlerCopy, websitePolicies = RetainPtr<_WKWebsitePolicies>(websitePolicies)] {
     118                decisionHandlerCopy(WKNavigationActionPolicyAllow, websitePolicies.get());
     119                Block_release(decisionHandlerCopy);
     120            });
     121        }
     122        return;
    113123    case 3:
    114124        // Verify enabling content blockers has no effect when reloading without content blockers.
Note: See TracChangeset for help on using the changeset viewer.