18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2005, 2006, 2007 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 "WebHTMLRepresentation.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import "DOMElementInternal.h" 3206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen#import "DOMNodeInternal.h" 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "DOMRangeInternal.h" 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebArchive.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebBasePluginPackage.h" 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebDataSourceInternal.h" 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebDocumentPrivate.h" 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebFrameInternal.h" 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebKitNSStringExtras.h" 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebKitStatisticsPrivate.h" 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebNSObjectExtras.h" 42d0825bca7fe65beaee391d30da42e937db621564Steve Block#import "WebTypesInternal.h" 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import "WebView.h" 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <Foundation/NSURLResponse.h> 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/Document.h> 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/DocumentLoader.h> 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/Frame.h> 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/FrameLoader.h> 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/FrameLoaderClient.h> 502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#import <WebCore/HTMLConverter.h> 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/HTMLFormControlElement.h> 520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#import <WebCore/HTMLFormElement.h> 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/HTMLInputElement.h> 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/HTMLNames.h> 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/MIMETypeRegistry.h> 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/Range.h> 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebCore/TextResourceDecoder.h> 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <WebKit/DOMHTMLInputElement.h> 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#import <wtf/Assertions.h> 60635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#import <wtf/StdLibExtras.h> 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace WebCore; 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectusing namespace HTMLNames; 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@interface WebHTMLRepresentationPrivate : NSObject { 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@public 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebDataSource *dataSource; 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project BOOL hasSentResponseToPlugin; 70692e5dbf12901edacf14812a6fae25462920af42Steve Block BOOL includedInWebKitStatistics; 71692e5dbf12901edacf14812a6fae25462920af42Steve Block 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project id <WebPluginManualLoader> manualLoader; 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSView *pluginView; 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebHTMLRepresentationPrivate 788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@implementation WebHTMLRepresentation 818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NSArray *stringArray(const HashSet<String>& set) 838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSMutableArray *array = [NSMutableArray arrayWithCapacity:set.size()]; 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HashSet<String>::const_iterator end = set.end(); 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (HashSet<String>::const_iterator it = set.begin(); it != end; ++it) 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [array addObject:(NSString *)(*it)]; 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return array; 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic NSArray *concatenateArrays(NSArray *first, NSArray *second) 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSMutableArray *result = [[first mutableCopy] autorelease]; 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [result addObjectsFromArray:second]; 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return result; 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (NSArray *)supportedMIMETypes 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 100635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project DEFINE_STATIC_LOCAL(RetainPtr<NSArray>, staticSupportedMIMETypes, (concatenateArrays([self supportedNonImageMIMETypes], [self supportedImageMIMETypes]))); 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return staticSupportedMIMETypes.get(); 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (NSArray *)supportedNonImageMIMETypes 1058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 106635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project DEFINE_STATIC_LOCAL(RetainPtr<NSArray>, staticSupportedNonImageMIMETypes, (stringArray(MIMETypeRegistry::getSupportedNonImageMIMETypes()))); 1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return staticSupportedNonImageMIMETypes.get(); 1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project+ (NSArray *)supportedImageMIMETypes 1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 112635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project DEFINE_STATIC_LOCAL(RetainPtr<NSArray>, staticSupportedImageMIMETypes, (stringArray(MIMETypeRegistry::getSupportedImageMIMETypes()))); 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return staticSupportedImageMIMETypes.get(); 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1162bde8e466a4451c7319e3a072d118917957d6554Steve Block+ (NSArray *)unsupportedTextMIMETypes 1172bde8e466a4451c7319e3a072d118917957d6554Steve Block{ 1182bde8e466a4451c7319e3a072d118917957d6554Steve Block DEFINE_STATIC_LOCAL(RetainPtr<NSArray>, staticUnsupportedTextMIMETypes, (stringArray(MIMETypeRegistry::getUnsupportedTextMIMETypes()))); 1192bde8e466a4451c7319e3a072d118917957d6554Steve Block return staticUnsupportedTextMIMETypes.get(); 1202bde8e466a4451c7319e3a072d118917957d6554Steve Block} 1212bde8e466a4451c7319e3a072d118917957d6554Steve Block 122967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch- (id)init 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project self = [super init]; 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!self) 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _private = [[WebHTMLRepresentationPrivate alloc] init]; 129692e5dbf12901edacf14812a6fae25462920af42Steve Block 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return self; 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)dealloc 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 135692e5dbf12901edacf14812a6fae25462920af42Steve Block if (_private && _private->includedInWebKitStatistics) 136692e5dbf12901edacf14812a6fae25462920af42Steve Block --WebHTMLRepresentationCount; 137692e5dbf12901edacf14812a6fae25462920af42Steve Block 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [_private release]; 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [super dealloc]; 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)finalize 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 145692e5dbf12901edacf14812a6fae25462920af42Steve Block if (_private && _private->includedInWebKitStatistics) 146692e5dbf12901edacf14812a6fae25462920af42Steve Block --WebHTMLRepresentationCount; 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [super finalize]; 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 151563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark- (void)_redirectDataToManualLoader:(id<WebPluginManualLoader>)manualLoader forPluginView:(NSView *)pluginView 1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _private->manualLoader = manualLoader; 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _private->pluginView = pluginView; 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)setDataSource:(WebDataSource *)dataSource 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project _private->dataSource = dataSource; 160692e5dbf12901edacf14812a6fae25462920af42Steve Block 161692e5dbf12901edacf14812a6fae25462920af42Steve Block if (!_private->includedInWebKitStatistics && [[dataSource webFrame] _isIncludedInWebKitStatistics]) { 162692e5dbf12901edacf14812a6fae25462920af42Steve Block _private->includedInWebKitStatistics = YES; 163692e5dbf12901edacf14812a6fae25462920af42Steve Block ++WebHTMLRepresentationCount; 164692e5dbf12901edacf14812a6fae25462920af42Steve Block } 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)_isDisplayingWebArchive 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 169563af33bc48281d19dce701398dbb88cb54fd7ecCary Clark return [[_private->dataSource _responseMIMEType] _webkit_isCaseInsensitiveEqualToString:@"application/x-webarchive"]; 1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)receivedData:(NSData *)data withDataSource:(WebDataSource *)dataSource 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project WebFrame *webFrame = [dataSource webFrame]; 17568513a70bcd92384395513322f1b801e7bf9c729Steve Block if (!webFrame) 17668513a70bcd92384395513322f1b801e7bf9c729Steve Block return; 17768513a70bcd92384395513322f1b801e7bf9c729Steve Block 17868513a70bcd92384395513322f1b801e7bf9c729Steve Block if (!_private->pluginView) 17968513a70bcd92384395513322f1b801e7bf9c729Steve Block [webFrame _commitData:data]; 18068513a70bcd92384395513322f1b801e7bf9c729Steve Block 18168513a70bcd92384395513322f1b801e7bf9c729Steve Block // If the document is a stand-alone media document, now is the right time to cancel the WebKit load 18268513a70bcd92384395513322f1b801e7bf9c729Steve Block Frame* coreFrame = core(webFrame); 18368513a70bcd92384395513322f1b801e7bf9c729Steve Block if (coreFrame->document()->isMediaDocument()) 18468513a70bcd92384395513322f1b801e7bf9c729Steve Block coreFrame->loader()->documentLoader()->cancelMainResourceLoad(coreFrame->loader()->client()->pluginWillHandleLoadError(coreFrame->loader()->documentLoader()->response())); 18568513a70bcd92384395513322f1b801e7bf9c729Steve Block 18668513a70bcd92384395513322f1b801e7bf9c729Steve Block if (_private->pluginView) { 18768513a70bcd92384395513322f1b801e7bf9c729Steve Block if (!_private->hasSentResponseToPlugin) { 18868513a70bcd92384395513322f1b801e7bf9c729Steve Block [_private->manualLoader pluginView:_private->pluginView receivedResponse:[dataSource response]]; 18968513a70bcd92384395513322f1b801e7bf9c729Steve Block _private->hasSentResponseToPlugin = YES; 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 19168513a70bcd92384395513322f1b801e7bf9c729Steve Block 19268513a70bcd92384395513322f1b801e7bf9c729Steve Block [_private->manualLoader pluginView:_private->pluginView receivedData:data]; 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)receivedError:(NSError *)error withDataSource:(WebDataSource *)dataSource 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (_private->pluginView) { 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [_private->manualLoader pluginView:_private->pluginView receivedError:error]; 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (void)finishedLoadingWithDataSource:(WebDataSource *)dataSource 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 20568513a70bcd92384395513322f1b801e7bf9c729Steve Block WebFrame* webFrame = [dataSource webFrame]; 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (_private->pluginView) { 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [_private->manualLoader pluginViewFinishedLoading:_private->pluginView]; 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return; 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 21268513a70bcd92384395513322f1b801e7bf9c729Steve Block if (!webFrame) 21368513a70bcd92384395513322f1b801e7bf9c729Steve Block return; 21468513a70bcd92384395513322f1b801e7bf9c729Steve Block 21568513a70bcd92384395513322f1b801e7bf9c729Steve Block if (![self _isDisplayingWebArchive]) { 21668513a70bcd92384395513322f1b801e7bf9c729Steve Block // Telling the frame we received some data and passing nil as the data is our 21768513a70bcd92384395513322f1b801e7bf9c729Steve Block // way to get work done that is normally done when the first bit of data is 21868513a70bcd92384395513322f1b801e7bf9c729Steve Block // received, even for the case of a document with no data (like about:blank). 21968513a70bcd92384395513322f1b801e7bf9c729Steve Block [webFrame _commitData:nil]; 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 22168513a70bcd92384395513322f1b801e7bf9c729Steve Block 22268513a70bcd92384395513322f1b801e7bf9c729Steve Block WebView *webView = [webFrame webView]; 22368513a70bcd92384395513322f1b801e7bf9c729Steve Block if ([webView isEditable]) 22468513a70bcd92384395513322f1b801e7bf9c729Steve Block core(webFrame)->editor()->applyEditingStyleToBodyElement(); 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)canProvideDocumentSource 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [[_private->dataSource webFrame] _canProvideDocumentSource]; 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)canSaveAsWebArchive 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [[_private->dataSource webFrame] _canSaveAsWebArchive]; 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)documentSource 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if ([self _isDisplayingWebArchive]) { 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project SharedBuffer *parsedArchiveData = [_private->dataSource _documentLoader]->parsedArchiveData(); 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSData *nsData = parsedArchiveData ? parsedArchiveData->createNSData() : nil; 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSString *result = [[NSString alloc] initWithData:nsData encoding:NSUTF8StringEncoding]; 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [nsData release]; 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [result autorelease]; 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Frame* coreFrame = core([_private->dataSource webFrame]); 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!coreFrame) 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project Document* document = coreFrame->document(); 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!document) 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project TextResourceDecoder* decoder = document->decoder(); 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!decoder) 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 2568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSData *data = [_private->dataSource data]; 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!data) 2588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 2598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return decoder->encoding().decode(reinterpret_cast<const char*>([data bytes]), [data length]); 2608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)title 2638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2642daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return nsStringNilIfEmpty([_private->dataSource _documentLoader]->title().string()); 2658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (DOMDocument *)DOMDocument 2688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return [[_private->dataSource webFrame] DOMDocument]; 2708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSAttributedString *)attributedText 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // FIXME: Implement 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSAttributedString *)attributedStringFrom:(DOMNode *)startNode startOffset:(int)startOffset to:(DOMNode *)endNode endOffset:(int)endOffset 2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch return [WebHTMLConverter editingAttributedStringFromRange:Range::create(core(startNode)->document(), core(startNode), startOffset, core(endNode), endOffset).get()]; 2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic HTMLFormElement* formElementFromDOMElement(DOMElement *element) 2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Element* node = core(element); 2860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return node && node->hasTagName(formTag) ? static_cast<HTMLFormElement*>(node) : 0; 2878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (DOMElement *)elementWithName:(NSString *)name inForm:(DOMElement *)form 2908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HTMLFormElement* formElement = formElementFromDOMElement(form); 2928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!formElement) 2938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 294f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch const Vector<FormAssociatedElement*>& elements = formElement->associatedElements(); 2958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project AtomicString targetName = name; 2968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned i = 0; i < elements.size(); i++) { 297f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch FormAssociatedElement* elt = elements[i]; 2985af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke if (elt->name() == targetName) 299f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch return kit(toHTMLElement(elt)); 3008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 3028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic HTMLInputElement* inputElementFromDOMElement(DOMElement* element) 3058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Element* node = core(element); 3078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return node && node->hasTagName(inputTag) ? static_cast<HTMLInputElement*>(node) : 0; 3088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)elementDoesAutoComplete:(DOMElement *)element 3118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HTMLInputElement* inputElement = inputElementFromDOMElement(element); 3138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return inputElement 314dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block && inputElement->isTextField() 31568513a70bcd92384395513322f1b801e7bf9c729Steve Block && !inputElement->isPasswordField() 3168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project && inputElement->autoComplete(); 3178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (BOOL)elementIsPassword:(DOMElement *)element 3208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HTMLInputElement* inputElement = inputElementFromDOMElement(element); 32268513a70bcd92384395513322f1b801e7bf9c729Steve Block return inputElement && inputElement->isPasswordField(); 3238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (DOMElement *)formForElement:(DOMElement *)element 3268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HTMLInputElement* inputElement = inputElementFromDOMElement(element); 3288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return inputElement ? kit(inputElement->form()) : 0; 3298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (DOMElement *)currentForm 3328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 33368513a70bcd92384395513322f1b801e7bf9c729Steve Block return kit(core([_private->dataSource webFrame])->selection()->currentForm()); 3348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSArray *)controlsInForm:(DOMElement *)form 3378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project HTMLFormElement* formElement = formElementFromDOMElement(form); 3398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!formElement) 3408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return nil; 3418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project NSMutableArray *results = nil; 342f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch const Vector<FormAssociatedElement*>& elements = formElement->associatedElements(); 3438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (unsigned i = 0; i < elements.size(); i++) { 3448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (elements[i]->isEnumeratable()) { // Skip option elements, other duds 345f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch DOMElement* de = kit(toHTMLElement(elements[i])); 3468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!results) 3478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project results = [NSMutableArray arrayWithObject:de]; 3488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project else 3498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project [results addObject:de]; 3508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 3528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return results; 3538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)searchForLabels:(NSArray *)labels beforeElement:(DOMElement *)element 3568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 357d0825bca7fe65beaee391d30da42e937db621564Steve Block return [self searchForLabels:labels beforeElement:element resultDistance:0 resultIsInCellAbove:0]; 358d0825bca7fe65beaee391d30da42e937db621564Steve Block} 359d0825bca7fe65beaee391d30da42e937db621564Steve Block 360d0825bca7fe65beaee391d30da42e937db621564Steve Block- (NSString *)searchForLabels:(NSArray *)labels beforeElement:(DOMElement *)element resultDistance:(NSUInteger*)outDistance resultIsInCellAbove:(BOOL*)outIsInCellAbove 361d0825bca7fe65beaee391d30da42e937db621564Steve Block{ 362d0825bca7fe65beaee391d30da42e937db621564Steve Block size_t distance; 363d0825bca7fe65beaee391d30da42e937db621564Steve Block bool isInCellAbove; 364d0825bca7fe65beaee391d30da42e937db621564Steve Block 365d0825bca7fe65beaee391d30da42e937db621564Steve Block NSString *result = core([_private->dataSource webFrame])->searchForLabelsBeforeElement(labels, core(element), &distance, &isInCellAbove); 366d0825bca7fe65beaee391d30da42e937db621564Steve Block 367d0825bca7fe65beaee391d30da42e937db621564Steve Block if (outDistance) { 368d0825bca7fe65beaee391d30da42e937db621564Steve Block if (distance == notFound) 369d0825bca7fe65beaee391d30da42e937db621564Steve Block *outDistance = NSNotFound; 370d0825bca7fe65beaee391d30da42e937db621564Steve Block else 371d0825bca7fe65beaee391d30da42e937db621564Steve Block *outDistance = distance; 372d0825bca7fe65beaee391d30da42e937db621564Steve Block } 373d0825bca7fe65beaee391d30da42e937db621564Steve Block 374d0825bca7fe65beaee391d30da42e937db621564Steve Block if (outIsInCellAbove) 375d0825bca7fe65beaee391d30da42e937db621564Steve Block *outIsInCellAbove = isInCellAbove; 376d0825bca7fe65beaee391d30da42e937db621564Steve Block 377d0825bca7fe65beaee391d30da42e937db621564Steve Block return result; 3788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project- (NSString *)matchLabels:(NSArray *)labels againstElement:(DOMElement *)element 3818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 3828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return core([_private->dataSource webFrame])->matchLabelsAgainstElement(labels, core(element)); 3838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 3848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 3858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project@end 386