Title: [242236] trunk
Revision
242236
Author
david_ques...@apple.com
Date
2019-02-28 15:37:43 -0800 (Thu, 28 Feb 2019)

Log Message

Expose APINavigationAction.shouldPerformDownload() on WKNavigationAction
https://bugs.webkit.org/show_bug.cgi?id=195121
rdar://problem/48450302

Reviewed by Alex Christensen.

Source/WebKit:

* UIProcess/API/Cocoa/WKNavigationAction.mm:
(-[WKNavigationAction _shouldPerformDownload]):
* UIProcess/API/Cocoa/WKNavigationActionPrivate.h:

Tools:

Add API tests for -WKNavigationAction._shouldPerformDownload in various
configurations where the 'download' attribute is absent, blank, or populated
with a filename, and where the anchor element is same-origin or cross-origin
(meaning the 'download' attribute shouldn't be honored).

* TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* TestWebKitAPI/Tests/WebKitCocoa/NavigationAction.mm: Added.
(-[NavigationActionTestDelegate init]):
(-[NavigationActionTestDelegate navigationAction]):
(-[NavigationActionTestDelegate waitForNavigationActionCallback]):
(-[NavigationActionTestDelegate waitForDidFinishNavigation]):
(-[NavigationActionTestDelegate webView:decidePolicyForNavigationAction:decisionHandler:]):
(-[NavigationActionTestDelegate webView:didFinishNavigation:]):
(TEST):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/WebKit/ChangeLog (242235 => 242236)


--- trunk/Source/WebKit/ChangeLog	2019-02-28 23:33:08 UTC (rev 242235)
+++ trunk/Source/WebKit/ChangeLog	2019-02-28 23:37:43 UTC (rev 242236)
@@ -1,3 +1,15 @@
+2019-02-28  David Quesada  <david_ques...@apple.com>
+
+        Expose APINavigationAction.shouldPerformDownload() on WKNavigationAction
+        https://bugs.webkit.org/show_bug.cgi?id=195121
+        rdar://problem/48450302
+
+        Reviewed by Alex Christensen.
+
+        * UIProcess/API/Cocoa/WKNavigationAction.mm:
+        (-[WKNavigationAction _shouldPerformDownload]):
+        * UIProcess/API/Cocoa/WKNavigationActionPrivate.h:
+
 2019-02-28  Antoine Quint  <grao...@apple.com>
 
         Disable Web Animations in Safari Technology Preview

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKNavigationAction.mm (242235 => 242236)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKNavigationAction.mm	2019-02-28 23:33:08 UTC (rev 242235)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKNavigationAction.mm	2019-02-28 23:37:43 UTC (rev 242236)
@@ -187,6 +187,11 @@
     return _navigationAction->shouldOpenAppLinks();
 }
 
