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
29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import "WebResourceInternal.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebFrameInternal.h"
32635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import "WebKitLogging.h"
33635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import "WebKitVersionChecks.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNSDictionaryExtras.h"
35635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import "WebNSObjectExtras.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNSURLExtras.h"
37635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import <JavaScriptCore/InitializeThreading.h>
38635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import <JavaScriptCore/PassRefPtr.h>
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/ArchiveResource.h>
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/LegacyWebArchive.h>
410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import <WebCore/RuntimeApplicationChecks.h>
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/TextEncoding.h>
43635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import <WebCore/ThreadCheck.h>
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/WebCoreObjCExtras.h>
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/WebCoreURLResponse.h>
4621939df44de1705786c545cd1bf519d47250322dBen Murdoch#import <wtf/Threading.h>
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WebCore;
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NSString * const WebResourceDataKey =              @"WebResourceData";
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NSString * const WebResourceFrameNameKey =         @"WebResourceFrameName";
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NSString * const WebResourceMIMETypeKey =          @"WebResourceMIMEType";
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NSString * const WebResourceURLKey =               @"WebResourceURL";
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NSString * const WebResourceTextEncodingNameKey =  @"WebResourceTextEncodingName";
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NSString * const WebResourceResponseKey =          @"WebResourceResponse";
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
57635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project@interface WebResourcePrivate : NSObject {
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@public
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ArchiveResource* coreResource;
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithCoreResource:(PassRefPtr<ArchiveResource>)coreResource;
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebResourcePrivate
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)initialize
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
68635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    JSC::initializeThreading();
6921939df44de1705786c545cd1bf519d47250322dBen Murdoch    WTF::initializeMainThreadToProcessMainThread();
70635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifndef BUILDING_ON_TIGER
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCoreObjCFinalizeOnMainThread(self);
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
73635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)init
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [super init];
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithCoreResource:(PassRefPtr<ArchiveResource>)passedResource
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    self = [super init];
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!self)
84635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return nil;
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Acquire the PassRefPtr<>'s ref as our own manual ref
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    coreResource = passedResource.releaseRef();
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return self;
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)dealloc
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (WebCoreObjCScheduleDeallocateOnMainThread([WebResourcePrivate class], self))
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (coreResource)
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        coreResource->deref();
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [super dealloc];
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)finalize
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (coreResource)
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        coreResource->deref();
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [super finalize];
1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebResource
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)init
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    self = [super init];
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!self)
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private = [[WebResourcePrivate alloc] init];
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return self;
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithData:(NSData *)data URL:(NSURL *)URL MIMEType:(NSString *)MIMEType textEncodingName:(NSString *)textEncodingName frameName:(NSString *)frameName
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self _initWithData:data URL:URL MIMEType:MIMEType textEncodingName:textEncodingName frameName:frameName response:nil copyData:YES];
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithCoder:(NSCoder *)decoder
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
127563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebCoreThreadViolationCheckRoundTwo();
128635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    self = [super init];
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!self)
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSData *data = nil;
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSURL *url = nil;
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *mimeType = nil, *textEncoding = nil, *frameName = nil;
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSURLResponse *response = nil;
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    @try {
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        id object = [decoder decodeObjectForKey:WebResourceDataKey];
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([object isKindOfClass:[NSData class]])
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            data = object;
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        object = [decoder decodeObjectForKey:WebResourceURLKey];
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([object isKindOfClass:[NSURL class]])
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            url = object;
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        object = [decoder decodeObjectForKey:WebResourceMIMETypeKey];
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([object isKindOfClass:[NSString class]])
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            mimeType = object;
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        object = [decoder decodeObjectForKey:WebResourceTextEncodingNameKey];
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([object isKindOfClass:[NSString class]])
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            textEncoding = object;
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        object = [decoder decodeObjectForKey:WebResourceFrameNameKey];
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([object isKindOfClass:[NSString class]])
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            frameName = object;
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        object = [decoder decodeObjectForKey:WebResourceResponseKey];
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([object isKindOfClass:[NSURLResponse class]])
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            response = object;
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } @catch(id) {
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self release];
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private = [[WebResourcePrivate alloc] initWithCoreResource:ArchiveResource::create(SharedBuffer::wrapNSData(data), url, mimeType, textEncoding, frameName, response)];
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return self;
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)encodeWithCoder:(NSCoder *)encoder
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ArchiveResource *resource = _private->coreResource;
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSData *data = nil;
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSURL *url = nil;
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSString *mimeType = nil, *textEncoding = nil, *frameName = nil;
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSURLResponse *response = nil;
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (resource) {
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (resource->data())
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            data = [resource->data()->createNSData() autorelease];
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        url = resource->url();
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        mimeType = resource->mimeType();
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        textEncoding = resource->textEncoding();
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        frameName = resource->frameName();
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        response = resource->response().nsURLResponse();
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [encoder encodeObject:data forKey:WebResourceDataKey];
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [encoder encodeObject:url forKey:WebResourceURLKey];
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [encoder encodeObject:mimeType forKey:WebResourceMIMETypeKey];
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [encoder encodeObject:textEncoding forKey:WebResourceTextEncodingNameKey];
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [encoder encodeObject:frameName forKey:WebResourceFrameNameKey];
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [encoder encodeObject:response forKey:WebResourceResponseKey];
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)dealloc
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [_private release];
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [super dealloc];
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)copyWithZone:(NSZone *)zone
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self retain];
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSData *)data
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
206635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifdef MAIL_THREAD_WORKAROUND
207635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (needMailThreadWorkaround())
208635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return [[self _webkit_invokeOnMainThread] data];
209635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
210635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
211563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebCoreThreadViolationCheckRoundTwo();
212635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
213635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!_private->coreResource)
214635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return nil;
215635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!_private->coreResource->data())
216635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return nil;
217635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return [_private->coreResource->data()->createNSData() autorelease];
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSURL *)URL
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
222635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifdef MAIL_THREAD_WORKAROUND
223635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (needMailThreadWorkaround())
224635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return [[self _webkit_invokeOnMainThread] URL];
225635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
226635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
227563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebCoreThreadViolationCheckRoundTwo();
228635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
229635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!_private->coreResource)
230635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return nil;
231635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    NSURL *url = _private->coreResource->url();
232635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return url;
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)MIMEType
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
237635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifdef MAIL_THREAD_WORKAROUND
238635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (needMailThreadWorkaround())
239635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return [[self _webkit_invokeOnMainThread] MIMEType];
240635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
241635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
242563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebCoreThreadViolationCheckRoundTwo();
243635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
244635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!_private->coreResource)
245635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return nil;
246635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    NSString *mimeType = _private->coreResource->mimeType();
247635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return mimeType;
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)textEncodingName
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
252635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifdef MAIL_THREAD_WORKAROUND
253635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (needMailThreadWorkaround())
254635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return [[self _webkit_invokeOnMainThread] textEncodingName];
255635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
256635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
257563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebCoreThreadViolationCheckRoundTwo();
258635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
259635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!_private->coreResource)
260635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return nil;
261635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    NSString *textEncodingName = _private->coreResource->textEncoding();
262635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return textEncodingName;
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)frameName
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
267635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifdef MAIL_THREAD_WORKAROUND
268635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (needMailThreadWorkaround())
269635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return [[self _webkit_invokeOnMainThread] frameName];
270635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
271635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
272563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebCoreThreadViolationCheckRoundTwo();
273635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
274635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!_private->coreResource)
275635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return nil;
276635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    NSString *frameName = _private->coreResource->frameName();
277635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return frameName;
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
28006ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen- (NSString *)description
2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [NSString stringWithFormat:@"<%@ %@>", [self className], [self URL]];
2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebResource (WebResourceInternal)
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)_initWithCoreResource:(PassRefPtr<ArchiveResource>)coreResource
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    self = [super init];
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!self)
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(coreResource);
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // WebResources should not be init'ed with nil data, and doing so breaks certain uses of NSHTMLReader
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // See <rdar://problem/5820157> for more info
2998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!coreResource->data()) {
3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self release];
3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private = [[WebResourcePrivate alloc] initWithCoreResource:coreResource];
3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return self;
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebCore::ArchiveResource *)_coreResource
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return _private->coreResource;
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebResource (WebResourcePrivate)
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// SPI for Mail (5066325)
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project// FIXME: This "ignoreWhenUnarchiving" concept is an ugly one - can we find a cleaner solution for those who need this SPI?
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)_ignoreWhenUnarchiving
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
322635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifdef MAIL_THREAD_WORKAROUND
323635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (needMailThreadWorkaround()) {
324635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        [[self _webkit_invokeOnMainThread] _ignoreWhenUnarchiving];
325635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
326635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
327635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
328635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
329563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebCoreThreadViolationCheckRoundTwo();
330635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
331635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!_private->coreResource)
332635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return;
333635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    _private->coreResource->ignoreWhenUnarchiving();
3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)_initWithData:(NSData *)data
3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                URL:(NSURL *)URL
3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           MIMEType:(NSString *)MIMEType
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project   textEncodingName:(NSString *)textEncodingName
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project          frameName:(NSString *)frameName
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           response:(NSURLResponse *)response
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project           copyData:(BOOL)copyData
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
344635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifdef MAIL_THREAD_WORKAROUND
345635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (needMailThreadWorkaround())
346635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return [[self _webkit_invokeOnMainThread] _initWithData:data URL:URL MIMEType:MIMEType textEncodingName:textEncodingName frameName:frameName response:response copyData:copyData];
347635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
348635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
349563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebCoreThreadViolationCheckRoundTwo();
350635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    self = [super init];
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!self)
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!data || !URL || !MIMEType) {
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self release];
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
359635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private = [[WebResourcePrivate alloc] initWithCoreResource:ArchiveResource::create(SharedBuffer::wrapNSData(copyData ? [[data copy] autorelease] : data), URL, MIMEType, textEncodingName, frameName, response)];
361635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return self;
3638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)_initWithData:(NSData *)data URL:(NSURL *)URL response:(NSURLResponse *)response
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Pass NO for copyData since the data doesn't need to be copied since we know that callers will no longer modify it.
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Copying it will also cause a performance regression.
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self _initWithData:data
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                           URL:URL
3710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                      MIMEType:[response MIMEType]
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project              textEncodingName:[response textEncodingName]
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                     frameName:nil
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                      response:response
375635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project                      copyData:NO];
376635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
377635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
378635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project- (NSString *)_suggestedFilename
379635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
380635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifdef MAIL_THREAD_WORKAROUND
381635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (needMailThreadWorkaround())
382635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return [[self _webkit_invokeOnMainThread] _suggestedFilename];
383635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
384635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
385563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebCoreThreadViolationCheckRoundTwo();
386635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
387635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!_private->coreResource)
388635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return nil;
389635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    NSString *suggestedFilename = _private->coreResource->response().suggestedFilename();
390635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return suggestedFilename;
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSFileWrapper *)_fileWrapperRepresentation
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
395635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    NSFileWrapper *wrapper = [[[NSFileWrapper alloc] initRegularFileWithContents:[self data]] autorelease];
396635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    NSString *filename = [self _suggestedFilename];
397635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!filename || ![filename length])
398635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        filename = [[self URL] _webkit_suggestedFilenameWithMIMEType:[self MIMEType]];
399635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    [wrapper setPreferredFilename:filename];
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return wrapper;
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSURLResponse *)_response
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
405635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifdef MAIL_THREAD_WORKAROUND
406635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (needMailThreadWorkaround())
407635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return [[self _webkit_invokeOnMainThread] _response];
408635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
409635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
410563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebCoreThreadViolationCheckRoundTwo();
411635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
4128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSURLResponse *response = nil;
4138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (_private->coreResource)
4148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        response = _private->coreResource->response().nsURLResponse();
4158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return response ? response : [[[NSURLResponse alloc] init] autorelease];
4168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)_stringValue
4198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
420635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifdef MAIL_THREAD_WORKAROUND
421635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (needMailThreadWorkaround())
422635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return [[self _webkit_invokeOnMainThread] _stringValue];
423635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
424635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
425563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebCoreThreadViolationCheckRoundTwo();
426635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
427635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    WebCore::TextEncoding encoding;
428635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (_private->coreResource)
429635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        encoding = _private->coreResource->textEncoding();
4308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!encoding.isValid())
4318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        encoding = WindowsLatin1Encoding();
4328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    SharedBuffer* coreData = _private->coreResource ? _private->coreResource->data() : 0;
4348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return encoding.decode(reinterpret_cast<const char*>(coreData ? coreData->data() : 0), coreData ? coreData->size() : 0);
4358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
438635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
439635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifdef MAIL_THREAD_WORKAROUND
440635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
441563af33bc48281d19dce701398dbb88cb54fd7ecCary Clarkstatic const double newMailBundleVersion = 1050.0;
442563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark
443635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project@implementation WebResource (WebMailThreadWorkaround)
444635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
445635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project+ (BOOL)_needMailThreadWorkaroundIfCalledOffMainThread
446635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{
4470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    static BOOL isOldMail = applicationIsAppleMail() && [[[NSBundle mainBundle] objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey] doubleValue] < newMailBundleVersion;
448635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    return isOldMail;
449635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
450635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
451635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project@end
452635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
453635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
454