a132d30c5e17981fc3ce247f95dd7001ac2fc06f
[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             [_private->bridge end];
136         }
137     }
138 }
139
140 - (BOOL)canProvideDocumentSource
141 {
142     return YES;
143 }
144
145 - (NSString *)documentSource
146 {
147     if ([self _isDisplayingWebArchive]) {
148         return [[[NSString alloc] initWithData:_private->parsedArchiveData encoding:NSUTF8StringEncoding] autorelease];
149     } else {
150         return [WebBridge stringWithData:[_private->dataSource data] textEncoding:[_private->bridge textEncoding]];
151     }
152 }
153
154 - (NSString *)title
155 {
156     return [_private->dataSource _title];
157 }
158
159 - (DOMDocument *)DOMDocument
160 {
161     return [_private->bridge DOMDocument];
162 }
163
164 - (void)setSelectionFrom:(DOMNode *)start startOffset:(int)startOffset to:(DOMNode *)end endOffset:(int) endOffset
165 {
166 }
167
168 - (NSAttributedString *)attributedText
169 {
170     // FIXME:  Implement
171     return nil;
172 }
173
174 - (NSAttributedString *)attributedStringFrom: (DOMNode *)startNode startOffset: (int)startOffset to: (DOMNode *)endNode endOffset: (int)endOffset
175 {
176     return [_private->bridge attributedStringFrom: startNode startOffset: startOffset to: endNode endOffset: endOffset];
177 }
178
179 - (DOMElement *)elementWithName:(NSString *)name inForm:(DOMElement *)form
180 {
181     return [_private->bridge elementWithName:name inForm:form];
182 }
183
184 - (DOMElement *)elementForView:(NSView *)view
185 {
186     return [_private->bridge elementForView:view];
187 }
188
189 - (BOOL)elementDoesAutoComplete:(DOMElement *)element
190 {
191     return [_private->bridge elementDoesAutoComplete:element];
192 }
193
194 - (BOOL)elementIsPassword:(DOMElement *)element
195 {
196     return [_private->bridge elementIsPassword:element];
197 }
198
199 - (DOMElement *)formForElement:(DOMElement *)element
200 {
201     return [_private->bridge formForElement:element];
202 }
203
204 - (DOMElement *)currentForm;
205 {
206     return [_private->bridge currentForm];
207 }
208
209 - (NSArray *)controlsInForm:(DOMElement *)form
210 {
211     return [_private->bridge controlsInForm:form];
212 }
213
214 - (NSString *)searchForLabels:(NSArray *)labels beforeElement:(DOMElement *)element
215 {
216     return [_private->bridge searchForLabels:labels beforeElement:element];
217 }
218
219 - (NSString *)matchLabels:(NSArray *)labels againstElement:(DOMElement *)element
220 {
221     return [_private->bridge matchLabels:labels againstElement:element];
222 }
223
224 @end