Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / core / rendering / HitTestResult.cpp
index 60ef749..9c4604f 100644 (file)
@@ -23,7 +23,6 @@
 #include "core/rendering/HitTestResult.h"
 
 #include "core/HTMLNames.h"
-#include "core/XLinkNames.h"
 #include "core/dom/DocumentMarkerController.h"
 #include "core/dom/NodeRenderingTraversal.h"
 #include "core/dom/shadow/ShadowRoot.h"
@@ -41,7 +40,7 @@
 #include "core/svg/SVGElement.h"
 #include "platform/scroll/Scrollbar.h"
 
-namespace WebCore {
+namespace blink {
 
 using namespace HTMLNames;
 
@@ -114,6 +113,29 @@ HitTestResult& HitTestResult::operator=(const HitTestResult& other)
     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)
@@ -124,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()) {
@@ -223,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;
@@ -331,30 +340,12 @@ 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
@@ -395,7 +386,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)
@@ -409,9 +400,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());
@@ -429,9 +417,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());
@@ -477,19 +462,18 @@ HitTestResult::NodeSet& HitTestResult::mutableRectBasedTestResult()
     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;
-
-    return node;
+    // FIXME: For maximum fidelity with point-based hit tests we should probably make use
+    // of RenderObject::updateHitTestResult here. See http://crbug.com/398914.
+    ASSERT(isRectBasedTest());
+    ASSERT(m_hitTestLocation.containsPoint(resolvedPointInMainFrame));
+    setInnerNode(resolvedInnerNode);
+    setInnerNonSharedNode(resolvedInnerNode);
+    m_hitTestLocation = HitTestLocation(resolvedPointInMainFrame);
+    m_pointInInnerNodeFrame = resolvedPointInMainFrame;
+    m_rectBasedTestResult = nullptr;
+    ASSERT(!isRectBasedTest());
 }
 
 Element* HitTestResult::innerElement() const
@@ -502,4 +486,4 @@ Element* HitTestResult::innerElement() const
     return 0;
 }
 
-} // namespace WebCore
+} // namespace blink