#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"
#include "core/svg/SVGElement.h"
#include "platform/scroll/Scrollbar.h"
-namespace WebCore {
+namespace blink {
using namespace HTMLNames;
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)
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()) {
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;
{
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 (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)
if (!node)
return true;
- if (request.disallowsShadowContent())
- node = node->document().ancestorInThisScope(node);
-
mutableRectBasedTestResult().add(node);
bool regionFilled = rect.contains(locationInContainer.boundingBox());
if (!node)
return true;
- if (request.disallowsShadowContent())
- node = node->document().ancestorInThisScope(node);
-
mutableRectBasedTestResult().add(node);
bool regionFilled = rect.contains(locationInContainer.boundingBox());
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
return 0;
}
-} // namespace WebCore
+} // namespace blink