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>
6321939df44de1705786c545cd1bf519d47250322dBen Murdoch#import <wtf/Threading.h>
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WebCore;
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface WebDataSourcePrivate : NSObject {
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@public
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebDocumentLoaderMac* loader;
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    id <WebDocumentRepresentation> representation;
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    BOOL representationFinishedLoading;
74692e5dbf12901edacf14812a6fae25462920af42Steve Block    BOOL includedInWebKitStatistics;
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebDataSourcePrivate
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)initialize
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
82635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    JSC::initializeThreading();
8321939df44de1705786c545cd1bf519d47250322dBen Murdoch    WTF::initializeMainThreadToProcessMainThread();
84635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifndef BUILDING_ON_TIGER
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCoreObjCFinalizeOnMainThread(self);
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
87635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)dealloc
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (WebCoreObjCScheduleDeallocateOnMainThread([WebDataSourcePrivate class], self))
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
94563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(loader);
95563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (loader) {
96563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        ASSERT(!loader->isLoading());
97563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        loader->detachDataSource();
98563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        loader->deref();
99563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [representation release];
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [super dealloc];
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)finalize
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT_MAIN_THREAD();
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
110563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    ASSERT(loader);
111563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    if (loader) {
112563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        ASSERT(!loader->isLoading());
113563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        loader->detachDataSource();
114563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        loader->deref();
115563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [super finalize];
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface WebDataSource (WebFileInternal)
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebDataSource (WebFileInternal)
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_setRepresentation:(id<WebDocumentRepresentation>)representation
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [_private->representation release];
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->representation = [representation retain];
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->representationFinishedLoading = NO;
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic inline void addTypesFromClass(NSMutableDictionary *allTypes, Class objCClass, NSArray *supportTypes)
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSEnumerator *enumerator = [supportTypes objectEnumerator];
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(enumerator != nil);
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *mime = nil;
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while ((mime = [enumerator nextObject]) != nil) {
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Don't clobber previously-registered classes.
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([allTypes objectForKey:mime] == nil)
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [allTypes setObject:objCClass forKey:mime];
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
146643ca7872b450ea4efacab6188849e5aac2ba161Steve Block+ (Class)_representationClassForMIMEType:(NSString *)MIMEType allowingPlugins:(BOOL)allowPlugins
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Class repClass;
149643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    return [WebView _viewClass:nil andRepresentationClass:&repClass forMIMEType:MIMEType allowingPlugins:allowPlugins] ? repClass : nil;
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebDataSource (WebPrivate)
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSError *)_mainDocumentError
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->loader->mainDocumentError();
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_addSubframeArchives:(NSArray *)subframeArchives
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: This SPI is poor, poor design.  Can we come up with another solution for those who need it?
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DocumentLoader* loader = [self _documentLoader];
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(loader);
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSEnumerator *enumerator = [subframeArchives objectEnumerator];
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebArchive *archive;
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while ((archive = [enumerator nextObject]) != nil)
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        loader->addAllArchiveResources([archive _coreLegacyWebArchive]);
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSFileWrapper *)_fileWrapperForURL:(NSURL *)URL
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if ([URL isFileURL]) {
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSString *path = [[URL path] stringByResolvingSymlinksInPath];
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [[[NSFileWrapper alloc] initWithPath:path] autorelease];
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebResource *resource = [self subresourceForURL:URL];
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (resource)
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return [resource _fileWrapperRepresentation];
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSCachedURLResponse *cachedResponse = [[self _webView] _cachedResponseForURL:URL];
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (cachedResponse) {
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSFileWrapper *wrapper = [[[NSFileWrapper alloc] initRegularFileWithContents:[cachedResponse data]] autorelease];
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [wrapper setPreferredFilename:[[cachedResponse response] suggestedFilename]];
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return wrapper;
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return nil;
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)_responseMIMEType
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return [[self response] MIMEType];
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_transferApplicationCache:(NSString*)destinationBundleIdentifier
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
200d0825bca7fe65beaee391d30da42e937db621564Steve Block#if ENABLE(OFFLINE_WEB_APPLICATIONS)
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DocumentLoader* loader = [self _documentLoader];
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!loader)
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NO;
2050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *cacheDir = [NSString _webkit_localCacheDirectoryWithBundleIdentifier:destinationBundleIdentifier];
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    return ApplicationCacheStorage::storeCopyOfCache(cacheDir, loader->applicationCacheHost());
209d0825bca7fe65beaee391d30da42e937db621564Steve Block#else
210d0825bca7fe65beaee391d30da42e937db621564Steve Block    return NO;
211d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
214967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (void)_setDeferMainResourceDataLoad:(BOOL)flag
215967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch{
216967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    DocumentLoader* loader = [self _documentLoader];
217967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
218967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    if (!loader)
219967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch        return;
220967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
221967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch    loader->setDeferMainResourceDataLoad(flag);
222967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch}
223967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebDataSource (WebInternal)
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_finishedLoading
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->representationFinishedLoading = YES;
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[self representation] finishedLoadingWithDataSource:self];
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_receivedData:(NSData *)data
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // protect self temporarily, as the bridge receivedData call could remove our last ref
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RetainPtr<WebDataSource*> protect(self);
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [[self representation] receivedData:data withDataSource:self];
2400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
2410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    if ([[self _webView] _usesDocumentViews])
2420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        [[[[self webFrame] frameView] documentView] dataSourceUpdated:self];
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_setMainDocumentError:(NSError *)error
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->representationFinishedLoading) {
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _private->representationFinishedLoading = YES;
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[self representation] receivedError:error withDataSource:self];
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_revertToProvisionalState
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self _setRepresentation:nil];
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (NSMutableDictionary *)_repTypesAllowImageTypeOmission:(BOOL)allowImageTypeOmission
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static NSMutableDictionary *repTypes = nil;
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static BOOL addedImageTypes = NO;
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!repTypes) {
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        repTypes = [[NSMutableDictionary alloc] init];
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addTypesFromClass(repTypes, [WebHTMLRepresentation class], [WebHTMLRepresentation supportedNonImageMIMETypes]);
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // Since this is a "secret default" we don't both registering it.
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        BOOL omitPDFSupport = [[NSUserDefaults standardUserDefaults] boolForKey:@"WebKitOmitPDFSupport"];
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!omitPDFSupport)
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            addTypesFromClass(repTypes, [WebPDFRepresentation class], [WebPDFRepresentation supportedMIMETypes]);
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!addedImageTypes && !allowImageTypeOmission) {
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addTypesFromClass(repTypes, [WebHTMLRepresentation class], [WebHTMLRepresentation supportedImageMIMETypes]);
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        addedImageTypes = YES;
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return repTypes;
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_replaceSelectionWithArchive:(WebArchive *)archive selectReplacement:(BOOL)selectReplacement
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DOMDocumentFragment *fragment = [self _documentFragmentWithArchive:archive];
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (fragment)
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [[self webFrame] _replaceSelectionWithFragment:fragment selectReplacement:selectReplacement smartReplace:NO matchStyle:NO];
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The 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.
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (DOMDocumentFragment *)_documentFragmentWithArchive:(WebArchive *)archive
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(archive);
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebResource *mainResource = [archive mainResource];
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (mainResource) {
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        NSString *MIMEType = [mainResource MIMEType];
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([WebView canShowMIMETypeAsHTML:MIMEType]) {
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            NSString *markupString = [[NSString alloc] initWithData:[mainResource data] encoding:NSUTF8StringEncoding];
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            // FIXME: seems poor form to do this as a side effect of getting a document fragment
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            if (DocumentLoader* loader = [self _documentLoader])
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                loader->addAllArchiveResources([archive _coreLegacyWebArchive]);
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            DOMDocumentFragment *fragment = [[self webFrame] _documentFragmentWithMarkupString:markupString baseURLString:[[mainResource URL] _web_originalDataAsString]];
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            [markupString release];
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return fragment;
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        } else if (MIMETypeRegistry::isSupportedImageMIMEType(MIMEType)) {
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return [self _documentFragmentWithImageResource:mainResource];
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return nil;
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (DOMDocumentFragment *)_documentFragmentWithImageResource:(WebResource *)resource
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DOMElement *imageElement = [self _imageElementWithImageResource:resource];
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!imageElement)
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DOMDocumentFragment *fragment = [[[self webFrame] DOMDocument] createDocumentFragment];
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [fragment appendChild:imageElement];
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return fragment;
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (DOMElement *)_imageElementWithImageResource:(WebResource *)resource
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!resource)
3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [self addSubresource:resource];
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DOMElement *imageElement = [[[self webFrame] DOMDocument] createElement:@"img"];
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: calling _web_originalDataAsString on a file URL returns an absolute path. Workaround this.
3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSURL *URL = [resource URL];
3338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [imageElement setAttribute:@"src" value:[URL isFileURL] ? [URL absoluteString] : [URL _web_originalDataAsString]];
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return imageElement;
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// May return nil if not initialized with a URL.
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSURL *)_URL
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const KURL& url = _private->loader->url();
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (url.isEmpty())
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return url;
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebView *)_webView
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[self webFrame] webView];
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_isDocumentHTML
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *MIMEType = [self _responseMIMEType];
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [WebView canShowMIMETypeAsHTML:MIMEType];
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch- (void)_makeRepresentation
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
360643ca7872b450ea4efacab6188849e5aac2ba161Steve Block    Class repClass = [[self class] _representationClassForMIMEType:[self _responseMIMEType] allowingPlugins:[[[self _webView] preferences] arePlugInsEnabled]];
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Check if the data source was already bound?
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (![[self representation] isKindOfClass:repClass]) {
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        id newRep = repClass != nil ? [[repClass alloc] init] : nil;
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self _setRepresentation:(id <WebDocumentRepresentation>)newRep];
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [newRep release];
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [_private->representation setDataSource:self];
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (DocumentLoader*)_documentLoader
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->loader;
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)_initWithDocumentLoader:(PassRefPtr<WebDocumentLoaderMac>)loader
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    self = [super init];
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!self)
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private = [[WebDataSourcePrivate alloc] init];
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->loader = loader.releaseRef();
3868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG(Loading, "creating datasource for %@", static_cast<NSURL *>(_private->loader->request().url()));
388692e5dbf12901edacf14812a6fae25462920af42Steve Block
389692e5dbf12901edacf14812a6fae25462920af42Steve Block    if ((_private->includedInWebKitStatistics = [[self webFrame] _isIncludedInWebKitStatistics]))
390692e5dbf12901edacf14812a6fae25462920af42Steve Block        ++WebDataSourceCount;
391692e5dbf12901edacf14812a6fae25462920af42Steve Block
392692e5dbf12901edacf14812a6fae25462920af42Steve Block    return self;
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebDataSource
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithRequest:(NSURLRequest *)request
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self _initWithDocumentLoader:WebDocumentLoaderMac::create(request, SubstituteData())];
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)dealloc
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
406692e5dbf12901edacf14812a6fae25462920af42Steve Block    if (_private && _private->includedInWebKitStatistics)
407692e5dbf12901edacf14812a6fae25462920af42Steve Block        --WebDataSourceCount;
408692e5dbf12901edacf14812a6fae25462920af42Steve Block
4098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [_private release];
410692e5dbf12901edacf14812a6fae25462920af42Steve Block
4118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [super dealloc];
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)finalize
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
416692e5dbf12901edacf14812a6fae25462920af42Steve Block    if (_private && _private->includedInWebKitStatistics)
417692e5dbf12901edacf14812a6fae25462920af42Steve Block        --WebDataSourceCount;
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [super finalize];
4208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSData *)data
4238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<SharedBuffer> mainResourceData = _private->loader->mainResourceData();
4258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!mainResourceData)
4268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
4278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [mainResourceData->createNSData() autorelease];
4288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id <WebDocumentRepresentation>)representation
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->representation;
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebFrame *)webFrame
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FrameLoader* frameLoader = _private->loader->frameLoader();
4388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!frameLoader)
4398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
4408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return static_cast<WebFrameLoaderClient*>(frameLoader->client())->webFrame();
4418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSURLRequest *)initialRequest
4448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->loader->originalRequest().nsURLRequest();
4468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSMutableURLRequest *)request
4498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    FrameLoader* frameLoader = _private->loader->frameLoader();
4518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!frameLoader || !frameLoader->frameHasLoaded())
4528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
4538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: this cast is dubious
4558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return (NSMutableURLRequest *)_private->loader->request().nsURLRequest();
4568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSURLResponse *)response
4598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->loader->response().nsURLResponse();
4618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)textEncodingName
4648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *textEncodingName = _private->loader->overrideEncoding();
4668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!textEncodingName)
4678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        textEncodingName = [[self response] textEncodingName];
4688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return textEncodingName;
4698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)isLoading
4728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->loader->isLoadingInAPISense();
4748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// Returns nil or the page title.
4778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)pageTitle
4788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[self representation] title];
4808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSURL *)unreachableURL
4838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    const KURL& unreachableURL = _private->loader->unreachableURL();
4858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (unreachableURL.isEmpty())
4868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
4878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return unreachableURL;
4888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebArchive *)webArchive
4918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // it makes no sense to grab a WebArchive from an uncommitted document.
4938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->loader->isCommitted())
4948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
4958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[[WebArchive alloc] _initWithCoreLegacyWebArchive:LegacyWebArchive::create(core([self webFrame]))] autorelease];
4978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebResource *)mainResource
5008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<ArchiveResource> coreResource = _private->loader->mainResource();
5028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[[WebResource alloc] _initWithCoreResource:coreResource.release()] autorelease];
5038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSArray *)subresources
5068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Vector<PassRefPtr<ArchiveResource> > coreSubresources;
5088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->loader->getSubresources(coreSubresources);
5098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSMutableArray *subresources = [[NSMutableArray alloc] initWithCapacity:coreSubresources.size()];
511563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    for (unsigned i = 0; i < coreSubresources.size(); ++i) {
512563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        WebResource *resource = [[WebResource alloc] _initWithCoreResource:coreSubresources[i]];
513563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        if (resource) {
514563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            [subresources addObject:resource];
515563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark            [resource release];
516563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark        }
517563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    }
518563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
5198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [subresources autorelease];
5208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebResource *)subresourceForURL:(NSURL *)URL
5238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<ArchiveResource> subresource = _private->loader->subresource(URL);
5258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return subresource ? [[[WebResource alloc] _initWithCoreResource:subresource.get()] autorelease] : nil;
5278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)addSubresource:(WebResource *)subresource
5308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
5318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->loader->addArchiveResource([subresource _coreResource]);
5328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
5338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
535