Title: [247026] trunk
Revision
247026
Author
[email protected]
Date
2019-07-01 15:07:09 -0700 (Mon, 01 Jul 2019)

Log Message

Add new decidePolicyForNavigationAction SPI with preferences and userInfo
https://bugs.webkit.org/show_bug.cgi?id=199371
<rdar://problem/52352905>

Patch by Alex Christensen <[email protected]> on 2019-07-01
Reviewed by Tim Horton.

Source/WebKit:

Also deprecate some older SPI so we may someday clean up this mess.

* UIProcess/API/Cocoa/WKNavigationDelegatePrivate.h:
* UIProcess/Cocoa/NavigationState.h:
* UIProcess/Cocoa/NavigationState.mm:
(WebKit::NavigationState::setNavigationDelegate):
(WebKit::NavigationState::NavigationClient::decidePolicyForNavigationAction):
(WebKit::NavigationState::NavigationClient::shouldBypassContentModeSafeguards const):

Tools:

* TestWebKitAPI/Tests/WebKitCocoa/Navigation.mm:
(-[NavigationActionSPIDelegate webView:didFinishNavigation:]):
(-[NavigationActionSPIDelegate _webView:decidePolicyForNavigationAction:preferences:userInfo:decisionHandler:]):
(-[NavigationActionSPIDelegate spiCalled]):
(TEST):

Modified Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (247025 => 247026)


--- trunk/Source/WebKit/ChangeLog	2019-07-01 21:55:03 UTC (rev 247025)
+++ trunk/Source/WebKit/ChangeLog	2019-07-01 22:07:09 UTC (rev 247026)
@@ -1,5 +1,22 @@
 2019-07-01  Alex Christensen  <[email protected]>
 
+        Add new decidePolicyForNavigationAction SPI with preferences and userInfo
+        https://bugs.webkit.org/show_bug.cgi?id=199371
+        <rdar://problem/52352905>
+
+        Reviewed by Tim Horton.
+
+        Also deprecate some older SPI so we may someday clean up this mess.
+
+        * UIProcess/API/Cocoa/WKNavigationDelegatePrivate.h:
+        * UIProcess/Cocoa/NavigationState.h:
+        * UIProcess/Cocoa/NavigationState.mm:
+        (WebKit::NavigationState::setNavigationDelegate):
+        (WebKit::NavigationState::NavigationClient::decidePolicyForNavigationAction):
+        (WebKit::NavigationState::NavigationClient::shouldBypassContentModeSafeguards const):
+
+2019-07-01  Alex Christensen  <[email protected]>
+
         Deprecate but still call _webView:showCustomSheetForElement: after transition to UIContextMenuInteraction
         https://bugs.webkit.org/show_bug.cgi?id=199296
         <rdar://problem/51041960>

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKNavigationDelegatePrivate.h (247025 => 247026)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKNavigationDelegatePrivate.h	2019-07-01 21:55:03 UTC (rev 247025)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKNavigationDelegatePrivate.h	2019-07-01 22:07:09 UTC (rev 247026)
@@ -93,8 +93,9 @@
 - (void)_webViewWillEndNavigationGesture:(WKWebView *)webView withNavigationToBackForwardListItem:(WKBackForwardListItem *)item;
 - (void)_webView:(WKWebView *)webView willSnapshotBackForwardListItem:(WKBackForwardListItem *)item;
 - (void)_webViewDidRemoveNavigationGestureSnapshot:(WKWebView *)webView WK_API_AVAILABLE(macos(10.12), ios(10.0));
