Title: [223165] branches/safari-604-branch

Diff

Modified: branches/safari-604-branch/Source/WebKit/ChangeLog (223164 => 223165)


--- branches/safari-604-branch/Source/WebKit/ChangeLog	2017-10-11 03:16:39 UTC (rev 223164)
+++ branches/safari-604-branch/Source/WebKit/ChangeLog	2017-10-11 03:49:13 UTC (rev 223165)
@@ -1,5 +1,51 @@
 2017-10-10  Jason Marcell  <jmarc...@apple.com>
 
+        Cherry-pick r223084. rdar://problem/34857469
+
+    2017-10-09  Jason Marcell  <jmarc...@apple.com>
+
+            Apply patch. rdar://problem/34857459
+
+        Apply patch. rdar://problem/34857459
+
+        2017-10-06  Alex Christensen  <achristen...@webkit.org>
+
+                REGRESSION(r214201): WebProcess hangs during policy decisions
+                https://bugs.webkit.org/show_bug.cgi?id=177411
+                <rdar://problem/34815986>
+
+                Original patch reviewed by Geoffrey Garen, this is a modification that doesn't change Mac.
+
+                This is like r222431 which allows the WebProcess to not be hung.  This fixes the desired bug on iOS
+                but without changing Mac, which depends on the ability to asynchronously call the completion handlers.
+
+                This change applies to the safari-604-branch.
+
+                * 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::dispatchDecidePolicyForNewWindowAction):
+                (WebKit::WebFrameLoaderClient::applyToDocumentLoader):
+                (WebKit::WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction):
+                (WebKit::WebFrameLoaderClient::dispatchWillSubmitForm):
+                * WebProcess/WebCoreSupport/WebFrameLoaderClient.h:
+                * WebProcess/WebPage/WebFrame.cpp:
+                (WebKit::WebFrame::setUpPolicyListener):
+                (WebKit::WebFrame::invalidatePolicyListener):
+                (WebKit::WebFrame::didReceivePolicyDecision):
+                * WebProcess/WebPage/WebFrame.h:
+                * WebProcess/WebPage/WebPage.cpp:
+                (WebKit::WebPage::didReceivePolicyDecision):
+                * WebProcess/WebPage/WebPage.h:
+                * WebProcess/WebPage/WebPage.messages.in:
+
+2017-10-10  Jason Marcell  <jmarc...@apple.com>
+
         Cherry-pick r222478. rdar://problem/34771020
 
     2017-09-25  Youenn Fablet  <you...@apple.com>

Modified: branches/safari-604-branch/Source/WebKit/UIProcess/WebPageProxy.cpp (223164 => 223165)


--- branches/safari-604-branch/Source/WebKit/UIProcess/WebPageProxy.cpp	2017-10-11 03:16:39 UTC (rev 223164)
+++ branches/safari-604-branch/Source/WebKit/UIProcess/WebPageProxy.cpp	2017-10-11 03:49:13 UTC (rev 223165)
@@ -2260,12 +2260,20 @@
     DownloadID downloadID = { };
     if (action == PolicyDownload) {
         // Create a download proxy.
+#if PLATFORM(MAC)
         DownloadProxy* download = m_process->processPool().createDownloadProxy(m_decidePolicyForResponseRequest);
+#else
+        const ResourceRequest& downloadRequest = m_decidePolicyForResponseRequest ? *m_decidePolicyForResponseRequest : ResourceRequest();
+        DownloadProxy* download = m_process->processPool().createDownloadProxy(downloadRequest);
+#endif
         downloadID = download->downloadID();
         handleDownloadRequest(download);
+#if PLATFORM(MAC)
         m_decidePolicyForResponseRequest = { };
+#endif
     }
 
+#if PLATFORM(MAC)
     // If we received a policy decision while in decidePolicyForResponse the decision will
     // be sent back to the web process by decidePolicyForResponse.
     if (m_responsePolicyReply) {
@@ -2285,6 +2293,24 @@
     }
     
     m_process->send(Messages::WebPage::DidReceivePolicyDecision(frame.frameID(), listenerID, action, navigation ? navigation->navigationID() : 0, downloadID), m_pageID);
+#else
+    if (m_inDecidePolicyForResponseSync) {
+        m_syncMimeTypePolicyActionIsValid = true;
+        m_syncMimeTypePolicyAction = action;
+        m_syncMimeTypePolicyDownloadID = downloadID;
+        return;
+    }
+
+    if (m_inDecidePolicyForNavigationAction) {
+        m_syncNavigationActionPolicyActionIsValid = true;
+        m_syncNavigationActionPolicyAction = action;
+        m_syncNavigationActionPolicyDownloadID = downloadID;
+        m_syncNavigationActionPolicyWebsitePolicies = websitePolicies;
+        return;
+    }
+
+    m_process->send(Messages::WebPage::DidReceivePolicyDecision(frame.frameID(), listenerID, action, navigation ? navigation->navigationID() : 0, downloadID, websitePolicies), m_pageID);
+#endif
 }
 
 void WebPageProxy::setUserAgent(const String& userAgent)
