• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2006, 2007, 2009 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 "DOMCoreClasses.h"
29 
30 #include "COMPtr.h"
31 #include "DOMCSSClasses.h"
32 #include "DOMEventsClasses.h"
33 #include "DOMHTMLClasses.h"
34 #include "WebKitGraphics.h"
35 
36 #pragma warning(push, 0)
37 #include <WebCore/BString.h>
38 #include <WebCore/DOMWindow.h>
39 #include <WebCore/Document.h>
40 #include <WebCore/Element.h>
41 #include <WebCore/Frame.h>
42 #include <WebCore/SimpleFontData.h>
43 #include <WebCore/HTMLFormElement.h>
44 #include <WebCore/HTMLInputElement.h>
45 #include <WebCore/HTMLNames.h>
46 #include <WebCore/HTMLOptionElement.h>
47 #include <WebCore/HTMLSelectElement.h>
48 #include <WebCore/HTMLTextAreaElement.h>
49 #include <WebCore/NodeList.h>
50 #include <WebCore/RenderObject.h>
51 #pragma warning(pop)
52 
53 #include <initguid.h>
54 // {3B0C0EFF-478B-4b0b-8290-D2321E08E23E}
55 DEFINE_GUID(IID_DOMElement, 0x3b0c0eff, 0x478b, 0x4b0b, 0x82, 0x90, 0xd2, 0x32, 0x1e, 0x8, 0xe2, 0x3e);
56 
57 // Our normal style is just to say "using namespace WebCore" rather than having
58 // individual using directives for each type from that namespace. But
59 // "DOMObject" exists both in the WebCore namespace and unnamespaced in this
60 // file, which leads to ambiguities if we say "using namespace WebCore".
61 using namespace WebCore::HTMLNames;
62 using WebCore::AtomicString;
63 using WebCore::BString;
64 using WebCore::Element;
65 using WebCore::ExceptionCode;
66 using WebCore::FontDescription;
67 using WebCore::Frame;
68 using WebCore::IntRect;
69 using WebCore::String;
70 
71 // DOMObject - IUnknown -------------------------------------------------------
72 
QueryInterface(REFIID riid,void ** ppvObject)73 HRESULT STDMETHODCALLTYPE DOMObject::QueryInterface(REFIID riid, void** ppvObject)
74 {
75     *ppvObject = 0;
76     if (IsEqualGUID(riid, IID_IDOMObject))
77         *ppvObject = static_cast<IDOMObject*>(this);
78     else
79         return WebScriptObject::QueryInterface(riid, ppvObject);
80 
81     AddRef();
82     return S_OK;
83 }
84 
85 // DOMNode - IUnknown ---------------------------------------------------------
86 
QueryInterface(REFIID riid,void ** ppvObject)87 HRESULT STDMETHODCALLTYPE DOMNode::QueryInterface(REFIID riid, void** ppvObject)
88 {
89     *ppvObject = 0;
90     if (IsEqualGUID(riid, IID_IDOMNode))
91         *ppvObject = static_cast<IDOMNode*>(this);
92     else if (IsEqualGUID(riid, __uuidof(DOMNode)))
93         *ppvObject = static_cast<DOMNode*>(this);
94     else
95         return DOMObject::QueryInterface(riid, ppvObject);
96 
97     AddRef();
98     return S_OK;
99 }
100 
101 // DOMNode --------------------------------------------------------------------
102 
nodeName(BSTR * result)103 HRESULT STDMETHODCALLTYPE DOMNode::nodeName(
104     /* [retval][out] */ BSTR* result)
105 {
106     if (!result)
107         return E_POINTER;
108 
109     if (!m_node)
110         return E_FAIL;
111 
112     *result = BString(m_node->nodeName()).release();
113     return S_OK;
114 }
115 
nodeValue(BSTR * result)116 HRESULT STDMETHODCALLTYPE DOMNode::nodeValue(
117     /* [retval][out] */ BSTR* result)
118 {
119     if (!m_node)
120         return E_FAIL;
121     WebCore::String nodeValueStr = m_node->nodeValue();
122     *result = SysAllocStringLen(nodeValueStr.characters(), nodeValueStr.length());
123     if (nodeValueStr.length() && !*result)
124         return E_OUTOFMEMORY;
125     return S_OK;
126 }
127 
setNodeValue(BSTR)128 HRESULT STDMETHODCALLTYPE DOMNode::setNodeValue(
129     /* [in] */ BSTR /*value*/)
130 {
131     ASSERT_NOT_REACHED();
132     return E_NOTIMPL;
133 }
134 
nodeType(unsigned short *)135 HRESULT STDMETHODCALLTYPE DOMNode::nodeType(
136     /* [retval][out] */ unsigned short* /*result*/)
137 {
138     ASSERT_NOT_REACHED();
139     return E_NOTIMPL;
140 }
141 
parentNode(IDOMNode ** result)142 HRESULT STDMETHODCALLTYPE DOMNode::parentNode(
143     /* [retval][out] */ IDOMNode** result)
144 {
145     *result = 0;
146     if (!m_node || !m_node->parentNode())
147         return E_FAIL;
148     *result = DOMNode::createInstance(m_node->parentNode());
149     return *result ? S_OK : E_FAIL;
150 }
151 
childNodes(IDOMNodeList **)152 HRESULT STDMETHODCALLTYPE DOMNode::childNodes(
153     /* [retval][out] */ IDOMNodeList** /*result*/)
154 {
155     ASSERT_NOT_REACHED();
156     return E_NOTIMPL;
157 }
158 
firstChild(IDOMNode **)159 HRESULT STDMETHODCALLTYPE DOMNode::firstChild(
160     /* [retval][out] */ IDOMNode** /*result*/)
161 {
162     ASSERT_NOT_REACHED();
163     return E_NOTIMPL;
164 }
165 
lastChild(IDOMNode **)166 HRESULT STDMETHODCALLTYPE DOMNode::lastChild(
167     /* [retval][out] */ IDOMNode** /*result*/)
168 {
169     ASSERT_NOT_REACHED();
170     return E_NOTIMPL;
171 }
172 
previousSibling(IDOMNode **)173 HRESULT STDMETHODCALLTYPE DOMNode::previousSibling(
174     /* [retval][out] */ IDOMNode** /*result*/)
175 {
176     ASSERT_NOT_REACHED();
177     return E_NOTIMPL;
178 }
179 
nextSibling(IDOMNode **)180 HRESULT STDMETHODCALLTYPE DOMNode::nextSibling(
181     /* [retval][out] */ IDOMNode** /*result*/)
182 {
183     ASSERT_NOT_REACHED();
184     return E_NOTIMPL;
185 }
186 
attributes(IDOMNamedNodeMap **)187 HRESULT STDMETHODCALLTYPE DOMNode::attributes(
188     /* [retval][out] */ IDOMNamedNodeMap** /*result*/)
189 {
190     ASSERT_NOT_REACHED();
191     return E_NOTIMPL;
192 }
193 
ownerDocument(IDOMDocument ** result)194 HRESULT STDMETHODCALLTYPE DOMNode::ownerDocument(
195     /* [retval][out] */ IDOMDocument** result)
196 {
197     if (!result)
198         return E_POINTER;
199     *result = 0;
200     if (!m_node)
201         return E_FAIL;
202     *result = DOMDocument::createInstance(m_node->ownerDocument());
203     return *result ? S_OK : E_FAIL;
204 }
205 
insertBefore(IDOMNode *,IDOMNode *,IDOMNode **)206 HRESULT STDMETHODCALLTYPE DOMNode::insertBefore(
207     /* [in] */ IDOMNode* /*newChild*/,
208     /* [in] */ IDOMNode* /*refChild*/,
209     /* [retval][out] */ IDOMNode** /*result*/)
210 {
211     ASSERT_NOT_REACHED();
212     return E_NOTIMPL;
213 }
214 
replaceChild(IDOMNode *,IDOMNode *,IDOMNode **)215 HRESULT STDMETHODCALLTYPE DOMNode::replaceChild(
216     /* [in] */ IDOMNode* /*newChild*/,
217     /* [in] */ IDOMNode* /*oldChild*/,
218     /* [retval][out] */ IDOMNode** /*result*/)
219 {
220     ASSERT_NOT_REACHED();
221     return E_NOTIMPL;
222 }
223 
removeChild(IDOMNode *,IDOMNode **)224 HRESULT STDMETHODCALLTYPE DOMNode::removeChild(
225     /* [in] */ IDOMNode* /*oldChild*/,
226     /* [retval][out] */ IDOMNode** /*result*/)
227 {
228     ASSERT_NOT_REACHED();
229     return E_NOTIMPL;
230 }
231 
appendChild(IDOMNode *,IDOMNode **)232 HRESULT STDMETHODCALLTYPE DOMNode::appendChild(
233     /* [in] */ IDOMNode* /*oldChild*/,
234     /* [retval][out] */ IDOMNode** /*result*/)
235 {
236     ASSERT_NOT_REACHED();
237     return E_NOTIMPL;
238 }
239 
hasChildNodes(BOOL *)240 HRESULT STDMETHODCALLTYPE DOMNode::hasChildNodes(
241     /* [retval][out] */ BOOL* /*result*/)
242 {
243     ASSERT_NOT_REACHED();
244     return E_NOTIMPL;
245 }
246 
cloneNode(BOOL,IDOMNode **)247 HRESULT STDMETHODCALLTYPE DOMNode::cloneNode(
248     /* [in] */ BOOL /*deep*/,
249     /* [retval][out] */ IDOMNode** /*result*/)
250 {
251     ASSERT_NOT_REACHED();
252     return E_NOTIMPL;
253 }
254 
normalize(void)255 HRESULT STDMETHODCALLTYPE DOMNode::normalize( void)
256 {
257     ASSERT_NOT_REACHED();
258     return E_NOTIMPL;
259 }
260 
isSupported(BSTR,BSTR,BOOL *)261 HRESULT STDMETHODCALLTYPE DOMNode::isSupported(
262     /* [in] */ BSTR /*feature*/,
263     /* [in] */ BSTR /*version*/,
264     /* [retval][out] */ BOOL* /*result*/)
265 {
266     ASSERT_NOT_REACHED();
267     return E_NOTIMPL;
268 }
269 
namespaceURI(BSTR *)270 HRESULT STDMETHODCALLTYPE DOMNode::namespaceURI(
271     /* [retval][out] */ BSTR* /*result*/)
272 {
273     ASSERT_NOT_REACHED();
274     return E_NOTIMPL;
275 }
276 
prefix(BSTR *)277 HRESULT STDMETHODCALLTYPE DOMNode::prefix(
278     /* [retval][out] */ BSTR* /*result*/)
279 {
280     ASSERT_NOT_REACHED();
281     return E_NOTIMPL;
282 }
283 
setPrefix(BSTR)284 HRESULT STDMETHODCALLTYPE DOMNode::setPrefix(
285     /* [in] */ BSTR /*prefix*/)
286 {
287     ASSERT_NOT_REACHED();
288     return E_NOTIMPL;
289 }
290 
localName(BSTR *)291 HRESULT STDMETHODCALLTYPE DOMNode::localName(
292     /* [retval][out] */ BSTR* /*result*/)
293 {
294     ASSERT_NOT_REACHED();
295     return E_NOTIMPL;
296 }
297 
hasAttributes(BOOL *)298 HRESULT STDMETHODCALLTYPE DOMNode::hasAttributes(
299     /* [retval][out] */ BOOL* /*result*/)
300 {
301     ASSERT_NOT_REACHED();
302     return E_NOTIMPL;
303 }
304 
isSameNode(IDOMNode * other,BOOL * result)305 HRESULT STDMETHODCALLTYPE DOMNode::isSameNode(
306     /* [in] */ IDOMNode* other,
307     /* [retval][out] */ BOOL* result)
308 {
309     if (!result) {
310         ASSERT_NOT_REACHED();
311         return E_POINTER;
312     }
313 
314     *result = FALSE;
315 
316     if (!other)
317         return E_POINTER;
318 
319     COMPtr<DOMNode> domOther;
320     HRESULT hr = other->QueryInterface(__uuidof(DOMNode), (void**)&domOther);
321     if (FAILED(hr))
322         return hr;
323 
324     *result = m_node->isSameNode(domOther->node()) ? TRUE : FALSE;
325     return S_OK;
326 }
327 
isEqualNode(IDOMNode *,BOOL *)328 HRESULT STDMETHODCALLTYPE DOMNode::isEqualNode(
329     /* [in] */ IDOMNode* /*other*/,
330     /* [retval][out] */ BOOL* /*result*/)
331 {
332     ASSERT_NOT_REACHED();
333     return E_NOTIMPL;
334 }
335 
textContent(BSTR * result)336 HRESULT STDMETHODCALLTYPE DOMNode::textContent(
337     /* [retval][out] */ BSTR* result)
338 {
339     if (!result)
340         return E_POINTER;
341 
342     *result = BString(m_node->textContent()).release();
343 
344     return S_OK;
345 }
346 
setTextContent(BSTR)347 HRESULT STDMETHODCALLTYPE DOMNode::setTextContent(
348     /* [in] */ BSTR /*text*/)
349 {
350     ASSERT_NOT_REACHED();
351     return E_NOTIMPL;
352 }
353 
354 // DOMNode - IDOMEventTarget --------------------------------------------------
355 
addEventListener(BSTR,IDOMEventListener *,BOOL)356 HRESULT STDMETHODCALLTYPE DOMNode::addEventListener(
357     /* [in] */ BSTR /*type*/,
358     /* [in] */ IDOMEventListener* /*listener*/,
359     /* [in] */ BOOL /*useCapture*/)
360 {
361     return E_NOTIMPL;
362 }
363 
removeEventListener(BSTR,IDOMEventListener *,BOOL)364 HRESULT STDMETHODCALLTYPE DOMNode::removeEventListener(
365     /* [in] */ BSTR /*type*/,
366     /* [in] */ IDOMEventListener* /*listener*/,
367     /* [in] */ BOOL /*useCapture*/)
368 {
369     return E_NOTIMPL;
370 }
371 
dispatchEvent(IDOMEvent * evt,BOOL * result)372 HRESULT STDMETHODCALLTYPE DOMNode::dispatchEvent(
373     /* [in] */ IDOMEvent* evt,
374     /* [retval][out] */ BOOL* result)
375 {
376     if (!m_node || !evt)
377         return E_FAIL;
378 
379 #if 0   // FIXME - raise dom exceptions
380     if (![self _node]->isEventTargetNode())
381         WebCore::raiseDOMException(DOM_NOT_SUPPORTED_ERR);
382 #endif
383 
384     COMPtr<DOMEvent> domEvent;
385     HRESULT hr = evt->QueryInterface(IID_DOMEvent, (void**) &domEvent);
386     if (FAILED(hr))
387         return hr;
388 
389     WebCore::ExceptionCode ec = 0;
390     *result = m_node->dispatchEvent(domEvent->coreEvent(), ec) ? TRUE : FALSE;
391 #if 0   // FIXME - raise dom exceptions
392     WebCore::raiseOnDOMError(ec);
393 #endif
394     return S_OK;
395 }
396 
397 // DOMNode - DOMNode ----------------------------------------------------------
398 
DOMNode(WebCore::Node * n)399 DOMNode::DOMNode(WebCore::Node* n)
400 : m_node(0)
401 {
402     if (n)
403         n->ref();
404 
405     m_node = n;
406 }
407 
~DOMNode()408 DOMNode::~DOMNode()
409 {
410     if (m_node)
411         m_node->deref();
412 }
413 
createInstance(WebCore::Node * n)414 IDOMNode* DOMNode::createInstance(WebCore::Node* n)
415 {
416     if (!n)
417         return 0;
418 
419     HRESULT hr = S_OK;
420     IDOMNode* domNode = 0;
421     WebCore::Node::NodeType nodeType = n->nodeType();
422 
423     switch (nodeType) {
424         case WebCore::Node::ELEMENT_NODE:
425         {
426             IDOMElement* newElement = DOMElement::createInstance(static_cast<WebCore::Element*>(n));
427             if (newElement) {
428                 hr = newElement->QueryInterface(IID_IDOMNode, (void**)&domNode);
429                 newElement->Release();
430             }
431         }
432         break;
433         case WebCore::Node::DOCUMENT_NODE:
434         {
435             IDOMDocument* newDocument = DOMDocument::createInstance(n->document());
436             if (newDocument) {
437                 hr = newDocument->QueryInterface(IID_IDOMNode, (void**)&domNode);
438                 newDocument->Release();
439             }
440         }
441         break;
442         default:
443         {
444             DOMNode* newNode = new DOMNode(n);
445             hr = newNode->QueryInterface(IID_IDOMNode, (void**)&domNode);
446         }
447         break;
448     }
449 
450     if (FAILED(hr))
451         return 0;
452 
453     return domNode;
454 }
455 
456 // DOMNodeList - IUnknown -----------------------------------------------------
457 
QueryInterface(REFIID riid,void ** ppvObject)458 HRESULT STDMETHODCALLTYPE DOMNodeList::QueryInterface(REFIID riid, void** ppvObject)
459 {
460     *ppvObject = 0;
461     if (IsEqualGUID(riid, IID_IDOMNodeList))
462         *ppvObject = static_cast<IDOMNodeList*>(this);
463     else
464         return DOMObject::QueryInterface(riid, ppvObject);
465 
466     AddRef();
467     return S_OK;
468 }
469 
470 // IDOMNodeList ---------------------------------------------------------------
471 
item(UINT index,IDOMNode ** result)472 HRESULT STDMETHODCALLTYPE DOMNodeList::item(
473     /* [in] */ UINT index,
474     /* [retval][out] */ IDOMNode **result)
475 {
476     *result = 0;
477     if (!m_nodeList)
478         return E_FAIL;
479 
480     WebCore::Node* itemNode = m_nodeList->item(index);
481     if (!itemNode)
482         return E_FAIL;
483 
484     *result = DOMNode::createInstance(itemNode);
485     return *result ? S_OK : E_FAIL;
486 }
487 
length(UINT * result)488 HRESULT STDMETHODCALLTYPE DOMNodeList::length(
489         /* [retval][out] */ UINT *result)
490 {
491     *result = 0;
492     if (!m_nodeList)
493         return E_FAIL;
494     *result = m_nodeList->length();
495     return S_OK;
496 }
497 
498 // DOMNodeList - DOMNodeList --------------------------------------------------
499 
DOMNodeList(WebCore::NodeList * l)500 DOMNodeList::DOMNodeList(WebCore::NodeList* l)
501 : m_nodeList(0)
502 {
503     if (l)
504         l->ref();
505 
506     m_nodeList = l;
507 }
508 
~DOMNodeList()509 DOMNodeList::~DOMNodeList()
510 {
511     if (m_nodeList)
512         m_nodeList->deref();
513 }
514 
createInstance(WebCore::NodeList * l)515 IDOMNodeList* DOMNodeList::createInstance(WebCore::NodeList* l)
516 {
517     if (!l)
518         return 0;
519 
520     IDOMNodeList* domNodeList = 0;
521     DOMNodeList* newNodeList = new DOMNodeList(l);
522     if (FAILED(newNodeList->QueryInterface(IID_IDOMNodeList, (void**)&domNodeList)))
523         return 0;
524 
525     return domNodeList;
526 }
527 
528 // DOMDocument - IUnknown -----------------------------------------------------
529 
QueryInterface(REFIID riid,void ** ppvObject)530 HRESULT STDMETHODCALLTYPE DOMDocument::QueryInterface(REFIID riid, void** ppvObject)
531 {
532     *ppvObject = 0;
533     if (IsEqualGUID(riid, IID_IDOMDocument))
534         *ppvObject = static_cast<IDOMDocument*>(this);
535     else if (IsEqualGUID(riid, IID_IDOMViewCSS))
536         *ppvObject = static_cast<IDOMViewCSS*>(this);
537     else if (IsEqualGUID(riid, IID_IDOMDocumentEvent))
538         *ppvObject = static_cast<IDOMDocumentEvent*>(this);
539     else
540         return DOMNode::QueryInterface(riid, ppvObject);
541 
542     AddRef();
543     return S_OK;
544 }
545 
546 // DOMDocument ----------------------------------------------------------------
547 
doctype(IDOMDocumentType **)548 HRESULT STDMETHODCALLTYPE DOMDocument::doctype(
549     /* [retval][out] */ IDOMDocumentType** /*result*/)
550 {
551     ASSERT_NOT_REACHED();
552     return E_NOTIMPL;
553 }
554 
implementation(IDOMImplementation **)555 HRESULT STDMETHODCALLTYPE DOMDocument::implementation(
556     /* [retval][out] */ IDOMImplementation** /*result*/)
557 {
558     ASSERT_NOT_REACHED();
559     return E_NOTIMPL;
560 }
561 
documentElement(IDOMElement ** result)562 HRESULT STDMETHODCALLTYPE DOMDocument::documentElement(
563     /* [retval][out] */ IDOMElement** result)
564 {
565     *result = DOMElement::createInstance(m_document->documentElement());
566     return *result ? S_OK : E_FAIL;
567 }
568 
createElement(BSTR tagName,IDOMElement ** result)569 HRESULT STDMETHODCALLTYPE DOMDocument::createElement(
570     /* [in] */ BSTR tagName,
571     /* [retval][out] */ IDOMElement** result)
572 {
573     if (!m_document)
574         return E_FAIL;
575 
576     String tagNameString(tagName);
577     ExceptionCode ec;
578     *result = DOMElement::createInstance(m_document->createElement(tagNameString, ec).get());
579     return *result ? S_OK : E_FAIL;
580 }
581 
createDocumentFragment(IDOMDocumentFragment **)582 HRESULT STDMETHODCALLTYPE DOMDocument::createDocumentFragment(
583     /* [retval][out] */ IDOMDocumentFragment** /*result*/)
584 {
585     ASSERT_NOT_REACHED();
586     return E_NOTIMPL;
587 }
588 
createTextNode(BSTR,IDOMText **)589 HRESULT STDMETHODCALLTYPE DOMDocument::createTextNode(
590     /* [in] */ BSTR /*data*/,
591     /* [retval][out] */ IDOMText** /*result*/)
592 {
593     ASSERT_NOT_REACHED();
594     return E_NOTIMPL;
595 }
596 
createComment(BSTR,IDOMComment **)597 HRESULT STDMETHODCALLTYPE DOMDocument::createComment(
598     /* [in] */ BSTR /*data*/,
599     /* [retval][out] */ IDOMComment** /*result*/)
600 {
601     ASSERT_NOT_REACHED();
602     return E_NOTIMPL;
603 }
604 
createCDATASection(BSTR,IDOMCDATASection **)605 HRESULT STDMETHODCALLTYPE DOMDocument::createCDATASection(
606     /* [in] */ BSTR /*data*/,
607     /* [retval][out] */ IDOMCDATASection** /*result*/)
608 {
609     ASSERT_NOT_REACHED();
610     return E_NOTIMPL;
611 }
612 
createProcessingInstruction(BSTR,BSTR,IDOMProcessingInstruction **)613 HRESULT STDMETHODCALLTYPE DOMDocument::createProcessingInstruction(
614     /* [in] */ BSTR /*target*/,
615     /* [in] */ BSTR /*data*/,
616     /* [retval][out] */ IDOMProcessingInstruction** /*result*/)
617 {
618     ASSERT_NOT_REACHED();
619     return E_NOTIMPL;
620 }
621 
createAttribute(BSTR,IDOMAttr **)622 HRESULT STDMETHODCALLTYPE DOMDocument::createAttribute(
623     /* [in] */ BSTR /*name*/,
624     /* [retval][out] */ IDOMAttr** /*result*/)
625 {
626     ASSERT_NOT_REACHED();
627     return E_NOTIMPL;
628 }
629 
createEntityReference(BSTR,IDOMEntityReference **)630 HRESULT STDMETHODCALLTYPE DOMDocument::createEntityReference(
631     /* [in] */ BSTR /*name*/,
632     /* [retval][out] */ IDOMEntityReference** /*result*/)
633 {
634     ASSERT_NOT_REACHED();
635     return E_NOTIMPL;
636 }
637 
getElementsByTagName(BSTR tagName,IDOMNodeList ** result)638 HRESULT STDMETHODCALLTYPE DOMDocument::getElementsByTagName(
639     /* [in] */ BSTR tagName,
640     /* [retval][out] */ IDOMNodeList** result)
641 {
642     if (!m_document)
643         return E_FAIL;
644 
645     String tagNameString(tagName);
646     *result = DOMNodeList::createInstance(m_document->getElementsByTagName(tagNameString).get());
647     return *result ? S_OK : E_FAIL;
648 }
649 
importNode(IDOMNode *,BOOL,IDOMNode **)650 HRESULT STDMETHODCALLTYPE DOMDocument::importNode(
651     /* [in] */ IDOMNode* /*importedNode*/,
652     /* [in] */ BOOL /*deep*/,
653     /* [retval][out] */ IDOMNode** /*result*/)
654 {
655     ASSERT_NOT_REACHED();
656     return E_NOTIMPL;
657 }
658 
createElementNS(BSTR,BSTR,IDOMElement **)659 HRESULT STDMETHODCALLTYPE DOMDocument::createElementNS(
660     /* [in] */ BSTR /*namespaceURI*/,
661     /* [in] */ BSTR /*qualifiedName*/,
662     /* [retval][out] */ IDOMElement** /*result*/)
663 {
664     ASSERT_NOT_REACHED();
665     return E_NOTIMPL;
666 }
667 
createAttributeNS(BSTR,BSTR,IDOMAttr **)668 HRESULT STDMETHODCALLTYPE DOMDocument::createAttributeNS(
669     /* [in] */ BSTR /*namespaceURI*/,
670     /* [in] */ BSTR /*qualifiedName*/,
671     /* [retval][out] */ IDOMAttr** /*result*/)
672 {
673     ASSERT_NOT_REACHED();
674     return E_NOTIMPL;
675 }
676 
getElementsByTagNameNS(BSTR namespaceURI,BSTR localName,IDOMNodeList ** result)677 HRESULT STDMETHODCALLTYPE DOMDocument::getElementsByTagNameNS(
678     /* [in] */ BSTR namespaceURI,
679     /* [in] */ BSTR localName,
680     /* [retval][out] */ IDOMNodeList** result)
681 {
682     if (!m_document)
683         return E_FAIL;
684 
685     String namespaceURIString(namespaceURI);
686     String localNameString(localName);
687     *result = DOMNodeList::createInstance(m_document->getElementsByTagNameNS(namespaceURIString, localNameString).get());
688     return *result ? S_OK : E_FAIL;
689 }
690 
getElementById(BSTR elementId,IDOMElement ** result)691 HRESULT STDMETHODCALLTYPE DOMDocument::getElementById(
692     /* [in] */ BSTR elementId,
693     /* [retval][out] */ IDOMElement** result)
694 {
695     if (!m_document)
696         return E_FAIL;
697 
698     String idString(elementId);
699     *result = DOMElement::createInstance(m_document->getElementById(idString));
700     return *result ? S_OK : E_FAIL;
701 }
702 
703 // DOMDocument - IDOMViewCSS --------------------------------------------------
704 
getComputedStyle(IDOMElement * elt,BSTR pseudoElt,IDOMCSSStyleDeclaration ** result)705 HRESULT STDMETHODCALLTYPE DOMDocument::getComputedStyle(
706     /* [in] */ IDOMElement* elt,
707     /* [in] */ BSTR pseudoElt,
708     /* [retval][out] */ IDOMCSSStyleDeclaration** result)
709 {
710     if (!elt || !result)
711         return E_POINTER;
712 
713     COMPtr<DOMElement> domEle;
714     HRESULT hr = elt->QueryInterface(IID_DOMElement, (void**)&domEle);
715     if (FAILED(hr))
716         return hr;
717     Element* element = domEle->element();
718 
719     WebCore::DOMWindow* dv = m_document->defaultView();
720     String pseudoEltString(pseudoElt);
721 
722     if (!dv)
723         return E_FAIL;
724 
725     *result = DOMCSSStyleDeclaration::createInstance(dv->getComputedStyle(element, pseudoEltString.impl()).get());
726     return *result ? S_OK : E_FAIL;
727 }
728 
729 // DOMDocument - IDOMDocumentEvent --------------------------------------------
730 
createEvent(BSTR eventType,IDOMEvent ** result)731 HRESULT STDMETHODCALLTYPE DOMDocument::createEvent(
732     /* [in] */ BSTR eventType,
733     /* [retval][out] */ IDOMEvent **result)
734 {
735     String eventTypeString(eventType, SysStringLen(eventType));
736     WebCore::ExceptionCode ec = 0;
737     *result = DOMEvent::createInstance(m_document->createEvent(eventTypeString, ec));
738     return *result ? S_OK : E_FAIL;
739 }
740 
741 // DOMDocument - DOMDocument --------------------------------------------------
742 
DOMDocument(WebCore::Document * d)743 DOMDocument::DOMDocument(WebCore::Document* d)
744 : DOMNode(d)
745 , m_document(d)
746 {
747 }
748 
~DOMDocument()749 DOMDocument::~DOMDocument()
750 {
751 }
752 
createInstance(WebCore::Document * d)753 IDOMDocument* DOMDocument::createInstance(WebCore::Document* d)
754 {
755     if (!d)
756         return 0;
757 
758     HRESULT hr;
759     IDOMDocument* domDocument = 0;
760 
761     if (d->isHTMLDocument()) {
762         DOMHTMLDocument* newDocument = new DOMHTMLDocument(d);
763         hr = newDocument->QueryInterface(IID_IDOMDocument, (void**)&domDocument);
764     } else {
765         DOMDocument* newDocument = new DOMDocument(d);
766         hr = newDocument->QueryInterface(IID_IDOMDocument, (void**)&domDocument);
767     }
768 
769     if (FAILED(hr))
770         return 0;
771 
772     return domDocument;
773 }
774 
775 // DOMElement - IUnknown ------------------------------------------------------
776 
QueryInterface(REFIID riid,void ** ppvObject)777 HRESULT STDMETHODCALLTYPE DOMElement::QueryInterface(REFIID riid, void** ppvObject)
778 {
779     *ppvObject = 0;
780     if (IsEqualGUID(riid, IID_IDOMElement))
781         *ppvObject = static_cast<IDOMElement*>(this);
782     else if (IsEqualGUID(riid, IID_DOMElement))
783         *ppvObject = static_cast<DOMElement*>(this);
784     else if (IsEqualGUID(riid, IID_IDOMElementPrivate))
785         *ppvObject = static_cast<IDOMElementPrivate*>(this);
786     else if (IsEqualGUID(riid, IID_IDOMNodeExtensions))
787         *ppvObject = static_cast<IDOMNodeExtensions*>(this);
788     else if (IsEqualGUID(riid, IID_IDOMElementCSSInlineStyle))
789         *ppvObject = static_cast<IDOMElementCSSInlineStyle*>(this);
790     else if (IsEqualGUID(riid, IID_IDOMElementExtensions))
791         *ppvObject = static_cast<IDOMElementExtensions*>(this);
792     else
793         return DOMNode::QueryInterface(riid, ppvObject);
794 
795     AddRef();
796     return S_OK;
797 }
798 
799 // DOMElement - IDOMNodeExtensions---------------------------------------------
800 
boundingBox(LPRECT rect)801 HRESULT STDMETHODCALLTYPE DOMElement::boundingBox(
802     /* [retval][out] */ LPRECT rect)
803 {
804     ::SetRectEmpty(rect);
805 
806     if (!m_element)
807         return E_FAIL;
808 
809     WebCore::RenderObject *renderer = m_element->renderer();
810     if (renderer) {
811         IntRect boundsIntRect = renderer->absoluteBoundingBoxRect();
812         rect->left = boundsIntRect.x();
813         rect->top = boundsIntRect.y();
814         rect->right = boundsIntRect.x() + boundsIntRect.width();
815         rect->bottom = boundsIntRect.y() + boundsIntRect.height();
816     }
817 
818     return S_OK;
819 }
820 
lineBoxRects(RECT *,int)821 HRESULT STDMETHODCALLTYPE DOMElement::lineBoxRects(
822     /* [size_is][in] */ RECT* /*rects*/,
823     /* [in] */ int /*cRects*/)
824 {
825     return E_NOTIMPL;
826 }
827 
828 // IDOMElement ----------------------------------------------------------------
829 
tagName(BSTR *)830 HRESULT STDMETHODCALLTYPE DOMElement::tagName(
831         /* [retval][out] */ BSTR* /*result*/)
832 {
833     ASSERT_NOT_REACHED();
834     return E_NOTIMPL;
835 }
836 
getAttribute(BSTR name,BSTR * result)837 HRESULT STDMETHODCALLTYPE DOMElement::getAttribute(
838         /* [in] */ BSTR name,
839         /* [retval][out] */ BSTR* result)
840 {
841     if (!m_element)
842         return E_FAIL;
843     WebCore::String nameString(name, SysStringLen(name));
844     WebCore::String& attrValueString = (WebCore::String&) m_element->getAttribute(nameString);
845     *result = SysAllocStringLen(attrValueString.characters(), attrValueString.length());
846     if (attrValueString.length() && !*result)
847         return E_OUTOFMEMORY;
848     return S_OK;
849 }
850 
setAttribute(BSTR name,BSTR value)851 HRESULT STDMETHODCALLTYPE DOMElement::setAttribute(
852         /* [in] */ BSTR name,
853         /* [in] */ BSTR value)
854 {
855     if (!m_element)
856         return E_FAIL;
857 
858     WebCore::String nameString(name, SysStringLen(name));
859     WebCore::String valueString(value, SysStringLen(value));
860     WebCore::ExceptionCode ec = 0;
861     m_element->setAttribute(nameString, valueString, ec);
862     return ec ? E_FAIL : S_OK;
863 }
864 
removeAttribute(BSTR)865 HRESULT STDMETHODCALLTYPE DOMElement::removeAttribute(
866         /* [in] */ BSTR /*name*/)
867 {
868     ASSERT_NOT_REACHED();
869     return E_NOTIMPL;
870 }
871 
getAttributeNode(BSTR,IDOMAttr **)872 HRESULT STDMETHODCALLTYPE DOMElement::getAttributeNode(
873         /* [in] */ BSTR /*name*/,
874         /* [retval][out] */ IDOMAttr** /*result*/)
875 {
876     ASSERT_NOT_REACHED();
877     return E_NOTIMPL;
878 }
879 
setAttributeNode(IDOMAttr *,IDOMAttr **)880 HRESULT STDMETHODCALLTYPE DOMElement::setAttributeNode(
881         /* [in] */ IDOMAttr* /*newAttr*/,
882         /* [retval][out] */ IDOMAttr** /*result*/)
883 {
884     ASSERT_NOT_REACHED();
885     return E_NOTIMPL;
886 }
887 
removeAttributeNode(IDOMAttr *,IDOMAttr **)888 HRESULT STDMETHODCALLTYPE DOMElement::removeAttributeNode(
889         /* [in] */ IDOMAttr* /*oldAttr*/,
890         /* [retval][out] */ IDOMAttr** /*result*/)
891 {
892     ASSERT_NOT_REACHED();
893     return E_NOTIMPL;
894 }
895 
getElementsByTagName(BSTR,IDOMNodeList **)896 HRESULT STDMETHODCALLTYPE DOMElement::getElementsByTagName(
897         /* [in] */ BSTR /*name*/,
898         /* [retval][out] */ IDOMNodeList** /*result*/)
899 {
900     ASSERT_NOT_REACHED();
901     return E_NOTIMPL;
902 }
903 
getAttributeNS(BSTR,BSTR,BSTR *)904 HRESULT STDMETHODCALLTYPE DOMElement::getAttributeNS(
905         /* [in] */ BSTR /*namespaceURI*/,
906         /* [in] */ BSTR /*localName*/,
907         /* [retval][out] */ BSTR* /*result*/)
908 {
909     ASSERT_NOT_REACHED();
910     return E_NOTIMPL;
911 }
912 
setAttributeNS(BSTR,BSTR,BSTR)913 HRESULT STDMETHODCALLTYPE DOMElement::setAttributeNS(
914         /* [in] */ BSTR /*namespaceURI*/,
915         /* [in] */ BSTR /*qualifiedName*/,
916         /* [in] */ BSTR /*value*/)
917 {
918     ASSERT_NOT_REACHED();
919     return E_NOTIMPL;
920 }
921 
removeAttributeNS(BSTR,BSTR)922 HRESULT STDMETHODCALLTYPE DOMElement::removeAttributeNS(
923         /* [in] */ BSTR /*namespaceURI*/,
924         /* [in] */ BSTR /*localName*/)
925 {
926     ASSERT_NOT_REACHED();
927     return E_NOTIMPL;
928 }
929 
getAttributeNodeNS(BSTR,BSTR,IDOMAttr **)930 HRESULT STDMETHODCALLTYPE DOMElement::getAttributeNodeNS(
931         /* [in] */ BSTR /*namespaceURI*/,
932         /* [in] */ BSTR /*localName*/,
933         /* [retval][out] */ IDOMAttr** /*result*/)
934 {
935     ASSERT_NOT_REACHED();
936     return E_NOTIMPL;
937 }
938 
setAttributeNodeNS(IDOMAttr *,IDOMAttr **)939 HRESULT STDMETHODCALLTYPE DOMElement::setAttributeNodeNS(
940         /* [in] */ IDOMAttr* /*newAttr*/,
941         /* [retval][out] */ IDOMAttr** /*result*/)
942 {
943     ASSERT_NOT_REACHED();
944     return E_NOTIMPL;
945 }
946 
getElementsByTagNameNS(BSTR,BSTR,IDOMNodeList **)947 HRESULT STDMETHODCALLTYPE DOMElement::getElementsByTagNameNS(
948         /* [in] */ BSTR /*namespaceURI*/,
949         /* [in] */ BSTR /*localName*/,
950         /* [retval][out] */ IDOMNodeList** /*result*/)
951 {
952     ASSERT_NOT_REACHED();
953     return E_NOTIMPL;
954 }
955 
hasAttribute(BSTR,BOOL *)956 HRESULT STDMETHODCALLTYPE DOMElement::hasAttribute(
957         /* [in] */ BSTR /*name*/,
958         /* [retval][out] */ BOOL* /*result*/)
959 {
960     ASSERT_NOT_REACHED();
961     return E_NOTIMPL;
962 }
963 
hasAttributeNS(BSTR,BSTR,BOOL *)964 HRESULT STDMETHODCALLTYPE DOMElement::hasAttributeNS(
965         /* [in] */ BSTR /*namespaceURI*/,
966         /* [in] */ BSTR /*localName*/,
967         /* [retval][out] */ BOOL* /*result*/)
968 {
969     ASSERT_NOT_REACHED();
970     return E_NOTIMPL;
971 }
972 
focus(void)973 HRESULT STDMETHODCALLTYPE DOMElement::focus( void)
974 {
975     if (!m_element)
976         return E_FAIL;
977     m_element->focus();
978     return S_OK;
979 }
980 
blur(void)981 HRESULT STDMETHODCALLTYPE DOMElement::blur( void)
982 {
983     if (!m_element)
984         return E_FAIL;
985     m_element->blur();
986     return S_OK;
987 }
988 
989 // IDOMElementPrivate ---------------------------------------------------------
990 
coreElement(void ** element)991 HRESULT DOMElement::coreElement(void **element)
992 {
993     if (!m_element)
994         return E_FAIL;
995     *element = (void*) m_element;
996     return S_OK;
997 }
998 
isEqual(IDOMElement * other,BOOL * result)999 HRESULT STDMETHODCALLTYPE DOMElement::isEqual(
1000     /* [in] */ IDOMElement *other,
1001     /* [retval][out] */ BOOL *result)
1002 {
1003     *result = FALSE;
1004 
1005     if (!other || !result)
1006         return E_POINTER;
1007 
1008     IDOMElementPrivate* otherPriv;
1009     HRESULT hr = other->QueryInterface(IID_IDOMElementPrivate, (void**) &otherPriv);
1010     if (FAILED(hr))
1011         return hr;
1012 
1013     void* otherCoreEle;
1014     hr = otherPriv->coreElement(&otherCoreEle);
1015     otherPriv->Release();
1016     if (FAILED(hr))
1017         return hr;
1018 
1019     *result = (otherCoreEle == (void*)m_element) ? TRUE : FALSE;
1020     return S_OK;
1021 }
1022 
isFocused(BOOL * result)1023 HRESULT STDMETHODCALLTYPE DOMElement::isFocused(
1024     /* [retval][out] */ BOOL *result)
1025 {
1026     if (!m_element)
1027         return E_FAIL;
1028 
1029     if (m_element->document()->focusedNode() == m_element)
1030         *result = TRUE;
1031     else
1032         *result = FALSE;
1033 
1034     return S_OK;
1035 }
1036 
innerText(BSTR * result)1037 HRESULT STDMETHODCALLTYPE DOMElement::innerText(
1038     /* [retval][out] */ BSTR* result)
1039 {
1040     if (!result) {
1041         ASSERT_NOT_REACHED();
1042         return E_POINTER;
1043     }
1044 
1045     if (!m_element) {
1046         ASSERT_NOT_REACHED();
1047         return E_FAIL;
1048     }
1049 
1050     *result = BString(m_element->innerText()).release();
1051     return S_OK;
1052 }
1053 
font(WebFontDescription * webFontDescription)1054 HRESULT STDMETHODCALLTYPE DOMElement::font(WebFontDescription* webFontDescription)
1055 {
1056     if (!webFontDescription) {
1057         ASSERT_NOT_REACHED();
1058         return E_POINTER;
1059     }
1060 
1061     ASSERT(m_element);
1062 
1063     WebCore::RenderObject* renderer = m_element->renderer();
1064     if (!renderer)
1065         return E_FAIL;
1066 
1067     FontDescription fontDescription = renderer->style()->font().fontDescription();
1068     AtomicString family = fontDescription.family().family();
1069     webFontDescription->family = family.characters();
1070     webFontDescription->familyLength = family.length();
1071     webFontDescription->size = fontDescription.computedSize();
1072     webFontDescription->bold = fontDescription.weight() >= WebCore::FontWeight600;
1073     webFontDescription->italic = fontDescription.italic();
1074 
1075     return S_OK;
1076 }
1077 
renderedImage(HBITMAP * image)1078 HRESULT STDMETHODCALLTYPE DOMElement::renderedImage(HBITMAP* image)
1079 {
1080     if (!image) {
1081         ASSERT_NOT_REACHED();
1082         return E_POINTER;
1083     }
1084     *image = 0;
1085 
1086     ASSERT(m_element);
1087 
1088     Frame* frame = m_element->document()->frame();
1089     if (!frame)
1090         return E_FAIL;
1091 
1092     *image = frame->nodeImage(m_element);
1093     if (!*image)
1094         return E_FAIL;
1095 
1096     return S_OK;
1097 }
1098 
1099 // IDOMElementCSSInlineStyle --------------------------------------------------
1100 
style(IDOMCSSStyleDeclaration ** result)1101 HRESULT STDMETHODCALLTYPE DOMElement::style(
1102     /* [retval][out] */ IDOMCSSStyleDeclaration** result)
1103 {
1104     if (!result)
1105         return E_POINTER;
1106     if (!m_element)
1107         return E_FAIL;
1108 
1109     WebCore::CSSStyleDeclaration* style = m_element->style();
1110     if (!style)
1111         return E_FAIL;
1112 
1113     *result = DOMCSSStyleDeclaration::createInstance(style);
1114     return *result ? S_OK : E_FAIL;
1115 }
1116 
1117 // IDOMElementExtensions ------------------------------------------------------
1118 
offsetLeft(int * result)1119 HRESULT STDMETHODCALLTYPE DOMElement::offsetLeft(
1120     /* [retval][out] */ int* result)
1121 {
1122     if (!m_element)
1123         return E_FAIL;
1124 
1125     *result = m_element->offsetLeft();
1126     return S_OK;
1127 }
1128 
offsetTop(int * result)1129 HRESULT STDMETHODCALLTYPE DOMElement::offsetTop(
1130     /* [retval][out] */ int* result)
1131 {
1132     if (!m_element)
1133         return E_FAIL;
1134 
1135     *result = m_element->offsetTop();
1136     return S_OK;
1137 }
1138 
offsetWidth(int * result)1139 HRESULT STDMETHODCALLTYPE DOMElement::offsetWidth(
1140     /* [retval][out] */ int* result)
1141 {
1142     if (!m_element)
1143         return E_FAIL;
1144 
1145     *result = m_element->offsetWidth();
1146     return S_OK;
1147 }
1148 
offsetHeight(int * result)1149 HRESULT STDMETHODCALLTYPE DOMElement::offsetHeight(
1150     /* [retval][out] */ int* result)
1151 {
1152     if (!m_element)
1153         return E_FAIL;
1154 
1155     *result = m_element->offsetHeight();
1156     return S_OK;
1157 }
1158 
offsetParent(IDOMElement **)1159 HRESULT STDMETHODCALLTYPE DOMElement::offsetParent(
1160     /* [retval][out] */ IDOMElement** /*result*/)
1161 {
1162     // FIXME
1163     ASSERT_NOT_REACHED();
1164     return E_NOTIMPL;
1165 }
1166 
clientWidth(int * result)1167 HRESULT STDMETHODCALLTYPE DOMElement::clientWidth(
1168     /* [retval][out] */ int* result)
1169 {
1170     if (!m_element)
1171         return E_FAIL;
1172 
1173     *result = m_element->clientWidth();
1174     return S_OK;
1175 }
1176 
clientHeight(int * result)1177 HRESULT STDMETHODCALLTYPE DOMElement::clientHeight(
1178     /* [retval][out] */ int* result)
1179 {
1180     if (!m_element)
1181         return E_FAIL;
1182 
1183     *result = m_element->clientHeight();
1184     return S_OK;
1185 }
1186 
scrollLeft(int * result)1187 HRESULT STDMETHODCALLTYPE DOMElement::scrollLeft(
1188     /* [retval][out] */ int* result)
1189 {
1190     if (!m_element)
1191         return E_FAIL;
1192 
1193     *result = m_element->scrollLeft();
1194     return S_OK;
1195 }
1196 
setScrollLeft(int)1197 HRESULT STDMETHODCALLTYPE DOMElement::setScrollLeft(
1198     /* [in] */ int /*newScrollLeft*/)
1199 {
1200     // FIXME
1201     ASSERT_NOT_REACHED();
1202     return E_NOTIMPL;
1203 }
1204 
scrollTop(int * result)1205 HRESULT STDMETHODCALLTYPE DOMElement::scrollTop(
1206     /* [retval][out] */ int* result)
1207 {
1208     if (!m_element)
1209         return E_FAIL;
1210 
1211     *result = m_element->scrollTop();
1212     return S_OK;
1213 }
1214 
setScrollTop(int)1215 HRESULT STDMETHODCALLTYPE DOMElement::setScrollTop(
1216     /* [in] */ int /*newScrollTop*/)
1217 {
1218     // FIXME
1219     ASSERT_NOT_REACHED();
1220     return E_NOTIMPL;
1221 }
1222 
scrollWidth(int * result)1223 HRESULT STDMETHODCALLTYPE DOMElement::scrollWidth(
1224     /* [retval][out] */ int* result)
1225 {
1226     if (!m_element)
1227         return E_FAIL;
1228 
1229     *result = m_element->scrollWidth();
1230     return S_OK;
1231 }
1232 
scrollHeight(int * result)1233 HRESULT STDMETHODCALLTYPE DOMElement::scrollHeight(
1234     /* [retval][out] */ int* result)
1235 {
1236     if (!m_element)
1237         return E_FAIL;
1238 
1239     *result = m_element->scrollHeight();
1240     return S_OK;
1241 }
1242 
scrollIntoView(BOOL alignWithTop)1243 HRESULT STDMETHODCALLTYPE DOMElement::scrollIntoView(
1244     /* [in] */ BOOL alignWithTop)
1245 {
1246     if (!m_element)
1247         return E_FAIL;
1248 
1249     m_element->scrollIntoView(!!alignWithTop);
1250     return S_OK;
1251 }
1252 
scrollIntoViewIfNeeded(BOOL centerIfNeeded)1253 HRESULT STDMETHODCALLTYPE DOMElement::scrollIntoViewIfNeeded(
1254     /* [in] */ BOOL centerIfNeeded)
1255 {
1256     if (!m_element)
1257         return E_FAIL;
1258 
1259     m_element->scrollIntoViewIfNeeded(!!centerIfNeeded);
1260     return S_OK;
1261 }
1262 
1263 // DOMElement -----------------------------------------------------------------
1264 
DOMElement(WebCore::Element * e)1265 DOMElement::DOMElement(WebCore::Element* e)
1266 : DOMNode(e)
1267 , m_element(e)
1268 {
1269 }
1270 
~DOMElement()1271 DOMElement::~DOMElement()
1272 {
1273 }
1274 
createInstance(WebCore::Element * e)1275 IDOMElement* DOMElement::createInstance(WebCore::Element* e)
1276 {
1277     if (!e)
1278         return 0;
1279 
1280     HRESULT hr;
1281     IDOMElement* domElement = 0;
1282 
1283     if (e->hasTagName(formTag)) {
1284         DOMHTMLFormElement* newElement = new DOMHTMLFormElement(e);
1285         hr = newElement->QueryInterface(IID_IDOMElement, (void**)&domElement);
1286     } else if (e->hasTagName(selectTag)) {
1287         DOMHTMLSelectElement* newElement = new DOMHTMLSelectElement(e);
1288         hr = newElement->QueryInterface(IID_IDOMElement, (void**)&domElement);
1289     } else if (e->hasTagName(optionTag)) {
1290         DOMHTMLOptionElement* newElement = new DOMHTMLOptionElement(e);
1291         hr = newElement->QueryInterface(IID_IDOMElement, (void**)&domElement);
1292     } else if (e->hasTagName(inputTag)) {
1293         DOMHTMLInputElement* newElement = new DOMHTMLInputElement(e);
1294         hr = newElement->QueryInterface(IID_IDOMElement, (void**)&domElement);
1295     } else if (e->hasTagName(textareaTag)) {
1296         DOMHTMLTextAreaElement* newElement = new DOMHTMLTextAreaElement(e);
1297         hr = newElement->QueryInterface(IID_IDOMElement, (void**)&domElement);
1298     } else if (e->isHTMLElement()) {
1299         DOMHTMLElement* newElement = new DOMHTMLElement(e);
1300         hr = newElement->QueryInterface(IID_IDOMElement, (void**)&domElement);
1301     } else {
1302         DOMElement* newElement = new DOMElement(e);
1303         hr = newElement->QueryInterface(IID_IDOMElement, (void**)&domElement);
1304     }
1305 
1306     if (FAILED(hr))
1307         return 0;
1308 
1309     return domElement;
1310 }
1311