15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2006, 2008, 2011 Apple Inc. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies)
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
2353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/HitTestResult.h"
2453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
255d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/HTMLNames.h"
2653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/DocumentMarkerController.h"
27521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "core/dom/NodeRenderingTraversal.h"
28e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)#include "core/dom/shadow/ShadowRoot.h"
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/editing/FrameSelection.h"
30e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)#include "core/fetch/ImageResource.h"
31d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h"
3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLAnchorElement.h"
3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLImageElement.h"
3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLInputElement.h"
3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/HTMLMediaElement.h"
3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/html/parser/HTMLParserIdioms.h"
3753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/page/FrameTree.h"
3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderImage.h"
391e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/rendering/RenderTextFragment.h"
40d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/svg/SVGElement.h"
41a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/scroll/Scrollbar.h"
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
43c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)using namespace HTMLNames;
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
47926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)HitTestResult::HitTestResult()
48926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    : m_isOverWidget(false)
491e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    , m_isFirstLetter(false)
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
53926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)HitTestResult::HitTestResult(const LayoutPoint& point)
54926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    : m_hitTestLocation(point)
55926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_pointInInnerNodeFrame(point)
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_isOverWidget(false)
571e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    , m_isFirstLetter(false)
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HitTestResult::HitTestResult(const LayoutPoint& centerPoint, unsigned topPadding, unsigned rightPadding, unsigned bottomPadding, unsigned leftPadding)
62926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    : m_hitTestLocation(centerPoint, topPadding, rightPadding, bottomPadding, leftPadding)
63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_pointInInnerNodeFrame(centerPoint)
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_isOverWidget(false)
65f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    , m_isFirstLetter(false)
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HitTestResult::HitTestResult(const HitTestLocation& other)
70926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    : m_hitTestLocation(other)
71926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_pointInInnerNodeFrame(m_hitTestLocation.point())
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_isOverWidget(false)
73f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    , m_isFirstLetter(false)
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HitTestResult::HitTestResult(const HitTestResult& other)
78926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    : m_hitTestLocation(other.m_hitTestLocation)
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_innerNode(other.innerNode())
801e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    , m_innerPossiblyPseudoNode(other.m_innerPossiblyPseudoNode)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_innerNonSharedNode(other.innerNonSharedNode())
82926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    , m_pointInInnerNodeFrame(other.m_pointInInnerNodeFrame)
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_localPoint(other.localPoint())
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_innerURLElement(other.URLElement())
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_scrollbar(other.scrollbar())
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_isOverWidget(other.isOverWidget())
87f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    , m_isFirstLetter(other.m_isFirstLetter)
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Only copy the NodeSet in case of rect hit test.
90d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    m_rectBasedTestResult = adoptPtrWillBeNoop(other.m_rectBasedTestResult ? new NodeSet(*other.m_rectBasedTestResult) : 0);
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HitTestResult::~HitTestResult()
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HitTestResult& HitTestResult::operator=(const HitTestResult& other)
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
99926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_hitTestLocation = other.m_hitTestLocation;
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_innerNode = other.innerNode();
1011e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    m_innerPossiblyPseudoNode = other.innerPossiblyPseudoNode();
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_innerNonSharedNode = other.innerNonSharedNode();
103926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    m_pointInInnerNodeFrame = other.m_pointInInnerNodeFrame;
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_localPoint = other.localPoint();
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_innerURLElement = other.URLElement();
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_scrollbar = other.scrollbar();
1071e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    m_isFirstLetter = other.m_isFirstLetter;
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_isOverWidget = other.isOverWidget();
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Only copy the NodeSet in case of rect hit test.
111d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    m_rectBasedTestResult = adoptPtrWillBeNoop(other.m_rectBasedTestResult ? new NodeSet(*other.m_rectBasedTestResult) : 0);
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return *this;
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1165d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)void HitTestResult::trace(Visitor* visitor)
1175d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){
1185d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    visitor->trace(m_innerNode);
1195d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    visitor->trace(m_innerPossiblyPseudoNode);
1205d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    visitor->trace(m_innerNonSharedNode);
1215d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    visitor->trace(m_innerURLElement);
1225d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#if ENABLE(OILPAN)
1235d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    visitor->trace(m_rectBasedTestResult);
1245d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#endif
1255d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)}
1265d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
127197021e6b966cfb06891637935ef33fff06433d1Ben MurdochPositionWithAffinity HitTestResult::position() const
128197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch{
129197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (!m_innerPossiblyPseudoNode)
130197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return PositionWithAffinity();
131197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    RenderObject* renderer = this->renderer();
132197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (!renderer)
133197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return PositionWithAffinity();
134197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    if (m_innerPossiblyPseudoNode->isPseudoElement() && m_innerPossiblyPseudoNode->pseudoId() == BEFORE)
135197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        return Position(m_innerNode, Position::PositionIsBeforeChildren).downstream();
136197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return renderer->positionForPoint(localPoint());
137197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch}
138197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
1391e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)RenderObject* HitTestResult::renderer() const
1401e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
1411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (!m_innerNode)
1421e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return 0;
1431e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    RenderObject* renderer = m_innerNode->renderer();
1441e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    if (!m_isFirstLetter || !renderer || !renderer->isText() || !toRenderText(renderer)->isTextFragment())
1451e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        return renderer;
1461e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return toRenderTextFragment(renderer)->firstRenderTextInFirstLetter();
1471e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
1481e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
149e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)void HitTestResult::setToShadowHostIfInUserAgentShadowRoot()
150e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles){
151e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    if (Node* node = innerNode()) {
152e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)        if (ShadowRoot* containingShadowRoot = node->containingShadowRoot()) {
153e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)            if (containingShadowRoot->type() == ShadowRoot::UserAgentShadowRoot)
154e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)                setInnerNode(node->shadowHost());
155e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)        }
156e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    }
157e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)
158e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    if (Node* node = innerNonSharedNode()) {
159e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)        if (ShadowRoot* containingShadowRoot = node->containingShadowRoot()) {
160e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)            if (containingShadowRoot->type() == ShadowRoot::UserAgentShadowRoot)
161e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)                setInnerNonSharedNode(node->shadowHost());
162e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)        }
163e52495584422c5edb5b2944981473a2e208da323Torne (Richard Coles)    }
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HitTestResult::setInnerNode(Node* n)
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1681e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    m_innerPossiblyPseudoNode = n;
169926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (n && n->isPseudoElement())
170926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        n = n->parentOrShadowHostNode();
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_innerNode = n;
1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
17302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HitTestResult::setInnerNonSharedNode(Node* n)
1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
176926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (n && n->isPseudoElement())
177926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        n = n->parentOrShadowHostNode();
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_innerNonSharedNode = n;
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
18102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdochvoid HitTestResult::setURLElement(Element* n)
18202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch{
18302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    m_innerURLElement = n;
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HitTestResult::setScrollbar(Scrollbar* s)
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_scrollbar = s;
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
191d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)LocalFrame* HitTestResult::innerNodeFrame() const
192926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
193926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_innerNonSharedNode)
1948abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return m_innerNonSharedNode->document().frame();
195926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (m_innerNode)
1968abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return m_innerNode->document().frame();
197926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return 0;
198926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
199926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HitTestResult::isSelected() const
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_innerNonSharedNode)
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
205d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (LocalFrame* frame = m_innerNonSharedNode->document().frame())
2068abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)        return frame->selection().contains(m_hitTestLocation.point());
2078abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return false;
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HitTestResult::spellingToolTip(TextDirection& dir) const
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dir = LTR;
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Return the tool tip string associated with this point, if any. Only markers associated with bad grammar
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // currently supply strings, but maybe someday markers associated with misspelled words will also.
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_innerNonSharedNode)
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return String();
21702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
218d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    DocumentMarker* marker = m_innerNonSharedNode->document().markers().markerContainingPoint(m_hitTestLocation.point(), DocumentMarker::Grammar);
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!marker)
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return String();
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (RenderObject* renderer = m_innerNonSharedNode->renderer())
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        dir = renderer->style()->direction();
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return marker->description();
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HitTestResult::title(TextDirection& dir) const
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    dir = LTR;
2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Find the title in the nearest enclosing DOM node.
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // For <area> tags in image maps, walk the tree for the <area>, not the <img> using it.
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (Node* titleNode = m_innerNode.get(); titleNode; titleNode = titleNode->parentNode()) {
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (titleNode->isElementNode()) {
234926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            String title = toElement(titleNode)->title();
235e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            if (!title.isNull()) {
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                if (RenderObject* renderer = titleNode->renderer())
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                    dir = renderer->style()->direction();
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)                return title;
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            }
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        }
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return String();
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
245a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)const AtomicString& HitTestResult::altDisplayString() const
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_innerNonSharedNode)
248a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        return nullAtom;
24902772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
250d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isHTMLImageElement(*m_innerNonSharedNode)) {
251d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        HTMLImageElement& image = toHTMLImageElement(*m_innerNonSharedNode);
252d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return image.getAttribute(altAttr);
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
25402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
255d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isHTMLInputElement(*m_innerNonSharedNode)) {
256d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        HTMLInputElement& input = toHTMLInputElement(*m_innerNonSharedNode);
257d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return input.alt();
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
260a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    return nullAtom;
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)Image* HitTestResult::image() const
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_innerNonSharedNode)
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
26702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RenderObject* renderer = m_innerNonSharedNode->renderer();
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (renderer && renderer->isImage()) {
27006f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        RenderImage* image = toRenderImage(renderer);
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (image->cachedImage() && !image->cachedImage()->errorOccurred())
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return image->cachedImage()->imageForRenderer(image);
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect HitTestResult::imageRect() const
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!image())
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return IntRect();
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_innerNonSharedNode->renderBox()->absoluteContentQuad().enclosingBoundingBox();
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)KURL HitTestResult::absoluteImageURL() const
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2878abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!m_innerNonSharedNode)
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return KURL();
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
290323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    RenderObject* renderer = m_innerNonSharedNode->renderer();
2917242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!(renderer && renderer->isImage()))
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return KURL();
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    AtomicString urlString;
2957242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (isHTMLEmbedElement(*m_innerNonSharedNode)
296d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        || isHTMLImageElement(*m_innerNonSharedNode)
297d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        || isHTMLInputElement(*m_innerNonSharedNode)
298d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        || isHTMLObjectElement(*m_innerNonSharedNode)
299d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        || isSVGImageElement(*m_innerNonSharedNode)
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)       ) {
301d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        urlString = toElement(*m_innerNonSharedNode).imageSourceURL();
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } else
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return KURL();
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3058abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    return m_innerNonSharedNode->document().completeURL(stripLeadingAndTrailingHTMLSpaces(urlString));
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)KURL HitTestResult::absoluteMediaURL() const
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (HTMLMediaElement* mediaElt = mediaElement())
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return mediaElt->currentSrc();
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return KURL();
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HTMLMediaElement* HitTestResult::mediaElement() const
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3178abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!m_innerNonSharedNode)
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!(m_innerNonSharedNode->renderer() && m_innerNonSharedNode->renderer()->isMedia()))
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
32309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (isHTMLMediaElement(*m_innerNonSharedNode))
32409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return toHTMLMediaElement(m_innerNonSharedNode);
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)KURL HitTestResult::absoluteLinkURL() const
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3308abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)    if (!m_innerURLElement)
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return KURL();
332197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return m_innerURLElement->hrefURL();
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HitTestResult::isLiveLink() const
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
337197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return m_innerURLElement && m_innerURLElement->isLiveLink();
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3405267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)bool HitTestResult::isMisspelled() const
3415267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles){
3427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    if (!innerNode() || !innerNode()->renderer())
3435267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return false;
3447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    VisiblePosition pos(innerNode()->renderer()->positionForPoint(localPoint()));
3455267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)    if (pos.isNull())
3465267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)        return false;
347d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return m_innerNonSharedNode->document().markers().markersInRange(
34806f816c7c76bc45a15e452ade8a34e8af077693eTorne (Richard Coles)        makeRange(pos, pos).get(), DocumentMarker::MisspellingMarkers()).size() > 0;
3495267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)}
3505267f701546148b83dfbe1d151cb184385bb5c22Torne (Richard Coles)
3511e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)bool HitTestResult::isOverLink() const
3521e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){
3531e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return m_innerURLElement && m_innerURLElement->isLink();
3541e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)}
3551e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String HitTestResult::textContent() const
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_innerURLElement)
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return String();
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_innerURLElement->textContent();
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// FIXME: This function needs a better name and may belong in a different class. It's not
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// really isContentEditable(); it's more like needsEditingContextMenu(). In many ways, this
36502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch// function would make more sense in the ContextMenu class, except that WebElementDictionary
36602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch// hooks into it. Anyway, we should architect this better.
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HitTestResult::isContentEditable() const
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_innerNonSharedNode)
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
372d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isHTMLTextAreaElement(*m_innerNonSharedNode))
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
375d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (isHTMLInputElement(*m_innerNonSharedNode))
376d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return toHTMLInputElement(*m_innerNonSharedNode).isTextField();
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
378197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    return m_innerNonSharedNode->hasEditableStyle();
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HitTestResult::addNodeToRectBasedTestResult(Node* node, const HitTestRequest& request, const HitTestLocation& locationInContainer, const LayoutRect& rect)
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If it is not a rect-based hit test, this method has to be no-op.
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Return false, so the hit test stops.
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!isRectBasedTest())
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If node is null, return true so the hit test can continue.
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!node)
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutableRectBasedTestResult().add(node);
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool regionFilled = rect.contains(locationInContainer.boundingBox());
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return !regionFilled;
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool HitTestResult::addNodeToRectBasedTestResult(Node* node, const HitTestRequest& request, const HitTestLocation& locationInContainer, const FloatRect& rect)
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If it is not a rect-based hit test, this method has to be no-op.
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Return false, so the hit test stops.
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!isRectBasedTest())
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return false;
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // If node is null, return true so the hit test can continue.
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!node)
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return true;
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    mutableRectBasedTestResult().add(node);
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    bool regionFilled = rect.contains(locationInContainer.boundingBox());
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return !regionFilled;
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void HitTestResult::append(const HitTestResult& other)
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(isRectBasedTest() && other.isRectBasedTest());
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
419a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (!m_scrollbar && other.scrollbar()) {
420a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        setScrollbar(other.scrollbar());
421a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    }
422a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_innerNode && other.innerNode()) {
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_innerNode = other.innerNode();
4251e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)        m_innerPossiblyPseudoNode = other.innerPossiblyPseudoNode();
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_innerNonSharedNode = other.innerNonSharedNode();
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_localPoint = other.localPoint();
428926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        m_pointInInnerNodeFrame = other.m_pointInInnerNodeFrame;
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_innerURLElement = other.URLElement();
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_isOverWidget = other.isOverWidget();
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (other.m_rectBasedTestResult) {
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        NodeSet& set = mutableRectBasedTestResult();
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        for (NodeSet::const_iterator it = other.m_rectBasedTestResult->begin(), last = other.m_rectBasedTestResult->end(); it != last; ++it)
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            set.add(it->get());
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const HitTestResult::NodeSet& HitTestResult::rectBasedTestResult() const
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_rectBasedTestResult)
443d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_rectBasedTestResult = adoptPtrWillBeNoop(new NodeSet);
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return *m_rectBasedTestResult;
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)HitTestResult::NodeSet& HitTestResult::mutableRectBasedTestResult()
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_rectBasedTestResult)
450d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        m_rectBasedTestResult = adoptPtrWillBeNoop(new NodeSet);
4515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return *m_rectBasedTestResult;
4525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
454197021e6b966cfb06891637935ef33fff06433d1Ben Murdochvoid HitTestResult::resolveRectBasedTest(Node* resolvedInnerNode, const LayoutPoint& resolvedPointInMainFrame)
4555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
456197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    ASSERT(isRectBasedTest());
457197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    ASSERT(m_hitTestLocation.containsPoint(resolvedPointInMainFrame));
458197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    m_hitTestLocation = HitTestLocation(resolvedPointInMainFrame);
459197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    m_pointInInnerNodeFrame = resolvedPointInMainFrame;
4607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_innerNode = nullptr;
4617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_innerNonSharedNode = nullptr;
4627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    m_innerPossiblyPseudoNode = nullptr;
463197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    m_rectBasedTestResult = nullptr;
4647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
4657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Update the HitTestResult as if the supplied node had been hit in normal point-based hit-test.
4667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // Note that we don't know the local point after a rect-based hit-test, but we never use
4677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    // it so shouldn't bother with the cost of computing it.
4687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    resolvedInnerNode->renderer()->updateHitTestResult(*this, LayoutPoint());
469197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    ASSERT(!isRectBasedTest());
4705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
472926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)Element* HitTestResult::innerElement() const
473926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
4741e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    for (Node* node = m_innerNode.get(); node; node = NodeRenderingTraversal::parent(node)) {
475926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        if (node->isElementNode())
476926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return toElement(node);
4771e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    }
478926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
479926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return 0;
480926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
481926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
482c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
483