-- (void)_webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy, _WKWebsitePolicies *))decisionHandler WK_API_DEPRECATED_WITH_REPLACEMENT("_webView:decidePolicyForNavigationAction:userInfo:decisionHandler:", macos(10.12.3, 10.14.4), ios(10.3, 12.2));
-- (void)_webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction userInfo:(id <NSSecureCoding>)userInfo decisionHandler:(void (^)(WKNavigationActionPolicy, _WKWebsitePolicies *))decisionHandler WK_API_AVAILABLE(macos(10.13.4), ios(11.3));
+- (void)_webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy, _WKWebsitePolicies *))decisionHandler WK_API_DEPRECATED_WITH_REPLACEMENT("_webView:decidePolicyForNavigationAction:preferences:userInfo:decisionHandler:", macos(10.12.3, 10.14.4), ios(10.3, 12.2));
+- (void)_webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction userInfo:(id <NSSecureCoding>)userInfo decisionHandler:(void (^)(WKNavigationActionPolicy, _WKWebsitePolicies *))decisionHandler WK_API_DEPRECATED_WITH_REPLACEMENT("_webView:decidePolicyForNavigationAction:preferences:userInfo:decisionHandler:", macos(10.13.4, WK_MAC_TBA), ios(11.3, WK_IOS_TBA));
+-(void)_webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction preferences:(WKWebpagePreferences *)preferences userInfo:(id <NSSecureCoding>)userInfo decisionHandler:(void (^)(WKNavigationActionPolicy, WKWebpagePreferences *))decisionHandler WK_API_AVAILABLE(macos(WK_MAC_TBA), ios(WK_IOS_TBA));
 - (void)_webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation userInfo:(id <NSSecureCoding>)userInfo WK_API_AVAILABLE(macos(10.13.4), ios(11.3));
 - (void)_webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error userInfo:(id <NSSecureCoding>)userInfo WK_API_AVAILABLE(macos(10.13.4), ios(11.3));
 

Modified: trunk/Source/WebKit/UIProcess/Cocoa/NavigationState.h (247025 => 247026)


