[iOS] Specify -[NSURL _title] for the associated URL when copying an image element
authorwenson_hsieh@apple.com <wenson_hsieh@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 18 Jan 2018 08:24:46 +0000 (08:24 +0000)
committerwenson_hsieh@apple.com <wenson_hsieh@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 18 Jan 2018 08:24:46 +0000 (08:24 +0000)
https://bugs.webkit.org/show_bug.cgi?id=181783
<rdar://problem/35785445>

Reviewed by Ryosuke Niwa.

Source/WebCore:

Always specify the -[NSURL _title] to be either the title specified in a PasteboardImage's inner PasteboardURL,
or if no title is specified, fall back to the user-visible URL string. This is because at least one internal
client always tries to use the -_title property to determine the title of a pasted URL, or if none is specified,
the -suggestedName. Since we need to set suggestedName to the preferred file name of the copied image and we
don't want the suggested name to become the title of the link, we need to explicitly set the link title.

In doing so, this patch also fixes a bug wherein we forget to set the _title of the NSURL we're registering to
an NSItemProvider.

Tests:  ActionSheetTests.CopyImageElementWithHREFAndTitle (new)
        ActionSheetTests.CopyImageElementWithHREF (modified)

* platform/ios/PlatformPasteboardIOS.mm:
(WebCore::PlatformPasteboard::write):

Tools:

Augments an existing API test and adds a new test to make sure that the resulting NSItemProvider's NSURL when
copying an image contains a relevant title.

* TestWebKitAPI/Tests/ios/ActionSheetTests.mm:
(TestWebKitAPI::TEST):
* TestWebKitAPI/ios/DataInteractionSimulator.mm:
* TestWebKitAPI/ios/UIKitSPI.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@227135 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/platform/ios/PlatformPasteboardIOS.mm
Tools/ChangeLog
Tools/TestWebKitAPI/Tests/ios/ActionSheetTests.mm
Tools/TestWebKitAPI/ios/UIKitSPI.h

index f9e2919..5fbfb42 100644 (file)
@@ -1,3 +1,26 @@
+2018-01-18  Wenson Hsieh  <wenson_hsieh@apple.com>
+
+        [iOS] Specify -[NSURL _title] for the associated URL when copying an image element
+        https://bugs.webkit.org/show_bug.cgi?id=181783
+        <rdar://problem/35785445>
+
+        Reviewed by Ryosuke Niwa.
+
+        Always specify the -[NSURL _title] to be either the title specified in a PasteboardImage's inner PasteboardURL,
+        or if no title is specified, fall back to the user-visible URL string. This is because at least one internal
+        client always tries to use the -_title property to determine the title of a pasted URL, or if none is specified,
+        the -suggestedName. Since we need to set suggestedName to the preferred file name of the copied image and we
+        don't want the suggested name to become the title of the link, we need to explicitly set the link title.
+
+        In doing so, this patch also fixes a bug wherein we forget to set the _title of the NSURL we're registering to
+        an NSItemProvider.
+
+        Tests:  ActionSheetTests.CopyImageElementWithHREFAndTitle (new)
+                ActionSheetTests.CopyImageElementWithHREF (modified)
+
+        * platform/ios/PlatformPasteboardIOS.mm:
+        (WebCore::PlatformPasteboard::write):
+
 2018-01-17  Jer Noble  <jer.noble@apple.com>
 
         WebVTT served via HLS never results in cues
index 91c9011..958f5b7 100644 (file)
@@ -32,6 +32,7 @@
 #import "SharedBuffer.h"
 #import "URL.h"
 #import "UTIUtilities.h"
+#import "WebCoreNSURLExtras.h"
 #import "WebItemProviderPasteboard.h"
 #import <MobileCoreServices/MobileCoreServices.h>
 #import <UIKit/UIImage.h>
