Reviewed by Dave Hyatt
https://bugs.webkit.org/show_bug.cgi?id=24361
Reinstate code that sets result.innerNode when hitTest() returns true,
but never filled in the innerNode. Fixes hit testing of generated content.
Test: fast/css-generated-content/hit-test-generated-content.html
* rendering/RenderLayer.cpp:
(WebCore::RenderLayer::hitTestContents):
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@41427
268f45cc-cd09-0410-ab3c-
d52691b4dbfc
+2009-03-04 Simon Fraser <simon.fraser@apple.com>
+
+ Reviewed by Dave Hyatt
+
+ https://bugs.webkit.org/show_bug.cgi?id=24361
+
+ Test hit testing on generated content.
+
+ * fast/css-generated-content/hit-test-generated-content.html: Added.
+ * platform/mac/fast/css-generated-content/hit-test-generated-content-expected.checksum: Added.
+ * platform/mac/fast/css-generated-content/hit-test-generated-content-expected.png: Added.
+ * platform/mac/fast/css-generated-content/hit-test-generated-content-expected.txt: Added.
+
2009-03-03 David Hyatt <hyatt@apple.com>
Test case for https://bugs.webkit.org/show_bug.cgi?id=24201
--- /dev/null
+<html>
+<head>
+<style>
+#target {
+ position: relative;
+ width: 100px;
+ height: 100px;
+}
+
+#target::before {
+ position: absolute;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background-color: gray;
+ content: "";
+}
+
+</style>
+<script type="text/javascript" charset="utf-8">
+ function runTest()
+ {
+ var hitElement = document.elementFromPoint(58, 58);
+ var results = document.getElementById('results')
+ if (hitElement && hitElement.id == 'target')
+ results.innerHTML = 'elementFromPoint found target: PASS';
+ else
+ results.innerHTML = 'elementFromPoint did not find target: FAIL';
+ }
+</script>
+</head>
+<body onload="runTest()">
+
+<p>Tests hit testing on generated content</p>
+<div id="target"> </div>
+
+<div id="results">
+</div>
+
+</body>
+</html>
\ No newline at end of file
--- /dev/null
+210c1269c3953dda51ca2c819ca6fd0c
\ No newline at end of file
--- /dev/null
+layer at (0,0) size 800x600
+ RenderView at (0,0) size 800x600
+layer at (0,0) size 800x600
+ RenderBlock {HTML} at (0,0) size 800x600
+ RenderBody {BODY} at (8,8) size 784x584
+ RenderBlock {P} at (0,0) size 784x18
+ RenderText {#text} at (0,0) size 233x18
+ text run at (0,0) width 233: "Tests hit testing on generated content"
+ RenderBlock {DIV} at (0,134) size 784x18
+ RenderText {#text} at (0,0) size 243x18
+ text run at (0,0) width 243: "elementFromPoint found target: PASS"
+layer at (8,42) size 100x100
+ RenderBlock (relative positioned) {DIV} at (0,34) size 100x100
+ RenderText {#text} at (0,0) size 4x18
+ text run at (0,0) width 4: " "
+layer at (8,42) size 100x100
+ RenderBlock (positioned) at (0,0) size 100x100 [bgcolor=#808080]
+ RenderText at (0,0) size 0x0
+2009-03-04 Simon Fraser <simon.fraser@apple.com>
+
+ Reviewed by Dave Hyatt
+
+ https://bugs.webkit.org/show_bug.cgi?id=24361
+
+ Reinstate code that sets result.innerNode when hitTest() returns true,
+ but never filled in the innerNode. Fixes hit testing of generated content.
+
+ Test: fast/css-generated-content/hit-test-generated-content.html
+
+ * rendering/RenderLayer.cpp:
+ (WebCore::RenderLayer::hitTestContents):
+
2009-03-04 Adam Barth <abath@webkit.org>
Reviewed by Alexey Proskuryakov.
bool RenderLayer::hitTestContents(const HitTestRequest& request, HitTestResult& result, const IntRect& layerBounds, const IntPoint& hitTestPoint, HitTestFilter hitTestFilter) const
{
- return renderer()->hitTest(request, result, hitTestPoint,
+ if (!renderer()->hitTest(request, result, hitTestPoint,
layerBounds.x() - renderBoxX(),
layerBounds.y() - renderBoxY(),
- hitTestFilter);
+ hitTestFilter))
+ return false;
+
+ // For positioned generated content, we might still not have a
+ // node by the time we get to the layer level, since none of
+ // the content in the layer has an element. So just walk up
+ // the tree.
+ if (!result.innerNode() || !result.innerNonSharedNode()) {
+ Node* e = enclosingElement();
+ if (!result.innerNode())
+ result.setInnerNode(e);
+ if (!result.innerNonSharedNode())
+ result.setInnerNonSharedNode(e);
+ }
+
+ return true;
}
void RenderLayer::updateClipRects(const RenderLayer* rootLayer)