WebCore:
[WebKit-https.git] / WebKit / WebView.subproj / WebHTMLRepresentation.m
1 /*      
2         WebHTMLRepresentation.m
3         Copyright 2002, Apple, Inc. All rights reserved.
4 */
5
6 #import <WebKit/WebHTMLRepresentation.h>
7
8 #import <WebKit/DOM.h>
9 #import <WebKit/WebArchive.h>
10 #import <WebKit/WebAssertions.h>
11 #import <WebKit/WebBridge.h>
12 #import <WebKit/WebDataSourcePrivate.h>
13 #import <WebKit/WebDocumentPrivate.h>
14 #import <WebKit/WebFramePrivate.h>
15 #import <WebKit/WebKitStatisticsPrivate.h>
16 #import <WebKit/WebNSObjectExtras.h>
17 #import <WebKit/WebResourcePrivate.h>
18
19 #import <Foundation/NSString_NSURLExtras.h>
20 #import <Foundation/NSURLResponse.h>
21
22 @interface WebHTMLRepresentationPrivate : NSObject
23 {
24 @public
25     WebDataSource *dataSource;
26     WebBridge *bridge;
27     NSData *parsedArchiveData;
28 }
29 @end
30
31 @implementation WebHTMLRepresentationPrivate
32
33 - (void)dealloc
34 {
35     [parsedArchiveData release];
36     [super dealloc];
37 }
38
39 @end
40
41 @implementation WebHTMLRepresentation
42
43 - init
44 {
45     [super init];
46     
47     _private = [[WebHTMLRepresentationPrivate alloc] init];
48     
49     ++WebHTMLRepresentationCount;
50     
51     return self;
52 }
53
54 - (void)dealloc
55 {
56     --WebHTMLRepresentationCount;
57     
58     [_private release];
59
60     [super dealloc];
61 }
62
63 - (void)finalize
64 {
65     --WebHTMLRepresentationCount;
66
67     [super finalize];
68 }
69
70 - (WebBridge *)_bridge
71 {
72     return _private->bridge;
73 }
74
75 - (void)setDataSource:(WebDataSource *)dataSource
76 {
77     _private->dataSource = dataSource;
78     _private->bridge = [[dataSource webFrame] _bridge];
79 }
80
81 - (BOOL)_isDisplayingWebArchive
82 {
83     return [[[_private->dataSource response] MIMEType] _web_isCaseInsensitiveEqualToString:@"application/x-webarchive"];
84 }
85
86 - (void)receivedData:(NSData *)data withDataSource:(WebDataSource *)dataSource
87 {
88     if ([dataSource webFrame] && ![self _isDisplayingWebArchive]) {
89         [_private->bridge receivedData:data textEncodingName:[[_private->dataSource response] textEncodingName]];
90     }
91 }
92
93 - (void)receivedError:(NSError *)error withDataSource:(WebDataSource *)dataSource
94 {
95 }
96
97 - (void)loadArchive
98 {
99     WebArchive *archive = [[WebArchive alloc] initWithData:[_private->dataSource data]];
100     WebResource *mainResource = [archive mainResource];
101     NSArray *subresources = [archive subresources];
102     NSArray *subframeArchives = [archive subframeArchives];
103     [archive release];
104     if (!mainResource) {
105         return;
106     }
107     
108     NSData *data = [mainResource data];
109     [data retain];
110     [_private->parsedArchiveData release];
111     _private->parsedArchiveData = data;
112     
113     [_private->dataSource _addSubresources:subresources];
114     [_private->dataSource _addSubframeArchives:subframeArchives];
115     [_private->bridge closeURL];
116     [_private->bridge openURL:[mainResource URL]
117                        reload:NO 
118                   contentType:[mainResource MIMEType]
119                       refresh:NO
120                  lastModified:nil
121                     pageCache:nil];
122     [_private->bridge receivedData:data textEncodingName:[mainResource textEncodingName]];
123 }
124
125 - (void)finishedLoadingWithDataSource:(WebDataSource *)dataSource
126 {
127     if ([dataSource webFrame]) {
128         if ([self _isDisplayingWebArchive]) {
129             [self loadArchive];
130         } else {
131             // Telling the bridge we received some data and passing nil as the data is our
132             // way to get work done that is normally done when the first bit of data is
133             // received, even for the case of a document with no data (like about:blank).
134             [_private->bridge receivedData:nil textEncodingName:[[_private->dataSource response] textEncodingName]];
135         }
136     }
137 }
138
139 - (BOOL)canProvideDocumentSource
140 {
141     return YES;
142 }
143
144 - (NSString *)documentSource
145 {
146     if ([self _isDisplayingWebArchive]) {
147         return [[[NSString alloc] initWithData:_private->parsedArchiveData encoding:NSUTF8StringEncoding] autorelease];
148     } else {
149         return [WebBridge stringWithData:[_private->dataSource data] textEncoding:[_private->bridge textEncoding]];
150     }
151 }
152
153 - (NSString *)title
154 {
155     return [_private->dataSource _title];
156 }
157
158 - (DOMDocument *)DOMDocument
159 {
160     return [_private->bridge DOMDocument];
161 }
162
163 - (void)setSelectionFrom:(DOMNode *)start startOffset:(int)startOffset to:(DOMNode *)end endOffset:(int) endOffset
164 {
165 }
166
167 - (NSAttributedString *)attributedText
168 {
169     // FIXME:  Implement
170     return nil;
171 }
172
173 - (NSAttributedString *)attributedStringFrom: (DOMNode *)startNode startOffset: (int)startOffset to: (DOMNode *)endNode endOffset: (int)endOffset
174 {
175     return [_private->bridge attributedStringFrom: startNode startOffset: startOffset to: endNode endOffset: endOffset];
176 }
177
178 - (DOMElement *)elementWithName:(NSString *)name inForm:(DOMElement *)form
179 {
180     return [_private->bridge elementWithName:name inForm:form];
181 }
182
183 - (DOMElement *)elementForView:(NSView *)view
184 {
185     return [_private->bridge elementForView:view];
186 }
187
188 - (BOOL)elementDoesAutoComplete:(DOMElement *)element
189 {
190     return [_private->bridge elementDoesAutoComplete:element];
191 }
192
193 - (BOOL)elementIsPassword:(DOMElement *)element
194 {
195     return [_private->bridge elementIsPassword:element];
196 }
197
198 - (DOMElement *)formForElement:(DOMElement *)element
199 {
200     return [_private->bridge formForElement:element];
201 }
202
203 - (DOMElement *)currentForm;
204 {
205     return [_private->bridge currentForm];
206 }
207
208 - (NSArray *)controlsInForm:(DOMElement *)form
209 {
210     return [_private->bridge controlsInForm:form];
211 }
212
213 - (NSString *)searchForLabels:(NSArray *)labels beforeElement:(DOMElement *)element
214 {
215     return [_private->bridge searchForLabels:labels beforeElement:element];
216 }
217
218 - (NSString *)matchLabels:(NSArray *)labels againstElement:(DOMElement *)element
219 {
220     return [_private->bridge matchLabels:labels againstElement:element];
221 }
222
223 @end