⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 domcoreclasses.cpp

📁 linux下开源浏览器WebKit的源码,市面上的很多商用浏览器都是移植自WebKit
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/* * Copyright (C) 2006, 2007, 2009 Apple Inc.  All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in the *    documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.  */#include "config.h"#include "WebKitDLL.h"#include "DOMCoreClasses.h"#include "COMPtr.h"#include "DOMCSSClasses.h"#include "DOMEventsClasses.h"#include "DOMHTMLClasses.h"#include "WebKitGraphics.h"#pragma warning(push, 0)#include <WebCore/BString.h>#include <WebCore/DOMWindow.h>#include <WebCore/Document.h>#include <WebCore/Element.h>#include <WebCore/Frame.h>#include <WebCore/SimpleFontData.h>#include <WebCore/HTMLFormElement.h>#include <WebCore/HTMLInputElement.h>#include <WebCore/HTMLNames.h>#include <WebCore/HTMLOptionElement.h>#include <WebCore/HTMLSelectElement.h>#include <WebCore/HTMLTextAreaElement.h>#include <WebCore/NodeList.h>#include <WebCore/RenderObject.h>#pragma warning(pop)#include <initguid.h>// {3B0C0EFF-478B-4b0b-8290-D2321E08E23E}DEFINE_GUID(IID_DOMElement, 0x3b0c0eff, 0x478b, 0x4b0b, 0x82, 0x90, 0xd2, 0x32, 0x1e, 0x8, 0xe2, 0x3e);// Our normal style is just to say "using namespace WebCore" rather than having// individual using directives for each type from that namespace. But// "DOMObject" exists both in the WebCore namespace and unnamespaced in this// file, which leads to ambiguities if we say "using namespace WebCore".using namespace WebCore::HTMLNames;using WebCore::AtomicString;using WebCore::BString;using WebCore::Element;using WebCore::ExceptionCode;using WebCore::FontDescription;using WebCore::Frame;using WebCore::IntRect;using WebCore::String;// DOMObject - IUnknown -------------------------------------------------------HRESULT STDMETHODCALLTYPE DOMObject::QueryInterface(REFIID riid, void** ppvObject){    *ppvObject = 0;    if (IsEqualGUID(riid, IID_IDOMObject))        *ppvObject = static_cast<IDOMObject*>(this);    else        return WebScriptObject::QueryInterface(riid, ppvObject);    AddRef();    return S_OK;}// DOMNode - IUnknown ---------------------------------------------------------HRESULT STDMETHODCALLTYPE DOMNode::QueryInterface(REFIID riid, void** ppvObject){    *ppvObject = 0;    if (IsEqualGUID(riid, IID_IDOMNode))        *ppvObject = static_cast<IDOMNode*>(this);    else if (IsEqualGUID(riid, __uuidof(DOMNode)))        *ppvObject = static_cast<DOMNode*>(this);    else        return DOMObject::QueryInterface(riid, ppvObject);    AddRef();    return S_OK;}// DOMNode --------------------------------------------------------------------HRESULT STDMETHODCALLTYPE DOMNode::nodeName(     /* [retval][out] */ BSTR* /*result*/){    ASSERT_NOT_REACHED();    return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE DOMNode::nodeValue(     /* [retval][out] */ BSTR* result){    if (!m_node)        return E_FAIL;    WebCore::String nodeValueStr = m_node->nodeValue();    *result = SysAllocStringLen(nodeValueStr.characters(), nodeValueStr.length());    if (nodeValueStr.length() && !*result)        return E_OUTOFMEMORY;    return S_OK;}HRESULT STDMETHODCALLTYPE DOMNode::setNodeValue(     /* [in] */ BSTR /*value*/){    ASSERT_NOT_REACHED();    return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE DOMNode::nodeType(     /* [retval][out] */ unsigned short* /*result*/){    ASSERT_NOT_REACHED();    return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE DOMNode::parentNode(     /* [retval][out] */ IDOMNode** result){    *result = 0;    if (!m_node || !m_node->parentNode())        return E_FAIL;    *result = DOMNode::createInstance(m_node->parentNode());    return *result ? S_OK : E_FAIL;}HRESULT STDMETHODCALLTYPE DOMNode::childNodes(     /* [retval][out] */ IDOMNodeList** /*result*/){    ASSERT_NOT_REACHED();    return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE DOMNode::firstChild(     /* [retval][out] */ IDOMNode** /*result*/){    ASSERT_NOT_REACHED();    return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE DOMNode::lastChild(     /* [retval][out] */ IDOMNode** /*result*/){    ASSERT_NOT_REACHED();    return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE DOMNode::previousSibling(     /* [retval][out] */ IDOMNode** /*result*/){    ASSERT_NOT_REACHED();    return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE DOMNode::nextSibling(     /* [retval][out] */ IDOMNode** /*result*/){    ASSERT_NOT_REACHED();    return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE DOMNode::attributes(     /* [retval][out] */ IDOMNamedNodeMap** /*result*/){    ASSERT_NOT_REACHED();    return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE DOMNode::ownerDocument(     /* [retval][out] */ IDOMDocument** result){    if (!result)        return E_POINTER;    *result = 0;    if (!m_node)        return E_FAIL;    *result = DOMDocument::createInstance(m_node->ownerDocument());    return *result ? S_OK : E_FAIL;}HRESULT STDMETHODCALLTYPE DOMNode::insertBefore(     /* [in] */ IDOMNode* /*newChild*/,    /* [in] */ IDOMNode* /*refChild*/,    /* [retval][out] */ IDOMNode** /*result*/){    ASSERT_NOT_REACHED();    return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE DOMNode::replaceChild(     /* [in] */ IDOMNode* /*newChild*/,    /* [in] */ IDOMNode* /*oldChild*/,    /* [retval][out] */ IDOMNode** /*result*/){    ASSERT_NOT_REACHED();    return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE DOMNode::removeChild(     /* [in] */ IDOMNode* /*oldChild*/,    /* [retval][out] */ IDOMNode** /*result*/){    ASSERT_NOT_REACHED();    return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE DOMNode::appendChild(     /* [in] */ IDOMNode* /*oldChild*/,    /* [retval][out] */ IDOMNode** /*result*/){    ASSERT_NOT_REACHED();    return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE DOMNode::hasChildNodes(     /* [retval][out] */ BOOL* /*result*/){    ASSERT_NOT_REACHED();    return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE DOMNode::cloneNode(     /* [in] */ BOOL /*deep*/,    /* [retval][out] */ IDOMNode** /*result*/){    ASSERT_NOT_REACHED();    return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE DOMNode::normalize( void){    ASSERT_NOT_REACHED();    return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE DOMNode::isSupported(     /* [in] */ BSTR /*feature*/,    /* [in] */ BSTR /*version*/,    /* [retval][out] */ BOOL* /*result*/){    ASSERT_NOT_REACHED();    return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE DOMNode::namespaceURI(     /* [retval][out] */ BSTR* /*result*/){    ASSERT_NOT_REACHED();    return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE DOMNode::prefix(     /* [retval][out] */ BSTR* /*result*/){    ASSERT_NOT_REACHED();    return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE DOMNode::setPrefix(     /* [in] */ BSTR /*prefix*/){    ASSERT_NOT_REACHED();    return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE DOMNode::localName(     /* [retval][out] */ BSTR* /*result*/){    ASSERT_NOT_REACHED();    return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE DOMNode::hasAttributes(     /* [retval][out] */ BOOL* /*result*/){    ASSERT_NOT_REACHED();    return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE DOMNode::isSameNode(     /* [in] */ IDOMNode* other,    /* [retval][out] */ BOOL* result){    if (!result) {        ASSERT_NOT_REACHED();        return E_POINTER;    }    *result = FALSE;    if (!other)        return E_POINTER;    COMPtr<DOMNode> domOther;    HRESULT hr = other->QueryInterface(__uuidof(DOMNode), (void**)&domOther);    if (FAILED(hr))        return hr;    *result = m_node->isSameNode(domOther->node()) ? TRUE : FALSE;    return S_OK;}HRESULT STDMETHODCALLTYPE DOMNode::isEqualNode(     /* [in] */ IDOMNode* /*other*/,    /* [retval][out] */ BOOL* /*result*/){    ASSERT_NOT_REACHED();    return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE DOMNode::textContent(     /* [retval][out] */ BSTR* result){    if (!result)        return E_POINTER;    *result = BString(m_node->textContent()).release();    return S_OK;}HRESULT STDMETHODCALLTYPE DOMNode::setTextContent(     /* [in] */ BSTR /*text*/){    ASSERT_NOT_REACHED();    return E_NOTIMPL;}// DOMNode - IDOMEventTarget --------------------------------------------------HRESULT STDMETHODCALLTYPE DOMNode::addEventListener(     /* [in] */ BSTR /*type*/,    /* [in] */ IDOMEventListener* /*listener*/,    /* [in] */ BOOL /*useCapture*/){    return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE DOMNode::removeEventListener(     /* [in] */ BSTR /*type*/,    /* [in] */ IDOMEventListener* /*listener*/,    /* [in] */ BOOL /*useCapture*/){    return E_NOTIMPL;}HRESULT STDMETHODCALLTYPE DOMNode::dispatchEvent(     /* [in] */ IDOMEvent* evt,    /* [retval][out] */ BOOL* result){    if (!m_node || !evt)        return E_FAIL;#if 0   // FIXME - raise dom exceptions    if (![self _node]->isEventTargetNode())        WebCore::raiseDOMException(DOM_NOT_SUPPORTED_ERR);#endif    COMPtr<DOMEvent> domEvent;    HRESULT hr = evt->QueryInterface(IID_DOMEvent, (void**) &domEvent);    if (FAILED(hr))        return hr;    WebCore::ExceptionCode ec = 0;    *result = m_node->dispatchEvent(domEvent->coreEvent(), ec) ? TRUE : FALSE;#if 0   // FIXME - raise dom exceptions    WebCore::raiseOnDOMError(ec);#endif    return S_OK;}// DOMNode - DOMNode ----------------------------------------------------------DOMNode::DOMNode(WebCore::Node* n): m_node(0){    if (n)        n->ref();    m_node = n;}DOMNode::~DOMNode(){    if (m_node)        m_node->deref();}IDOMNode* DOMNode::createInstance(WebCore::Node* n){    if (!n)        return 0;    HRESULT hr = S_OK;    IDOMNode* domNode = 0;    WebCore::Node::NodeType nodeType = n->nodeType();    switch (nodeType) {        case WebCore::Node::ELEMENT_NODE:         {            IDOMElement* newElement = DOMElement::createInstance(static_cast<WebCore::Element*>(n));            if (newElement) {                hr = newElement->QueryInterface(IID_IDOMNode, (void**)&domNode);                newElement->Release();            }        }        break;        case WebCore::Node::DOCUMENT_NODE:        {            IDOMDocument* newDocument = DOMDocument::createInstance(n->document());            if (newDocument) {                hr = newDocument->QueryInterface(IID_IDOMNode, (void**)&domNode);                newDocument->Release();            }        }        break;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -