| Index: Source/core/layout/HitTestResult.cpp
|
| diff --git a/Source/core/layout/HitTestResult.cpp b/Source/core/layout/HitTestResult.cpp
|
| index 1b3876e599b007881bcdf2c1b2c973eca9db9681..abd9b6b6482e26da5521f2169e448a69cf254c66 100644
|
| --- a/Source/core/layout/HitTestResult.cpp
|
| +++ b/Source/core/layout/HitTestResult.cpp
|
| @@ -83,8 +83,8 @@ HitTestResult::HitTestResult(const HitTestResult& other)
|
| , m_scrollbar(other.scrollbar())
|
| , m_isOverWidget(other.isOverWidget())
|
| {
|
| - // Only copy the NodeSet in case of rect hit test.
|
| - m_rectBasedTestResult = adoptPtrWillBeNoop(other.m_rectBasedTestResult ? new NodeSet(*other.m_rectBasedTestResult) : 0);
|
| + // Only copy the NodeSet in case of list hit test.
|
| + m_listBasedTestResult = adoptPtrWillBeNoop(other.m_listBasedTestResult ? new NodeSet(*other.m_listBasedTestResult) : 0);
|
| }
|
|
|
| HitTestResult::~HitTestResult()
|
| @@ -103,8 +103,8 @@ HitTestResult& HitTestResult::operator=(const HitTestResult& other)
|
| m_scrollbar = other.scrollbar();
|
| m_isOverWidget = other.isOverWidget();
|
|
|
| - // Only copy the NodeSet in case of rect hit test.
|
| - m_rectBasedTestResult = adoptPtrWillBeNoop(other.m_rectBasedTestResult ? new NodeSet(*other.m_rectBasedTestResult) : 0);
|
| + // Only copy the NodeSet in case of list hit test.
|
| + m_listBasedTestResult = adoptPtrWillBeNoop(other.m_listBasedTestResult ? new NodeSet(*other.m_listBasedTestResult) : 0);
|
|
|
| return *this;
|
| }
|
| @@ -117,7 +117,7 @@ DEFINE_TRACE(HitTestResult)
|
| visitor->trace(m_innerURLElement);
|
| visitor->trace(m_scrollbar);
|
| #if ENABLE(OILPAN)
|
| - visitor->trace(m_rectBasedTestResult);
|
| + visitor->trace(m_listBasedTestResult);
|
| #endif
|
| }
|
|
|
| @@ -372,43 +372,51 @@ bool HitTestResult::isContentEditable() const
|
| return m_innerNonSharedNode->hasEditableStyle();
|
| }
|
|
|
| -bool HitTestResult::addNodeToRectBasedTestResult(Node* node, const HitTestRequest& request, const HitTestLocation& locationInContainer, const LayoutRect& rect)
|
| +bool HitTestResult::addNodeToListBasedTestResult(Node* node, const HitTestRequest& request, const HitTestLocation& locationInContainer, const LayoutRect& rect)
|
| {
|
| - // If it is not a rect-based hit test, this method has to be no-op.
|
| - // Return false, so the hit test stops.
|
| - if (!isRectBasedTest())
|
| + // If not a list-based test, this function should be a no-op.
|
| + if (!request.listBased()) {
|
| + ASSERT(!isRectBasedTest());
|
| return false;
|
| + }
|
|
|
| // If node is null, return true so the hit test can continue.
|
| if (!node)
|
| return true;
|
|
|
| - mutableRectBasedTestResult().add(node);
|
| + mutableListBasedTestResult().add(node);
|
| +
|
| + if (request.penetratingList())
|
| + return true;
|
|
|
| bool regionFilled = rect.contains(locationInContainer.boundingBox());
|
| return !regionFilled;
|
| }
|
|
|
| -bool HitTestResult::addNodeToRectBasedTestResult(Node* node, const HitTestRequest& request, const HitTestLocation& locationInContainer, const FloatRect& rect)
|
| +bool HitTestResult::addNodeToListBasedTestResult(Node* node, const HitTestRequest& request, const HitTestLocation& locationInContainer, const FloatRect& rect)
|
| {
|
| - // If it is not a rect-based hit test, this method has to be no-op.
|
| - // Return false, so the hit test stops.
|
| - if (!isRectBasedTest())
|
| + // If not a list-based test, this function should be a no-op.
|
| + if (!request.listBased()) {
|
| + ASSERT(!isRectBasedTest());
|
| return false;
|
| + }
|
|
|
| // If node is null, return true so the hit test can continue.
|
| if (!node)
|
| return true;
|
|
|
| - mutableRectBasedTestResult().add(node);
|
| + mutableListBasedTestResult().add(node);
|
| +
|
| + if (request.penetratingList())
|
| + return true;
|
|
|
| bool regionFilled = rect.contains(locationInContainer.boundingBox());
|
| return !regionFilled;
|
| }
|
|
|
| -void HitTestResult::append(const HitTestResult& other)
|
| +void HitTestResult::append(const HitTestResult& other, const HitTestRequest& request)
|
| {
|
| - ASSERT(isRectBasedTest() && other.isRectBasedTest());
|
| + ASSERT(request.listBased());
|
|
|
| if (!m_scrollbar && other.scrollbar()) {
|
| setScrollbar(other.scrollbar());
|
| @@ -424,25 +432,25 @@ void HitTestResult::append(const HitTestResult& other)
|
| m_isOverWidget = other.isOverWidget();
|
| }
|
|
|
| - if (other.m_rectBasedTestResult) {
|
| - NodeSet& set = mutableRectBasedTestResult();
|
| - for (NodeSet::const_iterator it = other.m_rectBasedTestResult->begin(), last = other.m_rectBasedTestResult->end(); it != last; ++it)
|
| + if (other.m_listBasedTestResult) {
|
| + NodeSet& set = mutableListBasedTestResult();
|
| + for (NodeSet::const_iterator it = other.m_listBasedTestResult->begin(), last = other.m_listBasedTestResult->end(); it != last; ++it)
|
| set.add(it->get());
|
| }
|
| }
|
|
|
| -const HitTestResult::NodeSet& HitTestResult::rectBasedTestResult() const
|
| +const HitTestResult::NodeSet& HitTestResult::listBasedTestResult() const
|
| {
|
| - if (!m_rectBasedTestResult)
|
| - m_rectBasedTestResult = adoptPtrWillBeNoop(new NodeSet);
|
| - return *m_rectBasedTestResult;
|
| + if (!m_listBasedTestResult)
|
| + m_listBasedTestResult = adoptPtrWillBeNoop(new NodeSet);
|
| + return *m_listBasedTestResult;
|
| }
|
|
|
| -HitTestResult::NodeSet& HitTestResult::mutableRectBasedTestResult()
|
| +HitTestResult::NodeSet& HitTestResult::mutableListBasedTestResult()
|
| {
|
| - if (!m_rectBasedTestResult)
|
| - m_rectBasedTestResult = adoptPtrWillBeNoop(new NodeSet);
|
| - return *m_rectBasedTestResult;
|
| + if (!m_listBasedTestResult)
|
| + m_listBasedTestResult = adoptPtrWillBeNoop(new NodeSet);
|
| + return *m_listBasedTestResult;
|
| }
|
|
|
| void HitTestResult::resolveRectBasedTest(Node* resolvedInnerNode, const LayoutPoint& resolvedPointInMainFrame)
|
| @@ -454,7 +462,7 @@ void HitTestResult::resolveRectBasedTest(Node* resolvedInnerNode, const LayoutPo
|
| m_innerNode = nullptr;
|
| m_innerNonSharedNode = nullptr;
|
| m_innerPossiblyPseudoNode = nullptr;
|
| - m_rectBasedTestResult = nullptr;
|
| + m_listBasedTestResult = nullptr;
|
|
|
| // 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
|
|
|