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