Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1460)

Unified Diff: Source/core/layout/HitTestResult.cpp

Issue 869813003: Implement elementsFromPoint (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Cleanup, add a better test for tables Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/layout/HitTestResult.h ('k') | Source/core/layout/Layer.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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
« no previous file with comments | « Source/core/layout/HitTestResult.h ('k') | Source/core/layout/Layer.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698