18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
2635860845790a19bf50bbc51ba8fb66a96dde068The 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 "WebArchive.h"
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebArchiveInternal.h"
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebKitLogging.h"
33635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import "WebNSObjectExtras.h"
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebResourceInternal.h"
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebTypesInternal.h"
36635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import <JavaScriptCore/InitializeThreading.h>
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/ArchiveResource.h>
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/LegacyWebArchive.h>
39635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import <WebCore/ThreadCheck.h>
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/WebCoreObjCExtras.h>
4121939df44de1705786c545cd1bf519d47250322dBen Murdoch#import <wtf/Threading.h>
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WebCore;
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectNSString *WebArchivePboardType = @"Apple Web Archive pasteboard type";
468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NSString * const WebMainResourceKey = @"WebMainResource";
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NSString * const WebSubresourcesKey = @"WebSubresources";
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NSString * const WebSubframeArchivesKey = @"WebSubframeArchives";
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project@interface WebArchivePrivate : NSObject {
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@public
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebResource *cachedMainResource;
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSArray *cachedSubresources;
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSArray *cachedSubframeArchives;
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@private
57563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    RefPtr<LegacyWebArchive> coreArchive;
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithCoreArchive:(PassRefPtr<LegacyWebArchive>)coreArchive;
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (LegacyWebArchive*)coreArchive;
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setCoreArchive:(PassRefPtr<LegacyWebArchive>)newCoreArchive;
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebArchivePrivate
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (void)initialize
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
69635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    JSC::initializeThreading();
7021939df44de1705786c545cd1bf519d47250322dBen Murdoch    WTF::initializeMainThreadToProcessMainThread();
71635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifndef BUILDING_ON_TIGER
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebCoreObjCFinalizeOnMainThread(self);
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
74635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project}
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)init
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    self = [super init];
79635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!self)
80635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return nil;
81563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    coreArchive = LegacyWebArchive::create();
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return self;
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithCoreArchive:(PassRefPtr<LegacyWebArchive>)_coreArchive
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    self = [super init];
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!self || !_coreArchive) {
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self release];
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
92563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    coreArchive = _coreArchive;
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return self;
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (LegacyWebArchive*)coreArchive
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
98563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return coreArchive.get();
998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setCoreArchive:(PassRefPtr<LegacyWebArchive>)newCoreArchive
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(coreArchive);
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(newCoreArchive);
105563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    coreArchive = newCoreArchive;
1068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)dealloc
1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (WebCoreObjCScheduleDeallocateOnMainThread([WebArchivePrivate class], self))
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [cachedMainResource release];
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [cachedSubresources release];
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [cachedSubframeArchives release];
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [super dealloc];
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebArchive
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)init
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
126563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebCoreThreadViolationCheckRoundTwo();
127635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    self = [super init];
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!self)
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private = [[WebArchivePrivate alloc] init];
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return self;
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic BOOL isArrayOfClass(id object, Class elementClass)
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (![object isKindOfClass:[NSArray class]])
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return NO;
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSArray *array = (NSArray *)object;
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSUInteger count = [array count];
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (NSUInteger i = 0; i < count; ++i)
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (![[array objectAtIndex:i] isKindOfClass:elementClass])
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            return NO;
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return YES;
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithMainResource:(WebResource *)mainResource subresources:(NSArray *)subresources subframeArchives:(NSArray *)subframeArchives
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
149635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifdef MAIL_THREAD_WORKAROUND
150635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (needMailThreadWorkaround())
151635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return [[self _webkit_invokeOnMainThread] initWithMainResource:mainResource subresources:subresources subframeArchives:subframeArchives];
152635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
153635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
154563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebCoreThreadViolationCheckRoundTwo();
155635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    self = [super init];
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!self)
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private = [[WebArchivePrivate alloc] init];
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private->cachedMainResource = [mainResource retain];
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->cachedMainResource) {
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self release];
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!subresources || isArrayOfClass(subresources, [WebResource class]))
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _private->cachedSubresources = [subresources retain];
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else {
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self release];
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!subframeArchives || isArrayOfClass(subframeArchives, [WebArchive class]))
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        _private->cachedSubframeArchives = [subframeArchives retain];
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    else {
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self release];
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RefPtr<ArchiveResource> coreMainResource = mainResource ? [mainResource _coreResource] : 0;
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Vector<PassRefPtr<ArchiveResource> > coreResources;
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSEnumerator *enumerator = [subresources objectEnumerator];
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebResource *subresource;
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while ((subresource = [enumerator nextObject]) != nil)
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        coreResources.append([subresource _coreResource]);
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Vector<PassRefPtr<LegacyWebArchive> > coreArchives;
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    enumerator = [subframeArchives objectEnumerator];
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebArchive *subframeArchive;
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while ((subframeArchive = [enumerator nextObject]) != nil)
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        coreArchives.append([subframeArchive->_private coreArchive]);
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [_private setCoreArchive:LegacyWebArchive::create(coreMainResource.release(), coreResources, coreArchives)];
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (![_private coreArchive]) {
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self release];
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return self;
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithData:(NSData *)data
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
207563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebCoreThreadViolationCheckRoundTwo();
208635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    self = [super init];
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!self)
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if !LOG_DISABLED
2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();
2158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private = [[WebArchivePrivate alloc] init];
218635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    RefPtr<LegacyWebArchive> coreArchive = LegacyWebArchive::create(SharedBuffer::wrapNSData(data).get());
219635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (!coreArchive) {
220635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        [self release];
221635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return nil;
222635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    }
223635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
224635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    [_private setCoreArchive:coreArchive.release()];
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if !LOG_DISABLED
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFAbsoluteTime end = CFAbsoluteTimeGetCurrent();
2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFAbsoluteTime duration = end - start;
2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG(Timing, "Parsing web archive with [NSPropertyListSerialization propertyListFromData::::] took %f seconds", duration);
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return self;
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)initWithCoder:(NSCoder *)decoder
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    WebResource *mainResource = nil;
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSArray *subresources = nil;
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    NSArray *subframeArchives = nil;
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    @try {
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        id object = [decoder decodeObjectForKey:WebMainResourceKey];
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if ([object isKindOfClass:[WebResource class]])
244dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            mainResource = object;
2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        object = [decoder decodeObjectForKey:WebSubresourcesKey];
2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isArrayOfClass(object, [WebResource class]))
247dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            subresources = object;
2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        object = [decoder decodeObjectForKey:WebSubframeArchivesKey];
2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (isArrayOfClass(object, [WebArchive class]))
250dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block            subframeArchives = object;
2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } @catch(id) {
2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self release];
2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self initWithMainResource:mainResource subresources:subresources subframeArchives:subframeArchives];
2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)encodeWithCoder:(NSCoder *)encoder
2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [encoder encodeObject:[self mainResource] forKey:WebMainResourceKey];
2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [encoder encodeObject:[self subresources] forKey:WebSubresourcesKey];
2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [encoder encodeObject:[self subframeArchives] forKey:WebSubframeArchivesKey];
2648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)dealloc
2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [_private release];
2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    [super dealloc];
2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)copyWithZone:(NSZone *)zone
2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [self retain];
2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebResource *)mainResource
2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
279635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifdef MAIL_THREAD_WORKAROUND
280635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (needMailThreadWorkaround())
281635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return [[self _webkit_invokeOnMainThread] mainResource];
282635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
283635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
284563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebCoreThreadViolationCheckRoundTwo();
285635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Currently from WebKit API perspective, WebArchives are entirely immutable once created
2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If they ever become mutable, we'll need to rethink this.
2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->cachedMainResource) {
2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LegacyWebArchive* coreArchive = [_private coreArchive];
2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (coreArchive)
2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            _private->cachedMainResource = [[WebResource alloc] _initWithCoreResource:coreArchive->mainResource()];
2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[_private->cachedMainResource retain] autorelease];
2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSArray *)subresources
2988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
299635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifdef MAIL_THREAD_WORKAROUND
300635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (needMailThreadWorkaround())
301635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return [[self _webkit_invokeOnMainThread] subresources];
302635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
303635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
304563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebCoreThreadViolationCheckRoundTwo();
305635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Currently from WebKit API perspective, WebArchives are entirely immutable once created
3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If they ever become mutable, we'll need to rethink this.
3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->cachedSubresources) {
3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LegacyWebArchive* coreArchive = [_private coreArchive];
3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!coreArchive)
3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            _private->cachedSubresources = [[NSArray alloc] init];
3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            const Vector<RefPtr<ArchiveResource> >& subresources(coreArchive->subresources());
3148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithCapacity:subresources.size()];
3158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            _private->cachedSubresources = mutableArray;
3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            for (unsigned i = 0; i < subresources.size(); ++i) {
3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                WebResource *resource = [[WebResource alloc] _initWithCoreResource:subresources[i].get()];
3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                if (resource) {
3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    [mutableArray addObject:resource];
3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                    [resource release];
3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                }
3228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
325563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // Maintain the WebKit 3 behavior of this API, which is documented and
326563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    // relied upon by some clients, of returning nil if there are no subresources.
327563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    return [_private->cachedSubresources count] ? [[_private->cachedSubresources retain] autorelease] : nil;
3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSArray *)subframeArchives
3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
332635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifdef MAIL_THREAD_WORKAROUND
333635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    if (needMailThreadWorkaround())
334635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        return [[self _webkit_invokeOnMainThread] subframeArchives];
335635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
336635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
337563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebCoreThreadViolationCheckRoundTwo();
338635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Currently from WebKit API perspective, WebArchives are entirely immutable once created
3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // If they ever become mutable, we'll need to rethink this.
3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private->cachedSubframeArchives) {
3428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        LegacyWebArchive* coreArchive = [_private coreArchive];
3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!coreArchive)
3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            _private->cachedSubframeArchives = [[NSArray alloc] init];
3458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        else {
3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            const Vector<RefPtr<Archive> >& subframeArchives(coreArchive->subframeArchives());
3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            NSMutableArray *mutableArray = [[NSMutableArray alloc] initWithCapacity:subframeArchives.size()];
3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            _private->cachedSubframeArchives = mutableArray;
3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            for (unsigned i = 0; i < subframeArchives.size(); ++i) {
3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                WebArchive *archive = [[WebArchive alloc] _initWithCoreLegacyWebArchive:(LegacyWebArchive *)subframeArchives[i].get()];
3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                [mutableArray addObject:archive];
3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project                [archive release];
3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            }
3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[_private->cachedSubframeArchives retain] autorelease];
3588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSData *)data
3618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
362563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebCoreThreadViolationCheckRoundTwo();
363635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if !LOG_DISABLED
3658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();
3668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
3678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RetainPtr<CFDataRef> data = [_private coreArchive]->rawDataRepresentation();
3698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if !LOG_DISABLED
3718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFAbsoluteTime end = CFAbsoluteTimeGetCurrent();
3728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFAbsoluteTime duration = end - start;
3738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
3748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    LOG(Timing, "Serializing web archive to raw CFPropertyList data took %f seconds", duration);
3758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [[(NSData *)data.get() retain] autorelease];
3778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebArchive (WebInternal)
3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (id)_initWithCoreLegacyWebArchive:(PassRefPtr<WebCore::LegacyWebArchive>)coreLegacyWebArchive
3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
385563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebCoreThreadViolationCheckRoundTwo();
386635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    self = [super init];
3888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!self)
3898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
3908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    _private = [[WebArchivePrivate alloc] initWithCoreArchive:coreLegacyWebArchive];
3928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!_private) {
3938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        [self release];
3948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return nil;
3958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
3968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
3978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return self;
3988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
3998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (WebCore::LegacyWebArchive *)_coreLegacyWebArchive
4018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
402563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark    WebCoreThreadViolationCheckRoundTwo();
403635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
4048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return [_private coreArchive];
4058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
4068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
4078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end
408