@@ -3627,7 +3653,11 @@
         m_frameSetLargestFrame = value ? m_mainFrame : 0;
 }
 
+#if PLATFORM(MAC)
 void 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)
+#else
+void 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)
+#endif
 {
     PageClientProtector protector(m_pageClient);
 
@@ -3642,26 +3672,46 @@
     MESSAGE_CHECK_URL(request.url());
     MESSAGE_CHECK_URL(originalRequest.url());
     
+#if PLATFORM(MAC)
     m_newNavigationID = 0;
+#endif
     Ref<WebFramePolicyListenerProxy> listener = frame->setUpPolicyListenerProxy(listenerID);
     if (!navigationID && frame->isMainFrame()) {
         auto navigation = m_navigationState->createLoadRequestNavigation(request);
+#if PLATFORM(MAC)
         m_newNavigationID = navigation->navigationID();
+#else
+        newNavigationID = navigation->navigationID();
+#endif
         listener->setNavigation(WTFMove(navigation));
     }
 
 #if ENABLE(CONTENT_FILTERING)
     if (frame->didHandleContentFilterUnblockNavigation(request)) {
+#if PLATFORM(MAC)
         reply->send(m_newNavigationID, PolicyIgnore, { }, { });
         m_newNavigationID = 0;
+#else // PLATFORM(MAC)
+        receivedPolicyAction = true;
+        policyAction = PolicyIgnore;
+#endif // PLATFORM(MAC)
         return;
     }
-#endif
+#endif // ENABLE(CONTENT_FILTERING)
 
+#if !PLATFORM(MAC)
+    ASSERT(!m_inDecidePolicyForNavigationAction);
+
+    m_inDecidePolicyForNavigationAction = true;
+    m_syncNavigationActionPolicyActionIsValid = false;
+#endif // PLATFORM(MAC)
+
 #if ENABLE(DOWNLOAD_ATTRIBUTE)
     m_syncNavigationActionHasDownloadAttribute = !navigationActionData.downloadAttribute.isNull();
 #endif
+#if PLATFORM(MAC)
     m_navigationActionPolicyReply = WTFMove(reply);
+#endif
 
     WebFrameProxy* originatingFrame = m_process->webFrame(originatingFrameInfoData.frameID);
 
@@ -3683,6 +3733,17 @@
         m_policyClient->decidePolicyForNavigationAction(*this, frame, navigationActionData, originatingFrame, originalRequest, request, WTFMove(listener), m_process->transformHandlesToObjects(userData.object()).get());
 
     m_shouldSuppressAppLinksInNextNavigationPolicyDecision = false;
+#if !PLATFORM(MAC)
+    m_inDecidePolicyForNavigationAction = false;
+
+    // Check if we received a policy decision already. If we did, we can just pass it back.
+    receivedPolicyAction = m_syncNavigationActionPolicyActionIsValid;
+    if (m_syncNavigationActionPolicyActionIsValid) {
+        policyAction = m_syncNavigationActionPolicyAction;
+        downloadID = m_syncNavigationActionPolicyDownloadID;
+        websitePolicies = m_syncNavigationActionPolicyWebsitePolicies;
+    }
+#endif
 }
 
 void WebPageProxy::decidePolicyForNewWindowAction(uint64_t frameID, const SecurityOriginData& frameSecurityOrigin, const NavigationActionData& navigationActionData, const ResourceRequest& request, const String& frameName, uint64_t listenerID, const UserData& userData)
@@ -3728,14 +3789,37 @@
         m_policyClient->decidePolicyForResponse(*this, *frame, response, request, canShowMIMEType, WTFMove(listener), m_process->transformHandlesToObjects(userData.object()).get());
 }
 
+#if PLATFORM(MAC)
 void 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)
+#else
+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)
+#endif
 {
     PageClientProtector protector(m_pageClient);
 
+#if PLATFORM(MAC)
     m_decidePolicyForResponseRequest = request;
     m_responsePolicyReply = WTFMove(reply);
+#else
+    ASSERT(!m_inDecidePolicyForResponseSync);
 
+    m_inDecidePolicyForResponseSync = true;
+    m_decidePolicyForResponseRequest = &request;
+    m_syncMimeTypePolicyActionIsValid = false;
+#endif
+
     decidePolicyForResponse(frameID, frameSecurityOrigin, response, request, canShowMIMEType, listenerID, userData);
+#if !PLATFORM(MAC)
+    m_inDecidePolicyForResponseSync = false;
+    m_decidePolicyForResponseRequest = nullptr;
+
+    // Check if we received a policy decision already. If we did, we can just pass it back.
+    receivedPolicyAction = m_syncMimeTypePolicyActionIsValid;
+    if (m_syncMimeTypePolicyActionIsValid) {
+        policyAction = m_syncMimeTypePolicyAction;
+        downloadID = m_syncMimeTypePolicyDownloadID;
+    }
+#endif
 }
 
 void WebPageProxy::unableToImplementPolicy(uint64_t frameID, const ResourceError& error, const UserData& userData)

