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