+- (BOOL)_shouldPerformDownload
+{
+    return _navigationAction->shouldPerformDownload();
+}
+
 - (BOOL)_shouldOpenExternalURLs
 {
     return [self _shouldOpenExternalSchemes];

Modified: trunk/Source/WebKit/UIProcess/API/Cocoa/WKNavigationActionPrivate.h (242235 => 242236)


--- trunk/Source/WebKit/UIProcess/API/Cocoa/WKNavigationActionPrivate.h	2019-02-28 23:33:08 UTC (rev 242235)
+++ trunk/Source/WebKit/UIProcess/API/Cocoa/WKNavigationActionPrivate.h	2019-02-28 23:37:43 UTC (rev 242236)
@@ -47,6 +47,7 @@
 @property (nonatomic, readonly) BOOL _canHandleRequest;
 @property (nonatomic, readonly) BOOL _shouldOpenExternalSchemes WK_API_AVAILABLE(macosx(10.11), ios(9.0));
 @property (nonatomic, readonly) BOOL _shouldOpenAppLinks WK_API_AVAILABLE(macosx(10.11), ios(9.0));
+@property (nonatomic, readonly) BOOL _shouldPerformDownload WK_API_AVAILABLE(macosx(WK_MAC_TBA), ios(WK_IOS_TBA));
 
 @property (nonatomic, readonly) BOOL _shouldOpenExternalURLs WK_API_DEPRECATED("use _shouldOpenExternalSchemes and _shouldOpenAppLinks", macosx(10.11, 10.11), ios(9.0, 9.0));
 

Modified: trunk/Tools/ChangeLog (242235 => 242236)


--- trunk/Tools/ChangeLog	2019-02-28 23:33:08 UTC (rev 242235)
+++ trunk/Tools/ChangeLog	2019-02-28 23:37:43 UTC (rev 242236)
@@ -1,3 +1,26 @@
+2019-02-28  David Quesada  <david_ques...@apple.com>
+
+        Expose APINavigationAction.shouldPerformDownload() on WKNavigationAction
+        https://bugs.webkit.org/show_bug.cgi?id=195121
+        rdar://problem/48450302
+
+        Reviewed by Alex Christensen.
+
+        Add API tests for -WKNavigationAction._shouldPerformDownload in various
+        configurations where the 'download' attribute is absent, blank, or populated
+        with a filename, and where the anchor element is same-origin or cross-origin
+        (meaning the 'download' attribute shouldn't be honored).
+
+        * TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
+        * TestWebKitAPI/Tests/WebKitCocoa/NavigationAction.mm: Added.
+        (-[NavigationActionTestDelegate init]):
+        (-[NavigationActionTestDelegate navigationAction]):
+        (-[NavigationActionTestDelegate waitForNavigationActionCallback]):
+        (-[NavigationActionTestDelegate waitForDidFinishNavigation]):
+        (-[NavigationActionTestDelegate webView:decidePolicyForNavigationAction:decisionHandler:]):
+        (-[NavigationActionTestDelegate webView:didFinishNavigation:]):
+        (TEST):
+
 2019-02-28  Antoine Quint  <grao...@apple.com>
 
         Enable the Pointer Events runtime flag by default

Modified: trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj (242235 => 242236)


--- trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2019-02-28 23:33:08 UTC (rev 242235)
+++ trunk/Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj	2019-02-28 23:37:43 UTC (rev 242236)
@@ -340,6 +340,7 @@
 		5E4B1D2E1D404C6100053621 /* WKScrollViewDelegate.mm in Sources */ = {isa = PBXBuildFile; fileRef = 5E4B1D2C1D404C6100053621 /* WKScrollViewDelegate.mm */; };
 		631EFFF61E7B5E8D00D2EBB8 /* Geolocation.mm in Sources */ = {isa = PBXBuildFile; fileRef = 631EFFF51E7B5E8D00D2EBB8 /* Geolocation.mm */; };
 		634910E01E9D3FF300880309 /* CoreLocation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 634910DF1E9D3FF300880309 /* CoreLocation.framework */; };
+		6351992822275C6A00890AD3 /* NavigationAction.mm in Sources */ = {isa = PBXBuildFile; fileRef = 6351992722275C6A00890AD3 /* NavigationAction.mm */; };
 		6354F4D11F7C3AB500D89DF3 /* ApplicationManifestParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6354F4D01F7C3AB500D89DF3 /* ApplicationManifestParser.cpp */; };
 		6356FB221EC4E0BA0044BF18 /* VisibleContentRect.mm in Sources */ = {isa = PBXBuildFile; fileRef = 6356FB211EC4E0BA0044BF18 /* VisibleContentRect.mm */; };
 		636353A71E98665D0009F8AF /* GeolocationGetCurrentPositionResult.html in Copy Resources */ = {isa = PBXBuildFile; fileRef = 636353A61E9861940009F8AF /* GeolocationGetCurrentPositionResult.html */; };
@@ -1728,6 +1729,7 @@
 		5E4B1D2C1D404C6100053621 /* WKScrollViewDelegate.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = WKScrollViewDelegate.mm; path = ../ios/WKScrollViewDelegate.mm; sourceTree = "<group>"; };
 		631EFFF51E7B5E8D00D2EBB8 /* Geolocation.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = Geolocation.mm; sourceTree = "<group>"; };
 		634910DF1E9D3FF300880309 /* CoreLocation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreLocation.framework; path = System/Library/Frameworks/CoreLocation.framework; sourceTree = SDKROOT; };
+		6351992722275C6A00890AD3 /* NavigationAction.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = NavigationAction.mm; sourceTree = "<group>"; };
 		6354F4D01F7C3AB500D89DF3 /* ApplicationManifestParser.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ApplicationManifestParser.cpp; sourceTree = "<group>"; };
 		6356FB211EC4E0BA0044BF18 /* VisibleContentRect.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = VisibleContentRect.mm; sourceTree = "<group>"; };
 		636353A61E9861940009F8AF /* GeolocationGetCurrentPositionResult.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; path = GeolocationGetCurrentPositionResult.html; sourceTree = "<group>"; };
@@ -2544,6 +2546,7 @@
 				5165FE03201EE617009F7EC3 /* MessagePortProviders.mm */,
 				51CD1C6A1B38CE3600142CA5 /* ModalAlerts.mm */,
 				1ABC3DED1899BE6D004F0626 /* Navigation.mm */,
