Bug 1876640 - Fix offset* APIs on tables with captions. r=TYLin

The offset* APIs use the primary frame (the table wrapper frame) to
choose an offset parent, so if we stop at the table frame we skip the
offset between the wrapper and the table boxes.

Differential Revision: https://phabricator.services.mozilla.com/D200948
This commit is contained in:
Emilio Cobos Álvarez 2024-02-07 17:15:15 +00:00
parent c0cd4b85aa
commit d4b845ca46
2 changed files with 24 additions and 1 deletions

View File

@ -275,7 +275,7 @@ static bool IsOffsetParent(nsIFrame* aFrame) {
LayoutFrameType frameType = aFrame->Type();
if (frameType == LayoutFrameType::TableCell ||
frameType == LayoutFrameType::Table) {
frameType == LayoutFrameType::TableWrapper) {
// Per the IDL for Element, only td, th, and table are acceptable
// offsetParents apart from body or positioned elements; we need to check
// the content type as well as the frame type so we ignore anonymous tables

View File

@ -0,0 +1,23 @@
<!doctype html>
<meta charset="utf-8">
<link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-htmlelement-offsetparent">
<title>offset* APIs on tables with captions.</title>
<script src=/resources/testharness.js></script>
<script src=/resources/testharnessreport.js></script>
<table style="border-spacing: 0px">
<caption>I'm a <br>reasonably<br>tall caption.</caption>
<tr><td><span>I'm a cell.</span>
</table>
<script>
let td = document.querySelector("td");
let span = document.querySelector("span");
let caption = document.querySelector("caption");
let table = document.querySelector("table");
test(function() {
assert_equals(span.offsetParent, td, "<td> should be an offset parent");
assert_equals(td.offsetParent, table, "<table> should be an offset parent for <td>");
assert_equals(caption.offsetParent, table, "<table> should be an offset parent for <caption>");
assert_equals(caption.offsetTop, 0, "<caption> is at the top of its offsetParent");
assert_equals(td.offsetTop, caption.offsetHeight, "<td> is under the caption");
});
</script>