Modified: branches/safari-604-branch/Source/WebKit/UIProcess/WebPageProxy.h (223164 => 223165)


--- branches/safari-604-branch/Source/WebKit/UIProcess/WebPageProxy.h	2017-10-11 03:16:39 UTC (rev 223164)
+++ branches/safari-604-branch/Source/WebKit/UIProcess/WebPageProxy.h	2017-10-11 03:49:13 UTC (rev 223165)
@@ -1273,10 +1273,18 @@
 
     void didDestroyNavigation(uint64_t navigationID);
 
+#if PLATFORM(MAC)
     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>&&);
+#else
+    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&);
+#endif
     void decidePolicyForNewWindowAction(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, const NavigationActionData&, const WebCore::ResourceRequest&, const String& frameName, uint64_t listenerID, const UserData&);
     void decidePolicyForResponse(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, const WebCore::ResourceResponse&, const WebCore::ResourceRequest&, bool canShowMIMEType, uint64_t listenerID, const UserData&);
+#if PLATFORM(MAC)
     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>&&);
+#else
+    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&);
+#endif
     void unableToImplementPolicy(uint64_t frameID, const WebCore::ResourceError&, const UserData&);
 
     void willSubmitForm(uint64_t frameID, uint64_t sourceFrameID, const Vector<std::pair<String, String>>& textFieldValues, uint64_t listenerID, const UserData&);
@@ -1790,10 +1798,23 @@
     bool m_isInPrintingMode { false };
     bool m_isPerformingDOMPrintOperation { false };
 
+#if PLATFORM(MAC)
     RefPtr<Messages::WebPageProxy::DecidePolicyForNavigationAction::DelayedReply> m_navigationActionPolicyReply;
     uint64_t m_newNavigationID { 0 };
     RefPtr<Messages::WebPageProxy::DecidePolicyForResponseSync::DelayedReply> m_responsePolicyReply;
     WebCore::ResourceRequest m_decidePolicyForResponseRequest;
+#else
+    bool m_inDecidePolicyForResponseSync { false };
+    const WebCore::ResourceRequest* m_decidePolicyForResponseRequest { nullptr };
+    bool m_syncMimeTypePolicyActionIsValid { false };
+    WebCore::PolicyAction m_syncMimeTypePolicyAction { WebCore::PolicyUse };
+    DownloadID m_syncMimeTypePolicyDownloadID { 0 };
+    bool m_inDecidePolicyForNavigationAction { false };
+    bool m_syncNavigationActionPolicyActionIsValid { false };
+    WebCore::PolicyAction m_syncNavigationActionPolicyAction { WebCore::PolicyUse };
+    DownloadID m_syncNavigationActionPolicyDownloadID { 0 };
+    WebsitePolicies m_syncNavigationActionPolicyWebsitePolicies;
+#endif
 
     bool m_shouldSuppressAppLinksInNextNavigationPolicyDecision { false };
 

Modified: branches/safari-604-branch/Source/WebKit/UIProcess/WebPageProxy.messages.in (223164 => 223165)


--- branches/safari-604-branch/Source/WebKit/UIProcess/WebPageProxy.messages.in	2017-10-11 03:16:39 UTC (rev 223164)
+++ branches/safari-604-branch/Source/WebKit/UIProcess/WebPageProxy.messages.in	2017-10-11 03:49:13 UTC (rev 223165)
@@ -99,8 +99,14 @@
 #endif
 
     # Policy messages
+#if PLATFORM(MAC)
     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
     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
+#endif
+#if !PLATFORM(MAC)
+    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)
+    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)
+#endif
     DecidePolicyForNewWindowAction(uint64_t frameID, struct WebCore::SecurityOriginData frameSecurityOrigin, struct WebKit::NavigationActionData navigationActionData, WebCore::ResourceRequest request, String frameName, uint64_t listenerID, WebKit::UserData userData)
     UnableToImplementPolicy(uint64_t frameID, WebCore::ResourceError error, WebKit::UserData userData)
 

Modified: branches/safari-604-branch/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp (223164 => 223165)


--- branches/safari-604-branch/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp	2017-10-11 03:16:39 UTC (rev 223164)
+++ branches/safari-604-branch/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp	2017-10-11 03:49:13 UTC (rev 223165)
@@ -700,19 +700,36 @@
 
     bool canShowMIMEType = webPage->canShowMIMEType(response.mimeType());
 
+#if PLATFORM(MAC)
     uint64_t listenerID = m_frame->setUpPolicyListener(WTFMove(function));
+#else
+    uint64_t listenerID = m_frame->setUpPolicyListener(WTFMove(function), WebFrame::ForNavigationAction::No);
+    bool receivedPolicyAction;
+#endif
     uint64_t policyAction;
     DownloadID downloadID;
 
     Ref<WebFrame> protect(*m_frame);
     WebCore::Frame* coreFrame = m_frame->coreFrame();
+#if PLATFORM(MAC)
     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)) {
         m_frame->didReceivePolicyDecision(listenerID, PolicyIgnore, 0, { });
         return;
     }
