Changeset 234327 in webkit
- Timestamp:
- Jul 27, 2018 1:50:01 PM (6 years ago)
- Location:
- trunk/Source/WebKit
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit/ChangeLog
r234326 r234327 1 2018-07-27 Alex Christensen <achristensen@webkit.org> 2 3 Add RefCounted CompletionHandler wrapping abstraction for sending policy decisions back to WebProcess 4 https://bugs.webkit.org/show_bug.cgi?id=188089 5 6 Reviewed by Geoffrey Garen. 7 8 This will be necessary for when I add an asynchronous parallel step to decidePolicyForNavigationAction. 9 We will want to wait for that asynchronous step for decidePolicyForNavigationActionSync but not for a client. 10 11 No change in behavior. 12 13 * UIProcess/WebPageProxy.cpp: 14 (WebKit::WebPageProxy::PolicyDecisionSender::create): 15 (WebKit::WebPageProxy::PolicyDecisionSender::operator()): 16 (WebKit::WebPageProxy::PolicyDecisionSender::PolicyDecisionSender): 17 (WebKit::WebPageProxy::receivedPolicyDecision): 18 (WebKit::WebPageProxy::decidePolicyForNavigationActionAsync): 19 (WebKit::WebPageProxy::decidePolicyForNavigationAction): 20 (WebKit::WebPageProxy::decidePolicyForNavigationActionSync): 21 (WebKit::WebPageProxy::decidePolicyForNewWindowAction): 22 (WebKit::WebPageProxy::decidePolicyForResponse): 23 * UIProcess/WebPageProxy.h: 24 * UIProcess/WebPageProxy.messages.in: 25 * WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp: 26 (WebKit::WebFrameLoaderClient::dispatchDecidePolicyForNavigationAction): 27 1 28 2018-07-27 Saam Barati <sbarati@apple.com> 2 29 -
trunk/Source/WebKit/UIProcess/WebPageProxy.cpp
r234276 r234327 2408 2408 } 2409 2409 2410 void WebPageProxy::receivedPolicyDecision(PolicyAction action, WebFrameProxy& frame, uint64_t listenerID, API::Navigation* navigation, std::optional<WebsitePoliciesData>&& websitePolicies) 2410 class WebPageProxy::PolicyDecisionSender : public RefCounted<PolicyDecisionSender> { 2411 public: 2412 template<typename Lambda> static Ref<PolicyDecisionSender> create(Lambda lambda) 2413 { 2414 return adoptRef(*new PolicyDecisionSender(WTFMove(lambda))); 2415 } 2416 template<typename... Args> void send(Args... args) 2417 { 2418 if (m_completionHandler) 2419 m_completionHandler(std::forward<Args>(args)...); 2420 } 2421 private: 2422 template<typename Lambda> PolicyDecisionSender(Lambda lambda) 2423 : m_completionHandler(WTFMove(lambda)) { } 2424 2425 CompletionHandler<void(WebCore::PolicyAction, uint64_t newNavigationID, DownloadID, std::optional<WebsitePoliciesData>)> m_completionHandler; 2426 }; 2427 2428 void WebPageProxy::receivedPolicyDecision(PolicyAction action, API::Navigation* navigation, std::optional<WebsitePoliciesData>&& websitePolicies, Ref<PolicyDecisionSender>&& sender) 2411 2429 { 2412 2430 if (!isValid()) … … 2435 2453 } 2436 2454 2437 if (auto syncNavigationActionPolicyReply = WTFMove(m_syncNavigationActionPolicyReply)) { 2438 syncNavigationActionPolicyReply(navigation ? navigation->navigationID() : 0, action, downloadID, WTFMove(websitePolicies)); 2439 return; 2440 } 2441 2442 m_process->send(Messages::WebPage::DidReceivePolicyDecision(frame.frameID(), listenerID, action, navigation ? navigation->navigationID() : 0, downloadID, websitePolicies), m_pageID); 2455 sender->send(action, navigation ? navigation->navigationID() : 0, downloadID, WTFMove(websitePolicies)); 2443 2456 } 2444 2457 … … 3959 3972 } 3960 3973 3961 void WebPageProxy::decidePolicyForNavigationAction(uint64_t frameID, const SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, NavigationActionData&& navigationActionData, const FrameInfoData& originatingFrameInfoData, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, ResourceRequest&& request, ResourceResponse&& redirectResponse, uint64_t listenerID, const UserData& userData) 3974 void WebPageProxy::decidePolicyForNavigationActionAsync(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, NavigationActionData&& navigationActionData, const FrameInfoData& frameInfoData, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, WebCore::ResourceRequest&& request, WebCore::ResourceResponse&& redirectResponse, const UserData& userData, uint64_t listenerID) 3975 { 3976 decidePolicyForNavigationAction(frameID, frameSecurityOrigin, navigationID, WTFMove(navigationActionData), frameInfoData, originatingPageID, originalRequest, WTFMove(request), WTFMove(redirectResponse), userData, PolicyDecisionSender::create([this, protectedThis = makeRef(*this), frameID, listenerID] (auto... args) { 3977 m_process->send(Messages::WebPage::DidReceivePolicyDecision(frameID, listenerID, args...), m_pageID); 3978 })); 3979 } 3980 3981 void WebPageProxy::decidePolicyForNavigationAction(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, NavigationActionData&& navigationActionData, const FrameInfoData& originatingFrameInfoData, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, WebCore::ResourceRequest&& request, WebCore::ResourceResponse&& redirectResponse, const UserData& userData, Ref<PolicyDecisionSender>&& sender) 3962 3982 { 3963 3983 LOG(Loading, "WebPageProxy::decidePolicyForNavigationAction - Original URL %s, current target URL %s", originalRequest.url().string().utf8().data(), request.url().string().utf8().data()); … … 4006 4026 navigation->setOpener(navigationActionData.opener); 4007 4027 4008 auto listener = makeRef(frame->setUpPolicyListenerProxy([this, protectedThis = makeRef(*this), frame = makeRef(*frame), listenerID, navigation] (WebCore::PolicyAction policyAction, API::WebsitePolicies* policies, ShouldProcessSwapIfPossible swap) mutable { 4028 #if ENABLE(CONTENT_FILTERING) 4029 if (frame->didHandleContentFilterUnblockNavigation(request)) 4030 return receivedPolicyDecision(PolicyAction::Ignore, &m_navigationState->navigation(newNavigationID), std::nullopt, WTFMove(sender)); 4031 #else 4032 UNUSED_PARAM(newNavigationID); 4033 #endif 4034 4035 auto listener = makeRef(frame->setUpPolicyListenerProxy([this, protectedThis = makeRef(*this), frame = makeRef(*frame), sender = sender.copyRef(), navigation] (WebCore::PolicyAction policyAction, API::WebsitePolicies* policies, ShouldProcessSwapIfPossible swap) mutable { 4009 4036 std::optional<WebsitePoliciesData> data; 4010 4037 if (policies) { … … 4026 4053 } 4027 4054 4028 receivedPolicyDecision(policyAction, frame.get(), listenerID, navigation.get(), WTFMove(data));4055 receivedPolicyDecision(policyAction, navigation.get(), WTFMove(data), WTFMove(sender)); 4029 4056 })); 4030 4057 4031 4058 API::Navigation* mainFrameNavigation = frame->isMainFrame() ? navigation.get() : nullptr; 4032 4033 #if ENABLE(CONTENT_FILTERING)4034 if (frame->didHandleContentFilterUnblockNavigation(request))4035 return receivedPolicyDecision(PolicyAction::Ignore, *frame, listenerID, &m_navigationState->navigation(newNavigationID), std::nullopt);4036 #else4037 UNUSED_PARAM(newNavigationID);4038 #endif4039 4040 4059 WebFrameProxy* originatingFrame = m_process->webFrame(originatingFrameInfoData.frameID); 4041 4060 … … 4063 4082 } 4064 4083 4065 void WebPageProxy::decidePolicyForNavigationActionSync(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, NavigationActionData&& navigationActionData, const FrameInfoData& originatingFrameInfoData, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, WebCore::ResourceRequest&& request, ResourceResponse&& redirectResponse, uint64_t listenerID, const UserData& userData, Messages::WebPageProxy::DecidePolicyForNavigationActionSync::DelayedReply&& reply) 4066 { 4067 ASSERT(!m_syncNavigationActionPolicyReply); 4068 m_syncNavigationActionPolicyReply = WTFMove(reply); 4069 4070 decidePolicyForNavigationAction(frameID, frameSecurityOrigin, navigationID, WTFMove(navigationActionData), originatingFrameInfoData, originatingPageID, originalRequest, WTFMove(request), WTFMove(redirectResponse), listenerID, userData); 4084 void WebPageProxy::decidePolicyForNavigationActionSync(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, NavigationActionData&& navigationActionData, const FrameInfoData& frameInfoData, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, WebCore::ResourceRequest&& request, WebCore::ResourceResponse&& redirectResponse, const UserData& userData, Messages::WebPageProxy::DecidePolicyForNavigationActionSync::DelayedReply&& reply) 4085 { 4086 auto sender = PolicyDecisionSender::create(WTFMove(reply)); 4087 4088 decidePolicyForNavigationAction(frameID, frameSecurityOrigin, navigationID, WTFMove(navigationActionData), frameInfoData, originatingPageID, originalRequest, WTFMove(request), WTFMove(redirectResponse), userData, sender.copyRef()); 4071 4089 4072 4090 // If the client did not respond synchronously, proceed with the load. 4073 if (auto syncNavigationActionPolicyReply = WTFMove(m_syncNavigationActionPolicyReply)) 4074 syncNavigationActionPolicyReply(navigationID, PolicyAction::Use, { }, { }); 4091 sender->send(PolicyAction::Use, navigationID, DownloadID(), std::nullopt); 4075 4092 } 4076 4093 … … 4083 4100 MESSAGE_CHECK_URL(request.url()); 4084 4101 4085 auto listener = makeRef(frame->setUpPolicyListenerProxy([this, protectedThis = makeRef(*this), listenerID, frame = makeRef(*frame)] (WebCore::PolicyAction policyAction, API::WebsitePolicies*, ShouldProcessSwapIfPossible swap){4102 auto listener = makeRef(frame->setUpPolicyListenerProxy([this, protectedThis = makeRef(*this), listenerID, frameID] (WebCore::PolicyAction policyAction, API::WebsitePolicies*, ShouldProcessSwapIfPossible swap) mutable { 4086 4103 // FIXME: Assert the API::WebsitePolicies* is nullptr here once clients of WKFramePolicyListenerUseWithPolicies go away. 4087 4104 RELEASE_ASSERT(swap == ShouldProcessSwapIfPossible::No); 4088 receivedPolicyDecision(policyAction, frame.get(), listenerID, nullptr, std::nullopt); 4105 receivedPolicyDecision(policyAction, nullptr, std::nullopt, PolicyDecisionSender::create([this, protectedThis = WTFMove(protectedThis), frameID, listenerID] (auto... args) { 4106 m_process->send(Messages::WebPage::DidReceivePolicyDecision(frameID, listenerID, args...), m_pageID); 4107 })); 4089 4108 })); 4090 4109 … … 4116 4135 4117 4136 RefPtr<API::Navigation> navigation = navigationID ? &m_navigationState->navigation(navigationID) : nullptr; 4118 auto listener = makeRef(frame->setUpPolicyListenerProxy([this, protectedThis = makeRef(*this), frame = makeRef(*frame), listenerID, navigation = WTFMove(navigation)] (WebCore::PolicyAction policyAction, API::WebsitePolicies*, ShouldProcessSwapIfPossible swap){4137 auto listener = makeRef(frame->setUpPolicyListenerProxy([this, protectedThis = makeRef(*this), frameID, listenerID, navigation = WTFMove(navigation)] (WebCore::PolicyAction policyAction, API::WebsitePolicies*, ShouldProcessSwapIfPossible swap) mutable { 4119 4138 // FIXME: Assert the API::WebsitePolicies* is nullptr here once clients of WKFramePolicyListenerUseWithPolicies go away. 4120 4139 RELEASE_ASSERT(swap == ShouldProcessSwapIfPossible::No); 4121 receivedPolicyDecision(policyAction, frame.get(), listenerID, navigation.get(), std::nullopt); 4140 receivedPolicyDecision(policyAction, navigation.get(), std::nullopt, PolicyDecisionSender::create([this, protectedThis = WTFMove(protectedThis), frameID, listenerID] (auto... args) { 4141 m_process->send(Messages::WebPage::DidReceivePolicyDecision(frameID, listenerID, args...), m_pageID); 4142 })); 4122 4143 })); 4123 4144 -
trunk/Source/WebKit/UIProcess/WebPageProxy.h
r234268 r234327 909 909 #endif 910 910 911 void receivedPolicyDecision(WebCore::PolicyAction, WebFrameProxy&, uint64_t listenerID, API::Navigation*, std::optional<WebsitePoliciesData>&&); 911 class PolicyDecisionSender; 912 void receivedPolicyDecision(WebCore::PolicyAction, API::Navigation*, std::optional<WebsitePoliciesData>&&, Ref<PolicyDecisionSender>&&); 912 913 913 914 void backForwardRemovedItem(const WebCore::BackForwardItemIdentifier&); … … 1422 1423 void didDestroyNavigation(uint64_t navigationID); 1423 1424 1424 void decidePolicyForNavigationAction(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, NavigationActionData&&, const FrameInfoData&, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, WebCore::ResourceRequest&&, WebCore::ResourceResponse&& redirectResponse, uint64_t listenerID, const UserData&); 1425 void decidePolicyForNavigationActionSync(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, NavigationActionData&&, const FrameInfoData&, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, WebCore::ResourceRequest&&, WebCore::ResourceResponse&& redirectResponse, uint64_t listenerID, const UserData&, Messages::WebPageProxy::DecidePolicyForNavigationActionSync::DelayedReply&&); 1425 void decidePolicyForNavigationAction(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, NavigationActionData&&, const FrameInfoData&, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, WebCore::ResourceRequest&&, WebCore::ResourceResponse&& redirectResponse, const UserData&, Ref<PolicyDecisionSender>&&); 1426 void decidePolicyForNavigationActionAsync(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, NavigationActionData&&, const FrameInfoData&, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, WebCore::ResourceRequest&&, WebCore::ResourceResponse&& redirectResponse, const UserData&, uint64_t listenerID); 1427 void decidePolicyForNavigationActionSync(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, NavigationActionData&&, const FrameInfoData&, uint64_t originatingPageID, const WebCore::ResourceRequest& originalRequest, WebCore::ResourceRequest&&, WebCore::ResourceResponse&& redirectResponse, const UserData&, Messages::WebPageProxy::DecidePolicyForNavigationActionSync::DelayedReply&&); 1426 1428 void decidePolicyForNewWindowAction(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, NavigationActionData&&, WebCore::ResourceRequest&&, const String& frameName, uint64_t listenerID, const UserData&); 1427 1429 void decidePolicyForResponse(uint64_t frameID, const WebCore::SecurityOriginData& frameSecurityOrigin, uint64_t navigationID, const WebCore::ResourceResponse&, const WebCore::ResourceRequest&, bool canShowMIMEType, uint64_t listenerID, const UserData&); … … 2002 2004 bool m_isPerformingDOMPrintOperation { false }; 2003 2005 2004 // Synchronous navigation policy decision.2005 Messages::WebPageProxy::DecidePolicyForNavigationActionSync::DelayedReply m_syncNavigationActionPolicyReply;2006 2007 2006 WebCore::ResourceRequest m_decidePolicyForResponseRequest; 2008 2007 bool m_shouldSuppressAppLinksInNextNavigationPolicyDecision { false }; -
trunk/Source/WebKit/UIProcess/WebPageProxy.messages.in
r234172 r234327 107 107 # Policy messages 108 108 DecidePolicyForResponse(uint64_t frameID, struct WebCore::SecurityOriginData frameSecurityOrigin, uint64_t navigationID, WebCore::ResourceResponse response, WebCore::ResourceRequest request, bool canShowMIMEType, uint64_t listenerID, WebKit::UserData userData) 109 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, WebCore::ResourceResponse redirectResponse, uint64_t listenerID, WebKit::UserData userData)110 DecidePolicyForNavigationActionSync(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, WebCore::ResourceResponse redirectResponse, uint64_t listenerID, WebKit::UserData userData) -> (uint64_t newNavigationID, enum WebCore::PolicyAction policyAction, WebKit::DownloadID downloadID, std::optional<WebKit::WebsitePoliciesData> websitePolicies) Delayed109 DecidePolicyForNavigationActionAsync(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, WebCore::ResourceResponse redirectResponse, WebKit::UserData userData, uint64_t listenerID) 110 DecidePolicyForNavigationActionSync(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, WebCore::ResourceResponse redirectResponse, WebKit::UserData userData) -> (enum WebCore::PolicyAction policyAction, uint64_t newNavigationID, WebKit::DownloadID downloadID, std::optional<WebKit::WebsitePoliciesData> websitePolicies) Delayed 111 111 DecidePolicyForNewWindowAction(uint64_t frameID, struct WebCore::SecurityOriginData frameSecurityOrigin, struct WebKit::NavigationActionData navigationActionData, WebCore::ResourceRequest request, String frameName, uint64_t listenerID, WebKit::UserData userData) 112 112 UnableToImplementPolicy(uint64_t frameID, WebCore::ResourceError error, WebKit::UserData userData) -
trunk/Source/WebKit/WebProcess/WebCoreSupport/WebFrameLoaderClient.cpp
r233782 r234327 893 893 std::optional<WebsitePoliciesData> websitePolicies; 894 894 895 if (!webPage->sendSync(Messages::WebPageProxy::DecidePolicyForNavigationActionSync(m_frame->frameID(), SecurityOriginData::fromFrame(coreFrame), documentLoader->navigationID(), navigationActionData, originatingFrameInfoData, originatingPageID, navigationAction.resourceRequest(), request, redirectResponse, listenerID, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())), Messages::WebPageProxy::DecidePolicyForNavigationActionSync::Reply(newNavigationID, policyAction, downloadID, websitePolicies))) {895 if (!webPage->sendSync(Messages::WebPageProxy::DecidePolicyForNavigationActionSync(m_frame->frameID(), SecurityOriginData::fromFrame(coreFrame), documentLoader->navigationID(), navigationActionData, originatingFrameInfoData, originatingPageID, navigationAction.resourceRequest(), request, redirectResponse, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get())), Messages::WebPageProxy::DecidePolicyForNavigationActionSync::Reply(policyAction, newNavigationID, downloadID, websitePolicies))) { 896 896 m_frame->didReceivePolicyDecision(listenerID, PolicyAction::Ignore, 0, { }, { }); 897 897 return; … … 903 903 904 904 ASSERT(policyDecisionMode == PolicyDecisionMode::Asynchronous); 905 if (!webPage->send(Messages::WebPageProxy::DecidePolicyForNavigationAction (m_frame->frameID(), SecurityOriginData::fromFrame(coreFrame), documentLoader->navigationID(), navigationActionData, originatingFrameInfoData, originatingPageID, navigationAction.resourceRequest(), request, redirectResponse, listenerID, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get()))))905 if (!webPage->send(Messages::WebPageProxy::DecidePolicyForNavigationActionAsync(m_frame->frameID(), SecurityOriginData::fromFrame(coreFrame), documentLoader->navigationID(), navigationActionData, originatingFrameInfoData, originatingPageID, navigationAction.resourceRequest(), request, redirectResponse, UserData(WebProcess::singleton().transformObjectsToHandles(userData.get()).get()), listenerID))) 906 906 m_frame->didReceivePolicyDecision(listenerID, PolicyAction::Ignore, 0, { }, { }); 907 907 }
Note: See TracChangeset
for help on using the changeset viewer.