18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2005, 2006, 2007 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * its contributors may be used to endorse or promote products derived 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * from this software without specific prior written permission. 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNSPasteboardExtras.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "DOMElementInternal.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebArchive.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebFrameInternal.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebHTMLViewInternal.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNSURLExtras.h" 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebResourcePrivate.h" 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebURLsWithTitles.h" 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebViewPrivate.h" 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/Element.h> 40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#import <WebCore/Image.h> 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/MIMETypeRegistry.h> 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/RenderImage.h> 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKit/DOMExtensions.h> 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKit/DOMPrivate.h> 45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#import <WebKitSystemInterface.h> 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <wtf/Assertions.h> 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <wtf/RetainPtr.h> 48dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#import <wtf/StdLibExtras.h> 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WebCore; 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *WebURLPboardType = @"public.url"; 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *WebURLNamePboardType = @"public.url-name"; 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation NSPasteboard (WebExtras) 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (NSArray *)_web_writableTypesForURL 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 59635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project DEFINE_STATIC_LOCAL(RetainPtr<NSArray>, types, ([[NSArray alloc] initWithObjects: 60635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project WebURLsWithTitlesPboardType, 61635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project NSURLPboardType, 62635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project WebURLPboardType, 63635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project WebURLNamePboardType, 64635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project NSStringPboardType, 65635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project nil])); 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return types.get(); 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 69635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic inline NSArray *_createWritableTypesForImageWithoutArchive() 70635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 71635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project NSMutableArray *types = [[NSMutableArray alloc] initWithObjects:NSTIFFPboardType, nil]; 72635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [types addObjectsFromArray:[NSPasteboard _web_writableTypesForURL]]; 73635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return types; 74635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 75635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NSArray *_writableTypesForImageWithoutArchive (void) 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 78635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project DEFINE_STATIC_LOCAL(RetainPtr<NSArray>, types, (_createWritableTypesForImageWithoutArchive())); 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return types.get(); 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 82635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic inline NSArray *_createWritableTypesForImageWithArchive() 83635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 84635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project NSMutableArray *types = [_writableTypesForImageWithoutArchive() mutableCopy]; 85635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [types addObject:NSRTFDPboardType]; 86635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project [types addObject:WebArchivePboardType]; 87635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return types; 88635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 89635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NSArray *_writableTypesForImageWithArchive (void) 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 92635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project DEFINE_STATIC_LOCAL(RetainPtr<NSArray>, types, (_createWritableTypesForImageWithArchive())); 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return types.get(); 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (NSArray *)_web_writableTypesForImageIncludingArchive:(BOOL)hasArchive 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return hasArchive 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ? _writableTypesForImageWithArchive() 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : _writableTypesForImageWithoutArchive(); 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (NSArray *)_web_dragTypesForURL 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [NSArray arrayWithObjects: 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebURLsWithTitlesPboardType, 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSURLPboardType, 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebURLPboardType, 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebURLNamePboardType, 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSStringPboardType, 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSFilenamesPboardType, 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project nil]; 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSURL *)_web_bestURL 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSArray *types = [self types]; 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([types containsObject:NSURLPboardType]) { 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSURL *URLFromPasteboard = [NSURL URLFromPasteboard:self]; 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSString *scheme = [URLFromPasteboard scheme]; 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([scheme isEqualToString:@"http"] || [scheme isEqualToString:@"https"]) { 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [URLFromPasteboard _webkit_canonicalize]; 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([types containsObject:NSStringPboardType]) { 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSString *URLString = [self stringForType:NSStringPboardType]; 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([URLString _webkit_looksLikeAbsoluteURL]) { 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSURL *URL = [[NSURL _web_URLWithUserTypedString:URLString] _webkit_canonicalize]; 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (URL) { 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return URL; 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([types containsObject:NSFilenamesPboardType]) { 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSArray *files = [self propertyListForType:NSFilenamesPboardType]; 139e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block // FIXME: Maybe it makes more sense to allow multiple files and only use the first one? 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([files count] == 1) { 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSString *file = [files objectAtIndex:0]; 142e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block // FIXME: We are filtering out directories because that's what the original code used to 143e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block // do. Without this check, if the URL points to a local directory, Safari will open the 144e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block // parent directory of the directory in Finder. This check should go away as soon as 145e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block // possible. 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL isDirectory; 147e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block if ([[NSFileManager defaultManager] fileExistsAtPath:file isDirectory:&isDirectory] && isDirectory) 148e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block return nil; 149e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block return [[NSURL fileURLWithPath:file] _webkit_canonicalize]; 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_web_writeURL:(NSURL *)URL andTitle:(NSString *)title types:(NSArray *)types 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(URL); 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([title length] == 0) { 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project title = [[URL path] lastPathComponent]; 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([title length] == 0) 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project title = [URL _web_userVisibleString]; 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([types containsObject:NSURLPboardType]) 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [URL writeToPasteboard:self]; 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([types containsObject:WebURLPboardType]) 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self setString:[URL _web_originalDataAsString] forType:WebURLPboardType]; 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([types containsObject:WebURLNamePboardType]) 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self setString:title forType:WebURLNamePboardType]; 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([types containsObject:NSStringPboardType]) 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self setString:[URL _web_userVisibleString] forType:NSStringPboardType]; 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([types containsObject:WebURLsWithTitlesPboardType]) 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [WebURLsWithTitles writeURLs:[NSArray arrayWithObject:URL] andTitles:[NSArray arrayWithObject:title] toPasteboard:self]; 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (int)_web_setFindPasteboardString:(NSString *)string withOwner:(id)owner 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSPasteboard *findPasteboard = [NSPasteboard pasteboardWithName:NSFindPboard]; 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [findPasteboard declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:owner]; 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [findPasteboard setString:string forType:NSStringPboardType]; 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [findPasteboard changeCount]; 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_web_writeFileWrapperAsRTFDAttachment:(NSFileWrapper *)wrapper 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSTextAttachment *attachment = [[NSTextAttachment alloc] initWithFileWrapper:wrapper]; 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSAttributedString *string = [NSAttributedString attributedStringWithAttachment:attachment]; 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [attachment release]; 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSData *RTFDData = [string RTFDFromRange:NSMakeRange(0, [string length]) documentAttributes:nil]; 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self setData:RTFDData forType:NSRTFDPboardType]; 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_web_writePromisedRTFDFromArchive:(WebArchive*)archive containsImage:(BOOL)containsImage 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(archive); 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This image data is either the only subresource of an archive (HTML image case) 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // or the main resource (standalone image case). 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSArray *subresources = [archive subresources]; 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebResource *resource = [archive mainResource]; 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (containsImage && [subresources count] > 0 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project && MIMETypeRegistry::isSupportedImageResourceMIMEType([[subresources objectAtIndex:0] MIMEType])) 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project resource = (WebResource *)[subresources objectAtIndex:0]; 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(resource != nil); 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(!containsImage || MIMETypeRegistry::isSupportedImageResourceMIMEType([resource MIMEType])); 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!containsImage || MIMETypeRegistry::isSupportedImageResourceMIMEType([resource MIMEType])) 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self _web_writeFileWrapperAsRTFDAttachment:[resource _fileWrapperRepresentation]]; 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochstatic CachedImage* imageFromElement(DOMElement *domElement) 2170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch{ 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Element* element = core(domElement); 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!element) 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RenderObject* renderer = element->renderer(); 2230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch RenderImage* imageRenderer = toRenderImage(renderer); 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!imageRenderer->cachedImage() || imageRenderer->cachedImage()->errorOccurred()) 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return imageRenderer->cachedImage(); 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_web_writeImage:(NSImage *)image 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project element:(DOMElement *)element 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project URL:(NSURL *)URL 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project title:(NSString *)title 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project archive:(WebArchive *)archive 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project types:(NSArray *)types 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project source:(WebHTMLView *)source 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(image || element); 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(URL); 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self _web_writeURL:URL andTitle:title types:types]; 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([types containsObject:NSTIFFPboardType]) { 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (image) 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self setData:[image TIFFRepresentation] forType:NSTIFFPboardType]; 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (source && element) 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [source setPromisedDragTIFFDataSource:imageFromElement(element)]; 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else if (element) 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self setData:[element _imageTIFFRepresentation] forType:NSTIFFPboardType]; 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (archive) 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([types containsObject:WebArchivePboardType]) 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self setData:[archive data] forType:WebArchivePboardType]; 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else { 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // We should not have declared types that we aren't going to write (4031826). 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(![types containsObject:NSRTFDPboardType]); 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(![types containsObject:WebArchivePboardType]); 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)_web_declareAndWriteDragImageForElement:(DOMElement *)element 2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project URL:(NSURL *)URL 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project title:(NSString *)title 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project archive:(WebArchive *)archive 2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project source:(WebHTMLView *)source 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(self == [NSPasteboard pasteboardWithName:NSDragPboard]); 2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 269635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project NSString *extension = @""; 270635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (RenderObject* renderer = core(element)->renderer()) { 271635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (renderer->isImage()) { 2720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if (CachedImage* image = toRenderImage(renderer)->cachedImage()) { 273635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project extension = image->image()->filenameExtension(); 274635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (![extension length]) 275635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return 0; 276635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 277635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 278635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 279635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSMutableArray *types = [[NSMutableArray alloc] initWithObjects:NSFilesPromisePboardType, nil]; 2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [types addObjectsFromArray:[NSPasteboard _web_writableTypesForImageIncludingArchive:(archive != nil)]]; 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self declareTypes:types owner:source]; 2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self _web_writeImage:nil element:element URL:URL title:title archive:archive types:types source:source]; 2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [types release]; 2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSArray *extensions = [[NSArray alloc] initWithObjects:extension, nil]; 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self setPropertyList:extensions forType:NSFilesPromisePboardType]; 2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [extensions release]; 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return source; 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 294