+#else
+    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)) {
+        m_frame->didReceivePolicyDecision(listenerID, PolicyIgnore, 0, { }, { });
+        return;
+    }
+#endif
 
+#if PLATFORM(MAC)
     // We call this synchronously because CFNetwork can only convert a loading connection to a download from its didReceiveResponse callback.
     m_frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), 0, downloadID);
+#else
+    if (receivedPolicyAction)
+        m_frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), 0, downloadID, { });
+#endif
 }
 
 void WebFrameLoaderClient::dispatchDecidePolicyForNewWindowAction(const NavigationAction& navigationAction, const ResourceRequest& request, FormState* formState, const String& frameName, FramePolicyFunction&& function)
@@ -735,7 +752,11 @@
     }
 
 
+#if PLATFORM(MAC)
     uint64_t listenerID = m_frame->setUpPolicyListener(WTFMove(function));
+#else
+    uint64_t listenerID = m_frame->setUpPolicyListener(WTFMove(function), WebFrame::ForNavigationAction::No);
+#endif
 
     NavigationActionData navigationActionData;
     navigationActionData.navigationType = action->navigationType();
@@ -752,6 +773,54 @@
     webPage->send(Messages::WebPageProxy::DecidePolicyForNewWindowAction(m_frame->frameID(), SecurityOriginData::fromFrame(coreFrame), navigationActionData, request, frameName, listenerID, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())));
 }
 
+#if !PLATFORM(MAC)
+void WebFrameLoaderClient::applyToDocumentLoader(const WebsitePolicies& websitePolicies)
+{
+    if (!m_frame)
+        return;
+    auto* coreFrame = m_frame->coreFrame();
+    if (!coreFrame)
+        return;
+    WebDocumentLoader* documentLoader = static_cast<WebDocumentLoader*>(coreFrame->loader().policyDocumentLoader());
+    if (!documentLoader)
+        documentLoader = static_cast<WebDocumentLoader*>(coreFrame->loader().provisionalDocumentLoader());
+    if (!documentLoader)
+        documentLoader = static_cast<WebDocumentLoader*>(coreFrame->loader().documentLoader());
+    if (!documentLoader)
+        return;
+
+    // Only setUserContentExtensionsEnabled if it hasn't already been disabled by reloading without content blockers.
+    if (documentLoader->userContentExtensionsEnabled())
+        documentLoader->setUserContentExtensionsEnabled(websitePolicies.contentBlockersEnabled);
+
+    OptionSet<AutoplayQuirk> quirks;
+    auto allowedQuirks = websitePolicies.allowedAutoplayQuirks;
+
+    if (allowedQuirks.contains(WebsiteAutoplayQuirk::InheritedUserGestures))
+        quirks |= AutoplayQuirk::InheritedUserGestures;
+
+    if (allowedQuirks.contains(WebsiteAutoplayQuirk::SynthesizedPauseEvents))
+        quirks |= AutoplayQuirk::SynthesizedPauseEvents;
+
+    documentLoader->setAllowedAutoplayQuirks(quirks);
+
+    switch (websitePolicies.autoplayPolicy) {
+    case WebsiteAutoplayPolicy::Default:
+        documentLoader->setAutoplayPolicy(AutoplayPolicy::Default);
+        break;
+    case WebsiteAutoplayPolicy::Allow:
+        documentLoader->setAutoplayPolicy(AutoplayPolicy::Allow);
+        break;
+    case WebsiteAutoplayPolicy::AllowWithoutSound:
+        documentLoader->setAutoplayPolicy(AutoplayPolicy::AllowWithoutSound);
+        break;
+    case WebsiteAutoplayPolicy::Deny:
+        documentLoader->setAutoplayPolicy(AutoplayPolicy::Deny);
+        break;
+    }
+}
+#endif // PLATFORM(MAC)
+
 void WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction(const NavigationAction& navigationAction, const ResourceRequest& request, bool didReceiveRedirectResponse, FormState* formState, FramePolicyFunction&& function)
 {
     WebPage* webPage = m_frame->page();
@@ -777,7 +846,12 @@
         return;
     }
     
+#if PLATFORM(MAC)
     uint64_t listenerID = m_frame->setUpPolicyListener(WTFMove(function));
+#else
+    uint64_t listenerID = m_frame->setUpPolicyListener(WTFMove(function), WebFrame::ForNavigationAction::Yes);
+    bool receivedPolicyAction;
+#endif
     uint64_t newNavigationID;
     uint64_t policyAction;
     DownloadID downloadID;
@@ -821,11 +895,19 @@
     // FIXME: Determine the originating page independently from the originating frame as it may exist even if
     // the originating frame does not exist. This can happen if the originating frame was removed from the page.
     // See <https://bugs.webkit.org/show_bug.cgi?id=174531>.
+#if PLATFORM(MAC)
     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))) {
         m_frame->didReceivePolicyDecision(listenerID, PolicyIgnore, 0, { });
         return;
     }
