diff options
author | Upstream <upstream-import@none> | 1970-01-12 13:46:40 +0000 |
---|---|---|
committer | Upstream <upstream-import@none> | 1970-01-12 13:46:40 +0000 |
commit | d8543bb6618c17b12da906afa77d216f58cf4058 (patch) | |
tree | c58dc05ed86825bd0ef8d305d58c8205106b540f /WebKit/mac/WebView/WebHTMLRepresentation.mm | |
download | external_webkit-d8543bb6618c17b12da906afa77d216f58cf4058.zip external_webkit-d8543bb6618c17b12da906afa77d216f58cf4058.tar.gz external_webkit-d8543bb6618c17b12da906afa77d216f58cf4058.tar.bz2 |
external/webkit r30707
Diffstat (limited to 'WebKit/mac/WebView/WebHTMLRepresentation.mm')
-rw-r--r-- | WebKit/mac/WebView/WebHTMLRepresentation.mm | 322 |
1 files changed, 322 insertions, 0 deletions
diff --git a/WebKit/mac/WebView/WebHTMLRepresentation.mm b/WebKit/mac/WebView/WebHTMLRepresentation.mm new file mode 100644 index 0000000..1a25ade --- /dev/null +++ b/WebKit/mac/WebView/WebHTMLRepresentation.mm @@ -0,0 +1,322 @@ +/* + * Copyright (C) 2005, 2006, 2007 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of + * its contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY + * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#import "WebHTMLRepresentation.h" + +#import "DOMNodeInternal.h" +#import "DOMRangeInternal.h" +#import "WebArchive.h" +#import "WebBasePluginPackage.h" +#import "WebDataSourceInternal.h" +#import "WebDocumentPrivate.h" +#import "WebFrameBridge.h" +#import "WebFrameInternal.h" +#import "WebKitNSStringExtras.h" +#import "WebKitStatisticsPrivate.h" +#import "WebNSAttributedStringExtras.h" +#import "WebNSObjectExtras.h" +#import "WebResourcePrivate.h" +#import "WebView.h" +#import <Foundation/NSURLResponse.h> +#import <JavaScriptCore/Assertions.h> +#import <WebCore/Document.h> +#import <WebCore/DocumentLoader.h> +#import <WebCore/Frame.h> +#import <WebCore/FrameLoader.h> +#import <WebCore/MIMETypeRegistry.h> +#import <WebCore/Range.h> + +using namespace WebCore; + +@interface WebHTMLRepresentationPrivate : NSObject +{ +@public + WebDataSource *dataSource; + WebFrameBridge *bridge; + NSData *parsedArchiveData; + + BOOL hasSentResponseToPlugin; + id <WebPluginManualLoader> manualLoader; + NSView *pluginView; +} +@end + +@implementation WebHTMLRepresentationPrivate + +- (void)dealloc +{ + [parsedArchiveData release]; + [super dealloc]; +} + +@end + +@implementation WebHTMLRepresentation + +static NSArray *stringArray(const HashSet<String>& set) +{ + NSMutableArray *array = [NSMutableArray arrayWithCapacity:set.size()]; + HashSet<String>::const_iterator end = set.end(); + for (HashSet<String>::const_iterator it = set.begin(); it != end; ++it) + [array addObject:(NSString *)(*it)]; + return array; +} + +static NSArray *concatenateArrays(NSArray *first, NSArray *second) +{ + NSMutableArray *result = [[first mutableCopy] autorelease]; + [result addObjectsFromArray:second]; + return result; +} + ++ (NSArray *)supportedMIMETypes +{ + static RetainPtr<NSArray> staticSupportedMIMETypes = + concatenateArrays([self supportedNonImageMIMETypes], [self supportedImageMIMETypes]); + return staticSupportedMIMETypes.get(); +} + ++ (NSArray *)supportedNonImageMIMETypes +{ + static RetainPtr<NSArray> staticSupportedNonImageMIMETypes = + stringArray(MIMETypeRegistry::getSupportedNonImageMIMETypes()); + return staticSupportedNonImageMIMETypes.get(); +} + ++ (NSArray *)supportedImageMIMETypes +{ + static RetainPtr<NSArray> staticSupportedImageMIMETypes = + stringArray(MIMETypeRegistry::getSupportedImageMIMETypes()); + return staticSupportedImageMIMETypes.get(); +} + +- init +{ + self = [super init]; + if (!self) + return nil; + + _private = [[WebHTMLRepresentationPrivate alloc] init]; + + ++WebHTMLRepresentationCount; + + return self; +} + +- (void)dealloc +{ + --WebHTMLRepresentationCount; + + [_private release]; + + [super dealloc]; +} + +- (void)finalize +{ + --WebHTMLRepresentationCount; + + [super finalize]; +} + +- (WebFrameBridge *)_bridge +{ + return _private->bridge; +} + +- (void)_redirectDataToManualLoader:(id<WebPluginManualLoader>)manualLoader forPluginView:(NSView *)pluginView; +{ + _private->manualLoader = manualLoader; + _private->pluginView = pluginView; +} + +- (void)setDataSource:(WebDataSource *)dataSource +{ + _private->dataSource = dataSource; + _private->bridge = [[dataSource webFrame] _bridge]; +} + +- (BOOL)_isDisplayingWebArchive +{ + return [[[_private->dataSource response] MIMEType] _webkit_isCaseInsensitiveEqualToString:@"application/x-webarchive"]; +} + +- (void)receivedData:(NSData *)data withDataSource:(WebDataSource *)dataSource +{ + if ([dataSource webFrame] && ![self _isDisplayingWebArchive]) { + if (!_private->pluginView) + [_private->bridge receivedData:data textEncodingName:[[_private->dataSource response] textEncodingName]]; + + if (_private->pluginView) { + if (!_private->hasSentResponseToPlugin) { + [_private->manualLoader pluginView:_private->pluginView receivedResponse:[dataSource response]]; + _private->hasSentResponseToPlugin = YES; + } + + [_private->manualLoader pluginView:_private->pluginView receivedData:data]; + } + } +} + +- (void)receivedError:(NSError *)error withDataSource:(WebDataSource *)dataSource +{ + if (_private->pluginView) { + [_private->manualLoader pluginView:_private->pluginView receivedError:error]; + } +} + +- (void)_loadDataSourceAsWebArchive +{ + WebArchive *archive = [[WebArchive alloc] initWithData:[_private->dataSource data]]; + WebResource *mainResource = [archive mainResource]; + if (!mainResource) { + [archive release]; + return; + } + + NSData *data = [mainResource data]; + [data retain]; + [_private->parsedArchiveData release]; + _private->parsedArchiveData = data; + + [_private->dataSource _addToUnarchiveState:archive]; + [archive release]; + + WebFrame *webFrame = [_private->dataSource webFrame]; + + if (!webFrame) + return; + + core(webFrame)->loader()->continueLoadWithData(SharedBuffer::wrapNSData(data).get(), [mainResource MIMEType], [mainResource textEncodingName], [mainResource URL]); +} + +- (void)finishedLoadingWithDataSource:(WebDataSource *)dataSource +{ + WebFrame *frame = [dataSource webFrame]; + + if (_private->pluginView) { + [_private->manualLoader pluginViewFinishedLoading:_private->pluginView]; + return; + } + + if (frame) { + if ([self _isDisplayingWebArchive]) + [self _loadDataSourceAsWebArchive]; + else + // Telling the bridge we received some data and passing nil as the data is our + // way to get work done that is normally done when the first bit of data is + // received, even for the case of a document with no data (like about:blank). + [_private->bridge receivedData:nil textEncodingName:[[_private->dataSource response] textEncodingName]]; + + WebView *webView = [frame webView]; + if ([webView isEditable]) + core(frame)->applyEditingStyleToBodyElement(); + } +} + +- (BOOL)canProvideDocumentSource +{ + return [_private->bridge canProvideDocumentSource]; +} + +- (BOOL)canSaveAsWebArchive +{ + return [_private->bridge canSaveAsWebArchive]; +} + +- (NSString *)documentSource +{ + if ([self _isDisplayingWebArchive]) + return [[[NSString alloc] initWithData:_private->parsedArchiveData encoding:NSUTF8StringEncoding] autorelease]; + + return [_private->bridge stringWithData:[_private->dataSource data]]; +} + +- (NSString *)title +{ + return nsStringNilIfEmpty([_private->dataSource _documentLoader]->title()); +} + +- (DOMDocument *)DOMDocument +{ + return [[_private->bridge webFrame] DOMDocument]; +} + +- (NSAttributedString *)attributedText +{ + // FIXME: Implement + return nil; +} + +- (NSAttributedString *)attributedStringFrom:(DOMNode *)startNode startOffset:(int)startOffset to:(DOMNode *)endNode endOffset:(int)endOffset +{ + Range range([startNode _node]->document(), [startNode _node], startOffset, [endNode _node], endOffset); + return [NSAttributedString _web_attributedStringFromRange:&range]; +} + +- (DOMElement *)elementWithName:(NSString *)name inForm:(DOMElement *)form +{ + return [_private->bridge elementWithName:name inForm:form]; +} + +- (BOOL)elementDoesAutoComplete:(DOMElement *)element +{ + return [_private->bridge elementDoesAutoComplete:element]; +} + +- (BOOL)elementIsPassword:(DOMElement *)element +{ + return [_private->bridge elementIsPassword:element]; +} + +- (DOMElement *)formForElement:(DOMElement *)element +{ + return [_private->bridge formForElement:element]; +} + +- (DOMElement *)currentForm +{ + return [_private->bridge currentForm]; +} + +- (NSArray *)controlsInForm:(DOMElement *)form +{ + return [_private->bridge controlsInForm:form]; +} + +- (NSString *)searchForLabels:(NSArray *)labels beforeElement:(DOMElement *)element +{ + return [_private->bridge searchForLabels:labels beforeElement:element]; +} + +- (NSString *)matchLabels:(NSArray *)labels againstElement:(DOMElement *)element +{ + return [_private->bridge matchLabels:labels againstElement:element]; +} + +@end |