2 * Copyright (C) 2006, 2007, 2009 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
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.
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.
27 #include "WebKitDLL.h"
28 #include "DOMCoreClasses.h"
30 #include "DOMCSSClasses.h"
31 #include "DOMEventsClasses.h"
32 #include "DOMHTMLClasses.h"
33 #include "WebKitGraphics.h"
35 #include <WebCore/BString.h>
36 #include <WebCore/COMPtr.h>
37 #include <WebCore/DOMWindow.h>
38 #include <WebCore/Document.h>
39 #include <WebCore/Element.h>
40 #include <WebCore/Frame.h>
41 #include <WebCore/SimpleFontData.h>
42 #include <WebCore/HTMLFormElement.h>
43 #include <WebCore/HTMLInputElement.h>
44 #include <WebCore/HTMLNames.h>
45 #include <WebCore/HTMLOptionElement.h>
46 #include <WebCore/HTMLSelectElement.h>
47 #include <WebCore/HTMLTextAreaElement.h>
48 #include <WebCore/NodeList.h>
49 #include <WebCore/RenderObject.h>
50 #include <WebCore/RenderTreeAsText.h>
53 // {3B0C0EFF-478B-4b0b-8290-D2321E08E23E}
54 DEFINE_GUID(IID_DOMElement, 0x3b0c0eff, 0x478b, 0x4b0b, 0x82, 0x90, 0xd2, 0x32, 0x1e, 0x8, 0xe2, 0x3e);
56 // Our normal style is just to say "using namespace WebCore" rather than having
57 // individual using directives for each type from that namespace. But
58 // "DOMObject" exists both in the WebCore namespace and unnamespaced in this
59 // file, which leads to ambiguities if we say "using namespace WebCore".
60 using namespace WebCore::HTMLNames;
61 using WTF::AtomicString;
62 using WebCore::BString;
63 using WebCore::Element;
64 using WebCore::ExceptionCode;
65 using WebCore::FontDescription;
67 using WebCore::IntRect;
70 // DOMObject - IUnknown -------------------------------------------------------
72 HRESULT STDMETHODCALLTYPE DOMObject::QueryInterface(REFIID riid, void** ppvObject)
75 if (IsEqualGUID(riid, IID_IDOMObject))
76 *ppvObject = static_cast<IDOMObject*>(this);
78 return WebScriptObject::QueryInterface(riid, ppvObject);
84 // DOMNode - IUnknown ---------------------------------------------------------
86 HRESULT STDMETHODCALLTYPE DOMNode::QueryInterface(REFIID riid, void** ppvObject)
89 if (IsEqualGUID(riid, IID_IDOMNode))
90 *ppvObject = static_cast<IDOMNode*>(this);
91 else if (IsEqualGUID(riid, __uuidof(DOMNode)))
92 *ppvObject = static_cast<DOMNode*>(this);
93 else if (IsEqualGUID(riid, __uuidof(IDOMEventTarget)))
94 *ppvObject = static_cast<IDOMEventTarget*>(this);
96 return DOMObject::QueryInterface(riid, ppvObject);
102 // DOMNode --------------------------------------------------------------------
104 HRESULT STDMETHODCALLTYPE DOMNode::nodeName(
105 /* [retval][out] */ BSTR* result)
113 *result = BString(m_node->nodeName()).release();
117 HRESULT STDMETHODCALLTYPE DOMNode::nodeValue(
118 /* [retval][out] */ BSTR* result)
122 WTF::String nodeValueStr = m_node->nodeValue();
123 *result = SysAllocStringLen(nodeValueStr.characters(), nodeValueStr.length());
124 if (nodeValueStr.length() && !*result)
125 return E_OUTOFMEMORY;
129 HRESULT STDMETHODCALLTYPE DOMNode::setNodeValue(
130 /* [in] */ BSTR /*value*/)
132 ASSERT_NOT_REACHED();
136 HRESULT STDMETHODCALLTYPE DOMNode::nodeType(
137 /* [retval][out] */ unsigned short* /*result*/)
139 ASSERT_NOT_REACHED();
143 HRESULT STDMETHODCALLTYPE DOMNode::parentNode(
144 /* [retval][out] */ IDOMNode** result)
147 if (!m_node || !m_node->parentNode())
149 *result = DOMNode::createInstance(m_node->parentNode());
150 return *result ? S_OK : E_FAIL;
153 HRESULT STDMETHODCALLTYPE DOMNode::childNodes(
154 /* [retval][out] */ IDOMNodeList** result)
162 *result = DOMNodeList::createInstance(m_node->childNodes().get());
163 return *result ? S_OK : E_FAIL;
166 HRESULT STDMETHODCALLTYPE DOMNode::firstChild(
167 /* [retval][out] */ IDOMNode** /*result*/)
169 ASSERT_NOT_REACHED();
173 HRESULT STDMETHODCALLTYPE DOMNode::lastChild(
174 /* [retval][out] */ IDOMNode** /*result*/)
176 ASSERT_NOT_REACHED();
180 HRESULT STDMETHODCALLTYPE DOMNode::previousSibling(
181 /* [retval][out] */ IDOMNode** /*result*/)
183 ASSERT_NOT_REACHED();
187 HRESULT STDMETHODCALLTYPE DOMNode::nextSibling(
188 /* [retval][out] */ IDOMNode** result)
195 *result = DOMNode::createInstance(m_node->nextSibling());
196 return *result ? S_OK : E_FAIL;
199 HRESULT STDMETHODCALLTYPE DOMNode::attributes(
200 /* [retval][out] */ IDOMNamedNodeMap** /*result*/)
202 ASSERT_NOT_REACHED();
206 HRESULT STDMETHODCALLTYPE DOMNode::ownerDocument(
207 /* [retval][out] */ IDOMDocument** result)
214 *result = DOMDocument::createInstance(m_node->ownerDocument());
215 return *result ? S_OK : E_FAIL;
218 HRESULT STDMETHODCALLTYPE DOMNode::insertBefore(
219 /* [in] */ IDOMNode* newChild,
220 /* [in] */ IDOMNode* refChild,
221 /* [retval][out] */ IDOMNode** result)
231 COMPtr<DOMNode> newChildNode(Query, newChild);
235 COMPtr<DOMNode> refChildNode(Query, refChild);
238 if (!m_node->insertBefore(newChildNode->node(), refChildNode ? refChildNode->node() : 0, ec))
246 HRESULT STDMETHODCALLTYPE DOMNode::replaceChild(
247 /* [in] */ IDOMNode* /*newChild*/,
248 /* [in] */ IDOMNode* /*oldChild*/,
249 /* [retval][out] */ IDOMNode** /*result*/)
251 ASSERT_NOT_REACHED();
255 HRESULT STDMETHODCALLTYPE DOMNode::removeChild(
256 /* [in] */ IDOMNode* oldChild,
257 /* [retval][out] */ IDOMNode** result)
267 COMPtr<DOMNode> oldChildNode(Query, oldChild);
272 if (!m_node->removeChild(oldChildNode->node(), ec))
280 HRESULT STDMETHODCALLTYPE DOMNode::appendChild(
281 /* [in] */ IDOMNode* /*oldChild*/,
282 /* [retval][out] */ IDOMNode** /*result*/)
284 ASSERT_NOT_REACHED();
288 HRESULT STDMETHODCALLTYPE DOMNode::hasChildNodes(
289 /* [retval][out] */ BOOL* /*result*/)
291 ASSERT_NOT_REACHED();
295 HRESULT STDMETHODCALLTYPE DOMNode::cloneNode(
296 /* [in] */ BOOL /*deep*/,
297 /* [retval][out] */ IDOMNode** /*result*/)
299 ASSERT_NOT_REACHED();
303 HRESULT STDMETHODCALLTYPE DOMNode::normalize( void)
305 ASSERT_NOT_REACHED();
309 HRESULT STDMETHODCALLTYPE DOMNode::isSupported(
310 /* [in] */ BSTR /*feature*/,
311 /* [in] */ BSTR /*version*/,
312 /* [retval][out] */ BOOL* /*result*/)
314 ASSERT_NOT_REACHED();
318 HRESULT STDMETHODCALLTYPE DOMNode::namespaceURI(
319 /* [retval][out] */ BSTR* /*result*/)
321 ASSERT_NOT_REACHED();
325 HRESULT STDMETHODCALLTYPE DOMNode::prefix(
326 /* [retval][out] */ BSTR* /*result*/)
328 ASSERT_NOT_REACHED();
332 HRESULT STDMETHODCALLTYPE DOMNode::setPrefix(
333 /* [in] */ BSTR /*prefix*/)
335 ASSERT_NOT_REACHED();
339 HRESULT STDMETHODCALLTYPE DOMNode::localName(
340 /* [retval][out] */ BSTR* /*result*/)
342 ASSERT_NOT_REACHED();
346 HRESULT STDMETHODCALLTYPE DOMNode::hasAttributes(
347 /* [retval][out] */ BOOL* /*result*/)
349 ASSERT_NOT_REACHED();
353 HRESULT STDMETHODCALLTYPE DOMNode::isSameNode(
354 /* [in] */ IDOMNode* other,
355 /* [retval][out] */ BOOL* result)
358 ASSERT_NOT_REACHED();
367 COMPtr<DOMNode> domOther;
368 HRESULT hr = other->QueryInterface(__uuidof(DOMNode), (void**)&domOther);
372 *result = m_node->isSameNode(domOther->node()) ? TRUE : FALSE;
376 HRESULT STDMETHODCALLTYPE DOMNode::isEqualNode(
377 /* [in] */ IDOMNode* /*other*/,
378 /* [retval][out] */ BOOL* /*result*/)
380 ASSERT_NOT_REACHED();
384 HRESULT STDMETHODCALLTYPE DOMNode::textContent(
385 /* [retval][out] */ BSTR* result)
390 *result = BString(m_node->textContent()).release();
395 HRESULT STDMETHODCALLTYPE DOMNode::setTextContent(
396 /* [in] */ BSTR /*text*/)
398 ASSERT_NOT_REACHED();
402 // DOMNode - IDOMEventTarget --------------------------------------------------
404 HRESULT DOMNode::addEventListener(
405 /* [in] */ BSTR type,
406 /* [in] */ IDOMEventListener* listener,
407 /* [in] */ BOOL useCapture)
409 RefPtr<WebEventListener> webListener = WebEventListener::create(listener);
410 m_node->addEventListener(type, webListener, useCapture);
415 HRESULT DOMNode::removeEventListener(
416 /* [in] */ BSTR type,
417 /* [in] */ IDOMEventListener* listener,
418 /* [in] */ BOOL useCapture)
420 if (!listener || !type)
424 RefPtr<WebEventListener> webListener = WebEventListener::create(listener);
425 m_node->removeEventListener(type, webListener.get(), useCapture);
429 HRESULT DOMNode::dispatchEvent(
430 /* [in] */ IDOMEvent* evt,
431 /* [retval][out] */ BOOL* result)
438 COMPtr<DOMEvent> domEvent;
439 HRESULT hr = evt->QueryInterface(IID_DOMEvent, (void**) &domEvent);
443 WebCore::ExceptionCode ec = 0;
444 *result = m_node->dispatchEvent(domEvent->coreEvent(), ec) ? TRUE : FALSE;
445 return ec ? E_FAIL : S_OK;
448 // DOMNode - DOMNode ----------------------------------------------------------
450 DOMNode::DOMNode(WebCore::Node* n)
465 IDOMNode* DOMNode::createInstance(WebCore::Node* n)
471 IDOMNode* domNode = 0;
472 WebCore::Node::NodeType nodeType = n->nodeType();
475 case WebCore::Node::ELEMENT_NODE:
477 IDOMElement* newElement = DOMElement::createInstance(static_cast<WebCore::Element*>(n));
479 hr = newElement->QueryInterface(IID_IDOMNode, (void**)&domNode);
480 newElement->Release();
484 case WebCore::Node::DOCUMENT_NODE:
486 IDOMDocument* newDocument = DOMDocument::createInstance(n->document());
488 hr = newDocument->QueryInterface(IID_IDOMNode, (void**)&domNode);
489 newDocument->Release();
495 DOMNode* newNode = new DOMNode(n);
496 hr = newNode->QueryInterface(IID_IDOMNode, (void**)&domNode);
507 // DOMNodeList - IUnknown -----------------------------------------------------
509 HRESULT STDMETHODCALLTYPE DOMNodeList::QueryInterface(REFIID riid, void** ppvObject)
512 if (IsEqualGUID(riid, IID_IDOMNodeList))
513 *ppvObject = static_cast<IDOMNodeList*>(this);
515 return DOMObject::QueryInterface(riid, ppvObject);
521 // IDOMNodeList ---------------------------------------------------------------
523 HRESULT STDMETHODCALLTYPE DOMNodeList::item(
524 /* [in] */ UINT index,
525 /* [retval][out] */ IDOMNode **result)
531 WebCore::Node* itemNode = m_nodeList->item(index);
535 *result = DOMNode::createInstance(itemNode);
536 return *result ? S_OK : E_FAIL;
539 HRESULT STDMETHODCALLTYPE DOMNodeList::length(
540 /* [retval][out] */ UINT *result)
545 *result = m_nodeList->length();
549 // DOMNodeList - DOMNodeList --------------------------------------------------
551 DOMNodeList::DOMNodeList(WebCore::NodeList* l)
560 DOMNodeList::~DOMNodeList()
566 IDOMNodeList* DOMNodeList::createInstance(WebCore::NodeList* l)
571 IDOMNodeList* domNodeList = 0;
572 DOMNodeList* newNodeList = new DOMNodeList(l);
573 if (FAILED(newNodeList->QueryInterface(IID_IDOMNodeList, (void**)&domNodeList)))
579 // DOMDocument - IUnknown -----------------------------------------------------
581 HRESULT STDMETHODCALLTYPE DOMDocument::QueryInterface(REFIID riid, void** ppvObject)
584 if (IsEqualGUID(riid, IID_IDOMDocument))
585 *ppvObject = static_cast<IDOMDocument*>(this);
586 else if (IsEqualGUID(riid, IID_IDOMViewCSS))
587 *ppvObject = static_cast<IDOMViewCSS*>(this);
588 else if (IsEqualGUID(riid, IID_IDOMDocumentEvent))
589 *ppvObject = static_cast<IDOMDocumentEvent*>(this);
591 return DOMNode::QueryInterface(riid, ppvObject);
597 // DOMDocument ----------------------------------------------------------------
599 HRESULT STDMETHODCALLTYPE DOMDocument::doctype(
600 /* [retval][out] */ IDOMDocumentType** /*result*/)
602 ASSERT_NOT_REACHED();
606 HRESULT STDMETHODCALLTYPE DOMDocument::implementation(
607 /* [retval][out] */ IDOMImplementation** /*result*/)
609 ASSERT_NOT_REACHED();
613 HRESULT STDMETHODCALLTYPE DOMDocument::documentElement(
614 /* [retval][out] */ IDOMElement** result)
616 *result = DOMElement::createInstance(m_document->documentElement());
617 return *result ? S_OK : E_FAIL;
620 HRESULT STDMETHODCALLTYPE DOMDocument::createElement(
621 /* [in] */ BSTR tagName,
622 /* [retval][out] */ IDOMElement** result)
627 String tagNameString(tagName);
629 *result = DOMElement::createInstance(m_document->createElement(tagNameString, ec).get());
630 return *result ? S_OK : E_FAIL;
633 HRESULT STDMETHODCALLTYPE DOMDocument::createDocumentFragment(
634 /* [retval][out] */ IDOMDocumentFragment** /*result*/)
636 ASSERT_NOT_REACHED();
640 HRESULT STDMETHODCALLTYPE DOMDocument::createTextNode(
641 /* [in] */ BSTR /*data*/,
642 /* [retval][out] */ IDOMText** /*result*/)
644 ASSERT_NOT_REACHED();
648 HRESULT STDMETHODCALLTYPE DOMDocument::createComment(
649 /* [in] */ BSTR /*data*/,
650 /* [retval][out] */ IDOMComment** /*result*/)
652 ASSERT_NOT_REACHED();
656 HRESULT STDMETHODCALLTYPE DOMDocument::createCDATASection(
657 /* [in] */ BSTR /*data*/,
658 /* [retval][out] */ IDOMCDATASection** /*result*/)
660 ASSERT_NOT_REACHED();
664 HRESULT STDMETHODCALLTYPE DOMDocument::createProcessingInstruction(
665 /* [in] */ BSTR /*target*/,
666 /* [in] */ BSTR /*data*/,
667 /* [retval][out] */ IDOMProcessingInstruction** /*result*/)
669 ASSERT_NOT_REACHED();
673 HRESULT STDMETHODCALLTYPE DOMDocument::createAttribute(
674 /* [in] */ BSTR /*name*/,
675 /* [retval][out] */ IDOMAttr** /*result*/)
677 ASSERT_NOT_REACHED();
681 HRESULT STDMETHODCALLTYPE DOMDocument::createEntityReference(
682 /* [in] */ BSTR /*name*/,
683 /* [retval][out] */ IDOMEntityReference** /*result*/)
685 ASSERT_NOT_REACHED();
689 HRESULT STDMETHODCALLTYPE DOMDocument::getElementsByTagName(
690 /* [in] */ BSTR tagName,
691 /* [retval][out] */ IDOMNodeList** result)
696 String tagNameString(tagName);
697 *result = DOMNodeList::createInstance(m_document->getElementsByTagName(tagNameString).get());
698 return *result ? S_OK : E_FAIL;
701 HRESULT STDMETHODCALLTYPE DOMDocument::importNode(
702 /* [in] */ IDOMNode* /*importedNode*/,
703 /* [in] */ BOOL /*deep*/,
704 /* [retval][out] */ IDOMNode** /*result*/)
706 ASSERT_NOT_REACHED();
710 HRESULT STDMETHODCALLTYPE DOMDocument::createElementNS(
711 /* [in] */ BSTR /*namespaceURI*/,
712 /* [in] */ BSTR /*qualifiedName*/,
713 /* [retval][out] */ IDOMElement** /*result*/)
715 ASSERT_NOT_REACHED();
719 HRESULT STDMETHODCALLTYPE DOMDocument::createAttributeNS(
720 /* [in] */ BSTR /*namespaceURI*/,
721 /* [in] */ BSTR /*qualifiedName*/,
722 /* [retval][out] */ IDOMAttr** /*result*/)
724 ASSERT_NOT_REACHED();
728 HRESULT STDMETHODCALLTYPE DOMDocument::getElementsByTagNameNS(
729 /* [in] */ BSTR namespaceURI,
730 /* [in] */ BSTR localName,
731 /* [retval][out] */ IDOMNodeList** result)
736 String namespaceURIString(namespaceURI);
737 String localNameString(localName);
738 *result = DOMNodeList::createInstance(m_document->getElementsByTagNameNS(namespaceURIString, localNameString).get());
739 return *result ? S_OK : E_FAIL;
742 HRESULT STDMETHODCALLTYPE DOMDocument::getElementById(
743 /* [in] */ BSTR elementId,
744 /* [retval][out] */ IDOMElement** result)
749 String idString(elementId);
750 *result = DOMElement::createInstance(m_document->getElementById(idString));
751 return *result ? S_OK : E_FAIL;
754 // DOMDocument - IDOMViewCSS --------------------------------------------------
756 HRESULT STDMETHODCALLTYPE DOMDocument::getComputedStyle(
757 /* [in] */ IDOMElement* elt,
758 /* [in] */ BSTR pseudoElt,
759 /* [retval][out] */ IDOMCSSStyleDeclaration** result)
764 COMPtr<DOMElement> domEle;
765 HRESULT hr = elt->QueryInterface(IID_DOMElement, (void**)&domEle);
768 Element* element = domEle->element();
770 WebCore::DOMWindow* dv = m_document->defaultView();
771 String pseudoEltString(pseudoElt);
776 *result = DOMCSSStyleDeclaration::createInstance(dv->getComputedStyle(element, pseudoEltString.impl()).get());
777 return *result ? S_OK : E_FAIL;
780 // DOMDocument - IDOMDocumentEvent --------------------------------------------
782 HRESULT STDMETHODCALLTYPE DOMDocument::createEvent(
783 /* [in] */ BSTR eventType,
784 /* [retval][out] */ IDOMEvent **result)
786 String eventTypeString(eventType, SysStringLen(eventType));
787 WebCore::ExceptionCode ec = 0;
788 *result = DOMEvent::createInstance(m_document->createEvent(eventTypeString, ec));
789 return *result ? S_OK : E_FAIL;
792 // DOMDocument - DOMDocument --------------------------------------------------
794 DOMDocument::DOMDocument(WebCore::Document* d)
800 DOMDocument::~DOMDocument()
804 IDOMDocument* DOMDocument::createInstance(WebCore::Document* d)
810 IDOMDocument* domDocument = 0;
812 if (d->isHTMLDocument()) {
813 DOMHTMLDocument* newDocument = new DOMHTMLDocument(d);
814 hr = newDocument->QueryInterface(IID_IDOMDocument, (void**)&domDocument);
816 DOMDocument* newDocument = new DOMDocument(d);
817 hr = newDocument->QueryInterface(IID_IDOMDocument, (void**)&domDocument);
826 // DOMWindow - IUnknown ------------------------------------------------------
828 HRESULT DOMWindow::QueryInterface(REFIID riid, void** ppvObject)
831 if (IsEqualGUID(riid, IID_IDOMWindow))
832 *ppvObject = static_cast<IDOMWindow*>(this);
833 else if (IsEqualGUID(riid, IID_IDOMEventTarget))
834 *ppvObject = static_cast<IDOMEventTarget*>(this);
836 return DOMObject::QueryInterface(riid, ppvObject);
842 // DOMWindow - IDOMWindow ------------------------------------------------------
844 HRESULT DOMWindow::document(
845 /* [out, retval] */ IDOMDocument** result)
848 ASSERT_NOT_REACHED();
852 *result = DOMDocument::createInstance(m_window->document());
853 return *result ? S_OK : E_FAIL;
856 HRESULT DOMWindow::getComputedStyle(
857 /* [in] */ IDOMElement* element,
858 /* [in] */ BSTR pseudoElement)
860 ASSERT_NOT_REACHED();
864 HRESULT DOMWindow::getMatchedCSSRules(
865 /* [in] */ IDOMElement* element,
866 /* [in] */ BSTR pseudoElement,
867 /* [in] */ BOOL authorOnly,
868 /* [out, retval] */ IDOMCSSRuleList** result)
870 ASSERT_NOT_REACHED();
874 HRESULT DOMWindow::devicePixelRatio(
875 /* [out, retval] */ double* result)
877 ASSERT_NOT_REACHED();
881 // DOMWindow - IDOMEventTarget ------------------------------------------------------
883 HRESULT DOMWindow::addEventListener(
884 /* [in] */ BSTR type,
885 /* [in] */ IDOMEventListener* listener,
886 /* [in] */ BOOL useCapture)
888 if (!type || !listener)
892 RefPtr<WebEventListener> webListener = WebEventListener::create(listener);
893 m_window->addEventListener(type, webListener, useCapture);
897 HRESULT DOMWindow::removeEventListener(
898 /* [in] */ BSTR type,
899 /* [in] */ IDOMEventListener* listener,
900 /* [in] */ BOOL useCapture)
902 if (!type || !listener)
906 RefPtr<WebEventListener> webListener = WebEventListener::create(listener);
907 m_window->removeEventListener(type, webListener.get(), useCapture);
911 HRESULT DOMWindow::dispatchEvent(
912 /* [in] */ IDOMEvent* evt,
913 /* [retval][out] */ BOOL* result)
920 COMPtr<DOMEvent> domEvent;
921 HRESULT hr = evt->QueryInterface(IID_DOMEvent, (void**) &domEvent);
925 WebCore::ExceptionCode ec = 0;
926 *result = m_window->dispatchEvent(domEvent->coreEvent(), ec) ? TRUE : FALSE;
927 return ec ? E_FAIL : S_OK;
931 // DOMWindow - DOMWindow --------------------------------------------------
933 DOMWindow::DOMWindow(WebCore::DOMWindow* w)
938 DOMWindow::~DOMWindow()
942 IDOMWindow* DOMWindow::createInstance(WebCore::DOMWindow* w)
947 DOMWindow* newWindow = new DOMWindow(w);
949 IDOMWindow* domWindow = 0;
950 HRESULT hr = newWindow->QueryInterface(IID_IDOMWindow, reinterpret_cast<void**>(&domWindow));
958 // DOMElement - IUnknown ------------------------------------------------------
960 HRESULT STDMETHODCALLTYPE DOMElement::QueryInterface(REFIID riid, void** ppvObject)
963 if (IsEqualGUID(riid, IID_IDOMElement))
964 *ppvObject = static_cast<IDOMElement*>(this);
965 else if (IsEqualGUID(riid, IID_DOMElement))
966 *ppvObject = static_cast<DOMElement*>(this);
967 else if (IsEqualGUID(riid, IID_IDOMElementPrivate))
968 *ppvObject = static_cast<IDOMElementPrivate*>(this);
969 else if (IsEqualGUID(riid, IID_IDOMNodeExtensions))
970 *ppvObject = static_cast<IDOMNodeExtensions*>(this);
971 else if (IsEqualGUID(riid, IID_IDOMElementCSSInlineStyle))
972 *ppvObject = static_cast<IDOMElementCSSInlineStyle*>(this);
973 else if (IsEqualGUID(riid, IID_IDOMElementExtensions))
974 *ppvObject = static_cast<IDOMElementExtensions*>(this);
976 return DOMNode::QueryInterface(riid, ppvObject);
982 // DOMElement - IDOMNodeExtensions---------------------------------------------
984 HRESULT STDMETHODCALLTYPE DOMElement::boundingBox(
985 /* [retval][out] */ LPRECT rect)
987 ::SetRectEmpty(rect);
992 WebCore::RenderObject *renderer = m_element->renderer();
994 IntRect boundsIntRect = renderer->absoluteBoundingBoxRect();
995 rect->left = boundsIntRect.x();
996 rect->top = boundsIntRect.y();
997 rect->right = boundsIntRect.x() + boundsIntRect.width();
998 rect->bottom = boundsIntRect.y() + boundsIntRect.height();
1004 HRESULT STDMETHODCALLTYPE DOMElement::lineBoxRects(
1005 /* [size_is][in] */ RECT* /*rects*/,
1006 /* [in] */ int /*cRects*/)
1011 // IDOMElement ----------------------------------------------------------------
1013 HRESULT STDMETHODCALLTYPE DOMElement::tagName(
1014 /* [retval][out] */ BSTR* result)
1022 *result = BString(m_element->tagName()).release();
1026 HRESULT STDMETHODCALLTYPE DOMElement::getAttribute(
1027 /* [in] */ BSTR name,
1028 /* [retval][out] */ BSTR* result)
1032 WTF::String nameString(name, SysStringLen(name));
1033 WTF::String& attrValueString = (WTF::String&) m_element->getAttribute(nameString);
1034 *result = SysAllocStringLen(attrValueString.characters(), attrValueString.length());
1035 if (attrValueString.length() && !*result)
1036 return E_OUTOFMEMORY;
1040 HRESULT STDMETHODCALLTYPE DOMElement::setAttribute(
1041 /* [in] */ BSTR name,
1042 /* [in] */ BSTR value)
1047 WTF::String nameString(name, SysStringLen(name));
1048 WTF::String valueString(value, SysStringLen(value));
1049 WebCore::ExceptionCode ec = 0;
1050 m_element->setAttribute(nameString, valueString, ec);
1051 return ec ? E_FAIL : S_OK;
1054 HRESULT STDMETHODCALLTYPE DOMElement::removeAttribute(
1055 /* [in] */ BSTR /*name*/)
1057 ASSERT_NOT_REACHED();
1061 HRESULT STDMETHODCALLTYPE DOMElement::getAttributeNode(
1062 /* [in] */ BSTR /*name*/,
1063 /* [retval][out] */ IDOMAttr** /*result*/)
1065 ASSERT_NOT_REACHED();
1069 HRESULT STDMETHODCALLTYPE DOMElement::setAttributeNode(
1070 /* [in] */ IDOMAttr* /*newAttr*/,
1071 /* [retval][out] */ IDOMAttr** /*result*/)
1073 ASSERT_NOT_REACHED();
1077 HRESULT STDMETHODCALLTYPE DOMElement::removeAttributeNode(
1078 /* [in] */ IDOMAttr* /*oldAttr*/,
1079 /* [retval][out] */ IDOMAttr** /*result*/)
1081 ASSERT_NOT_REACHED();
1085 HRESULT STDMETHODCALLTYPE DOMElement::getElementsByTagName(
1086 /* [in] */ BSTR /*name*/,
1087 /* [retval][out] */ IDOMNodeList** /*result*/)
1089 ASSERT_NOT_REACHED();
1093 HRESULT STDMETHODCALLTYPE DOMElement::getAttributeNS(
1094 /* [in] */ BSTR /*namespaceURI*/,
1095 /* [in] */ BSTR /*localName*/,
1096 /* [retval][out] */ BSTR* /*result*/)
1098 ASSERT_NOT_REACHED();
1102 HRESULT STDMETHODCALLTYPE DOMElement::setAttributeNS(
1103 /* [in] */ BSTR /*namespaceURI*/,
1104 /* [in] */ BSTR /*qualifiedName*/,
1105 /* [in] */ BSTR /*value*/)
1107 ASSERT_NOT_REACHED();
1111 HRESULT STDMETHODCALLTYPE DOMElement::removeAttributeNS(
1112 /* [in] */ BSTR /*namespaceURI*/,
1113 /* [in] */ BSTR /*localName*/)
1115 ASSERT_NOT_REACHED();
1119 HRESULT STDMETHODCALLTYPE DOMElement::getAttributeNodeNS(
1120 /* [in] */ BSTR /*namespaceURI*/,
1121 /* [in] */ BSTR /*localName*/,
1122 /* [retval][out] */ IDOMAttr** /*result*/)
1124 ASSERT_NOT_REACHED();
1128 HRESULT STDMETHODCALLTYPE DOMElement::setAttributeNodeNS(
1129 /* [in] */ IDOMAttr* /*newAttr*/,
1130 /* [retval][out] */ IDOMAttr** /*result*/)
1132 ASSERT_NOT_REACHED();
1136 HRESULT STDMETHODCALLTYPE DOMElement::getElementsByTagNameNS(
1137 /* [in] */ BSTR /*namespaceURI*/,
1138 /* [in] */ BSTR /*localName*/,
1139 /* [retval][out] */ IDOMNodeList** /*result*/)
1141 ASSERT_NOT_REACHED();
1145 HRESULT STDMETHODCALLTYPE DOMElement::hasAttribute(
1146 /* [in] */ BSTR /*name*/,
1147 /* [retval][out] */ BOOL* /*result*/)
1149 ASSERT_NOT_REACHED();
1153 HRESULT STDMETHODCALLTYPE DOMElement::hasAttributeNS(
1154 /* [in] */ BSTR /*namespaceURI*/,
1155 /* [in] */ BSTR /*localName*/,
1156 /* [retval][out] */ BOOL* /*result*/)
1158 ASSERT_NOT_REACHED();
1162 HRESULT STDMETHODCALLTYPE DOMElement::focus( void)
1170 HRESULT STDMETHODCALLTYPE DOMElement::blur( void)
1178 // IDOMElementPrivate ---------------------------------------------------------
1180 HRESULT DOMElement::coreElement(void **element)
1184 *element = (void*) m_element;
1188 HRESULT STDMETHODCALLTYPE DOMElement::isEqual(
1189 /* [in] */ IDOMElement *other,
1190 /* [retval][out] */ BOOL *result)
1194 if (!other || !result)
1197 IDOMElementPrivate* otherPriv;
1198 HRESULT hr = other->QueryInterface(IID_IDOMElementPrivate, (void**) &otherPriv);
1203 hr = otherPriv->coreElement(&otherCoreEle);
1204 otherPriv->Release();
1208 *result = (otherCoreEle == (void*)m_element) ? TRUE : FALSE;
1212 HRESULT STDMETHODCALLTYPE DOMElement::isFocused(
1213 /* [retval][out] */ BOOL *result)
1218 if (m_element->document()->focusedNode() == m_element)
1226 HRESULT STDMETHODCALLTYPE DOMElement::innerText(
1227 /* [retval][out] */ BSTR* result)
1230 ASSERT_NOT_REACHED();
1235 ASSERT_NOT_REACHED();
1239 *result = BString(m_element->innerText()).release();
1243 HRESULT STDMETHODCALLTYPE DOMElement::font(WebFontDescription* webFontDescription)
1245 if (!webFontDescription) {
1246 ASSERT_NOT_REACHED();
1252 WebCore::RenderObject* renderer = m_element->renderer();
1256 FontDescription fontDescription = renderer->style()->font().fontDescription();
1257 AtomicString family = fontDescription.family().family();
1258 webFontDescription->family = family.characters();
1259 webFontDescription->familyLength = family.length();
1260 webFontDescription->size = fontDescription.computedSize();
1261 webFontDescription->bold = fontDescription.weight() >= WebCore::FontWeight600;
1262 webFontDescription->italic = fontDescription.italic();
1267 HRESULT STDMETHODCALLTYPE DOMElement::renderedImage(HBITMAP* image)
1270 ASSERT_NOT_REACHED();
1277 Frame* frame = m_element->document()->frame();
1281 *image = frame->nodeImage(m_element);
1288 HRESULT STDMETHODCALLTYPE DOMElement::markerTextForListItem(
1289 /* [retval][out] */ BSTR* markerText)
1296 *markerText = BString(WebCore::markerTextForListItem(m_element)).release();
1300 HRESULT STDMETHODCALLTYPE DOMElement::shadowPseudoId(
1301 /* [retval][out] */ BSTR* result)
1308 *result = BString(m_element->shadowPseudoId().string()).release();
1312 // IDOMElementCSSInlineStyle --------------------------------------------------
1314 HRESULT STDMETHODCALLTYPE DOMElement::style(
1315 /* [retval][out] */ IDOMCSSStyleDeclaration** result)
1322 WebCore::CSSStyleDeclaration* style = m_element->style();
1326 *result = DOMCSSStyleDeclaration::createInstance(style);
1327 return *result ? S_OK : E_FAIL;
1330 // IDOMElementExtensions ------------------------------------------------------
1332 HRESULT STDMETHODCALLTYPE DOMElement::offsetLeft(
1333 /* [retval][out] */ int* result)
1338 *result = m_element->offsetLeft();
1342 HRESULT STDMETHODCALLTYPE DOMElement::offsetTop(
1343 /* [retval][out] */ int* result)
1348 *result = m_element->offsetTop();
1352 HRESULT STDMETHODCALLTYPE DOMElement::offsetWidth(
1353 /* [retval][out] */ int* result)
1358 *result = m_element->offsetWidth();
1362 HRESULT STDMETHODCALLTYPE DOMElement::offsetHeight(
1363 /* [retval][out] */ int* result)
1368 *result = m_element->offsetHeight();
1372 HRESULT STDMETHODCALLTYPE DOMElement::offsetParent(
1373 /* [retval][out] */ IDOMElement** /*result*/)
1376 ASSERT_NOT_REACHED();
1380 HRESULT STDMETHODCALLTYPE DOMElement::clientWidth(
1381 /* [retval][out] */ int* result)
1386 *result = m_element->clientWidth();
1390 HRESULT STDMETHODCALLTYPE DOMElement::clientHeight(
1391 /* [retval][out] */ int* result)
1396 *result = m_element->clientHeight();
1400 HRESULT STDMETHODCALLTYPE DOMElement::scrollLeft(
1401 /* [retval][out] */ int* result)
1406 *result = m_element->scrollLeft();
1410 HRESULT STDMETHODCALLTYPE DOMElement::setScrollLeft(
1411 /* [in] */ int /*newScrollLeft*/)
1414 ASSERT_NOT_REACHED();
1418 HRESULT STDMETHODCALLTYPE DOMElement::scrollTop(
1419 /* [retval][out] */ int* result)
1424 *result = m_element->scrollTop();
1428 HRESULT STDMETHODCALLTYPE DOMElement::setScrollTop(
1429 /* [in] */ int /*newScrollTop*/)
1432 ASSERT_NOT_REACHED();
1436 HRESULT STDMETHODCALLTYPE DOMElement::scrollWidth(
1437 /* [retval][out] */ int* result)
1442 *result = m_element->scrollWidth();
1446 HRESULT STDMETHODCALLTYPE DOMElement::scrollHeight(
1447 /* [retval][out] */ int* result)
1452 *result = m_element->scrollHeight();
1456 HRESULT STDMETHODCALLTYPE DOMElement::scrollIntoView(
1457 /* [in] */ BOOL alignWithTop)
1462 m_element->scrollIntoView(!!alignWithTop);
1466 HRESULT STDMETHODCALLTYPE DOMElement::scrollIntoViewIfNeeded(
1467 /* [in] */ BOOL centerIfNeeded)
1472 m_element->scrollIntoViewIfNeeded(!!centerIfNeeded);
1476 // DOMElement -----------------------------------------------------------------
1478 DOMElement::DOMElement(WebCore::Element* e)
1484 DOMElement::~DOMElement()
1488 IDOMElement* DOMElement::createInstance(WebCore::Element* e)
1494 IDOMElement* domElement = 0;
1496 if (e->hasTagName(formTag)) {
1497 DOMHTMLFormElement* newElement = new DOMHTMLFormElement(e);
1498 hr = newElement->QueryInterface(IID_IDOMElement, (void**)&domElement);
1499 } else if (e->hasTagName(iframeTag)) {
1500 DOMHTMLIFrameElement* newElement = new DOMHTMLIFrameElement(e);
1501 hr = newElement->QueryInterface(IID_IDOMElement, (void**)&domElement);
1502 } else if (e->hasTagName(inputTag)) {
1503 DOMHTMLInputElement* newElement = new DOMHTMLInputElement(e);
1504 hr = newElement->QueryInterface(IID_IDOMElement, (void**)&domElement);
1505 } else if (e->hasTagName(optionTag)) {
1506 DOMHTMLOptionElement* newElement = new DOMHTMLOptionElement(e);
1507 hr = newElement->QueryInterface(IID_IDOMElement, (void**)&domElement);
1508 } else if (e->hasTagName(selectTag)) {
1509 DOMHTMLSelectElement* newElement = new DOMHTMLSelectElement(e);
1510 hr = newElement->QueryInterface(IID_IDOMElement, (void**)&domElement);
1511 } else if (e->hasTagName(textareaTag)) {
1512 DOMHTMLTextAreaElement* newElement = new DOMHTMLTextAreaElement(e);
1513 hr = newElement->QueryInterface(IID_IDOMElement, (void**)&domElement);
1514 } else if (e->isHTMLElement()) {
1515 DOMHTMLElement* newElement = new DOMHTMLElement(e);
1516 hr = newElement->QueryInterface(IID_IDOMElement, (void**)&domElement);
1518 DOMElement* newElement = new DOMElement(e);
1519 hr = newElement->QueryInterface(IID_IDOMElement, (void**)&domElement);