+#else
+    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))) {
+        m_frame->didReceivePolicyDecision(listenerID, PolicyIgnore, 0, { }, { });
+        return;
+    }
+#endif
 
+#if PLATFORM(MAC)
     // Only setUserContentExtensionsEnabled if it hasn't already been disabled by reloading without content blockers.
     if (documentLoader->userContentExtensionsEnabled())
         documentLoader->setUserContentExtensionsEnabled(websitePolicies.contentBlockersEnabled);
@@ -858,6 +940,10 @@
 
     // We call this synchronously because WebCore cannot gracefully handle a frame load without a synchronous navigation policy reply.
     m_frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), newNavigationID, downloadID);
+#else
+    if (receivedPolicyAction)
+        m_frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), newNavigationID, downloadID, websitePolicies);
+#endif
 }
 
 void WebFrameLoaderClient::cancelPolicyCheck()
@@ -911,7 +997,11 @@
     RefPtr<API::Object> userData;
     webPage->injectedBundleFormClient().willSubmitForm(webPage, &form, m_frame, sourceFrame, values, userData);
 
+#if PLATFORM(MAC)
     uint64_t listenerID = m_frame->setUpPolicyListener(WTFMove(function));
+#else
+    uint64_t listenerID = m_frame->setUpPolicyListener(WTFMove(function), WebFrame::ForNavigationAction::No);
+#endif
 
     webPage->send(Messages::WebPageProxy::WillSubmitForm(m_frame->frameID(), sourceFrame->frameID(), values, listenerID, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())));
 }

Modified: branches/safari-604-branch/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.h (223164 => 223165)


--- branches/safari-604-branch/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.h	2017-10-11 03:16:39 UTC (rev 223164)
+++ branches/safari-604-branch/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.h	2017-10-11 03:49:13 UTC (rev 223165)
@@ -35,6 +35,7 @@
 
 class PluginView;
 class WebFrame;
+struct WebsitePolicies;
     
 class WebFrameLoaderClient final : public WebCore::FrameLoaderClient {
 public:
@@ -48,6 +49,9 @@
 
     void setUseIconLoadingClient(bool useIconLoadingClient) { m_useIconLoadingClient = useIconLoadingClient; }
 
+#if !PLATFORM(MAC)
+    void applyToDocumentLoader(const WebsitePolicies&);
+#endif
 private:
     void frameLoaderDestroyed() final;
 

Modified: branches/safari-604-branch/Source/WebKit/WebProcess/WebPage/WebFrame.cpp (223164 => 223165)


--- branches/safari-604-branch/Source/WebKit/WebProcess/WebPage/WebFrame.cpp	2017-10-11 03:16:39 UTC (rev 223164)
+++ branches/safari-604-branch/Source/WebKit/WebProcess/WebPage/WebFrame.cpp	2017-10-11 03:49:13 UTC (rev 223165)
@@ -209,7 +209,11 @@
     m_coreFrame = 0;
 }
 
+#if PLATFORM(MAC)
 uint64_t WebFrame::setUpPolicyListener(WebCore::FramePolicyFunction&& policyFunction)
+#else
+uint64_t WebFrame::setUpPolicyListener(WebCore::FramePolicyFunction&& policyFunction, ForNavigationAction forNavigationAction)
+#endif
 {
     // FIXME: <rdar://5634381> We need to support multiple active policy listeners.
 
@@ -217,6 +221,9 @@
 
     m_policyListenerID = generateListenerID();
     m_policyFunction = WTFMove(policyFunction);
+#if !PLATFORM(MAC)
+    m_policyFunctionForNavigationAction = forNavigationAction;
+#endif
     return m_policyListenerID;
 }
 
@@ -228,9 +235,16 @@
     m_policyDownloadID = { };
     m_policyListenerID = 0;
     m_policyFunction = nullptr;
+#if !PLATFORM(MAC)
+    m_policyFunctionForNavigationAction = ForNavigationAction::No;
+#endif
 }
 
+#if PLATFORM(MAC)
 void WebFrame::didReceivePolicyDecision(uint64_t listenerID, PolicyAction action, uint64_t navigationID, DownloadID downloadID)
