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 } 320