Changeset 223165 in webkit
- Timestamp:
- Oct 10, 2017 8:49:13 PM (7 years ago)
- Location:
- branches/safari-604-branch
- Files:
-
- 1 added
- 13 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/safari-604-branch/Source/WebKit/ChangeLog
r223157 r223165 1 2017-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 1 47 2017-10-10 Jason Marcell <jmarcell@apple.com> 2 48 -
branches/safari-604-branch/Source/WebKit/UIProcess/WebPageProxy.cpp
r222913 r223165 2261 2261 if (action == PolicyDownload) { 2262 2262 // Create a download proxy. 2263 #if PLATFORM(MAC) 2263 2264 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 2264 2269 downloadID = download->downloadID(); 2265 2270 handleDownloadRequest(download); 2271 #if PLATFORM(MAC) 2266 2272 m_decidePolicyForResponseRequest = { }; 2267 } 2268 2273 #endif 2274 } 2275 2276 #if PLATFORM(MAC) 2269 2277 // If we received a policy decision while in decidePolicyForResponse the decision will 2270 2278 // be sent back to the web process by decidePolicyForResponse. … … 2286 2294 2287 2295 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 2288 2314 } 2289 2315 … … 3628 3654 } 3629 3655 3656 #if PLATFORM(MAC) 3630 3657 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) 3658 #else 3659 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) 3660 #endif 3631 3661 { 3632 3662 PageClientProtector protector(m_pageClient); … … 3643 3673 MESSAGE_CHECK_URL(originalRequest.url()); 3644 3674 3675 #if PLATFORM(MAC) 3645 3676 m_newNavigationID = 0; 3677 #endif 3646 3678 Ref<WebFramePolicyListenerProxy> listener = frame->setUpPolicyListenerProxy(listenerID); 3647 3679 if (!navigationID && frame->isMainFrame()) { 3648 3680 auto navigation = m_navigationState->createLoadRequestNavigation(request); 3681 #if PLATFORM(MAC) 3649 3682 m_newNavigationID = navigation->navigationID(); 3683 #else 3684 newNavigationID = navigation->navigationID(); 3685 #endif 3650 3686 listener->setNavigation(WTFMove(navigation)); 3651 3687 } … … 3653 3689 #if ENABLE(CONTENT_FILTERING) 3654 3690 if (frame->didHandleContentFilterUnblockNavigation(request)) { 3691 #if PLATFORM(MAC) 3655 3692 reply->send(m_newNavigationID, PolicyIgnore, { }, { }); 3656 3693 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) 3660 3708 3661 3709 #if ENABLE(DOWNLOAD_ATTRIBUTE) 3662 3710 m_syncNavigationActionHasDownloadAttribute = !navigationActionData.downloadAttribute.isNull(); 3663 3711 #endif 3712 #if PLATFORM(MAC) 3664 3713 m_navigationActionPolicyReply = WTFMove(reply); 3714 #endif 3665 3715 3666 3716 WebFrameProxy* originatingFrame = m_process->webFrame(originatingFrameInfoData.frameID); … … 3684 3734 3685 3735 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 3686 3747 } 3687 3748 … … 3729 3790 } 3730 3791 3792 #if PLATFORM(MAC) 3731 3793 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) 3794 #else 3795 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) 3796 #endif 3732 3797 { 3733 3798 PageClientProtector protector(m_pageClient); 3734 3799 3800 #if PLATFORM(MAC) 3735 3801 m_decidePolicyForResponseRequest = request; 3736 3802 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 3737 3810 3738 3811 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 3739 3823 } 3740 3824 -
branches/safari-604-branch/Source/WebKit/UIProcess/WebPageProxy.h
r222913 r223165 1274 1274 void didDestroyNavigation(uint64_t navigationID); 1275 1275 1276 #if PLATFORM(MAC) 1276 1277 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 1277 1281 void decidePolicyForNewWindowAction(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, const NavigationActionData&, const WebCore::ResourceRequest&, const String& frameName, uint64_t listenerID, const UserData&); 1278 1282 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) 1279 1284 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 1280 1288 void unableToImplementPolicy(uint64_t frameID, const WebCore::ResourceError&, const UserData&); 1281 1289 … … 1791 1799 bool m_isPerformingDOMPrintOperation { false }; 1792 1800 1801 #if PLATFORM(MAC) 1793 1802 RefPtr<Messages::WebPageProxy::DecidePolicyForNavigationAction::DelayedReply> m_navigationActionPolicyReply; 1794 1803 uint64_t m_newNavigationID { 0 }; 1795 1804 RefPtr<Messages::WebPageProxy::DecidePolicyForResponseSync::DelayedReply> m_responsePolicyReply; 1796 1805 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 1797 1818 1798 1819 bool m_shouldSuppressAppLinksInNextNavigationPolicyDecision { false }; -
branches/safari-604-branch/Source/WebKit/UIProcess/WebPageProxy.messages.in
r222913 r223165 100 100 101 101 # Policy messages 102 #if PLATFORM(MAC) 102 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 103 104 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 104 110 DecidePolicyForNewWindowAction(uint64_t frameID, struct WebCore::SecurityOriginData frameSecurityOrigin, struct WebKit::NavigationActionData navigationActionData, WebCore::ResourceRequest request, String frameName, uint64_t listenerID, WebKit::UserData userData) 105 111 UnableToImplementPolicy(uint64_t frameID, WebCore::ResourceError error, WebKit::UserData userData) -
branches/safari-604-branch/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp
r222913 r223165 701 701 bool canShowMIMEType = webPage->canShowMIMEType(response.mimeType()); 702 702 703 #if PLATFORM(MAC) 703 704 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 704 709 uint64_t policyAction; 705 710 DownloadID downloadID; … … 707 712 Ref<WebFrame> protect(*m_frame); 708 713 WebCore::Frame* coreFrame = m_frame->coreFrame(); 714 #if PLATFORM(MAC) 709 715 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)) { 710 716 m_frame->didReceivePolicyDecision(listenerID, PolicyIgnore, 0, { }); 711 717 return; 712 718 } 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) 714 727 // We call this synchronously because CFNetwork can only convert a loading connection to a download from its didReceiveResponse callback. 715 728 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 716 733 } 717 734 … … 736 753 737 754 755 #if PLATFORM(MAC) 738 756 uint64_t listenerID = m_frame->setUpPolicyListener(WTFMove(function)); 757 #else 758 uint64_t listenerID = m_frame->setUpPolicyListener(WTFMove(function), WebFrame::ForNavigationAction::No); 759 #endif 739 760 740 761 NavigationActionData navigationActionData; … … 753 774 } 754 775 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) 777 void WebFrameLoaderClient::applyToDocumentLoader(const WebsitePolicies& websitePolicies) 778 { 779 if (!m_frame) 780 return; 781 auto* coreFrame = m_frame->coreFrame(); 782 if (!coreFrame) 783 return; 809 784 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) 813 786 documentLoader = static_cast<WebDocumentLoader*>(coreFrame->loader().provisionalDocumentLoader()); 814 }815 787 if (!documentLoader) 816 788 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; 828 791 829 792 // Only setUserContentExtensionsEnabled if it hasn't already been disabled by reloading without content blockers. … … 856 819 break; 857 820 } 821 } 822 #endif // PLATFORM(MAC) 823 824 void 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 } 858 940 859 941 // We call this synchronously because WebCore cannot gracefully handle a frame load without a synchronous navigation policy reply. 860 942 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 861 947 } 862 948 … … 912 998 webPage->injectedBundleFormClient().willSubmitForm(webPage, &form, m_frame, sourceFrame, values, userData); 913 999 1000 #if PLATFORM(MAC) 914 1001 uint64_t listenerID = m_frame->setUpPolicyListener(WTFMove(function)); 1002 #else 1003 uint64_t listenerID = m_frame->setUpPolicyListener(WTFMove(function), WebFrame::ForNavigationAction::No); 1004 #endif 915 1005 916 1006 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 36 36 class PluginView; 37 37 class WebFrame; 38 struct WebsitePolicies; 38 39 39 40 class WebFrameLoaderClient final : public WebCore::FrameLoaderClient { … … 49 50 void setUseIconLoadingClient(bool useIconLoadingClient) { m_useIconLoadingClient = useIconLoadingClient; } 50 51 52 #if !PLATFORM(MAC) 53 void applyToDocumentLoader(const WebsitePolicies&); 54 #endif 51 55 private: 52 56 void frameLoaderDestroyed() final; -
branches/safari-604-branch/Source/WebKit/WebProcess/WebPage/WebFrame.cpp
r222913 r223165 210 210 } 211 211 212 #if PLATFORM(MAC) 212 213 uint64_t WebFrame::setUpPolicyListener(WebCore::FramePolicyFunction&& policyFunction) 214 #else 215 uint64_t WebFrame::setUpPolicyListener(WebCore::FramePolicyFunction&& policyFunction, ForNavigationAction forNavigationAction) 216 #endif 213 217 { 214 218 // FIXME: <rdar://5634381> We need to support multiple active policy listeners. … … 218 222 m_policyListenerID = generateListenerID(); 219 223 m_policyFunction = WTFMove(policyFunction); 224 #if !PLATFORM(MAC) 225 m_policyFunctionForNavigationAction = forNavigationAction; 226 #endif 220 227 return m_policyListenerID; 221 228 } … … 229 236 m_policyListenerID = 0; 230 237 m_policyFunction = nullptr; 231 } 232 238 #if !PLATFORM(MAC) 239 m_policyFunctionForNavigationAction = ForNavigationAction::No; 240 #endif 241 } 242 243 #if PLATFORM(MAC) 233 244 void WebFrame::didReceivePolicyDecision(uint64_t listenerID, PolicyAction action, uint64_t navigationID, DownloadID downloadID) 245 #else 246 void WebFrame::didReceivePolicyDecision(uint64_t listenerID, PolicyAction action, uint64_t navigationID, DownloadID downloadID, const WebsitePolicies& websitePolicies) 247 #endif 234 248 { 235 249 if (!m_coreFrame) … … 245 259 246 260 FramePolicyFunction function = WTFMove(m_policyFunction); 261 #if !PLATFORM(MAC) 262 bool forNavigationAction = m_policyFunctionForNavigationAction == ForNavigationAction::Yes; 263 #endif 247 264 248 265 invalidatePolicyListener(); 249 266 267 #if !PLATFORM(MAC) 268 if (forNavigationAction && m_frameLoaderClient) 269 m_frameLoaderClient->applyToDocumentLoader(websitePolicies); 270 #endif 271 250 272 m_policyDownloadID = downloadID; 251 273 if (navigationID) { -
branches/safari-604-branch/Source/WebKit/WebProcess/WebPage/WebFrame.h
r222913 r223165 62 62 class WebPage; 63 63 struct FrameInfoData; 64 struct WebsitePolicies; 64 65 65 66 class WebFrame : public API::ObjectImpl<API::Object::Type::BundleFrame> { … … 80 81 uint64_t frameID() const { return m_frameID; } 81 82 83 #if PLATFORM(MAC) 82 84 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 83 91 void invalidatePolicyListener(); 84 void didReceivePolicyDecision(uint64_t listenerID, WebCore::PolicyAction, uint64_t navigationID, DownloadID);85 92 86 93 void startDownload(const WebCore::ResourceRequest&, const String& suggestedName = { }); … … 172 179 uint64_t m_policyListenerID { 0 }; 173 180 WebCore::FramePolicyFunction m_policyFunction; 181 #if !PLATFORM(MAC) 182 ForNavigationAction m_policyFunctionForNavigationAction { ForNavigationAction::No }; 183 #endif 174 184 DownloadID m_policyDownloadID { 0 }; 175 185 -
branches/safari-604-branch/Source/WebKit/WebProcess/WebPage/WebPage.cpp
r222913 r223165 2724 2724 } 2725 2725 2726 #if PLATFORM(MAC) 2726 2727 void WebPage::didReceivePolicyDecision(uint64_t frameID, uint64_t listenerID, uint32_t policyAction, uint64_t navigationID, const DownloadID& downloadID) 2728 #else 2729 void WebPage::didReceivePolicyDecision(uint64_t frameID, uint64_t listenerID, uint32_t policyAction, uint64_t navigationID, const DownloadID& downloadID, WebsitePolicies&& websitePolicies) 2730 #endif 2727 2731 { 2728 2732 WebFrame* frame = WebProcess::singleton().webFrame(frameID); 2729 2733 if (!frame) 2730 2734 return; 2735 #if PLATFORM(MAC) 2731 2736 frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), navigationID, downloadID); 2737 #else 2738 frame->didReceivePolicyDecision(listenerID, static_cast<PolicyAction>(policyAction), navigationID, downloadID, websitePolicies); 2739 #endif 2732 2740 } 2733 2741 -
branches/safari-604-branch/Source/WebKit/WebProcess/WebPage/WebPage.h
r222913 r223165 1128 1128 void updatePreferences(const WebPreferencesStore&); 1129 1129 1130 #if PLATFORM(MAC) 1130 1131 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 1131 1136 void setUserAgent(const String&); 1132 1137 void setCustomTextEncodingName(const String&); -
branches/safari-604-branch/Source/WebKit/WebProcess/WebPage/WebPage.messages.in
r222913 r223165 151 151 152 152 UpdateWebsitePolicies(struct WebKit::WebsitePolicies websitePolicies) 153 #if PLATFORM(MAC) 153 154 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 154 159 155 160 ClearSelection() -
branches/safari-604-branch/Tools/ChangeLog
r223106 r223165 1 2017-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 1 27 2017-10-09 Jason Marcell <jmarcell@apple.com> 2 28 -
branches/safari-604-branch/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj
r222913 r223165 215 215 5C2936931D5BF70D00DEAB1E /* CookieAcceptPolicy.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C2936911D5BF63E00DEAB1E /* CookieAcceptPolicy.mm */; }; 216 216 5C2936961D5C00ED00DEAB1E /* CookieMessage.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 5C2936941D5BFD1900DEAB1E /* CookieMessage.html */; }; 217 5C5731051F76D85000081388 /* JavaScriptDuringNavigation.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C5731041F76D81F00081388 /* JavaScriptDuringNavigation.mm */; }; 217 218 5C6E65441D5CEFD400F7862E /* URLParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5C6E65411D5CEF8500F7862E /* URLParser.cpp */; }; 218 219 5C726D6F1D3EE06E00C5E1A1 /* InstanceMethodSwizzler.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5C726D6E1D3EE06800C5E1A1 /* InstanceMethodSwizzler.mm */; }; … … 1265 1266 5C2936911D5BF63E00DEAB1E /* CookieAcceptPolicy.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = CookieAcceptPolicy.mm; sourceTree = "<group>"; }; 1266 1267 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>"; }; 1267 1269 5C5E633D1D0B67940085A025 /* UniqueRef.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UniqueRef.cpp; sourceTree = "<group>"; }; 1268 1270 5C6E65411D5CEF8500F7862E /* URLParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = URLParser.cpp; sourceTree = "<group>"; }; … … 1872 1874 5198A23F1EA7E595008910B7 /* InitialWarmedProcessUsed.mm */, 1873 1875 2DB0232E1E4E871800707123 /* InteractionDeadlockAfterCrash.mm */, 1876 5C5731041F76D81F00081388 /* JavaScriptDuringNavigation.mm */, 1874 1877 C25CCA051E51380B0026CB8A /* LineBreaking.mm */, 1875 1878 37D36ED61AF42ECD00BAF5D9 /* LoadAlternateHTMLString.mm */, … … 3121 3124 7C83E0BE1D0A651300FEBCF3 /* IndexedDBMultiProcess.mm in Sources */, 3122 3125 7C83E0BF1D0A652200FEBCF3 /* IndexedDBPersistence.mm in Sources */, 3126 5C5731051F76D85000081388 /* JavaScriptDuringNavigation.mm in Sources */, 3123 3127 7CCE7EFB1A411AE600447C4C /* InjectedBundleBasic.cpp in Sources */, 3124 3128 7CCE7EFC1A411AE600447C4C /* InjectedBundleFrameHitTest.cpp in Sources */,
Note: See TracChangeset
for help on using the changeset viewer.