[block-in-inline] Fix hit-testing floats in block-in-inline
The hit-testing logic was skipping all non-inline boxes in an
inline formatting context assuming they are all painted
atomically. Block-in-inline is a case where it is not painted
atomically.
This patch checks |HasFloatingDescendantsForPaint()| when
|!IsPaintedAtomically()|.
Bug: 1299181
Change-Id: Id4636a87f52bf3dcd1c817e9b1d15352333a0e68
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3474748
Reviewed-by: Kent Tamura <tkent@chromium.org>
Commit-Queue: Koji Ishii <kojii@chromium.org>
Cr-Commit-Position: refs/heads/main@{#973448}
diff --git a/css/CSS2/normal-flow/block-in-inline-hittest-float-001.html b/css/CSS2/normal-flow/block-in-inline-hittest-float-001.html
new file mode 100644
index 0000000..6ede29d
--- /dev/null
+++ b/css/CSS2/normal-flow/block-in-inline-hittest-float-001.html
@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<link rel="help" href="http://www.w3.org/TR/CSS21/visuren.html#anonymous-block-level">
+<link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-document-elementfrompoint">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+.float {
+ float: left;
+ width: 200px;
+ height: 200px;
+ background: orange;
+}
+</style>
+<body>
+ <a id="a" href="#">
+ <div>
+ <div id="target" class="float"></div>
+ </div>
+ </a>
+<script>
+test(() => {
+ const target_bounds = target.getBoundingClientRect();
+ const target_x = target_bounds.x + (target_bounds.width / 2);
+ const target_y = target_bounds.y + (target_bounds.height / 2);
+ const result = document.elementFromPoint(target_x, target_y);
+ assert_equals(result, target);
+});
+</script>
+</body>