/* WebHTMLRepresentation.m Copyright 2002, Apple, Inc. All rights reserved. */ #import #import #import #import #import #import #import #import #import #import #import #import #import #import @interface WebHTMLRepresentationPrivate : NSObject { @public WebDataSource *dataSource; WebBridge *bridge; NSData *parsedArchiveData; } @end @implementation WebHTMLRepresentationPrivate - (void)dealloc { [parsedArchiveData release]; [super dealloc]; } @end @implementation WebHTMLRepresentation - init { [super init]; _private = [[WebHTMLRepresentationPrivate alloc] init]; ++WebHTMLRepresentationCount; return self; } - (void)dealloc { --WebHTMLRepresentationCount; [_private release]; [super dealloc]; } - (void)finalize { --WebHTMLRepresentationCount; [super finalize]; } - (WebBridge *)_bridge { return _private->bridge; } - (void)setDataSource:(WebDataSource *)dataSource { _private->dataSource = dataSource; _private->bridge = [[dataSource webFrame] _bridge]; } - (BOOL)_isDisplayingWebArchive { return [[[_private->dataSource response] MIMEType] _web_isCaseInsensitiveEqualToString:@"application/x-webarchive"]; } - (void)receivedData:(NSData *)data withDataSource:(WebDataSource *)dataSource { if ([dataSource webFrame] && ![self _isDisplayingWebArchive]) { [_private->bridge receivedData:data textEncodingName:[[_private->dataSource response] textEncodingName]]; } } - (void)receivedError:(NSError *)error withDataSource:(WebDataSource *)dataSource { } - (void)loadArchive { WebArchive *archive = [[WebArchive alloc] initWithData:[_private->dataSource data]]; WebResource *mainResource = [archive mainResource]; NSArray *subresources = [archive subresources]; NSArray *subframeArchives = [archive subframeArchives]; [archive release]; if (!mainResource) { return; } NSData *data = [mainResource data]; [data retain]; [_private->parsedArchiveData release]; _private->parsedArchiveData = data; [_private->dataSource _addSubresources:subresources]; [_private->dataSource _addSubframeArchives:subframeArchives]; [_private->bridge closeURL]; [_private->bridge openURL:[mainResource URL] reload:NO contentType:[mainResource MIMEType] refresh:NO lastModified:nil pageCache:nil]; [_private->bridge receivedData:data textEncodingName:[mainResource textEncodingName]]; } - (void)finishedLoadingWithDataSource:(WebDataSource *)dataSource { WebFrame *frame = [dataSource webFrame]; if (frame) { if ([self _isDisplayingWebArchive]) { [self loadArchive]; } 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]) { [_private->bridge applyEditingStyleToBodyElement]; } } } - (BOOL)canProvideDocumentSource { return YES; } - (NSString *)documentSource { if ([self _isDisplayingWebArchive]) { return [[[NSString alloc] initWithData:_private->parsedArchiveData encoding:NSUTF8StringEncoding] autorelease]; } else { return [WebBridge stringWithData:[_private->dataSource data] textEncoding:[_private->bridge textEncoding]]; } } - (NSString *)title { return [_private->dataSource _title]; } - (DOMDocument *)DOMDocument { return [_private->bridge DOMDocument]; } - (NSAttributedString *)attributedText { // FIXME: Implement return nil; } - (NSAttributedString *)attributedStringFrom: (DOMNode *)startNode startOffset: (int)startOffset to: (DOMNode *)endNode endOffset: (int)endOffset { return [_private->bridge attributedStringFrom: startNode startOffset: startOffset to: endNode endOffset: endOffset]; } - (DOMElement *)elementWithName:(NSString *)name inForm:(DOMElement *)form { return [_private->bridge elementWithName:name inForm:form]; } - (DOMElement *)elementForView:(NSView *)view { return [_private->bridge elementForView:view]; } - (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