|
1 /* |
|
2 * Copyright (C) 2006, 2007 Apple, 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 * 1. Redistributions of source code must retain the above copyright |
|
8 * notice, this list of conditions and the following disclaimer. |
|
9 * 2. Redistributions in binary form must reproduce the above copyright |
|
10 * notice, this list of conditions and the following disclaimer in the |
|
11 * documentation and/or other materials provided with the distribution. |
|
12 * |
|
13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY |
|
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
|
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
|
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR |
|
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
|
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
|
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
|
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY |
|
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
24 */ |
|
25 |
|
26 #include "config.h" |
|
27 #include "WebKitDLL.h" |
|
28 #include "WebHTMLRepresentation.h" |
|
29 |
|
30 #include "WebKit.h" |
|
31 #include "WebFrame.h" |
|
32 #include "WebKitStatisticsPrivate.h" |
|
33 #include <WebCore/BString.h> |
|
34 #include <WebCore/Frame.h> |
|
35 #include <WebCore/HTMLInputElement.h> |
|
36 #include <WebCore/TextResourceDecoder.h> |
|
37 |
|
38 using namespace WebCore; |
|
39 |
|
40 // WebHTMLRepresentation ------------------------------------------------------ |
|
41 |
|
42 WebHTMLRepresentation::WebHTMLRepresentation() |
|
43 : m_refCount(0) |
|
44 , m_frame(0) |
|
45 { |
|
46 WebHTMLRepresentationCount++; |
|
47 gClassCount++; |
|
48 gClassNameCount.add("WebHTMLRepresentation"); |
|
49 } |
|
50 |
|
51 WebHTMLRepresentation::~WebHTMLRepresentation() |
|
52 { |
|
53 if (m_frame) { |
|
54 m_frame->Release(); |
|
55 m_frame = 0; |
|
56 } |
|
57 |
|
58 WebHTMLRepresentationCount--; |
|
59 gClassCount--; |
|
60 gClassNameCount.remove("WebHTMLRepresentation"); |
|
61 } |
|
62 |
|
63 WebHTMLRepresentation* WebHTMLRepresentation::createInstance(WebFrame* frame) |
|
64 { |
|
65 WebHTMLRepresentation* instance = new WebHTMLRepresentation(); |
|
66 instance->m_frame = frame; |
|
67 frame->AddRef(); |
|
68 instance->AddRef(); |
|
69 return instance; |
|
70 } |
|
71 |
|
72 // IUnknown ------------------------------------------------------------------- |
|
73 |
|
74 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::QueryInterface(REFIID riid, void** ppvObject) |
|
75 { |
|
76 *ppvObject = 0; |
|
77 if (IsEqualGUID(riid, IID_IUnknown)) |
|
78 *ppvObject = static_cast<IWebHTMLRepresentation*>(this); |
|
79 else if (IsEqualGUID(riid, IID_IWebHTMLRepresentation)) |
|
80 *ppvObject = static_cast<IWebHTMLRepresentation*>(this); |
|
81 else if (IsEqualGUID(riid, IID_IWebDocumentRepresentation)) |
|
82 *ppvObject = static_cast<IWebDocumentRepresentation*>(this); |
|
83 else |
|
84 return E_NOINTERFACE; |
|
85 |
|
86 AddRef(); |
|
87 return S_OK; |
|
88 } |
|
89 |
|
90 ULONG STDMETHODCALLTYPE WebHTMLRepresentation::AddRef() |
|
91 { |
|
92 return ++m_refCount; |
|
93 } |
|
94 |
|
95 ULONG STDMETHODCALLTYPE WebHTMLRepresentation::Release() |
|
96 { |
|
97 ULONG newRef = --m_refCount; |
|
98 if (!newRef) |
|
99 delete(this); |
|
100 |
|
101 return newRef; |
|
102 } |
|
103 |
|
104 // IWebHTMLRepresentation -------------------------------------------------------------------- |
|
105 |
|
106 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::supportedMIMETypes( |
|
107 /* [out][in] */ BSTR* /*types*/, |
|
108 /* [out][in] */ int* /*cTypes*/) |
|
109 { |
|
110 ASSERT_NOT_REACHED(); |
|
111 return E_NOTIMPL; |
|
112 } |
|
113 |
|
114 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::supportedNonImageMIMETypes( |
|
115 /* [out][in] */ BSTR* /*types*/, |
|
116 /* [out][in] */ int* /*cTypes*/) |
|
117 { |
|
118 ASSERT_NOT_REACHED(); |
|
119 return E_NOTIMPL; |
|
120 } |
|
121 |
|
122 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::supportedImageMIMETypes( |
|
123 /* [out][in] */ BSTR* /*types*/, |
|
124 /* [out][in] */ int* /*cTypes*/) |
|
125 { |
|
126 ASSERT_NOT_REACHED(); |
|
127 return E_NOTIMPL; |
|
128 } |
|
129 |
|
130 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::attributedStringFromDOMNodes( |
|
131 /* [in] */ IDOMNode* /*startNode*/, |
|
132 /* [in] */ int /*startOffset*/, |
|
133 /* [in] */ IDOMNode* /*endNode*/, |
|
134 /* [in] */ int /*endOffset*/, |
|
135 /* [retval][out] */ IDataObject** /*attributedString*/) |
|
136 { |
|
137 ASSERT_NOT_REACHED(); |
|
138 return E_NOTIMPL; |
|
139 } |
|
140 |
|
141 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::elementWithName( |
|
142 /* [in] */ BSTR name, |
|
143 /* [in] */ IDOMElement* form, |
|
144 /* [retval][out] */ IDOMElement** element) |
|
145 { |
|
146 if (!m_frame) |
|
147 return E_FAIL; |
|
148 |
|
149 return m_frame->elementWithName(name, form, element); |
|
150 } |
|
151 |
|
152 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::elementDoesAutoComplete( |
|
153 /* [in] */ IDOMElement* element, |
|
154 /* [retval][out] */ BOOL* result) |
|
155 { |
|
156 BOOL doesAutoComplete; |
|
157 HRESULT hr = m_frame->elementDoesAutoComplete(element, &doesAutoComplete); |
|
158 *result = doesAutoComplete ? TRUE : FALSE; |
|
159 return hr; |
|
160 } |
|
161 |
|
162 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::elementIsPassword( |
|
163 /* [in] */ IDOMElement* element, |
|
164 /* [retval][out] */ BOOL* result) |
|
165 { |
|
166 bool isPassword; |
|
167 HRESULT hr = m_frame->elementIsPassword(element, &isPassword); |
|
168 *result = isPassword ? TRUE : FALSE; |
|
169 return hr; |
|
170 } |
|
171 |
|
172 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::formForElement( |
|
173 /* [in] */ IDOMElement* element, |
|
174 /* [retval][out] */ IDOMElement** form) |
|
175 { |
|
176 if (!m_frame) |
|
177 return E_FAIL; |
|
178 |
|
179 return m_frame->formForElement(element, form); |
|
180 } |
|
181 |
|
182 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::currentForm( |
|
183 /* [retval][out] */ IDOMElement** form) |
|
184 { |
|
185 if (!m_frame) |
|
186 return E_FAIL; |
|
187 |
|
188 return m_frame->currentForm(form); |
|
189 } |
|
190 |
|
191 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::controlsInForm( |
|
192 /* [in] */ IDOMElement* form, |
|
193 /* [out][in] */ IDOMElement** controls, |
|
194 /* [out][in] */ int* cControls) |
|
195 { |
|
196 return m_frame->controlsInForm(form, controls, cControls); |
|
197 } |
|
198 |
|
199 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::deprecatedSearchForLabels( |
|
200 /* [size_is][in] */ BSTR* labels, |
|
201 /* [in] */ int cLabels, |
|
202 /* [in] */ IDOMElement* beforeElement, |
|
203 /* [retval][out] */ BSTR* result) |
|
204 { |
|
205 return m_frame->searchForLabelsBeforeElement(labels, cLabels, beforeElement, 0, 0, result); |
|
206 } |
|
207 |
|
208 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::matchLabels( |
|
209 /* [size_is][in] */ BSTR* labels, |
|
210 /* [in] */ int cLabels, |
|
211 /* [in] */ IDOMElement* againstElement, |
|
212 /* [retval][out] */ BSTR* result) |
|
213 { |
|
214 return m_frame->matchLabelsAgainstElement(labels, cLabels, againstElement, result); |
|
215 } |
|
216 |
|
217 HRESULT WebHTMLRepresentation::searchForLabels(BSTR* labels, unsigned cLabels, IDOMElement* beforeElement, unsigned* resultDistance, BOOL* resultIsInCellAbove, BSTR* result) |
|
218 { |
|
219 return m_frame->searchForLabelsBeforeElement(labels, cLabels, beforeElement, resultDistance, resultIsInCellAbove, result); |
|
220 } |
|
221 |
|
222 // IWebDocumentRepresentation ---------------------------------------------------------------- |
|
223 |
|
224 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::setDataSource( |
|
225 /* [in] */ IWebDataSource* /*dataSource*/) |
|
226 { |
|
227 ASSERT_NOT_REACHED(); |
|
228 return E_NOTIMPL; |
|
229 } |
|
230 |
|
231 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::receivedData( |
|
232 /* [in] */ IStream* /*data*/, |
|
233 /* [in] */ IWebDataSource* /*dataSource*/) |
|
234 { |
|
235 ASSERT_NOT_REACHED(); |
|
236 return E_NOTIMPL; |
|
237 } |
|
238 |
|
239 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::receivedError( |
|
240 /* [in] */ IWebError* /*error*/, |
|
241 /* [in] */ IWebDataSource* /*dataSource*/) |
|
242 { |
|
243 ASSERT_NOT_REACHED(); |
|
244 return E_NOTIMPL; |
|
245 } |
|
246 |
|
247 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::finishedLoadingWithDataSource( |
|
248 /* [in] */ IWebDataSource* /*dataSource*/) |
|
249 { |
|
250 ASSERT_NOT_REACHED(); |
|
251 return E_NOTIMPL; |
|
252 } |
|
253 |
|
254 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::canProvideDocumentSource( |
|
255 /* [retval][out] */ BOOL* result) |
|
256 { |
|
257 bool canProvideSource; |
|
258 HRESULT hr = this->m_frame->canProvideDocumentSource(&canProvideSource); |
|
259 *result = canProvideSource ? TRUE : FALSE; |
|
260 return hr; |
|
261 } |
|
262 |
|
263 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::documentSource( |
|
264 /* [retval][out] */ BSTR* source) |
|
265 { |
|
266 if (!source) |
|
267 return E_FAIL; |
|
268 |
|
269 *source = 0; |
|
270 |
|
271 HRESULT hr = S_OK; |
|
272 |
|
273 COMPtr<IWebDataSource> dataSource; |
|
274 hr = m_frame->dataSource(&dataSource); |
|
275 if (FAILED(hr)) |
|
276 return hr; |
|
277 |
|
278 COMPtr<IStream> data; |
|
279 hr = dataSource->data(&data); |
|
280 if (FAILED(hr)) |
|
281 return hr; |
|
282 |
|
283 STATSTG stat; |
|
284 hr = data->Stat(&stat, STATFLAG_NONAME); |
|
285 if (FAILED(hr)) |
|
286 return hr; |
|
287 |
|
288 if (stat.cbSize.HighPart || !stat.cbSize.LowPart) |
|
289 return E_FAIL; |
|
290 |
|
291 Vector<char> dataBuffer(stat.cbSize.LowPart); |
|
292 ULONG read; |
|
293 |
|
294 hr = data->Read(dataBuffer.data(), static_cast<ULONG>(dataBuffer.size()), &read); |
|
295 if (FAILED(hr)) |
|
296 return hr; |
|
297 |
|
298 WebCore::Frame* frame = core(m_frame); |
|
299 if (!frame) |
|
300 return E_FAIL; |
|
301 |
|
302 WebCore::Document* doc = frame->document(); |
|
303 if (!doc) |
|
304 return E_FAIL; |
|
305 |
|
306 WebCore::TextResourceDecoder* decoder = doc->decoder(); |
|
307 if (!decoder) |
|
308 return E_FAIL; |
|
309 |
|
310 *source = WebCore::BString(decoder->encoding().decode(dataBuffer.data(), dataBuffer.size())).release(); |
|
311 return S_OK; |
|
312 } |
|
313 |
|
314 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::title( |
|
315 /* [retval][out] */ BSTR* /*docTitle*/) |
|
316 { |
|
317 ASSERT_NOT_REACHED(); |
|
318 return E_NOTIMPL; |
|
319 } |