#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"
#include "core/svg/SVGElement.h"
#include "platform/scroll/Scrollbar.h"
-namespace WebCore {
+namespace blink {
using namespace HTMLNames;
, 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()
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)
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_innerNonSharedNode)
return KURL();
- if (!(m_innerNonSharedNode->renderer() && m_innerNonSharedNode->renderer()->isImage()))
+ RenderObject* renderer = m_innerNonSharedNode->renderer();
+ if (!(renderer && renderer->isImage()))
return KURL();
AtomicString urlString;
{
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(
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)
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());
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
return 0;
}
-} // namespace WebCore
+} // namespace blink