WebKit/win/WebHTMLRepresentation.cpp
changeset 0 4f2f89ce4247
equal deleted inserted replaced
-1:000000000000 0:4f2f89ce4247
       
     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 }