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