Index: Source/core/rendering/HitTestResult.cpp |
diff --git a/Source/core/rendering/HitTestResult.cpp b/Source/core/rendering/HitTestResult.cpp |
index f7c4da96be03ea356a2807ed7e798af5a1050ed3..20d004c1900939b2a525ab46b11f4dc5bcf7d964 100644 |
--- a/Source/core/rendering/HitTestResult.cpp |
+++ b/Source/core/rendering/HitTestResult.cpp |
@@ -82,8 +82,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() |
@@ -102,8 +102,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; |
} |
@@ -116,7 +116,7 @@ void HitTestResult::trace(Visitor* visitor) |
visitor->trace(m_innerURLElement); |
visitor->trace(m_scrollbar); |
#if ENABLE(OILPAN) |
- visitor->trace(m_rectBasedTestResult); |
+ visitor->trace(m_listBasedTestResult); |
#endif |
} |
@@ -371,35 +371,43 @@ 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.penetrating()) |
+ 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.penetrating()) |
+ return true; |
bool regionFilled = rect.contains(locationInContainer.boundingBox()); |
return !regionFilled; |
@@ -407,8 +415,6 @@ bool HitTestResult::addNodeToRectBasedTestResult(Node* node, const HitTestReques |
void HitTestResult::append(const HitTestResult& other) |
{ |
- ASSERT(isRectBasedTest() && other.isRectBasedTest()); |
Rick Byers
2015/02/04 10:34:03
why don't you want to assert both are list-based h
pdr.
2015/02/17 04:10:14
I've added a const HitTestRequest& parameter to ap
Rick Byers
2015/02/20 20:02:23
Seems reasonable, thanks.
I was naively thinking
|
- |
if (!m_scrollbar && other.scrollbar()) { |
setScrollbar(other.scrollbar()); |
} |
@@ -423,25 +429,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) |
@@ -453,7 +459,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 |