@@ -346,9 +347,10 @@ void PlatformPasteboard::write(const PasteboardImage& pasteboardImage)
     // FIXME: When writing a PasteboardImage, we currently always place the image data at a higer fidelity than the
     // associated image URL. However, in the case of an image enclosed by an anchor, we might want to consider the
     // the URL (i.e. the anchor's href attribute) to be a higher fidelity representation.
-    if (!pasteboardImage.url.url.isEmpty()) {
-        if (NSURL *nsURL = pasteboardImage.url.url)
-            [representationsToRegister addRepresentingObject:nsURL];
+    auto& pasteboardURL = pasteboardImage.url;
+    if (NSURL *nsURL = pasteboardURL.url) {
+        nsURL._title = pasteboardURL.title.isEmpty() ? userVisibleString(pasteboardURL.url) : (NSString *)pasteboardURL.title;
+        [representationsToRegister addRepresentingObject:nsURL];
     }
 
     registerItemToPasteboard(representationsToRegister.get(), m_pasteboard.get());
index ee24498..adcfd5b 100644 (file)
@@ -1,3 +1,19 @@
+2018-01-18  Wenson Hsieh  <wenson_hsieh@apple.com>
+
+        [iOS] Specify -[NSURL _title] for the associated URL when copying an image element
+        https://bugs.webkit.org/show_bug.cgi?id=181783
+        <rdar://problem/35785445>
+
+        Reviewed by Ryosuke Niwa.
+
+        Augments an existing API test and adds a new test to make sure that the resulting NSItemProvider's NSURL when
+        copying an image contains a relevant title.
+
+        * TestWebKitAPI/Tests/ios/ActionSheetTests.mm:
+        (TestWebKitAPI::TEST):
+        * TestWebKitAPI/ios/DataInteractionSimulator.mm:
+        * TestWebKitAPI/ios/UIKitSPI.h:
+
 2018-01-17  Carlos Garcia Campos  <cgarcia@igalia.com>
 
         WebDriver: ignore the driver in selenium test names when getting expectations
index 643e824..3dd746b 100644 (file)
@@ -164,6 +164,47 @@ static void presentActionSheetAndChooseAction(WKWebView *webView, ActionSheetObs
     [copyAction runActionWithElementInfo:copyElement.get()];
 }
 
+TEST(ActionSheetTests, CopyImageElementWithHREFAndTitle)
+{
+    UIApplicationInitialize();
+    [UIPasteboard generalPasteboard].items = @[ ];
+
+    auto webView = adoptNS([[TestWKWebView alloc] initWithFrame:CGRectMake(0, 0, 320, 500)]);
+    auto observer = adoptNS([[ActionSheetObserver alloc] init]);
+    [webView setUIDelegate:observer.get()];
+    [webView synchronouslyLoadTestPageNamed:@"image-in-link-and-input"];
+    [webView stringByEvaluatingJavaScript:@"document.querySelector('a').setAttribute('title', 'hello world')"];
+
+    presentActionSheetAndChooseAction(webView.get(), observer.get(), CGPointMake(100, 50), _WKElementActionTypeCopy);
+
+    __block bool done = false;
+    __block RetainPtr<NSItemProvider> itemProvider;
+    [webView _doAfterNextPresentationUpdate:^() {
+        NSArray <NSString *> *pasteboardTypes = [[UIPasteboard generalPasteboard] pasteboardTypes];
+        EXPECT_EQ(2UL, pasteboardTypes.count);
+        EXPECT_WK_STREQ((NSString *)kUTTypePNG, pasteboardTypes.firstObject);
+        EXPECT_WK_STREQ((NSString *)kUTTypeURL, pasteboardTypes.lastObject);
+        NSArray <NSItemProvider *> *itemProviders = [[UIPasteboard generalPasteboard] itemProviders];
+        EXPECT_EQ(1UL, itemProviders.count);
+        itemProvider = itemProviders.firstObject;
+        EXPECT_EQ(2UL, [itemProvider registeredTypeIdentifiers].count);
+        EXPECT_WK_STREQ((NSString *)kUTTypePNG, [itemProvider registeredTypeIdentifiers].firstObject);
+        EXPECT_WK_STREQ((NSString *)kUTTypeURL, [itemProvider registeredTypeIdentifiers].lastObject);
+        done = true;
+    }];
+    TestWebKitAPI::Util::run(&done);
+
+    __block bool doneLoading = false;
+    [itemProvider loadObjectOfClass:[NSURL class] completionHandler:^(id <NSItemProviderReading> result, NSError *) {
+        EXPECT_TRUE([result isKindOfClass:[NSURL class]]);
+        NSURL *url = (NSURL *)result;
+        EXPECT_WK_STREQ("https://www.apple.com/", url.absoluteString);
+        EXPECT_WK_STREQ("hello world", url._title);
+        doneLoading = true;
+    }];
+    TestWebKitAPI::Util::run(&doneLoading);
+}
+
 TEST(ActionSheetTests, CopyImageElementWithHREF)
 {
     UIApplicationInitialize();
@@ -177,6 +218,7 @@ TEST(ActionSheetTests, CopyImageElementWithHREF)
     presentActionSheetAndChooseAction(webView.get(), observer.get(), CGPointMake(100, 50), _WKElementActionTypeCopy);
 
     __block bool done = false;
+    __block RetainPtr<NSItemProvider> itemProvider;
     [webView _doAfterNextPresentationUpdate:^() {
         NSArray <NSString *> *pasteboardTypes = [[UIPasteboard generalPasteboard] pasteboardTypes];
         EXPECT_EQ(2UL, pasteboardTypes.count);
@@ -184,13 +226,23 @@ TEST(ActionSheetTests, CopyImageElementWithHREF)
         EXPECT_WK_STREQ((NSString *)kUTTypeURL, pasteboardTypes.lastObject);
         NSArray <NSItemProvider *> *itemProviders = [[UIPasteboard generalPasteboard] itemProviders];
         EXPECT_EQ(1UL, itemProviders.count);
-        NSItemProvider *itemProvider = itemProviders.firstObject;
-        EXPECT_EQ(2UL, itemProvider.registeredTypeIdentifiers.count);
-        EXPECT_WK_STREQ((NSString *)kUTTypePNG, itemProvider.registeredTypeIdentifiers.firstObject);
-        EXPECT_WK_STREQ((NSString *)kUTTypeURL, itemProvider.registeredTypeIdentifiers.lastObject);
+        itemProvider = itemProviders.firstObject;
+        EXPECT_EQ(2UL, [itemProvider registeredTypeIdentifiers].count);
+        EXPECT_WK_STREQ((NSString *)kUTTypePNG, [itemProvider registeredTypeIdentifiers].firstObject);
+        EXPECT_WK_STREQ((NSString *)kUTTypeURL, [itemProvider registeredTypeIdentifiers].lastObject);
         done = true;
     }];
     TestWebKitAPI::Util::run(&done);
+
+    __block bool doneLoading = false;
+    [itemProvider loadObjectOfClass:[NSURL class] completionHandler:^(id <NSItemProviderReading> result, NSError *) {
+        EXPECT_TRUE([result isKindOfClass:[NSURL class]]);
+        NSURL *url = (NSURL *)result;
+        EXPECT_WK_STREQ("https://www.apple.com/", url.absoluteString);
+        EXPECT_WK_STREQ("https://www.apple.com/", url._title);
+        doneLoading = true;
+    }];
+    TestWebKitAPI::Util::run(&doneLoading);
 }
 
 TEST(ActionSheetTests, CopyImageElementWithoutHREF)
index 542d88f..c687210 100644 (file)
@@ -91,4 +91,8 @@ WTF_EXTERN_C_END
 @end
 #endif
 
+@interface NSURL (UIKitSPI)
+@property (nonatomic, copy, setter=_setTitle:) NSString *_title;
+@end
+
 #endif // PLATFORM(IOS)