+				6351992722275C6A00890AD3 /* NavigationAction.mm */,
 				5C8BC798218CF3E900813886 /* NetworkProcess.mm */,
 				5CAE4637201937CD0051610F /* NetworkProcessCrashNonPersistentDataStore.mm */,
 				CD2D0D19213465560018C784 /* NowPlaying.mm */,
@@ -4150,6 +4153,7 @@
 				7C83E0B61D0A64B300FEBCF3 /* ModalAlertsSPI.cpp in Sources */,
 				7CCE7F011A411AE600447C4C /* MouseMoveAfterCrash.cpp in Sources */,
 				7CCE7F241A411AF600447C4C /* Navigation.mm in Sources */,
+				6351992822275C6A00890AD3 /* NavigationAction.mm in Sources */,
 				5C0BF8951DD599CD00B00328 /* NavigatorLanguage.mm in Sources */,
 				5C8BC799218CF44700813886 /* NetworkProcess.mm in Sources */,
 				5CAE463820193B6A0051610F /* NetworkProcessCrashNonPersistentDataStore.mm in Sources */,

Added: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/NavigationAction.mm (0 => 242236)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/NavigationAction.mm	                        (rev 0)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/NavigationAction.mm	2019-02-28 23:37:43 UTC (rev 242236)
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2019 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 "TestWKWebView.h"
+#import <WebKit/WKNavigationActionPrivate.h>
+#import <wtf/RetainPtr.h>
+
+#if WK_API_ENABLED
+
+@interface NavigationActionTestDelegate : NSObject <WKNavigationDelegate>
+
+@property (nonatomic, readonly) WKNavigationAction *navigationAction;
+@property (nonatomic) WKNavigationActionPolicy navigationPolicy;
+
+@end
+
+@implementation NavigationActionTestDelegate {
+    RetainPtr<WKNavigationAction> _navigationAction;
+    bool _hasReceivedNavigationCallback;
+    bool _hasFinishedNavigation;
+}
+
+- (instancetype)init
+{
+    if (!(self = [super init]))
+        return nil;
+
+    _navigationPolicy = WKNavigationActionPolicyAllow;
+
+    return self;
+}
+
+- (WKNavigationAction *)navigationAction
+{
+    return _navigationAction.get();
+}
+
+- (void)waitForNavigationActionCallback
+{
+    _navigationAction = nullptr;
+    _hasReceivedNavigationCallback = false;
+    TestWebKitAPI::Util::run(&_hasReceivedNavigationCallback);
+}
+
+- (void)waitForDidFinishNavigation
+{
+    _hasFinishedNavigation = false;
+    TestWebKitAPI::Util::run(&_hasFinishedNavigation);
+}
+
+- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
+{
+    decisionHandler(_navigationPolicy);
+    _navigationAction = navigationAction;
+    _hasReceivedNavigationCallback = true;
+}
+
+- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
+{
+    _hasFinishedNavigation = true;
+}
+
+@end
+
+TEST(WKNavigationAction, ShouldPerformDownload_NoDownloadAttribute)
+{
+    auto navigationDelegate = adoptNS([[NavigationActionTestDelegate alloc] init]);
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
+    [webView setNavigationDelegate:navigationDelegate.get()];
+
+    auto baseURL = retainPtr([NSURL URLWithString:@"https://example.com/index.html"]);
+    [webView loadHTMLString:@"<a id='link' href=''>Click Me!</a>" baseURL:baseURL.get()];
+    [navigationDelegate waitForDidFinishNavigation];
+
+    [webView evaluateJavaScript:@"document.getElementById('link').click();" completionHandler:nil];
+    navigationDelegate.get().navigationPolicy = WKNavigationActionPolicyCancel;
+    [navigationDelegate waitForNavigationActionCallback];
+
+    EXPECT_NOT_NULL(navigationDelegate.get().navigationAction);
+    EXPECT_FALSE(navigationDelegate.get().navigationAction._shouldPerformDownload);
+}
+
+TEST(WKNavigationAction, ShouldPerformDownload_BlankDownloadAttribute_SameOrigin)
+{
+    auto navigationDelegate = adoptNS([[NavigationActionTestDelegate alloc] init]);
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
+    [webView setNavigationDelegate:navigationDelegate.get()];
+
+    auto baseURL = retainPtr([NSURL URLWithString:@"https://example.com/index.html"]);
+    [webView loadHTMLString:@"<a id='link' href='' download>Click Me!</a>" baseURL:baseURL.get()];
+    [navigationDelegate waitForDidFinishNavigation];
+
+    [webView evaluateJavaScript:@"document.getElementById('link').click();" completionHandler:nil];
+    navigationDelegate.get().navigationPolicy = WKNavigationActionPolicyCancel;
+    [navigationDelegate waitForNavigationActionCallback];
+
+    EXPECT_NOT_NULL(navigationDelegate.get().navigationAction);
+    EXPECT_TRUE(navigationDelegate.get().navigationAction._shouldPerformDownload);
+}
+
+TEST(WKNavigationAction, ShouldPerformDownload_BlankDownloadAttribute_CrossOrigin)
+{
+    auto navigationDelegate = adoptNS([[NavigationActionTestDelegate alloc] init]);
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
+    [webView setNavigationDelegate:navigationDelegate.get()];
+
+    auto baseURL = retainPtr([NSURL URLWithString:@"https://example.com/index.html"]);
+    [webView loadHTMLString:@"<a id='link' href='' download>Click Me!</a>" baseURL:baseURL.get()];
+    [navigationDelegate waitForDidFinishNavigation];
+
+    [webView evaluateJavaScript:@"document.getElementById('link').click();" completionHandler:nil];
+    navigationDelegate.get().navigationPolicy = WKNavigationActionPolicyCancel;
+    [navigationDelegate waitForNavigationActionCallback];
+
+    EXPECT_NOT_NULL(navigationDelegate.get().navigationAction);
+    EXPECT_FALSE(navigationDelegate.get().navigationAction._shouldPerformDownload);
+}
+
+TEST(WKNavigationAction, ShouldPerformDownload_DownloadAttribute_SameOrigin)
+{
+    auto navigationDelegate = adoptNS([[NavigationActionTestDelegate alloc] init]);
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
+    [webView setNavigationDelegate:navigationDelegate.get()];
+
+    auto baseURL = retainPtr([NSURL URLWithString:@"https://example.com/index.html"]);
+    [webView loadHTMLString:@"<a id='link' href='' download='file2.txt'>Click Me!</a>" baseURL:baseURL.get()];
+    [navigationDelegate waitForDidFinishNavigation];
+
+    [webView evaluateJavaScript:@"document.getElementById('link').click();" completionHandler:nil];
+    navigationDelegate.get().navigationPolicy = WKNavigationActionPolicyCancel;
+    [navigationDelegate waitForNavigationActionCallback];
+
+    EXPECT_NOT_NULL(navigationDelegate.get().navigationAction);
+    EXPECT_TRUE(navigationDelegate.get().navigationAction._shouldPerformDownload);
+}
+
+TEST(WKNavigationAction, ShouldPerformDownload_DownloadAttribute_CrossOrigin)
+{
+    auto navigationDelegate = adoptNS([[NavigationActionTestDelegate alloc] init]);
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600)]);
+    [webView setNavigationDelegate:navigationDelegate.get()];
+
+    auto baseURL = retainPtr([NSURL URLWithString:@"https://example.com/index.html"]);
+    [webView loadHTMLString:@"<a id='link' href='' download='file2.txt'>Click Me!</a>" baseURL:baseURL.get()];
+    [navigationDelegate waitForDidFinishNavigation];
+
+    [webView evaluateJavaScript:@"document.getElementById('link').click();" completionHandler:nil];
+    navigationDelegate.get().navigationPolicy = WKNavigationActionPolicyCancel;
+    [navigationDelegate waitForNavigationActionCallback];
+
+    EXPECT_NOT_NULL(navigationDelegate.get().navigationAction);
+    EXPECT_FALSE(navigationDelegate.get().navigationAction._shouldPerformDownload);
+}
+
+#endif // WK_API_ENABLED
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to