Changeset 238661 in webkit
- Timestamp:
- Nov 28, 2018 9:25:07 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r238657 r238661 1 2018-11-28 Wenson Hsieh <wenson_hsieh@apple.com> 2 3 [iOSMac] Dropping text selections from web content into editable elements crashes the web process 4 https://bugs.webkit.org/show_bug.cgi?id=192113 5 <rdar://problem/46323701> 6 7 Reviewed by Ryosuke Niwa. 8 9 In iOSMac, registering invalid UTIs on NSItemProvider when starting a drag or handling a drop does not work. 10 Since iOS writes and reads only "Apple Web Archive pasteboard type" (a.k.a. `WebArchivePboardType`) during drag 11 and drop as well as copy and paste, we fail to read or write any web archive data, and subsequently fall back to 12 reading RTF or flat RTFD, both of which are not supported in iOSMac, since UIFoundation links against the 13 system's macOS WebKit stack. 14 15 To fix this, we add support for reading and writing com.apple.webarchive (`kUTTypeWebArchive`) on iOS, so that 16 WebKit-based iOSMac applications can understand web archive data from the host running macOS, and the host can 17 also understand web archive data written by the iOSMac app. Additionally, don't allow reading RTF and flat RTFD 18 as web content in iOSMac. (Note that writing RTF and flat RTFD is still safe, since it does not depend on 19 UIFoundation.framework but rather `WebCore::HTMLConverter`). 20 21 Test: DragAndDropTests.ModernWebArchiveType 22 23 * editing/cocoa/WebContentReaderCocoa.mm: 24 (WebCore::createFragment): 25 26 Additionally make sure that we never call into UIFoundation's NSAttributedString to markup conversion codepath 27 by making `createFragment` an empty stub on iOSMac. 28 29 * platform/ios/PasteboardIOS.mm: 30 (WebCore::supportedImageTypes): 31 (WebCore::isTypeAllowedByReadingPolicy): 32 (WebCore::Pasteboard::readPasteboardWebContentDataForType): 33 (WebCore::Pasteboard::supportedWebContentPasteboardTypes): 34 * platform/ios/PlatformPasteboardIOS.mm: 35 (WebCore::PlatformPasteboard::write): 36 1 37 2018-11-28 Commit Queue <commit-queue@webkit.org> 2 38 -
trunk/Source/WebCore/editing/cocoa/WebContentReaderCocoa.mm
r238657 r238661 86 86 namespace WebCore { 87 87 88 #if (PLATFORM(IOS_FAMILY) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 110000) || (PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101300) 88 #if PLATFORM(IOSMAC) 89 90 static FragmentAndResources createFragment(Frame&, NSAttributedString *) 91 { 92 return { }; 93 } 94 95 #elif (PLATFORM(IOS_FAMILY) && __IPHONE_OS_VERSION_MIN_REQUIRED >= 110000) || (PLATFORM(MAC) && __MAC_OS_X_VERSION_MIN_REQUIRED >= 101300) 89 96 90 97 static NSDictionary *attributesForAttributedStringConversion() -
trunk/Source/WebCore/platform/ios/PasteboardIOS.mm
r237266 r238661 169 169 static NSArray* supportedImageTypes() 170 170 { 171 return @[( id)kUTTypePNG, (id)kUTTypeTIFF, (id)kUTTypeJPEG, (id)kUTTypeGIF];171 return @[(__bridge NSString *)kUTTypePNG, (__bridge NSString *)kUTTypeTIFF, (__bridge NSString *)kUTTypeJPEG, (__bridge NSString *)kUTTypeGIF]; 172 172 } 173 173 … … 176 176 return policy == WebContentReadingPolicy::AnyType 177 177 || [type isEqualToString:WebArchivePboardType] 178 || [type isEqualToString:(NSString *)kUTTypeHTML] 179 || [type isEqualToString:(NSString *)kUTTypeRTF] 180 || [type isEqualToString:(NSString *)kUTTypeFlatRTFD]; 178 || [type isEqualToString:(__bridge NSString *)kUTTypeWebArchive] 179 || [type isEqualToString:(__bridge NSString *)kUTTypeHTML] 180 || [type isEqualToString:(__bridge NSString *)kUTTypeRTF] 181 || [type isEqualToString:(__bridge NSString *)kUTTypeFlatRTFD]; 181 182 } 182 183 183 184 Pasteboard::ReaderResult Pasteboard::readPasteboardWebContentDataForType(PasteboardWebContentReader& reader, PasteboardStrategy& strategy, NSString *type, int itemIndex) 184 185 { 185 if ([type isEqualToString:WebArchivePboardType] ) {186 auto buffer = strategy.readBufferFromPasteboard(itemIndex, WebArchivePboardType, m_pasteboardName);186 if ([type isEqualToString:WebArchivePboardType] || [type isEqualToString:(__bridge NSString *)kUTTypeWebArchive]) { 187 auto buffer = strategy.readBufferFromPasteboard(itemIndex, type, m_pasteboardName); 187 188 if (m_changeCount != changeCount()) 188 189 return ReaderResult::PasteboardWasChangedExternally; … … 190 191 } 191 192 192 if ([type isEqualToString:( NSString *)kUTTypeHTML]) {193 if ([type isEqualToString:(__bridge NSString *)kUTTypeHTML]) { 193 194 String htmlString = strategy.readStringFromPasteboard(itemIndex, kUTTypeHTML, m_pasteboardName); 194 195 if (m_changeCount != changeCount()) … … 197 198 } 198 199 199 if ([type isEqualToString:(NSString *)kUTTypeFlatRTFD]) { 200 #if !PLATFORM(IOSMAC) 201 if ([type isEqualToString:(__bridge NSString *)kUTTypeFlatRTFD]) { 200 202 RefPtr<SharedBuffer> buffer = strategy.readBufferFromPasteboard(itemIndex, kUTTypeFlatRTFD, m_pasteboardName); 201 203 if (m_changeCount != changeCount()) … … 204 206 } 205 207 206 if ([type isEqualToString:( NSString *)kUTTypeRTF]) {208 if ([type isEqualToString:(__bridge NSString *)kUTTypeRTF]) { 207 209 RefPtr<SharedBuffer> buffer = strategy.readBufferFromPasteboard(itemIndex, kUTTypeRTF, m_pasteboardName); 208 210 if (m_changeCount != changeCount()) … … 210 212 return buffer && reader.readRTF(*buffer) ? ReaderResult::ReadType : ReaderResult::DidNotReadType; 211 213 } 214 #endif // !PLATFORM(IOSMAC) 212 215 213 216 if ([supportedImageTypes() containsObject:type]) { … … 218 221 } 219 222 220 if ([type isEqualToString:( NSString *)kUTTypeURL]) {223 if ([type isEqualToString:(__bridge NSString *)kUTTypeURL]) { 221 224 String title; 222 225 URL url = strategy.readURLFromPasteboard(itemIndex, m_pasteboardName, title); … … 226 229 } 227 230 228 if (UTTypeConformsTo(( CFStringRef)type, kUTTypePlainText)) {231 if (UTTypeConformsTo((__bridge CFStringRef)type, kUTTypePlainText)) { 229 232 String string = strategy.readStringFromPasteboard(itemIndex, kUTTypePlainText, m_pasteboardName); 230 233 if (m_changeCount != changeCount()) … … 233 236 } 234 237 235 if (UTTypeConformsTo(( CFStringRef)type, kUTTypeText)) {238 if (UTTypeConformsTo((__bridge CFStringRef)type, kUTTypeText)) { 236 239 String string = strategy.readStringFromPasteboard(itemIndex, kUTTypeText, m_pasteboardName); 237 240 if (m_changeCount != changeCount()) … … 322 325 NSArray *Pasteboard::supportedWebContentPasteboardTypes() 323 326 { 324 return @[(id)WebArchivePboardType, (id)kUTTypeFlatRTFD, (id)kUTTypeRTF, (id)kUTTypeHTML, (id)kUTTypePNG, (id)kUTTypeTIFF, (id)kUTTypeJPEG, (id)kUTTypeGIF, (id)kUTTypeURL, (id)kUTTypeText]; 327 return @[ 328 #if !PLATFORM(IOSMAC) 329 WebArchivePboardType, 330 #endif 331 (__bridge NSString *)kUTTypeWebArchive, 332 #if !PLATFORM(IOSMAC) 333 (__bridge NSString *)kUTTypeFlatRTFD, 334 (__bridge NSString *)kUTTypeRTF, 335 #endif 336 (__bridge NSString *)kUTTypeHTML, 337 (__bridge NSString *)kUTTypePNG, 338 (__bridge NSString *)kUTTypeTIFF, 339 (__bridge NSString *)kUTTypeJPEG, 340 (__bridge NSString *)kUTTypeGIF, 341 (__bridge NSString *)kUTTypeURL, 342 (__bridge NSString *)kUTTypeText 343 ]; 325 344 } 326 345 -
trunk/Source/WebCore/platform/ios/PlatformPasteboardIOS.mm
r238461 r238661 351 351 auto representationsToRegister = adoptNS([[WebItemProviderRegistrationInfoList alloc] init]); 352 352 353 #if !PLATFORM(IOSMAC) 353 354 [representationsToRegister addData:[webIOSPastePboardType dataUsingEncoding:NSUTF8StringEncoding] forType:webIOSPastePboardType]; 355 #endif 354 356 355 357 ASSERT(content.clientTypes.size() == content.clientData.size()); … … 357 359 [representationsToRegister addData:content.clientData[i]->createNSData().get() forType:content.clientTypes[i]]; 358 360 359 if (content.dataInWebArchiveFormat) 360 [representationsToRegister addData:content.dataInWebArchiveFormat->createNSData().get() forType:WebArchivePboardType]; 361 if (content.dataInWebArchiveFormat) { 362 auto webArchiveData = content.dataInWebArchiveFormat->createNSData(); 363 #if !PLATFORM(IOSMAC) 364 [representationsToRegister addData:webArchiveData.get() forType:WebArchivePboardType]; 365 #endif 366 [representationsToRegister addData:webArchiveData.get() forType:(__bridge NSString *)kUTTypeWebArchive]; 367 } 361 368 362 369 if (content.dataInAttributedStringFormat) { -
trunk/Tools/ChangeLog
r238644 r238661 1 2018-11-28 Wenson Hsieh <wenson_hsieh@apple.com> 2 3 [iOSMac] Dropping text selections from web content into editable elements crashes the web process 4 https://bugs.webkit.org/show_bug.cgi?id=192113 5 <rdar://problem/46323701> 6 7 Reviewed by Ryosuke Niwa. 8 9 Add a test to verify that, when dropping an item with both "com.apple.webarchive" and "public.utf8-plain-text" 10 representations, the higher fidelity web archive data is used when handling the drop. 11 12 * TestWebKitAPI/Tests/WebKitCocoa/DragAndDropTests.mm: 13 1 14 2018-11-28 Aakash Jain <aakash_jain@apple.com> 2 15 -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/DragAndDropTests.mm
r235835 r238661 26 26 #import "config.h" 27 27 28 #if WK_API_ENABLED && ENABLE(DRAG_SUPPORT) 29 28 30 #import "DragAndDropSimulator.h" 29 31 #import "PlatformUtilities.h" 30 32 #import <WebKit/WKPreferencesPrivate.h> 33 #import <WebKit/WebArchive.h> 31 34 32 #if WK_API_ENABLED && ENABLE(DRAG_SUPPORT) 35 #if PLATFORM(IOS_FAMILY) 36 #import <MobileCoreServices/MobileCoreServices.h> 37 #endif 38 39 TEST(DragAndDropTests, ModernWebArchiveType) 40 { 41 NSData *markupData = [@"<strong><i>Hello world</i></strong>" dataUsingEncoding:NSUTF8StringEncoding]; 42 auto mainResource = adoptNS([[WebResource alloc] initWithData:markupData URL:[NSURL URLWithString:@"foo.html"] MIMEType:@"text/html" textEncodingName:@"utf-8" frameName:nil]); 43 auto archive = adoptNS([[WebArchive alloc] initWithMainResource:mainResource.get() subresources:@[ ] subframeArchives:@[ ]]); 44 NSString *webArchiveType = (__bridge NSString *)kUTTypeWebArchive; 45 46 auto simulator = adoptNS([[DragAndDropSimulator alloc] initWithWebViewFrame:CGRectMake(0, 0, 320, 500)]); 47 auto webView = [simulator webView]; 48 [webView synchronouslyLoadHTMLString:@"<meta name='viewport' content='width=device-width'><body style='width: 100%; height: 100%;' contenteditable>"]; 49 #if PLATFORM(MAC) 50 NSPasteboard *pasteboard = [NSPasteboard pasteboardWithUniqueName]; 51 [pasteboard declareTypes:@[webArchiveType, (__bridge NSString *)kUTTypeUTF8PlainText] owner:nil]; 52 [pasteboard setData:[archive data] forType:webArchiveType]; 53 [pasteboard setData:[@"Hello world" dataUsingEncoding:NSUTF8StringEncoding] forType:(__bridge NSString *)kUTTypeUTF8PlainText]; 54 [simulator setExternalDragPasteboard:pasteboard]; 55 #else 56 auto item = adoptNS([[NSItemProvider alloc] init]); 57 [item registerDataRepresentationForTypeIdentifier:webArchiveType visibility:NSItemProviderRepresentationVisibilityAll loadHandler:[&] (void (^completionHandler)(NSData *, NSError *)) -> NSProgress * { 58 completionHandler([archive data], nil); 59 return nil; 60 }]; 61 [item registerDataRepresentationForTypeIdentifier:(__bridge NSString *)kUTTypeUTF8PlainText visibility:NSItemProviderRepresentationVisibilityAll loadHandler:[&] (void (^completionHandler)(NSData *, NSError *)) -> NSProgress * { 62 completionHandler([@"Hello world" dataUsingEncoding:NSUTF8StringEncoding], nil); 63 return nil; 64 }]; 65 [simulator setExternalItemProviders:@[ item.get() ]]; 66 #endif 67 [simulator runFrom:CGPointMake(0, 0) to:CGPointMake(50, 50)]; 68 [webView stringByEvaluatingJavaScript:@"document.body.focus(); getSelection().setBaseAndExtent(document.body, 0, document.body, 1)"]; 69 EXPECT_WK_STREQ("Hello world", [webView stringByEvaluatingJavaScript:@"document.body.textContent"]); 70 EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"document.queryCommandState('bold')"].boolValue); 71 EXPECT_TRUE([webView stringByEvaluatingJavaScript:@"document.queryCommandState('italic')"].boolValue); 72 } 33 73 34 74 TEST(DragAndDropTests, DragImageLocationForLinkInSubframe)
Note: See TracChangeset
for help on using the changeset viewer.