WebCore:
[WebKit-https.git] / WebKit / WebView / WebHTMLRepresentation.m
1 /*
2  * Copyright (C) 2005 Apple Computer, Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  *
8  * 1.  Redistributions of source code must retain the above copyright
9  *     notice, this list of conditions and the following disclaimer. 
10  * 2.  Redistributions in binary form must reproduce the above copyright
11  *     notice, this list of conditions and the following disclaimer in the
12  *     documentation and/or other materials provided with the distribution. 
13  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14  *     its contributors may be used to endorse or promote products derived
15  *     from this software without specific prior written permission. 
16  *
17  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  */
28
29 #import <WebKit/WebHTMLRepresentation.h>
30
31 #import <WebKit/DOM.h>
32 #import <WebKit/WebArchive.h>
33 #import <JavaScriptCore/Assertions.h>
34 #import <WebKit/WebFrameBridge.h>
35 #import <WebKit/WebDataSourceInternal.h>
36 #import <WebKit/WebDocumentPrivate.h>
37 #import <WebKit/WebFramePrivate.h>
38 #import <WebKit/WebKitNSStringExtras.h>
39 #import <WebKit/WebKitStatisticsPrivate.h>
40 #import <WebKit/WebNSObjectExtras.h>
41 #import <WebKit/WebResourcePrivate.h>
42 #import <WebKit/WebView.h>
43
44 #import <Foundation/NSURLResponse.h>
45
46 @interface WebHTMLRepresentationPrivate : NSObject
47 {
48 @public
49     WebDataSource *dataSource;
50     WebFrameBridge *bridge;
51     NSData *parsedArchiveData;
52 }
53 @end
54
55 @implementation WebHTMLRepresentationPrivate
56
57 - (void)dealloc
58 {
59     [parsedArchiveData release];
60     [super dealloc];
61 }
62
63 @end
64
65 @implementation WebHTMLRepresentation
66
67 + (NSArray *)supportedMIMETypes
68 {
69     return [WebCoreFrameBridge supportedMIMETypes];
70 }
71
72 - init
73 {
74     self = [super init];
75     if (!self)
76         return nil;
77     
78     _private = [[WebHTMLRepresentationPrivate alloc] init];
79     
80     ++WebHTMLRepresentationCount;
81     
82     return self;
83 }
84
85 - (void)dealloc
86 {
87     --WebHTMLRepresentationCount;
88     
89     [_private release];
90
91     [super dealloc];
92 }
93
94 - (void)finalize
95 {
96     --WebHTMLRepresentationCount;
97
98     [super finalize];
99 }
100
101 - (WebFrameBridge *)_bridge
102 {
103     return _private->bridge;
104 }
105
106 - (void)setDataSource:(WebDataSource *)dataSource
107 {
108     _private->dataSource = dataSource;
109     _private->bridge = [[dataSource webFrame] _bridge];
110 }
111
112 - (BOOL)_isDisplayingWebArchive
113 {
114     return [[[_private->dataSource response] MIMEType] _webkit_isCaseInsensitiveEqualToString:@"application/x-webarchive"];
115 }
116
117 - (void)receivedData:(NSData *)data withDataSource:(WebDataSource *)dataSource
118 {
119     if ([dataSource webFrame] && ![self _isDisplayingWebArchive]) {
120         [_private->bridge receivedData:data textEncodingName:[[_private->dataSource response] textEncodingName]];
121     }
122 }
123
124 - (void)receivedError:(NSError *)error withDataSource:(WebDataSource *)dataSource
125 {
126 }
127
128 - (void)loadArchive
129 {
130     WebArchive *archive = [[WebArchive alloc] initWithData:[_private->dataSource data]];
131     [[_private->dataSource webFrame] loadArchive:archive];
132 }
133
134 - (void)finishedLoadingWithDataSource:(WebDataSource *)dataSource
135 {
136     WebFrame *frame = [dataSource webFrame];
137     if (frame) {
138         if ([self _isDisplayingWebArchive]) {
139             [self loadArchive];
140         } else {
141             // Telling the bridge we received some data and passing nil as the data is our
142             // way to get work done that is normally done when the first bit of data is
143             // received, even for the case of a document with no data (like about:blank).
144             [_private->bridge receivedData:nil textEncodingName:[[_private->dataSource response] textEncodingName]];
145         }
146         
147         WebView *webView = [frame webView];
148         if ([webView isEditable]) {
149             [_private->bridge applyEditingStyleToBodyElement];
150         }
151     }
152 }
153
154 - (BOOL)canProvideDocumentSource
155 {
156     return [_private->bridge canProvideDocumentSource];
157 }
158
159 - (BOOL)canSaveAsWebArchive
160 {
161     return [_private->bridge canSaveAsWebArchive];
162 }
163
164 - (NSString *)documentSource
165 {
166     NSData *data = [_private->dataSource data];
167     CFStringEncoding encoding = [_private->bridge textEncoding];
168     return [WebFrameBridge stringWithData:data textEncoding:encoding];
169 }
170
171 - (NSString *)title
172 {
173     return [_private->dataSource _title];
174 }
175
176 - (DOMDocument *)DOMDocument
177 {
178     return [_private->bridge DOMDocument];
179 }
180
181 - (NSAttributedString *)attributedText
182 {
183     // FIXME:  Implement
184     return nil;
185 }
186
187 - (NSAttributedString *)attributedStringFrom: (DOMNode *)startNode startOffset: (int)startOffset to: (DOMNode *)endNode endOffset: (int)endOffset
188 {
189     return [_private->bridge attributedStringFrom: startNode startOffset: startOffset to: endNode endOffset: endOffset];
190 }
191
192 - (DOMElement *)elementWithName:(NSString *)name inForm:(DOMElement *)form
193 {
194     return [_private->bridge elementWithName:name inForm:form];
195 }
196
197 - (BOOL)elementDoesAutoComplete:(DOMElement *)element
198 {
199     return [_private->bridge elementDoesAutoComplete:element];
200 }
201
202 - (BOOL)elementIsPassword:(DOMElement *)element
203 {
204     return [_private->bridge elementIsPassword:element];
205 }
206
207 - (DOMElement *)formForElement:(DOMElement *)element
208 {
209     return [_private->bridge formForElement:element];
210 }
211
212 - (DOMElement *)currentForm
213 {
214     return [_private->bridge currentForm];
215 }
216
217 - (NSArray *)controlsInForm:(DOMElement *)form
218 {
219     return [_private->bridge controlsInForm:form];
220 }
221
222 - (NSString *)searchForLabels:(NSArray *)labels beforeElement:(DOMElement *)element
223 {
224     return [_private->bridge searchForLabels:labels beforeElement:element];
225 }
226
227 - (NSString *)matchLabels:(NSArray *)labels againstElement:(DOMElement *)element
228 {
229     return [_private->bridge matchLabels:labels againstElement:element];
230 }
231
232 @end