[Release] Webkit2-efl-123997_0.11.86
[framework/web/webkit-efl.git] / Source / 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 "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 }