WebCore:
[WebKit-https.git] / WebKit / win / WebHTMLRepresentation.cpp
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 "DOMCore.h"
31 #include "WebFrame.h"
32 #include "WebKitStatisticsPrivate.h"
33 #pragma warning(push, 0)
34 #include <WebCore/BString.h>
35 #include <WebCore/HTMLInputElement.h>
36 #include <WebCore/TextResourceDecoder.h>
37 #pragma warning(pop)
38
39 using namespace WebCore;
40
41 // WebHTMLRepresentation ------------------------------------------------------
42
43 WebHTMLRepresentation::WebHTMLRepresentation()
44     : m_refCount(0)
45     , m_frame(0)
46 {
47     WebHTMLRepresentationCount++;
48     gClassCount++;
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 }
61
62 WebHTMLRepresentation* WebHTMLRepresentation::createInstance(WebFrame* frame)
63 {
64     WebHTMLRepresentation* instance = new WebHTMLRepresentation();
65     instance->m_frame = frame;
66     frame->AddRef();
67     instance->AddRef();
68     return instance;
69 }
70
71 // IUnknown -------------------------------------------------------------------
72
73 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::QueryInterface(REFIID riid, void** ppvObject)
74 {
75     *ppvObject = 0;
76     if (IsEqualGUID(riid, IID_IUnknown))
77         *ppvObject = static_cast<IWebHTMLRepresentation*>(this);
78     else if (IsEqualGUID(riid, IID_IWebHTMLRepresentation))
79         *ppvObject = static_cast<IWebHTMLRepresentation*>(this);
80     else if (IsEqualGUID(riid, IID_IWebDocumentRepresentation))
81         *ppvObject = static_cast<IWebDocumentRepresentation*>(this);
82     else
83         return E_NOINTERFACE;
84
85     AddRef();
86     return S_OK;
87 }
88
89 ULONG STDMETHODCALLTYPE WebHTMLRepresentation::AddRef()
90 {
91     return ++m_refCount;
92 }
93
94 ULONG STDMETHODCALLTYPE WebHTMLRepresentation::Release()
95 {
96     ULONG newRef = --m_refCount;
97     if (!newRef)
98         delete(this);
99
100     return newRef;
101 }
102
103 // IWebHTMLRepresentation --------------------------------------------------------------------
104
105 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::supportedMIMETypes( 
106         /* [out][in] */ BSTR* /*types*/,
107         /* [out][in] */ int* /*cTypes*/)
108 {
109     ASSERT_NOT_REACHED();
110     return E_NOTIMPL;
111 }
112     
113 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::supportedNonImageMIMETypes( 
114         /* [out][in] */ BSTR* /*types*/,
115         /* [out][in] */ int* /*cTypes*/)
116 {
117     ASSERT_NOT_REACHED();
118     return E_NOTIMPL;
119 }
120     
121 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::supportedImageMIMETypes( 
122         /* [out][in] */ BSTR* /*types*/,
123         /* [out][in] */ int* /*cTypes*/)
124 {
125     ASSERT_NOT_REACHED();
126     return E_NOTIMPL;
127 }
128     
129 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::attributedStringFromDOMNodes( 
130         /* [in] */ IDOMNode* /*startNode*/,
131         /* [in] */ int /*startOffset*/,
132         /* [in] */ IDOMNode* /*endNode*/,
133         /* [in] */ int /*endOffset*/,
134         /* [retval][out] */ IDataObject** /*attributedString*/)
135 {
136     ASSERT_NOT_REACHED();
137     return E_NOTIMPL;
138 }
139     
140 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::elementWithName( 
141         /* [in] */ BSTR name,
142         /* [in] */ IDOMElement* form,
143         /* [retval][out] */ IDOMElement** element)
144 {
145     if (!m_frame)
146         return E_FAIL;
147
148     return m_frame->elementWithName(name, form, element);
149 }
150     
151 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::elementDoesAutoComplete( 
152         /* [in] */ IDOMElement* element,
153         /* [retval][out] */ BOOL* result)
154 {
155     bool doesAutoComplete;
156     HRESULT hr = m_frame->elementDoesAutoComplete(element, &doesAutoComplete);
157     *result = doesAutoComplete ? TRUE : FALSE;
158     return hr;
159 }
160     
161 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::elementIsPassword( 
162         /* [in] */ IDOMElement* element,
163         /* [retval][out] */ BOOL* result)
164 {
165     bool isPassword;
166     HRESULT hr = m_frame->elementIsPassword(element, &isPassword);
167     *result = isPassword ?  TRUE : FALSE;
168     return hr;
169 }
170     
171 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::formForElement( 
172         /* [in] */ IDOMElement* element,
173         /* [retval][out] */ IDOMElement** form)
174 {
175     if (!m_frame)
176         return E_FAIL;
177
178     return m_frame->formForElement(element, form);
179 }
180     
181 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::currentForm( 
182         /* [retval][out] */ IDOMElement** form)
183 {
184     if (!m_frame)
185         return E_FAIL;
186
187     return m_frame->currentForm(form);
188 }
189     
190 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::controlsInForm( 
191         /* [in] */ IDOMElement* form,
192         /* [out][in] */ IDOMElement** controls,
193         /* [out][in] */ int* cControls)
194 {
195     return m_frame->controlsInForm(form, controls, cControls);
196 }
197     
198 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::searchForLabels( 
199         /* [size_is][in] */ BSTR* labels,
200         /* [in] */ int cLabels,
201         /* [in] */ IDOMElement* beforeElement,
202         /* [retval][out] */ BSTR* result)
203 {
204     return m_frame->searchForLabelsBeforeElement(labels, cLabels, beforeElement, result);
205 }
206     
207 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::matchLabels( 
208         /* [size_is][in] */ BSTR* labels,
209         /* [in] */ int cLabels,
210         /* [in] */ IDOMElement* againstElement,
211         /* [retval][out] */ BSTR* result)
212 {
213     return m_frame->matchLabelsAgainstElement(labels, cLabels, againstElement, result);
214 }
215
216 // IWebDocumentRepresentation ----------------------------------------------------------------
217
218 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::setDataSource( 
219         /* [in] */ IWebDataSource* /*dataSource*/)
220 {
221     ASSERT_NOT_REACHED();
222     return E_NOTIMPL;
223 }
224     
225 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::receivedData( 
226         /* [in] */ IStream* /*data*/,
227         /* [in] */ IWebDataSource* /*dataSource*/)
228 {
229     ASSERT_NOT_REACHED();
230     return E_NOTIMPL;
231 }
232     
233 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::receivedError( 
234         /* [in] */ IWebError* /*error*/,
235         /* [in] */ IWebDataSource* /*dataSource*/)
236 {
237     ASSERT_NOT_REACHED();
238     return E_NOTIMPL;
239 }
240     
241 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::finishedLoadingWithDataSource( 
242         /* [in] */ IWebDataSource* /*dataSource*/)
243 {
244     ASSERT_NOT_REACHED();
245     return E_NOTIMPL;
246 }
247     
248 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::canProvideDocumentSource( 
249         /* [retval][out] */ BOOL* result)
250 {
251     bool canProvideSource;
252     HRESULT hr = this->m_frame->canProvideDocumentSource(&canProvideSource);
253     *result = canProvideSource ? TRUE : FALSE;
254     return hr;
255 }
256     
257 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::documentSource( 
258         /* [retval][out] */ BSTR* source)
259 {
260     if (!source)
261         return E_FAIL;
262
263     *source = 0;
264
265     HRESULT hr = S_OK;
266
267     COMPtr<IWebDataSource> dataSource;
268     hr = m_frame->dataSource(&dataSource);
269     if (FAILED(hr))
270         return hr;
271
272     COMPtr<IStream> data;
273     hr = dataSource->data(&data);
274     if (FAILED(hr))
275         return hr;
276
277     STATSTG stat;
278     hr = data->Stat(&stat, STATFLAG_NONAME);
279     if (FAILED(hr))
280         return hr;
281
282     if (stat.cbSize.HighPart || !stat.cbSize.LowPart)
283         return E_FAIL;
284
285     Vector<char> dataBuffer(stat.cbSize.LowPart);
286     ULONG read;
287     
288     hr = data->Read(dataBuffer.data(), static_cast<ULONG>(dataBuffer.size()), &read);
289     if (FAILED(hr))
290         return hr;
291
292     WebCore::Frame* frame = core(m_frame);
293     if (!frame)
294         return E_FAIL;
295
296     WebCore::Document* doc = frame->document();
297     if (!doc)
298         return E_FAIL;
299
300     WebCore::TextResourceDecoder* decoder = doc->decoder();
301     if (!decoder)
302         return E_FAIL;
303
304     *source = WebCore::BString(decoder->encoding().decode(dataBuffer.data(), dataBuffer.size())).release();
305     return S_OK;
306 }
307     
308 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::title( 
309         /* [retval][out] */ BSTR* /*docTitle*/)
310 {
311     ASSERT_NOT_REACHED();
312     return E_NOTIMPL;
313 }