+#else
+void WebFrame::didReceivePolicyDecision(uint64_t listenerID, PolicyAction action, uint64_t navigationID, DownloadID downloadID, const WebsitePolicies& websitePolicies)
+#endif
 {
     if (!m_coreFrame)
         return;
@@ -244,9 +258,17 @@
     ASSERT(m_policyFunction);
 
     FramePolicyFunction function = WTFMove(m_policyFunction);
+#if !PLATFORM(MAC)
+    bool forNavigationAction = m_policyFunctionForNavigationAction == ForNavigationAction::Yes;
+#endif
 
     invalidatePolicyListener();
 
+#if !PLATFORM(MAC)
+    if (forNavigationAction && m_frameLoaderClient)
+        m_frameLoaderClient->applyToDocumentLoader(websitePolicies);
+#endif
+    
     m_policyDownloadID = downloadID;
     if (navigationID) {
         if (WebDocumentLoader* documentLoader = static_cast<WebDocumentLoader*>(m_coreFrame->loader().policyDocumentLoader()))

Modified: branches/safari-604-branch/Source/WebKit/WebProcess/WebPage/WebFrame.h (223164 => 223165)


--- branches/safari-604-branch/Source/WebKit/WebProcess/WebPage/WebFrame.h	2017-10-11 03:16:39 UTC (rev 223164)
+++ branches/safari-604-branch/Source/WebKit/WebProcess/WebPage/WebFrame.h	2017-10-11 03:49:13 UTC (rev 223165)
@@ -61,6 +61,7 @@
 class InjectedBundleScriptWorld;
 class WebPage;
 struct FrameInfoData;
+struct WebsitePolicies;
 
 class WebFrame : public API::ObjectImpl<API::Object::Type::BundleFrame> {
 public:
@@ -79,9 +80,15 @@
     FrameInfoData info() const;
     uint64_t frameID() const { return m_frameID; }
 
+#if PLATFORM(MAC)
     uint64_t setUpPolicyListener(WebCore::FramePolicyFunction&&);
+    void didReceivePolicyDecision(uint64_t listenerID, WebCore::PolicyAction, uint64_t navigationID, DownloadID);
+#else
+    enum class ForNavigationAction { No, Yes };
+    uint64_t setUpPolicyListener(WebCore::FramePolicyFunction&&, ForNavigationAction);
+    void didReceivePolicyDecision(uint64_t listenerID, WebCore::PolicyAction, uint64_t navigationID, DownloadID, const WebsitePolicies&);
+#endif
     void invalidatePolicyListener();
-    void didReceivePolicyDecision(uint64_t listenerID, WebCore::PolicyAction, uint64_t navigationID, DownloadID);
 
     void startDownload(const WebCore::ResourceRequest&, const String& suggestedName = { });
     void convertMainResourceLoadToDownload(WebCore::DocumentLoader*, WebCore::SessionID, const WebCore::ResourceRequest&, const WebCore::ResourceResponse&);
@@ -171,6 +178,9 @@
 
     uint64_t m_policyListenerID { 0 };
     WebCore::FramePolicyFunction m_policyFunction;
+#if !PLATFORM(MAC)
+    ForNavigationAction m_policyFunctionForNavigationAction { ForNavigationAction::No };
+#endif
     DownloadID m_policyDownloadID { 0 };
 
     std::unique_ptr<WebFrameLoaderClient> m_frameLoaderClient;

Modified: branches/safari-604-branch/Source/WebKit/WebProcess/WebPage/WebPage.cpp (223164 => 223165)


--- branches/safari-604-branch/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2017-10-11 03:16:39 UTC (rev 223164)
+++ branches/safari-604-branch/Source/WebKit/WebProcess/WebPage/WebPage.cpp	2017-10-11 03:49:13 UTC (rev 223165)
@@ -2723,12 +2723,20 @@
     m_page->setSessionID(sessionID);
 }
 
+#if PLATFORM(MAC)
 void WebPage::didReceivePolicyDecision(uint64_t frameID, uint64_t listenerID, uint32_t policyAction, uint64_t navigationID, const DownloadID& downloadID)
+#else
+void WebPage::didReceivePolicyDecision(uint64_t frameID, uint64_t listenerID, uint32_t policyAction, uint64_t navigationID, const DownloadID& downloadID, WebsitePolicies&& websitePolicies)
+#endif
 {
     WebFrame* frame = WebProcess::singleton().webFrame(frameID);
     if (!frame)
         return;
+#if PLATFORM(MAC)
     frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), navigationID, downloadID);
+#else
+    frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), navigationID, downloadID, websitePolicies);
+#endif
 }
 
 void WebPage::didStartPageTransition()

Modified: branches/safari-604-branch/Source/WebKit/WebProcess/WebPage/WebPage.h (223164 => 223165)


--- branches/safari-604-branch/Source/WebKit/WebProcess/WebPage/WebPage.h	2017-10-11 03:16:39 UTC (rev 223164)
+++ branches/safari-604-branch/Source/WebKit/WebProcess/WebPage/WebPage.h	2017-10-11 03:49:13 UTC (rev 223165)
@@ -1127,7 +1127,12 @@
     void platformPreferencesDidChange(const WebPreferencesStore&);
     void updatePreferences(const WebPreferencesStore&);
 
+#if PLATFORM(MAC)
     void didReceivePolicyDecision(uint64_t frameID, uint64_t listenerID, uint32_t policyAction, uint64_t navigationID, const DownloadID&);
+#else
+    void didReceivePolicyDecision(uint64_t frameID, uint64_t listenerID, uint32_t policyAction, uint64_t navigationID, const DownloadID&, WebsitePolicies&&);
+#endif
+
     void setUserAgent(const String&);
     void setCustomTextEncodingName(const String&);
     void suspendActiveDOMObjectsAndAnimations();

Modified: branches/safari-604-branch/Source/WebKit/WebProcess/WebPage/WebPage.messages.in (223164 => 223165)


