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

Unified Diff: Source/core/testing/Internals.cpp

Issue 13824008: Move nodesFromRect from Document to Internals (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 8 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/testing/Internals.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/testing/Internals.cpp
diff --git a/Source/core/testing/Internals.cpp b/Source/core/testing/Internals.cpp
index ae10e588352f077617ba975d5c8d6045cbea3f19..841afb572ce981aa1885c1d4f4eb97475a0cf737 100644
--- a/Source/core/testing/Internals.cpp
+++ b/Source/core/testing/Internals.cpp
@@ -68,6 +68,7 @@
#include "TypeConversions.h"
#include "ViewportArguments.h"
#include "WorkerThread.h"
+#include "core/dom/StaticNodeList.h"
#include "core/editing/Editor.h"
#include "core/editing/SpellChecker.h"
#include "core/editing/TextIterator.h"
@@ -96,6 +97,7 @@
#include "core/rendering/RenderMenuList.h"
#include "core/rendering/RenderObject.h"
#include "core/rendering/RenderTreeAsText.h"
+#include "core/rendering/RenderView.h"
#include <wtf/dtoa.h>
#include <wtf/text/StringBuffer.h>
@@ -1324,7 +1326,7 @@ PassRefPtr<ClientRectList> Internals::touchEventTargetClientRects(Document* docu
return ClientRectList::create(absoluteQuads);
}
-PassRefPtr<NodeList> Internals::nodesFromRect(Document* document, int x, int y, unsigned topPadding, unsigned rightPadding,
+PassRefPtr<NodeList> Internals::nodesFromRect(Document* document, int centerX, int centerY, unsigned topPadding, unsigned rightPadding,
unsigned bottomPadding, unsigned leftPadding, bool ignoreClipping, bool allowShadowContent, bool allowChildFrameContent, ExceptionCode& ec) const
{
if (!document || !document->frame() || !document->frame()->view()) {
@@ -1332,6 +1334,16 @@ PassRefPtr<NodeList> Internals::nodesFromRect(Document* document, int x, int y,
return 0;
}
+ Frame* frame = document->frame();
+ FrameView* frameView = document->view();
+ RenderView* renderView = document->renderView();
+
+ if (!renderView)
+ return 0;
+
+ float zoomFactor = frame->pageZoomFactor();
+ LayoutPoint point = roundedLayoutPoint(FloatPoint(centerX * zoomFactor + frameView->scrollX(), centerY * zoomFactor + frameView->scrollY()));
+
HitTestRequest::HitTestRequestType hitType = HitTestRequest::ReadOnly | HitTestRequest::Active;
if (ignoreClipping)
hitType |= HitTestRequest::IgnoreClipping;
@@ -1340,7 +1352,28 @@ PassRefPtr<NodeList> Internals::nodesFromRect(Document* document, int x, int y,
if (allowChildFrameContent)
hitType |= HitTestRequest::AllowChildFrameContent;
- return document->nodesFromRect(x, y, topPadding, rightPadding, bottomPadding, leftPadding, hitType);
+ HitTestRequest request(hitType);
+
+ // When ignoreClipping is false, this method returns null for coordinates outside of the viewport.
+ if (!request.ignoreClipping() && !frameView->visibleContentRect().intersects(HitTestLocation::rectForPoint(point, topPadding, rightPadding, bottomPadding, leftPadding)))
+ return 0;
+
+ Vector<RefPtr<Node> > matches;
+
+ // Need padding to trigger a rect based hit test, but we want to return a NodeList
+ // so we special case this.
+ if (!topPadding && !rightPadding && !bottomPadding && !leftPadding) {
+ HitTestResult result(point);
+ renderView->hitTest(request, result);
+ if (result.innerNode())
+ matches.append(result.innerNode()->deprecatedShadowAncestorNode());
+ } else {
+ HitTestResult result(point, topPadding, rightPadding, bottomPadding, leftPadding);
+ renderView->hitTest(request, result);
+ copyToVector(result.rectBasedTestResult(), matches);
+ }
+
+ return StaticNodeList::adopt(matches);
}
void Internals::emitInspectorDidBeginFrame()
« no previous file with comments | « Source/core/testing/Internals.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698