Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / rendering / HitTestResult.cpp
index 1b15d9c..921448c 100644 (file)
@@ -22,9 +22,7 @@
 #include "config.h"
 #include "core/rendering/HitTestResult.h"
 
-#include "HTMLNames.h"
-#include "SVGNames.h"
-#include "XLinkNames.h"
+#include "core/HTMLNames.h"
 #include "core/dom/DocumentMarkerController.h"
 #include "core/dom/NodeRenderingTraversal.h"
 #include "core/dom/shadow/ShadowRoot.h"
@@ -42,7 +40,7 @@
 #include "core/svg/SVGElement.h"
 #include "platform/scroll/Scrollbar.h"
 
-namespace WebCore {
+namespace blink {
 
 using namespace HTMLNames;
 
@@ -89,7 +87,7 @@ HitTestResult::HitTestResult(const HitTestResult& other)
     , m_isFirstLetter(other.m_isFirstLetter)
 {
     // Only copy the NodeSet in case of rect hit test.
-    m_rectBasedTestResult = adoptPtr(other.m_rectBasedTestResult ? new NodeSet(*other.m_rectBasedTestResult) : 0);
+    m_rectBasedTestResult = adoptPtrWillBeNoop(other.m_rectBasedTestResult ? new NodeSet(*other.m_rectBasedTestResult) : 0);
 }
 
 HitTestResult::~HitTestResult()
@@ -110,11 +108,34 @@ HitTestResult& HitTestResult::operator=(const HitTestResult& other)
     m_isOverWidget = other.isOverWidget();
 
     // Only copy the NodeSet in case of rect hit test.
-    m_rectBasedTestResult = adoptPtr(other.m_rectBasedTestResult ? new NodeSet(*other.m_rectBasedTestResult) : 0);
+    m_rectBasedTestResult = adoptPtrWillBeNoop(other.m_rectBasedTestResult ? new NodeSet(*other.m_rectBasedTestResult) : 0);
 
     return *this;
 }
 
+void HitTestResult::trace(Visitor* visitor)
+{
+    visitor->trace(m_innerNode);
+    visitor->trace(m_innerPossiblyPseudoNode);
+    visitor->trace(m_innerNonSharedNode);
+    visitor->trace(m_innerURLElement);
+#if ENABLE(OILPAN)
+    visitor->trace(m_rectBasedTestResult);
+#endif
+}
+
+PositionWithAffinity HitTestResult::position() const
+{
+    if (!m_innerPossiblyPseudoNode)
+        return PositionWithAffinity();
+    RenderObject* renderer = this->renderer();
+    if (!renderer)
+        return PositionWithAffinity();
+    if (m_innerPossiblyPseudoNode->isPseudoElement() && m_innerPossiblyPseudoNode->pseudoId() == BEFORE)
+        return Position(m_innerNode, Position::PositionIsBeforeChildren).downstream();
+    return renderer->positionForPoint(localPoint());
+}
+
 RenderObject* HitTestResult::renderer() const
 {
     if (!m_innerNode)
@@ -125,19 +146,6 @@ RenderObject* HitTestResult::renderer() const
     return toRenderTextFragment(renderer)->firstRenderTextInFirstLetter();
 }
 
-void HitTestResult::setToNodesInDocumentTreeScope()
-{
-    if (Node* node = innerNode()) {
-        node = node->document().ancestorInThisScope(node);
-        setInnerNode(node);
-    }
-
-    if (Node* node = innerNonSharedNode()) {
-        node = node->document().ancestorInThisScope(node);
-        setInnerNonSharedNode(node);
-    }
-}
-
 void HitTestResult::setToShadowHostIfInUserAgentShadowRoot()
 {
     if (Node* node = innerNode()) {
@@ -224,7 +232,7 @@ String HitTestResult::title(TextDirection& dir) const
     for (Node* titleNode = m_innerNode.get(); titleNode; titleNode = titleNode->parentNode()) {
         if (titleNode->isElementNode()) {
             String title = toElement(titleNode)->title();
-            if (!title.isEmpty()) {
+            if (!title.isNull()) {
                 if (RenderObject* renderer = titleNode->renderer())
                     dir = renderer->style()->direction();
                 return title;
@@ -279,7 +287,8 @@ KURL HitTestResult::absoluteImageURL() const
     if (!m_innerNonSharedNode)
         return KURL();
 
-    if (!(m_innerNonSharedNode->renderer() && m_innerNonSharedNode->renderer()->isImage()))
+    RenderObject* renderer = m_innerNonSharedNode->renderer();
+    if (!(renderer && renderer->isImage()))
         return KURL();
 
     AtomicString urlString;
@@ -320,37 +329,19 @@ KURL HitTestResult::absoluteLinkURL() const
 {
     if (!m_innerURLElement)
         return KURL();
-
-    AtomicString urlString;
-    if (isHTMLAnchorElement(*m_innerURLElement) || isHTMLAreaElement(*m_innerURLElement) || isHTMLLinkElement(*m_innerURLElement))
-        urlString = m_innerURLElement->getAttribute(hrefAttr);
-    else if (isSVGAElement(*m_innerURLElement))
-        urlString = m_innerURLElement->getAttribute(XLinkNames::hrefAttr);
-    else
-        return KURL();
-
-    return m_innerURLElement->document().completeURL(stripLeadingAndTrailingHTMLSpaces(urlString));
+    return m_innerURLElement->hrefURL();
 }
 
 bool HitTestResult::isLiveLink() const
 {
-    if (!m_innerURLElement)
-        return false;
-
-    if (isHTMLAnchorElement(*m_innerURLElement))
-        return toHTMLAnchorElement(m_innerURLElement)->isLiveLink();
-
-    if (isSVGAElement(*m_innerURLElement))
-        return m_innerURLElement->isLink();
-
-    return false;
+    return m_innerURLElement && m_innerURLElement->isLiveLink();
 }
 
 bool HitTestResult::isMisspelled() const
 {
-    if (!targetNode() || !targetNode()->renderer())
+    if (!innerNode() || !innerNode()->renderer())
         return false;
-    VisiblePosition pos(targetNode()->renderer()->positionForPoint(localPoint()));
+    VisiblePosition pos(innerNode()->renderer()->positionForPoint(localPoint()));
     if (pos.isNull())
         return false;
     return m_innerNonSharedNode->document().markers().markersInRange(
@@ -362,14 +353,6 @@ bool HitTestResult::isOverLink() const
     return m_innerURLElement && m_innerURLElement->isLink();
 }
 
-String HitTestResult::titleDisplayString() const
-{
-    if (!m_innerURLElement)
-        return String();
-
-    return m_innerURLElement->title();
-}
-
 String HitTestResult::textContent() const
 {
     if (!m_innerURLElement)
@@ -392,7 +375,7 @@ bool HitTestResult::isContentEditable() const
     if (isHTMLInputElement(*m_innerNonSharedNode))
         return toHTMLInputElement(*m_innerNonSharedNode).isTextField();
 
-    return m_innerNonSharedNode->rendererIsEditable();
+    return m_innerNonSharedNode->hasEditableStyle();
 }
 
 bool HitTestResult::addNodeToRectBasedTestResult(Node* node, const HitTestRequest& request, const HitTestLocation& locationInContainer, const LayoutRect& rect)
@@ -406,9 +389,6 @@ bool HitTestResult::addNodeToRectBasedTestResult(Node* node, const HitTestReques
     if (!node)
         return true;
 
-    if (request.disallowsShadowContent())
-        node = node->document().ancestorInThisScope(node);
-
     mutableRectBasedTestResult().add(node);
 
     bool regionFilled = rect.contains(locationInContainer.boundingBox());
@@ -426,9 +406,6 @@ bool HitTestResult::addNodeToRectBasedTestResult(Node* node, const HitTestReques
     if (!node)
         return true;
 
-    if (request.disallowsShadowContent())
-        node = node->document().ancestorInThisScope(node);
-
     mutableRectBasedTestResult().add(node);
 
     bool regionFilled = rect.contains(locationInContainer.boundingBox());
@@ -463,30 +440,33 @@ void HitTestResult::append(const HitTestResult& other)
 const HitTestResult::NodeSet& HitTestResult::rectBasedTestResult() const
 {
     if (!m_rectBasedTestResult)
-        m_rectBasedTestResult = adoptPtr(new NodeSet);
+        m_rectBasedTestResult = adoptPtrWillBeNoop(new NodeSet);
     return *m_rectBasedTestResult;
 }
 
 HitTestResult::NodeSet& HitTestResult::mutableRectBasedTestResult()
 {
     if (!m_rectBasedTestResult)
-        m_rectBasedTestResult = adoptPtr(new NodeSet);
+        m_rectBasedTestResult = adoptPtrWillBeNoop(new NodeSet);
     return *m_rectBasedTestResult;
 }
 
-Node* HitTestResult::targetNode() const
+void HitTestResult::resolveRectBasedTest(Node* resolvedInnerNode, const LayoutPoint& resolvedPointInMainFrame)
 {
-    Node* node = innerNode();
-    if (!node)
-        return 0;
-    if (node->inDocument())
-        return node;
-
-    Element* element = node->parentElement();
-    if (element && element->inDocument())
-        return element;
+    ASSERT(isRectBasedTest());
+    ASSERT(m_hitTestLocation.containsPoint(resolvedPointInMainFrame));
+    m_hitTestLocation = HitTestLocation(resolvedPointInMainFrame);
+    m_pointInInnerNodeFrame = resolvedPointInMainFrame;
+    m_innerNode = nullptr;
+    m_innerNonSharedNode = nullptr;
+    m_innerPossiblyPseudoNode = nullptr;
+    m_rectBasedTestResult = nullptr;
 
-    return node;
+    // Update the HitTestResult as if the supplied node had been hit in normal point-based hit-test.
+    // Note that we don't know the local point after a rect-based hit-test, but we never use
+    // it so shouldn't bother with the cost of computing it.
+    resolvedInnerNode->renderer()->updateHitTestResult(*this, LayoutPoint());
+    ASSERT(!isRectBasedTest());
 }
 
 Element* HitTestResult::innerElement() const
@@ -499,4 +479,4 @@ Element* HitTestResult::innerElement() const
     return 0;
 }
 
-} // namespace WebCore
+} // namespace blink