--- branches/safari-604-branch/Source/WebKit/WebProcess/WebPage/WebPage.messages.in	2017-10-11 03:16:39 UTC (rev 223164)
+++ branches/safari-604-branch/Source/WebKit/WebProcess/WebPage/WebPage.messages.in	2017-10-11 03:49:13 UTC (rev 223165)
@@ -150,7 +150,12 @@
     DidRemoveBackForwardItem(uint64_t backForwardItemID)
 
     UpdateWebsitePolicies(struct WebKit::WebsitePolicies websitePolicies)
+#if PLATFORM(MAC)
     DidReceivePolicyDecision(uint64_t frameID, uint64_t listenerID, uint32_t policyAction, uint64_t navigationID, WebKit::DownloadID downloadID)
+#endif
+#if !PLATFORM(MAC)
+    DidReceivePolicyDecision(uint64_t frameID, uint64_t listenerID, uint32_t policyAction, uint64_t navigationID, WebKit::DownloadID downloadID, struct WebKit::WebsitePolicies websitePolicies)
+#endif
 
     ClearSelection()
     RestoreSelectionInFocusedEditableElement()

Modified: branches/safari-604-branch/Tools/ChangeLog (223164 => 223165)


--- branches/safari-604-branch/Tools/ChangeLog	2017-10-11 03:16:39 UTC (rev 223164)
+++ branches/safari-604-branch/Tools/ChangeLog	2017-10-11 03:49:13 UTC (rev 223165)
@@ -1,3 +1,29 @@
+2017-10-10  Jason Marcell  <jmarc...@apple.com>
+
+        Cherry-pick r223084. rdar://problem/34857469
+
+    2017-10-09  Jason Marcell  <jmarc...@apple.com>
+
+            Apply patch. rdar://problem/34857459
+
+        Apply patch. rdar://problem/34857459
+
+        2017-10-06  Alex Christensen  <achristen...@webkit.org>
+
+                REGRESSION(r214201): WebProcess hangs during policy decisions
+                https://bugs.webkit.org/show_bug.cgi?id=177411
+                <rdar://problem/34815986>
+
+                Original patch reviewed by Geoffrey Garen, this is a modification that doesn't change Mac.
+
+                * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+                * TestWebKitAPI/Tests/WebKit2Cocoa/_javascript_DuringNavigation.mm: Added.
+                (-[JSNavigationDelegate webView:didFinishNavigation:]):
+                (-[JSNavigationDelegate webView:decidePolicyForNavigationAction:decisionHandler:]):
+                (-[JSNavigationDelegate webView:decidePolicyForNavigationResponse:decisionHandler:]):
+                (-[JSNavigationDelegate webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:]):
+                (TEST):
+
 2017-10-09  Jason Marcell  <jmarc...@apple.com>
 
         Cherry-pick r220412. rdar://problem/34771061

Modified: branches/safari-604-branch/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (223164 => 223165)


--- branches/safari-604-branch/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2017-10-11 03:16:39 UTC (rev 223164)
+++ branches/safari-604-branch/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2017-10-11 03:49:13 UTC (rev 223165)
@@ -214,6 +214,7 @@
 		5C0BF8951DD599CD00B00328 /* NavigatorLanguage.mm in Sources */ = {isa = PBXBuildFile; fileRef = E19DB9781B32137C00DB38D4 /* NavigatorLanguage.mm */; };
 		5C2936931D5BF70D00DEAB1E /* CookieAcceptPolicy.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C2936911D5BF63E00DEAB1E /* CookieAcceptPolicy.mm */; };
 		5C2936961D5C00ED00DEAB1E /* CookieMessage.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 5C2936941D5BFD1900DEAB1E /* CookieMessage.html */; };
+		5C5731051F76D85000081388 /* _javascript_DuringNavigation.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C5731041F76D81F00081388 /* _javascript_DuringNavigation.mm */; };
 		5C6E65441D5CEFD400F7862E /* URLParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C6E65411D5CEF8500F7862E /* URLParser.cpp */; };
 		5C726D6F1D3EE06E00C5E1A1 /* InstanceMethodSwizzler.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C726D6E1D3EE06800C5E1A1 /* InstanceMethodSwizzler.mm */; };
 		5C7964101EB0278D0075D74C /* EventModifiers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C79640F1EB0269B0075D74C /* EventModifiers.cpp */; };