--- trunk/Source/WebKit/UIProcess/Cocoa/NavigationState.h	2019-07-01 21:55:03 UTC (rev 247025)
+++ trunk/Source/WebKit/UIProcess/Cocoa/NavigationState.h	2019-07-01 22:07:09 UTC (rev 247026)
@@ -193,6 +193,7 @@
     struct {
         bool webViewDecidePolicyForNavigationActionDecisionHandler : 1;
         bool webViewDecidePolicyForNavigationActionWithPreferencesDecisionHandler : 1;
+        bool webViewDecidePolicyForNavigationActionWithPreferencesUserInfoDecisionHandler : 1;
         bool webViewDecidePolicyForNavigationActionDecisionHandlerWebsitePolicies : 1;
         bool webViewDecidePolicyForNavigationActionUserInfoDecisionHandlerWebsitePolicies : 1;
         bool webViewDecidePolicyForNavigationResponseDecisionHandler : 1;

Modified: trunk/Source/WebKit/UIProcess/Cocoa/NavigationState.mm (247025 => 247026)


--- trunk/Source/WebKit/UIProcess/Cocoa/NavigationState.mm	2019-07-01 21:55:03 UTC (rev 247025)
+++ trunk/Source/WebKit/UIProcess/Cocoa/NavigationState.mm	2019-07-01 22:07:09 UTC (rev 247026)
@@ -149,6 +149,7 @@
     m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionWithPreferencesDecisionHandler = [delegate respondsToSelector:@selector(webView:decidePolicyForNavigationAction:preferences:decisionHandler:)];
     m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandlerWebsitePolicies = [delegate respondsToSelector:@selector(_webView:decidePolicyForNavigationAction:decisionHandler:)];
     m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionUserInfoDecisionHandlerWebsitePolicies = [delegate respondsToSelector:@selector(_webView:decidePolicyForNavigationAction:userInfo:decisionHandler:)];
+    m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionWithPreferencesUserInfoDecisionHandler = [delegate respondsToSelector:@selector(_webView:decidePolicyForNavigationAction:preferences:userInfo:decisionHandler:)];
     m_navigationDelegateMethods.webViewDecidePolicyForNavigationResponseDecisionHandler = [delegate respondsToSelector:@selector(webView:decidePolicyForNavigationResponse:decisionHandler:)];
 
     m_navigationDelegateMethods.webViewDidStartProvisionalNavigation = [delegate respondsToSelector:@selector(webView:didStartProvisionalNavigation:)];
@@ -522,6 +523,7 @@
         defaultWebsitePolicies = policies->copy();
 
     if (!m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandler
+        && !m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionWithPreferencesUserInfoDecisionHandler
         && !m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionWithPreferencesDecisionHandler
         && !m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandlerWebsitePolicies
         && !m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionUserInfoDecisionHandlerWebsitePolicies) {
@@ -561,12 +563,13 @@
     if (!navigationDelegate)
         return;
 
-    bool delegateHasWebpagePreferences = m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionWithPreferencesDecisionHandler;
+    bool delegateHasWebpagePreferences = m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionWithPreferencesDecisionHandler
+        || m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionWithPreferencesUserInfoDecisionHandler;
     bool delegateHasWebsitePolicies = m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionDecisionHandlerWebsitePolicies || m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionUserInfoDecisionHandlerWebsitePolicies;
 
     auto selectorForCompletionHandlerChecker = ([&] () -> SEL {
         if (delegateHasWebpagePreferences)
-            return @selector(webView:decidePolicyForNavigationAction:preferences:decisionHandler:);
+            return m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionWithPreferencesDecisionHandler ? @selector(webView:decidePolicyForNavigationAction:preferences:decisionHandler:) : @selector(_webView:decidePolicyForNavigationAction:preferences:userInfo:decisionHandler:);
         if (delegateHasWebsitePolicies)
             return @selector(_webView:decidePolicyForNavigationAction:decisionHandler:);
         return @selector(webView:decidePolicyForNavigationAction:decisionHandler:);
@@ -636,13 +639,18 @@
         }
     };
 
-    if (delegateHasWebpagePreferences)
-        [navigationDelegate webView:m_navigationState.m_webView decidePolicyForNavigationAction:wrapper(navigationAction) preferences:wrapper(defaultWebsitePolicies) decisionHandler:makeBlockPtr(WTFMove(decisionHandlerWithPreferencesOrPolicies)).get()];
-    else if (delegateHasWebsitePolicies) {
+    if (delegateHasWebpagePreferences) {
+        if (m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionWithPreferencesDecisionHandler)
+            [navigationDelegate webView:m_navigationState.m_webView decidePolicyForNavigationAction:wrapper(navigationAction) preferences:wrapper(defaultWebsitePolicies) decisionHandler:makeBlockPtr(WTFMove(decisionHandlerWithPreferencesOrPolicies)).get()];
+        else
+            [(id <WKNavigationDelegatePrivate>)navigationDelegate _webView:m_navigationState.m_webView decidePolicyForNavigationAction:wrapper(navigationAction) preferences:wrapper(defaultWebsitePolicies) userInfo:userInfo ? static_cast<id<NSSecureCoding>>(userInfo->wrapper()) : nil decisionHandler:makeBlockPtr(WTFMove(decisionHandlerWithPreferencesOrPolicies)).get()];
+    } else if (delegateHasWebsitePolicies) {
         auto decisionHandler = makeBlockPtr(WTFMove(decisionHandlerWithPreferencesOrPolicies));
-        if (m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionUserInfoDecisionHandlerWebsitePolicies)
+        if (m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionUserInfoDecisionHandlerWebsitePolicies) {
+            ALLOW_DEPRECATED_DECLARATIONS_BEGIN
             [(id <WKNavigationDelegatePrivate>)navigationDelegate _webView:m_navigationState.m_webView decidePolicyForNavigationAction:wrapper(navigationAction) userInfo:userInfo ? static_cast<id <NSSecureCoding>>(userInfo->wrapper()) : nil decisionHandler:decisionHandler.get()];
-        else {
+            ALLOW_DEPRECATED_DECLARATIONS_END
+        } else {
             ALLOW_DEPRECATED_DECLARATIONS_BEGIN
             [(id <WKNavigationDelegatePrivate>)navigationDelegate _webView:m_navigationState.m_webView decidePolicyForNavigationAction:wrapper(navigationAction) decisionHandler:decisionHandler.get()];
             ALLOW_DEPRECATED_DECLARATIONS_END
@@ -947,7 +955,8 @@
 
 bool NavigationState::NavigationClient::shouldBypassContentModeSafeguards() const
 {
-    return m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionWithPreferencesDecisionHandler;
+    return m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionWithPreferencesDecisionHandler
+        || m_navigationState.m_navigationDelegateMethods.webViewDecidePolicyForNavigationActionWithPreferencesUserInfoDecisionHandler;
 }
 
 static AuthenticationChallengeDisposition toAuthenticationChallengeDisposition(NSURLSessionAuthChallengeDisposition disposition)

Modified: trunk/Tools/ChangeLog (247025 => 247026)


--- trunk/Tools/ChangeLog	2019-07-01 21:55:03 UTC (rev 247025)
+++ trunk/Tools/ChangeLog	2019-07-01 22:07:09 UTC (rev 247026)
@@ -1,5 +1,19 @@
 2019-07-01  Alex Christensen  <[email protected]>
 
+        Add new decidePolicyForNavigationAction SPI with preferences and userInfo
+        https://bugs.webkit.org/show_bug.cgi?id=199371
+        <rdar://problem/52352905>
+
+        Reviewed by Tim Horton.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/Navigation.mm:
+        (-[NavigationActionSPIDelegate webView:didFinishNavigation:]):
+        (-[NavigationActionSPIDelegate _webView:decidePolicyForNavigationAction:preferences:userInfo:decisionHandler:]):
+        (-[NavigationActionSPIDelegate spiCalled]):
+        (TEST):
+
+2019-07-01  Alex Christensen  <[email protected]>
+
         Deprecate _webView:showCustomSheetForElement: after transition to UIContextMenuInteraction
         https://bugs.webkit.org/show_bug.cgi?id=199296
         <rdar://problem/51041960>

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/Navigation.mm (247025 => 247026)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/Navigation.mm	2019-07-01 21:55:03 UTC (rev 247025)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/Navigation.mm	2019-07-01 22:07:09 UTC (rev 247026)
@@ -354,6 +354,42 @@
     ASSERT_TRUE(didCancelRedirect);
 }
 
+@interface NavigationActionSPIDelegate : NSObject <WKNavigationDelegate> {
+@public
+    BOOL _spiCalled;
+}
+- (BOOL)spiCalled;
+@end
+
+@implementation NavigationActionSPIDelegate
+
+- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
+{
+    isDone = true;
+}
+
+-(void)_webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction preferences:(WKWebpagePreferences *)preferences userInfo:(id <NSSecureCoding>)userInfo decisionHandler:(void (^)(WKNavigationActionPolicy, WKWebpagePreferences *))decisionHandler {
+    _spiCalled = TRUE;
+    decisionHandler(WKNavigationActionPolicyAllow, preferences);
+}
+
+- (BOOL)spiCalled
+{
+    return _spiCalled;
+}
+
+@end
+
+TEST(WKNavigation, NavigationActionSPI)
+{
+    auto webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
+    auto delegate = adoptNS([[NavigationActionSPIDelegate alloc] init]);
+    [webView setNavigationDelegate:delegate.get()];
+    [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"data:text/html,1"]]];
+    TestWebKitAPI::Util::run(&isDone);
+    EXPECT_TRUE([delegate spiCalled]);
+}
+
 #if PLATFORM(MAC)
 
 static bool navigationComplete;

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm (247025 => 247026)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm	2019-07-01 21:55:03 UTC (rev 247025)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/WebsitePolicies.mm	2019-07-01 22:07:09 UTC (rev 247026)
@@ -250,7 +250,9 @@
 
 @implementation WebsitePoliciesNavigationDelegate
 
+IGNORE_WARNINGS_BEGIN("deprecated-implementations")
 - (void)_webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction userInfo:(id <NSSecureCoding>)userInfo decisionHandler:(void (^)(WKNavigationActionPolicy, _WKWebsitePolicies *))decisionHandler
+IGNORE_WARNINGS_END
 {
     if (_decidePolicyForNavigationActionWithWebsitePolicies)
         _decidePolicyForNavigationActionWithWebsitePolicies(navigationAction, userInfo, decisionHandler);
@@ -1127,7 +1129,9 @@
 
 @implementation CustomUserAgentDelegate
 
+IGNORE_WARNINGS_BEGIN("deprecated-implementations")
 - (void)_webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction userInfo:(id <NSSecureCoding>)userInfo decisionHandler:(void (^)(WKNavigationActionPolicy, _WKWebsitePolicies *))decisionHandler
+IGNORE_WARNINGS_END
 {
     _WKWebsitePolicies *websitePolicies = [[[_WKWebsitePolicies alloc] init] autorelease];
     if (navigationAction.targetFrame.mainFrame)
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to