commit 37db33174d7bb511621240fbd49929b935b38d5a
parent eb9ba190413ecfa8ca24cf76636e62fb3eda4f14
Author: sickl8 <sickl8@protonmail.com>
Date: Fri, 28 Nov 2025 23:06:12 +0000
Bug 1918733 - Implement recommended fix for zero width/height on `range.getBoundingClientRect()`. r=emilio
- Added a tests for Bug 1918733
- Used `AsContent()` instead of `static_cast<nsIContent*>`
- Fixed typo in file name
- Updated code to handle root nodes as well as leaf nodes
- Added tests for root nodes
- Fix wrong variable to use in test
Differential Revision: https://phabricator.services.mozilla.com/D274369
Diffstat:
2 files changed, 30 insertions(+), 1 deletion(-)
diff --git a/dom/base/nsRange.cpp b/dom/base/nsRange.cpp
@@ -3060,7 +3060,11 @@ void nsRange::CollectClientRectsAndText(
}
if (aFlushLayout) {
- aStartContainer->OwnerDoc()->FlushPendingNotifications(FlushType::Layout);
+ if (auto* content = nsIContent::FromNode(aStartContainer)) {
+ content->GetPrimaryFrame(FlushType::Layout);
+ } else {
+ aStartContainer->OwnerDoc()->FlushPendingNotifications(FlushType::Layout);
+ }
// Recheck whether we're still in the document
if (!aStartContainer->IsInComposedDoc()) {
return;
diff --git a/testing/web-platform/tests/css/cssom-view/getBoundingClientRect-content-visibility-hidden.html b/testing/web-platform/tests/css/cssom-view/getBoundingClientRect-content-visibility-hidden.html
@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-element-getboundingclientrect">
+<link rel="help" href="https://drafts.csswg.org/cssom-view/#dom-range-getboundingclientrect">
+<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1918733">
+<script src="/resources/testharness.js"></script>
+<script src="/resources/testharnessreport.js"></script>
+<style>
+</style>
+<body>
+ <div style="content-visibility: hidden; contain-intrinsic-size: 100px 100px;">
+ <span id="span">Hello</span>
+ </div>
+<script>
+ const rangeLeaf = document.createRange();
+ const rangeRoot = document.createRange();
+ rangeLeaf.selectNode(span.firstChild);
+ rangeRoot.selectNode(document.documentElement);
+ const rectLeaf = rangeLeaf.getBoundingClientRect();
+ const rectRoot = rangeRoot.getBoundingClientRect();
+ test(() => assert_not_equals(rectLeaf.width, 0, "leaf rect width should not be zero"));
+ test(() => assert_not_equals(rectLeaf.height, 0, "leaf rect height should not be zero"));
+ test(() => assert_not_equals(rectRoot.width, 0, "root rect width should not be zero"));
+ test(() => assert_not_equals(rectRoot.height, 0, "root rect height should not be zero"));
+</script>
+</body>