• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
WebHTMLRepresentation()42 WebHTMLRepresentation::WebHTMLRepresentation()
43     : m_refCount(0)
44     , m_frame(0)
45 {
46     WebHTMLRepresentationCount++;
47     gClassCount++;
48     gClassNameCount.add("WebHTMLRepresentation");
49 }
50 
~WebHTMLRepresentation()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 
createInstance(WebFrame * frame)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 
QueryInterface(REFIID riid,void ** ppvObject)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 
AddRef()90 ULONG STDMETHODCALLTYPE WebHTMLRepresentation::AddRef()
91 {
92     return ++m_refCount;
93 }
94 
Release()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 
supportedMIMETypes(BSTR *,int *)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 
supportedNonImageMIMETypes(BSTR *,int *)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 
supportedImageMIMETypes(BSTR *,int *)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 
attributedStringFromDOMNodes(IDOMNode *,int,IDOMNode *,int,IDataObject **)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 
elementWithName(BSTR name,IDOMElement * form,IDOMElement ** element)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 
elementDoesAutoComplete(IDOMElement * element,BOOL * result)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 
elementIsPassword(IDOMElement * element,BOOL * result)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 
formForElement(IDOMElement * element,IDOMElement ** form)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 
currentForm(IDOMElement ** form)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 
controlsInForm(IDOMElement * form,IDOMElement ** controls,int * cControls)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 
deprecatedSearchForLabels(BSTR * labels,int cLabels,IDOMElement * beforeElement,BSTR * result)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 
matchLabels(BSTR * labels,int cLabels,IDOMElement * againstElement,BSTR * result)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 
searchForLabels(BSTR * labels,unsigned cLabels,IDOMElement * beforeElement,unsigned * resultDistance,BOOL * resultIsInCellAbove,BSTR * result)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 
setDataSource(IWebDataSource *)224 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::setDataSource(
225         /* [in] */ IWebDataSource* /*dataSource*/)
226 {
227     ASSERT_NOT_REACHED();
228     return E_NOTIMPL;
229 }
230 
receivedData(IStream *,IWebDataSource *)231 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::receivedData(
232         /* [in] */ IStream* /*data*/,
233         /* [in] */ IWebDataSource* /*dataSource*/)
234 {
235     ASSERT_NOT_REACHED();
236     return E_NOTIMPL;
237 }
238 
receivedError(IWebError *,IWebDataSource *)239 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::receivedError(
240         /* [in] */ IWebError* /*error*/,
241         /* [in] */ IWebDataSource* /*dataSource*/)
242 {
243     ASSERT_NOT_REACHED();
244     return E_NOTIMPL;
245 }
246 
finishedLoadingWithDataSource(IWebDataSource *)247 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::finishedLoadingWithDataSource(
248         /* [in] */ IWebDataSource* /*dataSource*/)
249 {
250     ASSERT_NOT_REACHED();
251     return E_NOTIMPL;
252 }
253 
canProvideDocumentSource(BOOL * result)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 
documentSource(BSTR * source)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 
title(BSTR *)314 HRESULT STDMETHODCALLTYPE WebHTMLRepresentation::title(
315         /* [retval][out] */ BSTR* /*docTitle*/)
316 {
317     ASSERT_NOT_REACHED();
318     return E_NOTIMPL;
319 }
320