Changeset 223165 in webkit


Ignore:
Timestamp:
Oct 10, 2017 8:49:13 PM (7 years ago)
Author:
jmarcell@apple.com
Message:

Cherry-pick r223084. rdar://problem/34857469

Location:
branches/safari-604-branch
Files:
1 added
13 edited

Legend:

Unmodified
Added
Removed
  • branches/safari-604-branch/Source/WebKit/ChangeLog

    r223157 r223165  
     12017-10-10  Jason Marcell  <jmarcell@apple.com>
     2
     3        Cherry-pick r223084. rdar://problem/34857469
     4
     5    2017-10-09  Jason Marcell  <jmarcell@apple.com>
     6
     7            Apply patch. rdar://problem/34857459
     8
     9        Apply patch. rdar://problem/34857459
     10
     11        2017-10-06  Alex Christensen  <achristensen@webkit.org>
     12
     13                REGRESSION(r214201): WebProcess hangs during policy decisions
     14                https://bugs.webkit.org/show_bug.cgi?id=177411
     15                <rdar://problem/34815986>
     16
     17                Original patch reviewed by Geoffrey Garen, this is a modification that doesn't change Mac.
     18
     19                This is like r222431 which allows the WebProcess to not be hung.  This fixes the desired bug on iOS
     20                but without changing Mac, which depends on the ability to asynchronously call the completion handlers.
     21
     22                This change applies to the safari-604-branch.
     23
     24                * UIProcess/WebPageProxy.cpp:
     25                (WebKit::WebPageProxy::receivedPolicyDecision):
     26                (WebKit::WebPageProxy::decidePolicyForNavigationAction):
     27                (WebKit::WebPageProxy::decidePolicyForResponseSync):
     28                * UIProcess/WebPageProxy.h:
     29                * UIProcess/WebPageProxy.messages.in:
     30                * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp:
     31                (WebKit::WebFrameLoaderClient::dispatchDecidePolicyForResponse):
     32                (WebKit::WebFrameLoaderClient::dispatchDecidePolicyForNewWindowAction):
     33                (WebKit::WebFrameLoaderClient::applyToDocumentLoader):
     34                (WebKit::WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction):
     35                (WebKit::WebFrameLoaderClient::dispatchWillSubmitForm):
     36                * WebProcess/WebCoreSupport/WebFrameLoaderClient.h:
     37                * WebProcess/WebPage/WebFrame.cpp:
     38                (WebKit::WebFrame::setUpPolicyListener):
     39                (WebKit::WebFrame::invalidatePolicyListener):
     40                (WebKit::WebFrame::didReceivePolicyDecision):
     41                * WebProcess/WebPage/WebFrame.h:
     42                * WebProcess/WebPage/WebPage.cpp:
     43                (WebKit::WebPage::didReceivePolicyDecision):
     44                * WebProcess/WebPage/WebPage.h:
     45                * WebProcess/WebPage/WebPage.messages.in:
     46
    1472017-10-10  Jason Marcell  <jmarcell@apple.com>
    248
  • branches/safari-604-branch/Source/WebKit/UIProcess/WebPageProxy.cpp

    r222913 r223165  
    22612261    if (action == PolicyDownload) {
    22622262        // Create a download proxy.
     2263#if PLATFORM(MAC)
    22632264        DownloadProxy* download = m_process->processPool().createDownloadProxy(m_decidePolicyForResponseRequest);
     2265#else
     2266        const ResourceRequest& downloadRequest = m_decidePolicyForResponseRequest ? *m_decidePolicyForResponseRequest : ResourceRequest();
     2267        DownloadProxy* download = m_process->processPool().createDownloadProxy(downloadRequest);
     2268#endif
    22642269        downloadID = download->downloadID();
    22652270        handleDownloadRequest(download);
     2271#if PLATFORM(MAC)
    22662272        m_decidePolicyForResponseRequest = { };
    2267     }
    2268 
     2273#endif
     2274    }
     2275
     2276#if PLATFORM(MAC)
    22692277    // If we received a policy decision while in decidePolicyForResponse the decision will
    22702278    // be sent back to the web process by decidePolicyForResponse.
     
    22862294   
    22872295    m_process->send(Messages::WebPage::DidReceivePolicyDecision(frame.frameID(), listenerID, action, navigation ? navigation->navigationID() : 0, downloadID), m_pageID);
     2296#else
     2297    if (m_inDecidePolicyForResponseSync) {
     2298        m_syncMimeTypePolicyActionIsValid = true;
     2299        m_syncMimeTypePolicyAction = action;
     2300        m_syncMimeTypePolicyDownloadID = downloadID;
     2301        return;
     2302    }
     2303
     2304    if (m_inDecidePolicyForNavigationAction) {
     2305        m_syncNavigationActionPolicyActionIsValid = true;
     2306        m_syncNavigationActionPolicyAction = action;
     2307        m_syncNavigationActionPolicyDownloadID = downloadID;
     2308        m_syncNavigationActionPolicyWebsitePolicies = websitePolicies;
     2309        return;
     2310    }
     2311
     2312    m_process->send(Messages::WebPage::DidReceivePolicyDecision(frame.frameID(), listenerID, action, navigation ? navigation->navigationID() : 0, downloadID, websitePolicies), m_pageID);
     2313#endif
    22882314}
    22892315
     
    36283654}
    36293655
     3656#if PLATFORM(MAC)
    36303657void WebPageProxy::decidePolicyForNavigationAction(uint64_t frameID, const SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const NavigationActionData& navigationActionData, const FrameInfoData& originatingFrameInfoData, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, const ResourceRequest& request, uint64_t listenerID, const UserData& userData, Ref<Messages::WebPageProxy::DecidePolicyForNavigationAction::DelayedReply>&& reply)
     3658#else
     3659void WebPageProxy::decidePolicyForNavigationAction(uint64_t frameID, const SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const NavigationActionData& navigationActionData, const FrameInfoData& originatingFrameInfoData, uint64_t originatingPageID, 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)
     3660#endif
    36313661{
    36323662    PageClientProtector protector(m_pageClient);
     
    36433673    MESSAGE_CHECK_URL(originalRequest.url());
    36443674   
     3675#if PLATFORM(MAC)
    36453676    m_newNavigationID = 0;
     3677#endif
    36463678    Ref<WebFramePolicyListenerProxy> listener = frame->setUpPolicyListenerProxy(listenerID);
    36473679    if (!navigationID && frame->isMainFrame()) {
    36483680        auto navigation = m_navigationState->createLoadRequestNavigation(request);
     3681#if PLATFORM(MAC)
    36493682        m_newNavigationID = navigation->navigationID();
     3683#else
     3684        newNavigationID = navigation->navigationID();
     3685#endif
    36503686        listener->setNavigation(WTFMove(navigation));
    36513687    }
     
    36533689#if ENABLE(CONTENT_FILTERING)
    36543690    if (frame->didHandleContentFilterUnblockNavigation(request)) {
     3691#if PLATFORM(MAC)
    36553692        reply->send(m_newNavigationID, PolicyIgnore, { }, { });
    36563693        m_newNavigationID = 0;
    3657         return;
    3658     }
    3659 #endif
     3694#else // PLATFORM(MAC)
     3695        receivedPolicyAction = true;
     3696        policyAction = PolicyIgnore;
     3697#endif // PLATFORM(MAC)
     3698        return;
     3699    }
     3700#endif // ENABLE(CONTENT_FILTERING)
     3701
     3702#if !PLATFORM(MAC)
     3703    ASSERT(!m_inDecidePolicyForNavigationAction);
     3704
     3705    m_inDecidePolicyForNavigationAction = true;
     3706    m_syncNavigationActionPolicyActionIsValid = false;
     3707#endif // PLATFORM(MAC)
    36603708
    36613709#if ENABLE(DOWNLOAD_ATTRIBUTE)
    36623710    m_syncNavigationActionHasDownloadAttribute = !navigationActionData.downloadAttribute.isNull();
    36633711#endif
     3712#if PLATFORM(MAC)
    36643713    m_navigationActionPolicyReply = WTFMove(reply);
     3714#endif
    36653715
    36663716    WebFrameProxy* originatingFrame = m_process->webFrame(originatingFrameInfoData.frameID);
     
    36843734
    36853735    m_shouldSuppressAppLinksInNextNavigationPolicyDecision = false;
     3736#if !PLATFORM(MAC)
     3737    m_inDecidePolicyForNavigationAction = false;
     3738
     3739    // Check if we received a policy decision already. If we did, we can just pass it back.
     3740    receivedPolicyAction = m_syncNavigationActionPolicyActionIsValid;
     3741    if (m_syncNavigationActionPolicyActionIsValid) {
     3742        policyAction = m_syncNavigationActionPolicyAction;
     3743        downloadID = m_syncNavigationActionPolicyDownloadID;
     3744        websitePolicies = m_syncNavigationActionPolicyWebsitePolicies;
     3745    }
     3746#endif
    36863747}
    36873748
     
    37293790}
    37303791
     3792#if PLATFORM(MAC)
    37313793void 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)
     3794#else
     3795void 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)
     3796#endif
    37323797{
    37333798    PageClientProtector protector(m_pageClient);
    37343799
     3800#if PLATFORM(MAC)
    37353801    m_decidePolicyForResponseRequest = request;
    37363802    m_responsePolicyReply = WTFMove(reply);
     3803#else
     3804    ASSERT(!m_inDecidePolicyForResponseSync);
     3805
     3806    m_inDecidePolicyForResponseSync = true;
     3807    m_decidePolicyForResponseRequest = &request;
     3808    m_syncMimeTypePolicyActionIsValid = false;
     3809#endif
    37373810
    37383811    decidePolicyForResponse(frameID, frameSecurityOrigin, response, request, canShowMIMEType, listenerID, userData);
     3812#if !PLATFORM(MAC)
     3813    m_inDecidePolicyForResponseSync = false;
     3814    m_decidePolicyForResponseRequest = nullptr;
     3815
     3816    // Check if we received a policy decision already. If we did, we can just pass it back.
     3817    receivedPolicyAction = m_syncMimeTypePolicyActionIsValid;
     3818    if (m_syncMimeTypePolicyActionIsValid) {
     3819        policyAction = m_syncMimeTypePolicyAction;
     3820        downloadID = m_syncMimeTypePolicyDownloadID;
     3821    }
     3822#endif
    37393823}
    37403824
  • branches/safari-604-branch/Source/WebKit/UIProcess/WebPageProxy.h

    r222913 r223165  
    12741274    void didDestroyNavigation(uint64_t navigationID);
    12751275
     1276#if PLATFORM(MAC)
    12761277    void decidePolicyForNavigationAction(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const NavigationActionData&, const FrameInfoData&, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, const WebCore::ResourceRequest&, uint64_t listenerID, const UserData&, Ref<Messages::WebPageProxy::DecidePolicyForNavigationAction::DelayedReply>&&);
     1278#else
     1279    void decidePolicyForNavigationAction(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const NavigationActionData&, const FrameInfoData&, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, const WebCore::ResourceRequest&, uint64_t listenerID, const UserData&, bool& receivedPolicyAction, uint64_t& newNavigationID, uint64_t& policyAction, DownloadID&, WebsitePolicies&);
     1280#endif
    12771281    void decidePolicyForNewWindowAction(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, const NavigationActionData&, const WebCore::ResourceRequest&, const String& frameName, uint64_t listenerID, const UserData&);
    12781282    void decidePolicyForResponse(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, const WebCore::ResourceResponse&, const WebCore::ResourceRequest&, bool canShowMIMEType, uint64_t listenerID, const UserData&);
     1283#if PLATFORM(MAC)
    12791284    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>&&);
     1285#else
     1286    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&);
     1287#endif
    12801288    void unableToImplementPolicy(uint64_t frameID, const WebCore::ResourceError&, const UserData&);
    12811289
     
    17911799    bool m_isPerformingDOMPrintOperation { false };
    17921800
     1801#if PLATFORM(MAC)
    17931802    RefPtr<Messages::WebPageProxy::DecidePolicyForNavigationAction::DelayedReply> m_navigationActionPolicyReply;
    17941803    uint64_t m_newNavigationID { 0 };
    17951804    RefPtr<Messages::WebPageProxy::DecidePolicyForResponseSync::DelayedReply> m_responsePolicyReply;
    17961805    WebCore::ResourceRequest m_decidePolicyForResponseRequest;
     1806#else
     1807    bool m_inDecidePolicyForResponseSync { false };
     1808    const WebCore::ResourceRequest* m_decidePolicyForResponseRequest { nullptr };
     1809    bool m_syncMimeTypePolicyActionIsValid { false };
     1810    WebCore::PolicyAction m_syncMimeTypePolicyAction { WebCore::PolicyUse };
     1811    DownloadID m_syncMimeTypePolicyDownloadID { 0 };
     1812    bool m_inDecidePolicyForNavigationAction { false };
     1813    bool m_syncNavigationActionPolicyActionIsValid { false };
     1814    WebCore::PolicyAction m_syncNavigationActionPolicyAction { WebCore::PolicyUse };
     1815    DownloadID m_syncNavigationActionPolicyDownloadID { 0 };
     1816    WebsitePolicies m_syncNavigationActionPolicyWebsitePolicies;
     1817#endif
    17971818
    17981819    bool m_shouldSuppressAppLinksInNextNavigationPolicyDecision { false };
  • branches/safari-604-branch/Source/WebKit/UIProcess/WebPageProxy.messages.in

    r222913 r223165  
    100100
    101101    # Policy messages
     102#if PLATFORM(MAC)
    102103    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
    103104    DecidePolicyForNavigationAction(uint64_t frameID, struct WebCore::SecurityOriginData frameSecurityOrigin, uint64_t navigationID, struct WebKit::NavigationActionData navigationActionData, struct WebKit::FrameInfoData originatingFrameInfoData, uint64_t originatingPageID, 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
     105#endif
     106#if !PLATFORM(MAC)
     107    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)
     108    DecidePolicyForNavigationAction(uint64_t frameID, struct WebCore::SecurityOriginData frameSecurityOrigin, uint64_t navigationID, struct WebKit::NavigationActionData navigationActionData, struct WebKit::FrameInfoData originatingFrameInfoData, uint64_t originatingPageID, 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)
     109#endif
    104110    DecidePolicyForNewWindowAction(uint64_t frameID, struct WebCore::SecurityOriginData frameSecurityOrigin, struct WebKit::NavigationActionData navigationActionData, WebCore::ResourceRequest request, String frameName, uint64_t listenerID, WebKit::UserData userData)
    105111    UnableToImplementPolicy(uint64_t frameID, WebCore::ResourceError error, WebKit::UserData userData)
  • branches/safari-604-branch/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp

    r222913 r223165  
    701701    bool canShowMIMEType = webPage->canShowMIMEType(response.mimeType());
    702702
     703#if PLATFORM(MAC)
    703704    uint64_t listenerID = m_frame->setUpPolicyListener(WTFMove(function));
     705#else
     706    uint64_t listenerID = m_frame->setUpPolicyListener(WTFMove(function), WebFrame::ForNavigationAction::No);
     707    bool receivedPolicyAction;
     708#endif
    704709    uint64_t policyAction;
    705710    DownloadID downloadID;
     
    707712    Ref<WebFrame> protect(*m_frame);
    708713    WebCore::Frame* coreFrame = m_frame->coreFrame();
     714#if PLATFORM(MAC)
    709715    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)) {
    710716        m_frame->didReceivePolicyDecision(listenerID, PolicyIgnore, 0, { });
    711717        return;
    712718    }
    713 
     719#else
     720    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)) {
     721        m_frame->didReceivePolicyDecision(listenerID, PolicyIgnore, 0, { }, { });
     722        return;
     723    }
     724#endif
     725
     726#if PLATFORM(MAC)
    714727    // We call this synchronously because CFNetwork can only convert a loading connection to a download from its didReceiveResponse callback.
    715728    m_frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), 0, downloadID);
     729#else
     730    if (receivedPolicyAction)
     731        m_frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), 0, downloadID, { });
     732#endif
    716733}
    717734
     
    736753
    737754
     755#if PLATFORM(MAC)
    738756    uint64_t listenerID = m_frame->setUpPolicyListener(WTFMove(function));
     757#else
     758    uint64_t listenerID = m_frame->setUpPolicyListener(WTFMove(function), WebFrame::ForNavigationAction::No);
     759#endif
    739760
    740761    NavigationActionData navigationActionData;
     
    753774}
    754775
    755 void WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction(const NavigationAction& navigationAction, const ResourceRequest& request, bool didReceiveRedirectResponse, FormState* formState, FramePolicyFunction&& function)
    756 {
    757     WebPage* webPage = m_frame->page();
    758     if (!webPage) {
    759         function(PolicyIgnore);
    760         return;
    761     }
    762 
    763     // Always ignore requests with empty URLs.
    764     if (request.isEmpty()) {
    765         function(PolicyIgnore);
    766         return;
    767     }
    768 
    769     RefPtr<API::Object> userData;
    770 
    771     RefPtr<InjectedBundleNavigationAction> action = InjectedBundleNavigationAction::create(m_frame, navigationAction, formState);
    772 
    773     // Notify the bundle client.
    774     WKBundlePagePolicyAction policy = webPage->injectedBundlePolicyClient().decidePolicyForNavigationAction(webPage, m_frame, action.get(), request, userData);
    775     if (policy == WKBundlePagePolicyActionUse) {
    776         function(PolicyUse);
    777         return;
    778     }
    779    
    780     uint64_t listenerID = m_frame->setUpPolicyListener(WTFMove(function));
    781     uint64_t newNavigationID;
    782     uint64_t policyAction;
    783     DownloadID downloadID;
    784 
    785     ASSERT(navigationAction.sourceDocument());
    786     const Document& sourceDocument = *navigationAction.sourceDocument();
    787     RefPtr<WebFrame> originatingFrame = sourceDocument.frame() ? WebFrame::fromCoreFrame(*sourceDocument.frame()) : nullptr;
    788 
    789     FrameInfoData originatingFrameInfoData;
    790     originatingFrameInfoData.isMainFrame = navigationAction.initiatedByMainFrame() == InitiatedByMainFrame::Yes;
    791     originatingFrameInfoData.request = ResourceRequest(sourceDocument.url());
    792     originatingFrameInfoData.securityOrigin = SecurityOriginData::fromSecurityOrigin(sourceDocument.securityOrigin());
    793     if (originatingFrame)
    794         originatingFrameInfoData.frameID = originatingFrame->frameID();
    795 
    796     NavigationActionData navigationActionData;
    797     navigationActionData.navigationType = action->navigationType();
    798     navigationActionData.modifiers = action->modifiers();
    799     navigationActionData.mouseButton = action->mouseButton();
    800     navigationActionData.syntheticClickType = action->syntheticClickType();
    801     navigationActionData.clickLocationInRootViewCoordinates = action->clickLocationInRootViewCoordinates();
    802     navigationActionData.userGestureTokenIdentifier = WebProcess::singleton().userGestureTokenIdentifier(navigationAction.userGestureToken());
    803     navigationActionData.canHandleRequest = webPage->canHandleRequest(request);
    804     navigationActionData.shouldOpenExternalURLsPolicy = navigationAction.shouldOpenExternalURLsPolicy();
    805     navigationActionData.downloadAttribute = navigationAction.downloadAttribute();
    806     navigationActionData.isRedirect = didReceiveRedirectResponse;
    807 
    808     WebCore::Frame* coreFrame = m_frame->coreFrame();
     776#if !PLATFORM(MAC)
     777void WebFrameLoaderClient::applyToDocumentLoader(const WebsitePolicies& websitePolicies)
     778{
     779    if (!m_frame)
     780        return;
     781    auto* coreFrame = m_frame->coreFrame();
     782    if (!coreFrame)
     783        return;
    809784    WebDocumentLoader* documentLoader = static_cast<WebDocumentLoader*>(coreFrame->loader().policyDocumentLoader());
    810     if (!documentLoader) {
    811         // FIXME: When we receive a redirect after the navigation policy has been decided for the initial request,
    812         // the provisional load's DocumentLoader needs to receive navigation policy decisions. We need a better model for this state.
     785    if (!documentLoader)
    813786        documentLoader = static_cast<WebDocumentLoader*>(coreFrame->loader().provisionalDocumentLoader());
    814     }
    815787    if (!documentLoader)
    816788        documentLoader = static_cast<WebDocumentLoader*>(coreFrame->loader().documentLoader());
    817 
    818     // Notify the UIProcess.
    819     Ref<WebFrame> protect(*m_frame);
    820     WebsitePolicies websitePolicies;
    821     // FIXME: Determine the originating page independently from the originating frame as it may exist even if
    822     // the originating frame does not exist. This can happen if the originating frame was removed from the page.
    823     // See <https://bugs.webkit.org/show_bug.cgi?id=174531>.
    824     if (!webPage->sendSync(Messages::WebPageProxy::DecidePolicyForNavigationAction(m_frame->frameID(), SecurityOriginData::fromFrame(coreFrame), documentLoader->navigationID(), navigationActionData, originatingFrameInfoData, originatingFrame && originatingFrame->page() ? originatingFrame->page()->pageID() : 0, navigationAction.resourceRequest(), request, listenerID, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())), Messages::WebPageProxy::DecidePolicyForNavigationAction::Reply(newNavigationID, policyAction, downloadID, websitePolicies))) {
    825         m_frame->didReceivePolicyDecision(listenerID, PolicyIgnore, 0, { });
    826         return;
    827     }
     789    if (!documentLoader)
     790        return;
    828791
    829792    // Only setUserContentExtensionsEnabled if it hasn't already been disabled by reloading without content blockers.
     
    856819        break;
    857820    }
     821}
     822#endif // PLATFORM(MAC)
     823
     824void WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction(const NavigationAction& navigationAction, const ResourceRequest& request, bool didReceiveRedirectResponse, FormState* formState, FramePolicyFunction&& function)
     825{
     826    WebPage* webPage = m_frame->page();
     827    if (!webPage) {
     828        function(PolicyIgnore);
     829        return;
     830    }
     831
     832    // Always ignore requests with empty URLs.
     833    if (request.isEmpty()) {
     834        function(PolicyIgnore);
     835        return;
     836    }
     837
     838    RefPtr<API::Object> userData;
     839
     840    RefPtr<InjectedBundleNavigationAction> action = InjectedBundleNavigationAction::create(m_frame, navigationAction, formState);
     841
     842    // Notify the bundle client.
     843    WKBundlePagePolicyAction policy = webPage->injectedBundlePolicyClient().decidePolicyForNavigationAction(webPage, m_frame, action.get(), request, userData);
     844    if (policy == WKBundlePagePolicyActionUse) {
     845        function(PolicyUse);
     846        return;
     847    }
     848   
     849#if PLATFORM(MAC)
     850    uint64_t listenerID = m_frame->setUpPolicyListener(WTFMove(function));
     851#else
     852    uint64_t listenerID = m_frame->setUpPolicyListener(WTFMove(function), WebFrame::ForNavigationAction::Yes);
     853    bool receivedPolicyAction;
     854#endif
     855    uint64_t newNavigationID;
     856    uint64_t policyAction;
     857    DownloadID downloadID;
     858
     859    ASSERT(navigationAction.sourceDocument());
     860    const Document& sourceDocument = *navigationAction.sourceDocument();
     861    RefPtr<WebFrame> originatingFrame = sourceDocument.frame() ? WebFrame::fromCoreFrame(*sourceDocument.frame()) : nullptr;
     862
     863    FrameInfoData originatingFrameInfoData;
     864    originatingFrameInfoData.isMainFrame = navigationAction.initiatedByMainFrame() == InitiatedByMainFrame::Yes;
     865    originatingFrameInfoData.request = ResourceRequest(sourceDocument.url());
     866    originatingFrameInfoData.securityOrigin = SecurityOriginData::fromSecurityOrigin(sourceDocument.securityOrigin());
     867    if (originatingFrame)
     868        originatingFrameInfoData.frameID = originatingFrame->frameID();
     869
     870    NavigationActionData navigationActionData;
     871    navigationActionData.navigationType = action->navigationType();
     872    navigationActionData.modifiers = action->modifiers();
     873    navigationActionData.mouseButton = action->mouseButton();
     874    navigationActionData.syntheticClickType = action->syntheticClickType();
     875    navigationActionData.clickLocationInRootViewCoordinates = action->clickLocationInRootViewCoordinates();
     876    navigationActionData.userGestureTokenIdentifier = WebProcess::singleton().userGestureTokenIdentifier(navigationAction.userGestureToken());
     877    navigationActionData.canHandleRequest = webPage->canHandleRequest(request);
     878    navigationActionData.shouldOpenExternalURLsPolicy = navigationAction.shouldOpenExternalURLsPolicy();
     879    navigationActionData.downloadAttribute = navigationAction.downloadAttribute();
     880    navigationActionData.isRedirect = didReceiveRedirectResponse;
     881
     882    WebCore::Frame* coreFrame = m_frame->coreFrame();
     883    WebDocumentLoader* documentLoader = static_cast<WebDocumentLoader*>(coreFrame->loader().policyDocumentLoader());
     884    if (!documentLoader) {
     885        // FIXME: When we receive a redirect after the navigation policy has been decided for the initial request,
     886        // the provisional load's DocumentLoader needs to receive navigation policy decisions. We need a better model for this state.
     887        documentLoader = static_cast<WebDocumentLoader*>(coreFrame->loader().provisionalDocumentLoader());
     888    }
     889    if (!documentLoader)
     890        documentLoader = static_cast<WebDocumentLoader*>(coreFrame->loader().documentLoader());
     891
     892    // Notify the UIProcess.
     893    Ref<WebFrame> protect(*m_frame);
     894    WebsitePolicies websitePolicies;
     895    // FIXME: Determine the originating page independently from the originating frame as it may exist even if
     896    // the originating frame does not exist. This can happen if the originating frame was removed from the page.
     897    // See <https://bugs.webkit.org/show_bug.cgi?id=174531>.
     898#if PLATFORM(MAC)
     899    if (!webPage->sendSync(Messages::WebPageProxy::DecidePolicyForNavigationAction(m_frame->frameID(), SecurityOriginData::fromFrame(coreFrame), documentLoader->navigationID(), navigationActionData, originatingFrameInfoData, originatingFrame && originatingFrame->page() ? originatingFrame->page()->pageID() : 0, navigationAction.resourceRequest(), request, listenerID, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())), Messages::WebPageProxy::DecidePolicyForNavigationAction::Reply(newNavigationID, policyAction, downloadID, websitePolicies))) {
     900        m_frame->didReceivePolicyDecision(listenerID, PolicyIgnore, 0, { });
     901        return;
     902    }
     903#else
     904    if (!webPage->sendSync(Messages::WebPageProxy::DecidePolicyForNavigationAction(m_frame->frameID(), SecurityOriginData::fromFrame(coreFrame), documentLoader->navigationID(), navigationActionData, originatingFrameInfoData, originatingFrame && originatingFrame->page() ? originatingFrame->page()->pageID() : 0, navigationAction.resourceRequest(), request, listenerID, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())), Messages::WebPageProxy::DecidePolicyForNavigationAction::Reply(receivedPolicyAction, newNavigationID, policyAction, downloadID, websitePolicies))) {
     905        m_frame->didReceivePolicyDecision(listenerID, PolicyIgnore, 0, { }, { });
     906        return;
     907    }
     908#endif
     909
     910#if PLATFORM(MAC)
     911    // Only setUserContentExtensionsEnabled if it hasn't already been disabled by reloading without content blockers.
     912    if (documentLoader->userContentExtensionsEnabled())
     913        documentLoader->setUserContentExtensionsEnabled(websitePolicies.contentBlockersEnabled);
     914
     915    OptionSet<AutoplayQuirk> quirks;
     916    auto allowedQuirks = websitePolicies.allowedAutoplayQuirks;
     917
     918    if (allowedQuirks.contains(WebsiteAutoplayQuirk::InheritedUserGestures))
     919        quirks |= AutoplayQuirk::InheritedUserGestures;
     920
     921    if (allowedQuirks.contains(WebsiteAutoplayQuirk::SynthesizedPauseEvents))
     922        quirks |= AutoplayQuirk::SynthesizedPauseEvents;
     923
     924    documentLoader->setAllowedAutoplayQuirks(quirks);
     925
     926    switch (websitePolicies.autoplayPolicy) {
     927    case WebsiteAutoplayPolicy::Default:
     928        documentLoader->setAutoplayPolicy(AutoplayPolicy::Default);
     929        break;
     930    case WebsiteAutoplayPolicy::Allow:
     931        documentLoader->setAutoplayPolicy(AutoplayPolicy::Allow);
     932        break;
     933    case WebsiteAutoplayPolicy::AllowWithoutSound:
     934        documentLoader->setAutoplayPolicy(AutoplayPolicy::AllowWithoutSound);
     935        break;
     936    case WebsiteAutoplayPolicy::Deny:
     937        documentLoader->setAutoplayPolicy(AutoplayPolicy::Deny);
     938        break;
     939    }
    858940
    859941    // We call this synchronously because WebCore cannot gracefully handle a frame load without a synchronous navigation policy reply.
    860942    m_frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), newNavigationID, downloadID);
     943#else
     944    if (receivedPolicyAction)
     945        m_frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), newNavigationID, downloadID, websitePolicies);
     946#endif
    861947}
    862948
     
    912998    webPage->injectedBundleFormClient().willSubmitForm(webPage, &form, m_frame, sourceFrame, values, userData);
    913999
     1000#if PLATFORM(MAC)
    9141001    uint64_t listenerID = m_frame->setUpPolicyListener(WTFMove(function));
     1002#else
     1003    uint64_t listenerID = m_frame->setUpPolicyListener(WTFMove(function), WebFrame::ForNavigationAction::No);
     1004#endif
    9151005
    9161006    webPage->send(Messages::WebPageProxy::WillSubmitForm(m_frame->frameID(), sourceFrame->frameID(), values, listenerID, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())));
  • branches/safari-604-branch/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.h

    r222913 r223165  
    3636class PluginView;
    3737class WebFrame;
     38struct WebsitePolicies;
    3839   
    3940class WebFrameLoaderClient final : public WebCore::FrameLoaderClient {
     
    4950    void setUseIconLoadingClient(bool useIconLoadingClient) { m_useIconLoadingClient = useIconLoadingClient; }
    5051
     52#if !PLATFORM(MAC)
     53    void applyToDocumentLoader(const WebsitePolicies&);
     54#endif
    5155private:
    5256    void frameLoaderDestroyed() final;
  • branches/safari-604-branch/Source/WebKit/WebProcess/WebPage/WebFrame.cpp

    r222913 r223165  
    210210}
    211211
     212#if PLATFORM(MAC)
    212213uint64_t WebFrame::setUpPolicyListener(WebCore::FramePolicyFunction&& policyFunction)
     214#else
     215uint64_t WebFrame::setUpPolicyListener(WebCore::FramePolicyFunction&& policyFunction, ForNavigationAction forNavigationAction)
     216#endif
    213217{
    214218    // FIXME: <rdar://5634381> We need to support multiple active policy listeners.
     
    218222    m_policyListenerID = generateListenerID();
    219223    m_policyFunction = WTFMove(policyFunction);
     224#if !PLATFORM(MAC)
     225    m_policyFunctionForNavigationAction = forNavigationAction;
     226#endif
    220227    return m_policyListenerID;
    221228}
     
    229236    m_policyListenerID = 0;
    230237    m_policyFunction = nullptr;
    231 }
    232 
     238#if !PLATFORM(MAC)
     239    m_policyFunctionForNavigationAction = ForNavigationAction::No;
     240#endif
     241}
     242
     243#if PLATFORM(MAC)
    233244void WebFrame::didReceivePolicyDecision(uint64_t listenerID, PolicyAction action, uint64_t navigationID, DownloadID downloadID)
     245#else
     246void WebFrame::didReceivePolicyDecision(uint64_t listenerID, PolicyAction action, uint64_t navigationID, DownloadID downloadID, const WebsitePolicies& websitePolicies)
     247#endif
    234248{
    235249    if (!m_coreFrame)
     
    245259
    246260    FramePolicyFunction function = WTFMove(m_policyFunction);
     261#if !PLATFORM(MAC)
     262    bool forNavigationAction = m_policyFunctionForNavigationAction == ForNavigationAction::Yes;
     263#endif
    247264
    248265    invalidatePolicyListener();
    249266
     267#if !PLATFORM(MAC)
     268    if (forNavigationAction && m_frameLoaderClient)
     269        m_frameLoaderClient->applyToDocumentLoader(websitePolicies);
     270#endif
     271   
    250272    m_policyDownloadID = downloadID;
    251273    if (navigationID) {
  • branches/safari-604-branch/Source/WebKit/WebProcess/WebPage/WebFrame.h

    r222913 r223165  
    6262class WebPage;
    6363struct FrameInfoData;
     64struct WebsitePolicies;
    6465
    6566class WebFrame : public API::ObjectImpl<API::Object::Type::BundleFrame> {
     
    8081    uint64_t frameID() const { return m_frameID; }
    8182
     83#if PLATFORM(MAC)
    8284    uint64_t setUpPolicyListener(WebCore::FramePolicyFunction&&);
     85    void didReceivePolicyDecision(uint64_t listenerID, WebCore::PolicyAction, uint64_t navigationID, DownloadID);
     86#else
     87    enum class ForNavigationAction { No, Yes };
     88    uint64_t setUpPolicyListener(WebCore::FramePolicyFunction&&, ForNavigationAction);
     89    void didReceivePolicyDecision(uint64_t listenerID, WebCore::PolicyAction, uint64_t navigationID, DownloadID, const WebsitePolicies&);
     90#endif
    8391    void invalidatePolicyListener();
    84     void didReceivePolicyDecision(uint64_t listenerID, WebCore::PolicyAction, uint64_t navigationID, DownloadID);
    8592
    8693    void startDownload(const WebCore::ResourceRequest&, const String& suggestedName = { });
     
    172179    uint64_t m_policyListenerID { 0 };
    173180    WebCore::FramePolicyFunction m_policyFunction;
     181#if !PLATFORM(MAC)
     182    ForNavigationAction m_policyFunctionForNavigationAction { ForNavigationAction::No };
     183#endif
    174184    DownloadID m_policyDownloadID { 0 };
    175185
  • branches/safari-604-branch/Source/WebKit/WebProcess/WebPage/WebPage.cpp

    r222913 r223165  
    27242724}
    27252725
     2726#if PLATFORM(MAC)
    27262727void WebPage::didReceivePolicyDecision(uint64_t frameID, uint64_t listenerID, uint32_t policyAction, uint64_t navigationID, const DownloadID& downloadID)
     2728#else
     2729void WebPage::didReceivePolicyDecision(uint64_t frameID, uint64_t listenerID, uint32_t policyAction, uint64_t navigationID, const DownloadID& downloadID, WebsitePolicies&& websitePolicies)
     2730#endif
    27272731{
    27282732    WebFrame* frame = WebProcess::singleton().webFrame(frameID);
    27292733    if (!frame)
    27302734        return;
     2735#if PLATFORM(MAC)
    27312736    frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), navigationID, downloadID);
     2737#else
     2738    frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), navigationID, downloadID, websitePolicies);
     2739#endif
    27322740}
    27332741
  • branches/safari-604-branch/Source/WebKit/WebProcess/WebPage/WebPage.h

    r222913 r223165  
    11281128    void updatePreferences(const WebPreferencesStore&);
    11291129
     1130#if PLATFORM(MAC)
    11301131    void didReceivePolicyDecision(uint64_t frameID, uint64_t listenerID, uint32_t policyAction, uint64_t navigationID, const DownloadID&);
     1132#else
     1133    void didReceivePolicyDecision(uint64_t frameID, uint64_t listenerID, uint32_t policyAction, uint64_t navigationID, const DownloadID&, WebsitePolicies&&);
     1134#endif
     1135
    11311136    void setUserAgent(const String&);
    11321137    void setCustomTextEncodingName(const String&);
  • branches/safari-604-branch/Source/WebKit/WebProcess/WebPage/WebPage.messages.in

    r222913 r223165  
    151151
    152152    UpdateWebsitePolicies(struct WebKit::WebsitePolicies websitePolicies)
     153#if PLATFORM(MAC)
    153154    DidReceivePolicyDecision(uint64_t frameID, uint64_t listenerID, uint32_t policyAction, uint64_t navigationID, WebKit::DownloadID downloadID)
     155#endif
     156#if !PLATFORM(MAC)
     157    DidReceivePolicyDecision(uint64_t frameID, uint64_t listenerID, uint32_t policyAction, uint64_t navigationID, WebKit::DownloadID downloadID, struct WebKit::WebsitePolicies websitePolicies)
     158#endif
    154159
    155160    ClearSelection()
  • branches/safari-604-branch/Tools/ChangeLog

    r223106 r223165  
     12017-10-10  Jason Marcell  <jmarcell@apple.com>
     2
     3        Cherry-pick r223084. rdar://problem/34857469
     4
     5    2017-10-09  Jason Marcell  <jmarcell@apple.com>
     6
     7            Apply patch. rdar://problem/34857459
     8
     9        Apply patch. rdar://problem/34857459
     10
     11        2017-10-06  Alex Christensen  <achristensen@webkit.org>
     12
     13                REGRESSION(r214201): WebProcess hangs during policy decisions
     14                https://bugs.webkit.org/show_bug.cgi?id=177411
     15                <rdar://problem/34815986>
     16
     17                Original patch reviewed by Geoffrey Garen, this is a modification that doesn't change Mac.
     18
     19                * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
     20                * TestWebKitAPI/Tests/WebKit2Cocoa/JavaScriptDuringNavigation.mm: Added.
     21                (-[JSNavigationDelegate webView:didFinishNavigation:]):
     22                (-[JSNavigationDelegate webView:decidePolicyForNavigationAction:decisionHandler:]):
     23                (-[JSNavigationDelegate webView:decidePolicyForNavigationResponse:decisionHandler:]):
     24                (-[JSNavigationDelegate webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:]):
     25                (TEST):
     26
    1272017-10-09  Jason Marcell  <jmarcell@apple.com>
    228
  • branches/safari-604-branch/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj

    r222913 r223165  
    215215                5C2936931D5BF70D00DEAB1E /* CookieAcceptPolicy.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C2936911D5BF63E00DEAB1E /* CookieAcceptPolicy.mm */; };
    216216                5C2936961D5C00ED00DEAB1E /* CookieMessage.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 5C2936941D5BFD1900DEAB1E /* CookieMessage.html */; };
     217                5C5731051F76D85000081388 /* JavaScriptDuringNavigation.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C5731041F76D81F00081388 /* JavaScriptDuringNavigation.mm */; };
    217218                5C6E65441D5CEFD400F7862E /* URLParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C6E65411D5CEF8500F7862E /* URLParser.cpp */; };
    218219                5C726D6F1D3EE06E00C5E1A1 /* InstanceMethodSwizzler.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C726D6E1D3EE06800C5E1A1 /* InstanceMethodSwizzler.mm */; };
     
    12651266                5C2936911D5BF63E00DEAB1E /* CookieAcceptPolicy.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CookieAcceptPolicy.mm; sourceTree = "<group>"; };
    12661267                5C2936941D5BFD1900DEAB1E /* CookieMessage.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = CookieMessage.html; sourceTree = "<group>"; };
     1268                5C5731041F76D81F00081388 /* JavaScriptDuringNavigation.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = JavaScriptDuringNavigation.mm; sourceTree = "<group>"; };
    12671269                5C5E633D1D0B67940085A025 /* UniqueRef.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UniqueRef.cpp; sourceTree = "<group>"; };
    12681270                5C6E65411D5CEF8500F7862E /* URLParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = URLParser.cpp; sourceTree = "<group>"; };
     
    18721874                                5198A23F1EA7E595008910B7 /* InitialWarmedProcessUsed.mm */,
    18731875                                2DB0232E1E4E871800707123 /* InteractionDeadlockAfterCrash.mm */,
     1876                                5C5731041F76D81F00081388 /* JavaScriptDuringNavigation.mm */,
    18741877                                C25CCA051E51380B0026CB8A /* LineBreaking.mm */,
    18751878                                37D36ED61AF42ECD00BAF5D9 /* LoadAlternateHTMLString.mm */,
     
    31213124                                7C83E0BE1D0A651300FEBCF3 /* IndexedDBMultiProcess.mm in Sources */,
    31223125                                7C83E0BF1D0A652200FEBCF3 /* IndexedDBPersistence.mm in Sources */,
     3126                                5C5731051F76D85000081388 /* JavaScriptDuringNavigation.mm in Sources */,
    31233127                                7CCE7EFB1A411AE600447C4C /* InjectedBundleBasic.cpp in Sources */,
    31243128                                7CCE7EFC1A411AE600447C4C /* InjectedBundleFrameHitTest.cpp in Sources */,
Note: See TracChangeset for help on using the changeset viewer.