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