15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Google Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
32f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebNode.h"
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
341fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch#include "bindings/v8/ExceptionState.h"
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Element.h"
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Node.h"
3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/NodeList.h"
3976c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)#include "core/dom/TagCollection.h"
4053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/markup.h"
4109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/events/Event.h"
4209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/html/HTMLCollection.h"
43d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/html/HTMLElement.h"
4453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderObject.h"
4553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderWidget.h"
461e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/Widget.h"
475267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebString.h"
485267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)#include "public/platform/WebVector.h"
49f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebDOMEvent.h"
50f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebDOMEventListener.h"
51f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebDocument.h"
52f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebElement.h"
53f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebElementCollection.h"
54f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebNodeList.h"
55f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "public/web/WebPluginContainer.h"
56f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/EventListenerWrapper.h"
57f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/FrameLoaderClientImpl.h"
58f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebLocalFrameImpl.h"
59f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu#include "web/WebPluginContainerImpl.h"
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace WebCore;
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink {
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebNode::reset()
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_private.reset();
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebNode::assign(const WebNode& other)
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_private = other.m_private;
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebNode::equals(const WebNode& n) const
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
77e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    return m_private.get() == n.m_private.get();
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebNode::lessThan(const WebNode& n) const
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
82e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch    return m_private.get() < n.m_private.get();
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebNode::NodeType WebNode::nodeType() const
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return static_cast<NodeType>(m_private->nodeType());
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebNode WebNode::parentNode() const
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebNode(const_cast<ContainerNode*>(m_private->parentNode()));
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebString WebNode::nodeName() const
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_private->nodeName();
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebString WebNode::nodeValue() const
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_private->nodeValue();
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebDocument WebNode::document() const
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1078abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return WebDocument(&m_private->document());
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebNode WebNode::firstChild() const
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebNode(m_private->firstChild());
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebNode WebNode::lastChild() const
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebNode(m_private->lastChild());
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebNode WebNode::previousSibling() const
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebNode(m_private->previousSibling());
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebNode WebNode::nextSibling() const
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebNode(m_private->nextSibling());
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebNode::hasChildNodes() const
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
132d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return m_private->hasChildren();
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebNodeList WebNode::childNodes()
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebNodeList(m_private->childNodes());
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebString WebNode::createMarkup() const
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebCore::createMarkup(m_private.get());
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebNode::isLink() const
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_private->isLink();
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebNode::isTextNode() const
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_private->isTextNode();
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebNode::isFocusable() const
1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
157df95704c49daea886ddad70775bda23618d6274dBen Murdoch    if (!m_private->isElementNode())
158df95704c49daea886ddad70775bda23618d6274dBen Murdoch        return false;
1598abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    m_private->document().updateLayoutIgnorePendingStylesheets();
160df95704c49daea886ddad70775bda23618d6274dBen Murdoch    return toElement(m_private.get())->isFocusable();
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebNode::isContentEditable() const
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_private->isContentEditable();
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebNode::isElementNode() const
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_private->isElementNode();
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebNode::addEventListener(const WebString& eventType, WebDOMEventListener* listener, bool useCapture)
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
175926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // Please do not add more eventTypes to this list without an API review.
176926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    RELEASE_ASSERT(eventType == "mousedown");
177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
178926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    EventListenerWrapper* listenerWrapper = listener->createEventListenerWrapper(eventType, useCapture, m_private.get());
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // The listenerWrapper is only referenced by the actual Node.  Once it goes
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // away, the wrapper notifies the WebEventListener so it can clear its
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // pointer to it.
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_private->addEventListener(eventType, adoptRef(listenerWrapper), useCapture);
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebNode::dispatchEvent(const WebDOMEvent& event)
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!event.isNull())
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_private->dispatchEvent(event);
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return false;
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void WebNode::simulateClick()
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
194926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_private->dispatchSimulatedClick(0);
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
19709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)WebElementCollection WebNode::getElementsByTagName(const WebString& tag) const
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
199c664b83e7394be007e9ef2430bed7d73b50e0da7Bo Liu    if (m_private->isContainerNode()) {
200c664b83e7394be007e9ef2430bed7d73b50e0da7Bo Liu        // FIXME: Calling getElementsByTagNameNS here is inconsistent with the
201c664b83e7394be007e9ef2430bed7d73b50e0da7Bo Liu        // function name. This is a temporary fix for a serious bug, and should
202c664b83e7394be007e9ef2430bed7d73b50e0da7Bo Liu        // be reverted soon.
203c664b83e7394be007e9ef2430bed7d73b50e0da7Bo Liu        return WebElementCollection(toContainerNode(m_private.get())->getElementsByTagNameNS(HTMLNames::xhtmlNamespaceURI, tag));
204c664b83e7394be007e9ef2430bed7d73b50e0da7Bo Liu    }
20509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return WebElementCollection();
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
208926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebElement WebNode::querySelector(const WebString& tag, WebExceptionCode& ec) const
209926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
21051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    TrackExceptionState exceptionState;
21109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    WebElement element;
212d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (m_private->isContainerNode())
21309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        element = toContainerNode(m_private.get())->querySelector(tag, exceptionState);
21451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ec = exceptionState.code();
215df95704c49daea886ddad70775bda23618d6274dBen Murdoch    return element;
216926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
217926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)WebElement WebNode::rootEditableElement() const
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return WebElement(m_private->rootEditableElement());
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebNode::focused() const
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_private->focused();
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebNode::remove()
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
23051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    TrackExceptionState exceptionState;
23151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    m_private->remove(exceptionState);
23251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return !exceptionState.hadException();
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool WebNode::hasNonEmptyBoundingBox() const
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2378abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    m_private->document().updateLayoutIgnorePendingStylesheets();
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_private->hasNonEmptyBoundingBox();
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
241926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebPluginContainer* WebNode::pluginContainer() const
242926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
243926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (isNull())
244926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return 0;
245d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    const Node& coreNode = *constUnwrap<Node>();
246d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isHTMLObjectElement(coreNode) || isHTMLEmbedElement(coreNode)) {
247d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        RenderObject* object = coreNode.renderer();
248926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (object && object->isWidget()) {
249926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            Widget* widget = WebCore::toRenderWidget(object)->widget();
250926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            if (widget && widget->isPluginContainer())
25109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)                return toWebPluginContainerImpl(widget);
252926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        }
253926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    }
254926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return 0;
255926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
256926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
257926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)WebElement WebNode::shadowHost() const
258926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
259926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (isNull())
260926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        return WebElement();
261926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    const Node* coreNode = constUnwrap<Node>();
262926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return WebElement(coreNode->shadowHost());
263926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
264926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
265323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)WebNode::WebNode(const PassRefPtrWillBeRawPtr<Node>& node)
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_private(node)
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
270323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)WebNode& WebNode::operator=(const PassRefPtrWillBeRawPtr<Node>& node)
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_private = node;
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return *this;
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
276323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)WebNode::operator PassRefPtrWillBeRawPtr<Node>() const
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_private.get();
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} // namespace blink
282