📄 domcoreclasses.cpp
字号:
/* * 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 + -