@@ -1264,6 +1265,7 @@
 		5C0BF88F1DD5999B00B00328 /* WebViewCanPasteZeroPng.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebViewCanPasteZeroPng.mm; sourceTree = "<group>"; };
 		5C2936911D5BF63E00DEAB1E /* CookieAcceptPolicy.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CookieAcceptPolicy.mm; sourceTree = "<group>"; };
 		5C2936941D5BFD1900DEAB1E /* CookieMessage.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = CookieMessage.html; sourceTree = "<group>"; };
+		5C5731041F76D81F00081388 /* _javascript_DuringNavigation.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = _javascript_DuringNavigation.mm; sourceTree = "<group>"; };
 		5C5E633D1D0B67940085A025 /* UniqueRef.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UniqueRef.cpp; sourceTree = "<group>"; };
 		5C6E65411D5CEF8500F7862E /* URLParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = URLParser.cpp; sourceTree = "<group>"; };
 		5C726D6D1D3EE06800C5E1A1 /* InstanceMethodSwizzler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = InstanceMethodSwizzler.h; path = cocoa/InstanceMethodSwizzler.h; sourceTree = "<group>"; };
@@ -1871,6 +1873,7 @@
 				51B1EE8D1C80F5880064FB98 /* IndexedDBPersistence.mm */,
 				5198A23F1EA7E595008910B7 /* InitialWarmedProcessUsed.mm */,
 				2DB0232E1E4E871800707123 /* InteractionDeadlockAfterCrash.mm */,
+				5C5731041F76D81F00081388 /* _javascript_DuringNavigation.mm */,
 				C25CCA051E51380B0026CB8A /* LineBreaking.mm */,
 				37D36ED61AF42ECD00BAF5D9 /* LoadAlternateHTMLString.mm */,
 				A125478D1DB18B9400358564 /* LoadDataWithNilMIMEType.mm */,
@@ -3120,6 +3123,7 @@
 				51A587861D273AA9004BA9AF /* IndexedDBDatabaseProcessKill.mm in Sources */,
 				7C83E0BE1D0A651300FEBCF3 /* IndexedDBMultiProcess.mm in Sources */,
 				7C83E0BF1D0A652200FEBCF3 /* IndexedDBPersistence.mm in Sources */,
+				5C5731051F76D85000081388 /* _javascript_DuringNavigation.mm in Sources */,
 				7CCE7EFB1A411AE600447C4C /* InjectedBundleBasic.cpp in Sources */,
 				7CCE7EFC1A411AE600447C4C /* InjectedBundleFrameHitTest.cpp in Sources */,
 				7CCE7EFD1A411AE600447C4C /* InjectedBundleInitializationUserDataCallbackWins.cpp in Sources */,

Added: branches/safari-604-branch/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/_javascript_DuringNavigation.mm (0 => 223165)


--- branches/safari-604-branch/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/_javascript_DuringNavigation.mm	                        (rev 0)
+++ branches/safari-604-branch/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/_javascript_DuringNavigation.mm	2017-10-11 03:49:13 UTC (rev 223165)
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2017 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+
+#import "PlatformUtilities.h"
+#import "Test.h"
+#import <WebKit/WKWebView.h>
+#import <wtf/RetainPtr.h>
+
+#if WK_API_ENABLED && PLATFORM(IOS)
+
+static bool navigationComplete;
+static size_t alerts;
+static bool receivedBothAlerts;
+static RetainPtr<NSURL> firstURL;
+static RetainPtr<NSURL> secondURL;
+
+@interface JSNavigationDelegate : NSObject <WKNavigationDelegate, WKUIDelegate>
+@end
+
+@implementation JSNavigationDelegate
+
+- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation
+{
+    navigationComplete = true;
+}
+
+- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
+{
+    if ([navigationAction.request.URL.absoluteString isEqualToString:[secondURL absoluteString]]) {
+        [webView evaluateJavaScript:@"alert(document.location);" completionHandler:^(id, NSError *) {
+            decisionHandler(WKNavigationActionPolicyAllow);
+        }];
+    } else
+        decisionHandler(WKNavigationActionPolicyAllow);
+}
+
+- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler
+{
+    if ([navigationResponse.response.URL.absoluteString isEqualToString:[secondURL absoluteString]]) {
+        [webView evaluateJavaScript:@"alert(document.location);" completionHandler:^(id, NSError *) {
+            decisionHandler(WKNavigationResponsePolicyAllow);
+        }];
+    } else
+    decisionHandler(WKNavigationResponsePolicyAllow);
+}
+
+- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler
+{
+    EXPECT_STREQ(message.UTF8String, [[firstURL absoluteString] UTF8String]);
+    if (++alerts == 2)
+        receivedBothAlerts = true;
+    completionHandler();
+}
+
+@end
+
+TEST(WebKit2, _javascript_DuringNavigation)
+{
+    firstURL = [[NSBundle mainBundle] URLForResource:@"simple" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"];
+    secondURL = [[NSBundle mainBundle] URLForResource:@"simple2" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"];
+    
+    auto webView = adoptNS([[WKWebView alloc] init]);
+    auto delegate = adoptNS([[JSNavigationDelegate alloc] init]);
+    [webView setNavigationDelegate:delegate.get()];
+    [webView setUIDelegate:delegate.get()];
+
+    [webView loadRequest:[NSURLRequest requestWithURL:firstURL.get()]];
+    TestWebKitAPI::Util::run(&navigationComplete);
+
+    [webView loadRequest:[NSURLRequest requestWithURL:secondURL.get()]];
+    TestWebKitAPI::Util::run(&receivedBothAlerts);
+}
+
+#endif
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to