WebDataSource.mm revision 692e5dbf12901edacf14812a6fae25462920af42
18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2005, 2006, 2007, 2008 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 "WebDataSource.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebArchive.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebArchiveInternal.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebDataSourceInternal.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebDocument.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebDocumentLoaderMac.h" 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebFrameInternal.h" 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebFrameLoadDelegate.h" 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebFrameLoaderClient.h" 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebHTMLRepresentation.h" 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebKitErrorsPrivate.h" 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebKitLogging.h" 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebKitStatisticsPrivate.h" 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebKitNSStringExtras.h" 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNSURLExtras.h" 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNSURLRequestExtras.h" 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebPDFRepresentation.h" 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebResourceInternal.h" 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebResourceLoadDelegate.h" 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebViewInternal.h" 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/ApplicationCacheStorage.h> 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/FrameLoader.h> 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/KURL.h> 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/LegacyWebArchive.h> 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/MIMETypeRegistry.h> 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/ResourceRequest.h> 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/SharedBuffer.h> 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/WebCoreObjCExtras.h> 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/WebCoreURLResponse.h> 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKit/DOMHTML.h> 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKit/DOMPrivate.h> 61635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import <runtime/InitializeThreading.h> 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <wtf/Assertions.h> 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WebCore; 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface WebDataSourcePrivate : NSObject { 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@public 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebDocumentLoaderMac* loader; 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project id <WebDocumentRepresentation> representation; 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL representationFinishedLoading; 73692e5dbf12901edacf14812a6fae25462920af42Steve Block BOOL includedInWebKitStatistics; 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebDataSourcePrivate 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)initialize 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 81635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project JSC::initializeThreading(); 82635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifndef BUILDING_ON_TIGER 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebCoreObjCFinalizeOnMainThread(self); 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 85635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)dealloc 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (WebCoreObjCScheduleDeallocateOnMainThread([WebDataSourcePrivate class], self)) 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 92563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark ASSERT(loader); 93563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (loader) { 94563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark ASSERT(!loader->isLoading()); 95563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark loader->detachDataSource(); 96563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark loader->deref(); 97563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [representation release]; 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [super dealloc]; 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)finalize 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT_MAIN_THREAD(); 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 108563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark ASSERT(loader); 109563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (loader) { 110563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark ASSERT(!loader->isLoading()); 111563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark loader->detachDataSource(); 112563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark loader->deref(); 113563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [super finalize]; 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface WebDataSource (WebFileInternal) 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebDataSource (WebFileInternal) 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_setRepresentation:(id<WebDocumentRepresentation>)representation 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [_private->representation release]; 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _private->representation = [representation retain]; 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _private->representationFinishedLoading = NO; 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline void addTypesFromClass(NSMutableDictionary *allTypes, Class objCClass, NSArray *supportTypes) 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSEnumerator *enumerator = [supportTypes objectEnumerator]; 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(enumerator != nil); 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSString *mime = nil; 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while ((mime = [enumerator nextObject]) != nil) { 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Don't clobber previously-registered classes. 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([allTypes objectForKey:mime] == nil) 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [allTypes setObject:objCClass forKey:mime]; 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 144643ca7872b450ea4efacab6188849e5aac2ba161Steve Block+ (Class)_representationClassForMIMEType:(NSString *)MIMEType allowingPlugins:(BOOL)allowPlugins 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Class repClass; 147643ca7872b450ea4efacab6188849e5aac2ba161Steve Block return [WebView _viewClass:nil andRepresentationClass:&repClass forMIMEType:MIMEType allowingPlugins:allowPlugins] ? repClass : nil; 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebDataSource (WebPrivate) 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSError *)_mainDocumentError 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return _private->loader->mainDocumentError(); 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_addSubframeArchives:(NSArray *)subframeArchives 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: This SPI is poor, poor design. Can we come up with another solution for those who need it? 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DocumentLoader* loader = [self _documentLoader]; 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(loader); 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSEnumerator *enumerator = [subframeArchives objectEnumerator]; 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebArchive *archive; 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project while ((archive = [enumerator nextObject]) != nil) 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->addAllArchiveResources([archive _coreLegacyWebArchive]); 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSFileWrapper *)_fileWrapperForURL:(NSURL *)URL 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([URL isFileURL]) { 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSString *path = [[URL path] stringByResolvingSymlinksInPath]; 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [[[NSFileWrapper alloc] initWithPath:path] autorelease]; 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebResource *resource = [self subresourceForURL:URL]; 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (resource) 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [resource _fileWrapperRepresentation]; 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSCachedURLResponse *cachedResponse = [[self _webView] _cachedResponseForURL:URL]; 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (cachedResponse) { 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSFileWrapper *wrapper = [[[NSFileWrapper alloc] initRegularFileWithContents:[cachedResponse data]] autorelease]; 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [wrapper setPreferredFilename:[[cachedResponse response] suggestedFilename]]; 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return wrapper; 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)_responseMIMEType 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return [[self response] MIMEType]; 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_transferApplicationCache:(NSString*)destinationBundleIdentifier 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 198d0825bca7fe65beaee391d30da42e937db621564Steve Block#if ENABLE(OFFLINE_WEB_APPLICATIONS) 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DocumentLoader* loader = [self _documentLoader]; 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!loader) 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return NO; 2030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSString *cacheDir = [NSString _webkit_localCacheDirectoryWithBundleIdentifier:destinationBundleIdentifier]; 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return ApplicationCacheStorage::storeCopyOfCache(cacheDir, loader->applicationCacheHost()); 207d0825bca7fe65beaee391d30da42e937db621564Steve Block#else 208d0825bca7fe65beaee391d30da42e937db621564Steve Block return NO; 209d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebDataSource (WebInternal) 2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_finishedLoading 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _private->representationFinishedLoading = YES; 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [[self representation] finishedLoadingWithDataSource:self]; 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_receivedData:(NSData *)data 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // protect self temporarily, as the bridge receivedData call could remove our last ref 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RetainPtr<WebDataSource*> protect(self); 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [[self representation] receivedData:data withDataSource:self]; 2280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 2290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch if ([[self _webView] _usesDocumentViews]) 2300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch [[[[self webFrame] frameView] documentView] dataSourceUpdated:self]; 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_setMainDocumentError:(NSError *)error 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!_private->representationFinishedLoading) { 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _private->representationFinishedLoading = YES; 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [[self representation] receivedError:error withDataSource:self]; 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_revertToProvisionalState 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self _setRepresentation:nil]; 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (NSMutableDictionary *)_repTypesAllowImageTypeOmission:(BOOL)allowImageTypeOmission 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static NSMutableDictionary *repTypes = nil; 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static BOOL addedImageTypes = NO; 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!repTypes) { 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project repTypes = [[NSMutableDictionary alloc] init]; 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addTypesFromClass(repTypes, [WebHTMLRepresentation class], [WebHTMLRepresentation supportedNonImageMIMETypes]); 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Since this is a "secret default" we don't both registering it. 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL omitPDFSupport = [[NSUserDefaults standardUserDefaults] boolForKey:@"WebKitOmitPDFSupport"]; 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!omitPDFSupport) 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addTypesFromClass(repTypes, [WebPDFRepresentation class], [WebPDFRepresentation supportedMIMETypes]); 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!addedImageTypes && !allowImageTypeOmission) { 2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addTypesFromClass(repTypes, [WebHTMLRepresentation class], [WebHTMLRepresentation supportedImageMIMETypes]); 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project addedImageTypes = YES; 2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return repTypes; 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_replaceSelectionWithArchive:(WebArchive *)archive selectReplacement:(BOOL)selectReplacement 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DOMDocumentFragment *fragment = [self _documentFragmentWithArchive:archive]; 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (fragment) 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [[self webFrame] _replaceSelectionWithFragment:fragment selectReplacement:selectReplacement smartReplace:NO matchStyle:NO]; 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// FIXME: There are few reasons why this method and many of its related methods can't be pushed entirely into WebCore in the future. 2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (DOMDocumentFragment *)_documentFragmentWithArchive:(WebArchive *)archive 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(archive); 2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebResource *mainResource = [archive mainResource]; 2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (mainResource) { 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSString *MIMEType = [mainResource MIMEType]; 2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([WebView canShowMIMETypeAsHTML:MIMEType]) { 2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSString *markupString = [[NSString alloc] initWithData:[mainResource data] encoding:NSUTF8StringEncoding]; 2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: seems poor form to do this as a side effect of getting a document fragment 2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (DocumentLoader* loader = [self _documentLoader]) 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project loader->addAllArchiveResources([archive _coreLegacyWebArchive]); 2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DOMDocumentFragment *fragment = [[self webFrame] _documentFragmentWithMarkupString:markupString baseURLString:[[mainResource URL] _web_originalDataAsString]]; 2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [markupString release]; 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return fragment; 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } else if (MIMETypeRegistry::isSupportedImageMIMEType(MIMEType)) { 2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [self _documentFragmentWithImageResource:mainResource]; 2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (DOMDocumentFragment *)_documentFragmentWithImageResource:(WebResource *)resource 3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DOMElement *imageElement = [self _imageElementWithImageResource:resource]; 3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!imageElement) 3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DOMDocumentFragment *fragment = [[[self webFrame] DOMDocument] createDocumentFragment]; 3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [fragment appendChild:imageElement]; 3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return fragment; 3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (DOMElement *)_imageElementWithImageResource:(WebResource *)resource 3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!resource) 3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self addSubresource:resource]; 3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project DOMElement *imageElement = [[[self webFrame] DOMDocument] createElement:@"img"]; 3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: calling _web_originalDataAsString on a file URL returns an absolute path. Workaround this. 3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSURL *URL = [resource URL]; 3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [imageElement setAttribute:@"src" value:[URL isFileURL] ? [URL absoluteString] : [URL _web_originalDataAsString]]; 3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return imageElement; 3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// May return nil if not initialized with a URL. 3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSURL *)_URL 3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const KURL& url = _private->loader->url(); 3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (url.isEmpty()) 3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return url; 3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebView *)_webView 3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [[self webFrame] webView]; 3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_isDocumentHTML 3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSString *MIMEType = [self _responseMIMEType]; 3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [WebView canShowMIMETypeAsHTML:MIMEType]; 3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)_makeRepresentation 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 348643ca7872b450ea4efacab6188849e5aac2ba161Steve Block Class repClass = [[self class] _representationClassForMIMEType:[self _responseMIMEType] allowingPlugins:[[[self _webView] preferences] arePlugInsEnabled]]; 3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // Check if the data source was already bound? 3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (![[self representation] isKindOfClass:repClass]) { 3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project id newRep = repClass != nil ? [[repClass alloc] init] : nil; 3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [self _setRepresentation:(id <WebDocumentRepresentation>)newRep]; 3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [newRep release]; 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [_private->representation setDataSource:self]; 3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (DocumentLoader*)_documentLoader 3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return _private->loader; 3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)_initWithDocumentLoader:(PassRefPtr<WebDocumentLoaderMac>)loader 3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project self = [super init]; 3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!self) 3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _private = [[WebDataSourcePrivate alloc] init]; 3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _private->loader = loader.releaseRef(); 3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG(Loading, "creating datasource for %@", static_cast<NSURL *>(_private->loader->request().url())); 376692e5dbf12901edacf14812a6fae25462920af42Steve Block 377692e5dbf12901edacf14812a6fae25462920af42Steve Block if ((_private->includedInWebKitStatistics = [[self webFrame] _isIncludedInWebKitStatistics])) 378692e5dbf12901edacf14812a6fae25462920af42Steve Block ++WebDataSourceCount; 379692e5dbf12901edacf14812a6fae25462920af42Steve Block 380692e5dbf12901edacf14812a6fae25462920af42Steve Block return self; 3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebDataSource 3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithRequest:(NSURLRequest *)request 3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [self _initWithDocumentLoader:WebDocumentLoaderMac::create(request, SubstituteData())]; 3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)dealloc 3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 394692e5dbf12901edacf14812a6fae25462920af42Steve Block if (_private && _private->includedInWebKitStatistics) 395692e5dbf12901edacf14812a6fae25462920af42Steve Block --WebDataSourceCount; 396692e5dbf12901edacf14812a6fae25462920af42Steve Block 3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [_private release]; 398692e5dbf12901edacf14812a6fae25462920af42Steve Block 3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [super dealloc]; 4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)finalize 4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 404692e5dbf12901edacf14812a6fae25462920af42Steve Block if (_private && _private->includedInWebKitStatistics) 405692e5dbf12901edacf14812a6fae25462920af42Steve Block --WebDataSourceCount; 4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [super finalize]; 4088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSData *)data 4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<SharedBuffer> mainResourceData = _private->loader->mainResourceData(); 4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!mainResourceData) 4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [mainResourceData->createNSData() autorelease]; 4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id <WebDocumentRepresentation>)representation 4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return _private->representation; 4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebFrame *)webFrame 4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FrameLoader* frameLoader = _private->loader->frameLoader(); 4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!frameLoader) 4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return static_cast<WebFrameLoaderClient*>(frameLoader->client())->webFrame(); 4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSURLRequest *)initialRequest 4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return _private->loader->originalRequest().nsURLRequest(); 4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSMutableURLRequest *)request 4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project FrameLoader* frameLoader = _private->loader->frameLoader(); 4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!frameLoader || !frameLoader->frameHasLoaded()) 4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: this cast is dubious 4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return (NSMutableURLRequest *)_private->loader->request().nsURLRequest(); 4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSURLResponse *)response 4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return _private->loader->response().nsURLResponse(); 4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)textEncodingName 4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSString *textEncodingName = _private->loader->overrideEncoding(); 4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!textEncodingName) 4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project textEncodingName = [[self response] textEncodingName]; 4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return textEncodingName; 4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)isLoading 4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return _private->loader->isLoadingInAPISense(); 4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Returns nil or the page title. 4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)pageTitle 4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [[self representation] title]; 4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSURL *)unreachableURL 4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project const KURL& unreachableURL = _private->loader->unreachableURL(); 4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (unreachableURL.isEmpty()) 4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return unreachableURL; 4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebArchive *)webArchive 4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // it makes no sense to grab a WebArchive from an uncommitted document. 4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!_private->loader->isCommitted()) 4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [[[WebArchive alloc] _initWithCoreLegacyWebArchive:LegacyWebArchive::create(core([self webFrame]))] autorelease]; 4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebResource *)mainResource 4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<ArchiveResource> coreResource = _private->loader->mainResource(); 4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [[[WebResource alloc] _initWithCoreResource:coreResource.release()] autorelease]; 4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSArray *)subresources 4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Vector<PassRefPtr<ArchiveResource> > coreSubresources; 4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _private->loader->getSubresources(coreSubresources); 4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSMutableArray *subresources = [[NSMutableArray alloc] initWithCapacity:coreSubresources.size()]; 499563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark for (unsigned i = 0; i < coreSubresources.size(); ++i) { 500563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark WebResource *resource = [[WebResource alloc] _initWithCoreResource:coreSubresources[i]]; 501563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark if (resource) { 502563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark [subresources addObject:resource]; 503563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark [resource release]; 504563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 505563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark } 506563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark 5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [subresources autorelease]; 5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebResource *)subresourceForURL:(NSURL *)URL 5118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project RefPtr<ArchiveResource> subresource = _private->loader->subresource(URL); 5138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return subresource ? [[[WebResource alloc] _initWithCoreResource:subresource.get()] autorelease] : nil; 5158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)addSubresource:(WebResource *)subresource 5188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _private->loader->addArchiveResource([subresource _coreResource]); 5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 523