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