Chromium Code Reviews| Index: Source/core/dom/TreeScope.cpp |
| diff --git a/Source/core/dom/TreeScope.cpp b/Source/core/dom/TreeScope.cpp |
| index 671a79cacbad3324f215f926c720e2f53d04b6a4..5c99b5954ed6e3c4df0e78627dc051afd6d85cd7 100644 |
| --- a/Source/core/dom/TreeScope.cpp |
| +++ b/Source/core/dom/TreeScope.cpp |
| @@ -241,7 +241,7 @@ HTMLMapElement* TreeScope::getImageMap(const String& url) const |
| return toHTMLMapElement(m_imageMapsByName->getElementByMapName(AtomicString(name), this)); |
| } |
| -HitTestResult hitTestInDocument(const Document* document, int x, int y) |
| +HitTestResult hitTestInDocument(const Document* document, int x, int y, HitTestRequest request) |
| { |
| LocalFrame* frame = document->frame(); |
| @@ -257,7 +257,6 @@ HitTestResult hitTestInDocument(const Document* document, int x, int y) |
| if (!frameView->visibleContentRect().contains(point)) |
| return HitTestResult(); |
| - HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active); |
| HitTestResult result(point); |
| document->renderView()->hitTest(request, result); |
| return result; |
| @@ -265,7 +264,8 @@ HitTestResult hitTestInDocument(const Document* document, int x, int y) |
| Element* TreeScope::elementFromPoint(int x, int y) const |
| { |
| - HitTestResult result = hitTestInDocument(&rootNode().document(), x, y); |
| + HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active); |
| + HitTestResult result = hitTestInDocument(&rootNode().document(), x, y, request); |
| Node* node = result.innerNode(); |
| if (!node || node->isDocumentNode()) |
| return 0; |
| @@ -278,6 +278,36 @@ Element* TreeScope::elementFromPoint(int x, int y) const |
| return toElement(node); |
| } |
| +Vector<Element*> TreeScope::elementsFromPoint(int x, int y) const |
| +{ |
| + Vector<Element*> elements; |
| + |
| + HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::ListBased | HitTestRequest::Penetrating); |
| + HitTestResult result = hitTestInDocument(&rootNode().document(), x, y, request); |
| + |
| + Node* lastNode = nullptr; |
| + for (const auto rectBasedNode : result.listBasedTestResult()) { |
| + Node* node = rectBasedNode.get(); |
| + if (!node || !node->isElementNode() || node->isDocumentNode()) |
| + continue; |
| + |
| + if (node->isPseudoElement() || node->isTextNode()) |
| + node = node->parentOrShadowHostNode(); |
| + node = ancestorInThisScope(node); |
| + |
| + // Prune duplicate entries. A pseduo ::before content above its parent |
| + // node should only result in a single entry. |
|
Rick Byers
2015/02/04 10:34:03
are duplicate notes guaranteed to be adjacent, or
pdr.
2015/02/17 04:10:13
This is a good question. Because result.listBasedT
|
| + if (node == lastNode) |
| + continue; |
| + |
| + if (node && node->isElementNode()) { |
| + elements.append(toElement(node)); |
| + lastNode = node; |
| + } |
| + } |
| + return elements; |
| +} |
| + |
| void TreeScope::addLabel(const AtomicString& forAttributeValue, HTMLLabelElement* element) |
| { |
| ASSERT(m_labelsByForAttribute); |