Index: Source/WebKit/UIProcess/Cocoa/NavigationState.mm |
diff --git a/Source/WebKit/UIProcess/Cocoa/NavigationState.mm b/Source/WebKit/UIProcess/Cocoa/NavigationState.mm |
index 8c3fa9d7496026b0b631aa7a11f9c2fa1287e0bb..ed8a0766456ab0b1a0db6b0eb0d0c4674b7bdd62 100644 |
--- a/Source/WebKit/UIProcess/Cocoa/NavigationState.mm |
+++ b/Source/WebKit/UIProcess/Cocoa/NavigationState.mm |
@@ -39,6 +39,7 @@ |
#import "Logging.h" |
#import "NavigationActionData.h" |
#import "PageLoadState.h" |
+#import "SafeBrowsingController.h" |
#import "WKBackForwardListInternal.h" |
#import "WKBackForwardListItemInternal.h" |
#import "WKFrameInfoInternal.h" |
@@ -105,6 +106,7 @@ NavigationState::NavigationState(WKWebView *webView) |
navigationStates().add(m_webView->_page.get(), this); |
m_webView->_page->pageLoadState().addObserver(*this); |
+ m_safeBrowsingController = std::make_unique<SafeBrowsingController>(webView); |
} |
NavigationState::~NavigationState() |
@@ -478,29 +480,37 @@ static void tryAppLink(Ref<API::NavigationAction>&& navigationAction, const Stri |
void NavigationState::NavigationClient::decidePolicyForNavigationAction(WebPageProxy& webPageProxy, Ref<API::NavigationAction>&& navigationAction, Ref<WebFramePolicyListenerProxy>&& listener, API::Object* userInfo) |
{ |
ASSERT(webPageProxy.mainFrame()); |
+ auto policyDecider = [&webPageProxy, navigationAction = navigationAction.copyRef(), userInfo, this] (WTF::Function<void(WKNavigationActionPolicy, std::optional<WebsitePoliciesData>&&)>&& completionHandler) mutable { |
+ decidePolicyForNavigationActionInternal(webPageProxy, WTFMove(navigationAction), WTFMove(completionHandler), userInfo); |
+ }; |
+ m_navigationState.m_safeBrowsingController->checkURL(WTFMove(navigationAction), WTFMove(policyDecider), WTFMove(listener)); |
+} |
+ |
+void NavigationState::NavigationClient::decidePolicyForNavigationActionInternal(WebPageProxy& webPageProxy, Ref<API::NavigationAction>&& navigationAction, WTF::Function<void(WKNavigationActionPolicy, std::optional<WebsitePoliciesData>&&)>&& completionHandler, API::Object* userInfo) |
+{ |
String mainFrameURLString = webPageProxy.mainFrame()->url(); |
bool subframeNavigation = navigationAction->targetFrame() && !navigationAction->targetFrame()->isMainFrame(); |
if (!m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandler |
&& !m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandlerWebsitePolicies |
&& !m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionUserInfoDecisionHandlerWebsitePolicies) { |
- auto completionHandler = [webPage = makeRef(webPageProxy), listener = WTFMove(listener), navigationAction = navigationAction.copyRef()] (bool followedLinkToApp) { |
+ auto localCompletionHandler = [webPage = makeRef(webPageProxy), completionHandler = WTFMove(completionHandler), navigationAction = navigationAction.copyRef()] (bool followedLinkToApp) { |
if (followedLinkToApp) { |
- listener->ignore(); |
+ completionHandler(WKNavigationActionPolicyCancel, std::nullopt); |
return; |
} |
if (!navigationAction->targetFrame()) { |
- listener->use(std::nullopt); |
+ completionHandler(WKNavigationActionPolicyAllow, std::nullopt); |
return; |
} |
RetainPtr<NSURLRequest> nsURLRequest = adoptNS(wrapper(API::URLRequest::create(navigationAction->request()).leakRef())); |
if ([NSURLConnection canHandleRequest:nsURLRequest.get()] || webPage->urlSchemeHandlerForScheme([nsURLRequest URL].scheme)) { |
if (navigationAction->shouldPerformDownload()) |
- listener->download(); |
+ completionHandler(_WKNavigationActionPolicyDownload, std::nullopt); |
else |
- listener->use(std::nullopt); |
+ completionHandler(WKNavigationActionPolicyAllow, std::nullopt); |
return; |
} |
@@ -510,9 +520,9 @@ void NavigationState::NavigationClient::decidePolicyForNavigationAction(WebPageP |
if (![[nsURLRequest URL] isFileURL]) |
[[NSWorkspace sharedWorkspace] openURL:[nsURLRequest URL]]; |
#endif |
- listener->ignore(); |
+ completionHandler(WKNavigationActionPolicyCancel, std::nullopt); |
}; |
- tryAppLink(WTFMove(navigationAction), mainFrameURLString, WTFMove(completionHandler)); |
+ tryAppLink(WTFMove(navigationAction), mainFrameURLString, WTFMove(localCompletionHandler)); |
return; |
} |
@@ -524,7 +534,7 @@ void NavigationState::NavigationClient::decidePolicyForNavigationAction(WebPageP |
auto checker = CompletionHandlerCallChecker::create(navigationDelegate.get(), delegateHasWebsitePolicies ? @selector(_webView:decidePolicyForNavigationAction:decisionHandler:) : @selector(webView:decidePolicyForNavigationAction:decisionHandler:)); |
- auto decisionHandlerWithPolicies = [localListener = WTFMove(listener), navigationAction = navigationAction.copyRef(), checker = WTFMove(checker), mainFrameURLString, webPageProxy = makeRef(webPageProxy), subframeNavigation](WKNavigationActionPolicy actionPolicy, _WKWebsitePolicies *websitePolicies) mutable { |
+ auto decisionHandlerWithPolicies = [localCompletionHandler = WTFMove(completionHandler), navigationAction = navigationAction.copyRef(), checker = WTFMove(checker), mainFrameURLString, webPageProxy = makeRef(webPageProxy), subframeNavigation](WKNavigationActionPolicy actionPolicy, _WKWebsitePolicies *websitePolicies) mutable { |
if (checker->completionHandlerHasBeenCalled()) |
return; |
checker->didCallCompletionHandler(); |
@@ -545,30 +555,30 @@ void NavigationState::NavigationClient::decidePolicyForNavigationAction(WebPageP |
switch (actionPolicy) { |
case WKNavigationActionPolicyAllow: |
- tryAppLink(WTFMove(navigationAction), mainFrameURLString, [localListener = WTFMove(localListener), data = WTFMove(data)](bool followedLinkToApp) mutable { |
+ tryAppLink(WTFMove(navigationAction), mainFrameURLString, [localCompletionHandler = WTFMove(localCompletionHandler), data = WTFMove(data)](bool followedLinkToApp) mutable { |
if (followedLinkToApp) { |
- localListener->ignore(); |
+ localCompletionHandler(WKNavigationActionPolicyCancel, std::nullopt); |
return; |
} |
- localListener->use(WTFMove(data)); |
+ localCompletionHandler(WKNavigationActionPolicyAllow, WTFMove(data)); |
}); |
break; |
case WKNavigationActionPolicyCancel: |
- localListener->ignore(); |
+ localCompletionHandler(WKNavigationActionPolicyCancel, std::nullopt); |
break; |
// FIXME: Once we have a new enough compiler everywhere we don't need to ignore -Wswitch. |
#pragma clang diagnostic push |
#pragma clang diagnostic ignored "-Wswitch" |
case _WKNavigationActionPolicyDownload: |
- localListener->download(); |
+ localCompletionHandler(_WKNavigationActionPolicyDownload, std::nullopt); |
break; |
case _WKNavigationActionPolicyAllowWithoutTryingAppLink: |
#pragma clang diagnostic pop |
- localListener->use(WTFMove(data)); |
+ localCompletionHandler(WKNavigationActionPolicyAllow, WTFMove(data)); |
break; |
} |
}; |