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