Don't convert pasted content to use blob URL in WebKit1
[WebKit-https.git] / Tools / TestWebKitAPI / Tests / WebKitLegacy / mac / AccessingPastedImage.mm
1 /*
2  * Copyright (C) 2017 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #import "config.h"
27 #import "PlatformUtilities.h"
28 #import "WTFStringUtilities.h"
29
30 #import <WebKit/DOM.h>
31 #import <WebKit/WebViewPrivate.h>
32
33 #if PLATFORM(IOS)
34 #include <MobileCoreServices/MobileCoreServices.h>
35 #endif
36
37 #if PLATFORM(MAC)
38
39 static void writeRTFDToPasteboard(NSData *data)
40 {
41     [[NSPasteboard generalPasteboard] declareTypes:@[NSRTFDPboardType] owner:nil];
42     [[NSPasteboard generalPasteboard] setData:data forType:NSRTFDPboardType];
43 }
44 #else
45
46 @interface NSAttributedString ()
47 - (id)initWithRTF:(NSData *)data documentAttributes:(NSDictionary **)dict;
48 - (id)initWithRTFD:(NSData *)data documentAttributes:(NSDictionary **)dict;
49 - (NSData *)RTFFromRange:(NSRange)range documentAttributes:(NSDictionary *)dict;
50 - (NSData *)RTFDFromRange:(NSRange)range documentAttributes:(NSDictionary *)dict;
51 - (BOOL)containsAttachments;
52 @end
53
54 static void writeRTFDToPasteboard(NSData *data)
55 {
56     [[UIPasteboard generalPasteboard] setItems:@[@{ (NSString *)kUTTypeFlatRTFD : data}]];
57 }
58 #endif
59
60 @interface SubresourceForBlobURLFrameLoadDelegate : NSObject <WebFrameLoadDelegate, WebUIDelegate> {
61 }
62 @end
63
64 static bool didFinishLoad = false;
65 static bool didAlert = false;
66
67 @implementation SubresourceForBlobURLFrameLoadDelegate
68
69 - (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame
70 {
71     didFinishLoad = true;
72 }
73
74 - (void)webView:(WebView *)sender runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WebFrame *)frame
75 {
76     didAlert = true;
77 }
78
79 @end
80
81 namespace TestWebKitAPI {
82
83 TEST(WebKitLegacy, AccessingImageInPastedRTFD)
84 {
85     auto webView = adoptNS([[WebView alloc] initWithFrame:NSMakeRect(0, 0, 400, 400) frameName:nil groupName:nil]);
86     auto delegate = adoptNS([[SubresourceForBlobURLFrameLoadDelegate alloc] init]);
87     [webView.get() setFrameLoadDelegate:delegate.get()];
88     [webView.get() setUIDelegate:delegate.get()];
89
90     auto *mainFrame = webView.get().mainFrame;
91     [[webView.get() mainFrame] loadRequest:[NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"paste-rtfd" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]]];
92     Util::run(&didFinishLoad);
93     [webView.get() setEditable:YES];
94
95     auto *pngData = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"sunset-in-cupertino-200px" ofType:@"png" inDirectory:@"TestWebKitAPI.resources"]];
96     auto attachment = adoptNS([[NSTextAttachment alloc] initWithData:pngData ofType:(NSString *)kUTTypePNG]);
97     NSAttributedString *string = [NSAttributedString attributedStringWithAttachment:attachment.get()];
98     NSData *RTFDData = [string RTFDFromRange:NSMakeRange(0, [string length]) documentAttributes:@{ }];
99
100     writeRTFDToPasteboard(RTFDData);
101     [webView paste:nil];
102     Util::run(&didAlert);
103
104     DOMDocument *document = [mainFrame DOMDocument];
105     DOMElement *documentElement = document.documentElement;
106     DOMHTMLImageElement *image = (DOMHTMLImageElement *)[documentElement querySelector:@"img"];
107     NSURL *url = image.absoluteImageURL;
108
109     EXPECT_EQ(200, image.width);
110     EXPECT_WK_STREQ("webkit-fake-url", url.scheme);
111
112     WebResource *webResource = [mainFrame.dataSource subresourceForURL:url];
113     EXPECT_TRUE(webResource);
114     EXPECT_TRUE(webResource.data);
115     EXPECT_WK_STREQ("image/png", webResource.MIMEType);
116 }
117
118 TEST(WebKitLegacy, AccessingImageInPastedWebArchive)
119 {
120     auto sourceWebView = adoptNS([[WebView alloc] initWithFrame:NSMakeRect(0, 0, 400, 400) frameName:nil groupName:nil]);
121     auto destinationWebView = adoptNS([[WebView alloc] initWithFrame:NSMakeRect(0, 0, 400, 400) frameName:nil groupName:nil]);
122     auto delegate = adoptNS([[SubresourceForBlobURLFrameLoadDelegate alloc] init]);
123     [sourceWebView.get() setFrameLoadDelegate:delegate.get()];
124     [sourceWebView.get() setUIDelegate:delegate.get()];
125     [destinationWebView.get() setFrameLoadDelegate:delegate.get()];
126     [destinationWebView.get() setUIDelegate:delegate.get()];
127
128     [[sourceWebView.get() mainFrame] loadRequest:[NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"image-and-contenteditable" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]]];
129     Util::run(&didFinishLoad);
130     [sourceWebView.get() setEditable:YES];
131
132     didFinishLoad = false;
133     [[destinationWebView.get() mainFrame] loadRequest:[NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"paste-rtfd" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]]];
134     Util::run(&didFinishLoad);
135     [destinationWebView.get() setEditable:YES];
136
137     [sourceWebView stringByEvaluatingJavaScriptFromString:@"document.body.focus(); document.execCommand('selectAll');"];
138     [sourceWebView copy:nil];
139
140     [destinationWebView paste:nil];
141     Util::run(&didAlert);
142
143     auto *mainFrame = destinationWebView.get().mainFrame;
144     DOMDocument *document = [mainFrame DOMDocument];
145     DOMElement *documentElement = document.documentElement;
146     DOMHTMLImageElement *image = (DOMHTMLImageElement *)[documentElement querySelector:@"img"];
147     NSURL *url = image.absoluteImageURL;
148
149     EXPECT_EQ(200, image.width);
150     EXPECT_WK_STREQ("file", url.scheme);
151
152     WebResource *webResource = [mainFrame.dataSource subresourceForURL:url];
153     EXPECT_TRUE(webResource);
154     EXPECT_TRUE(webResource.data);
155     EXPECT_WK_STREQ("image/png", webResource.MIMEType);
156 }
157
158 } // namespace TestWebKitAPI