DeferredShaping: Disable the feature for auto-sizing frames
* If auto-sizing is enabled, |LocalFrameView::
UpdateStyleAndLayoutInternal()| is called multiple times before
PerformPostLayoutTasks(), which locks deferred IFCs. It can change the
state of elements in LocalFrameView::deferred_to_be_locked_.
* Auto-sizing frames need precise box sizes.
Bug: 1259085
Change-Id: I402b74999dc9d9ae99cb19bb3e193f4d71592590
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3750662
Reviewed-by: Koji Ishii <kojii@chromium.org>
Auto-Submit: Kent Tamura <tkent@chromium.org>
Commit-Queue: Koji Ishii <kojii@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1022045}
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc
index 4c887ca..fe56c51 100644
--- a/third_party/blink/renderer/core/frame/local_frame_view.cc
+++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -857,11 +857,7 @@
default_allow_deferred_shaping_ =
default_allow_deferred_shaping_ &&
RuntimeEnabledFeatures::DeferredShapingEnabled() &&
- !frame_->PagePopupOwner() &&
- // Avoid a DCEHCK failure in |NavigatingExtensionPopupInteractiveTest.
- // PageInOtherExtension_Get| on linux-lacros-rel.
- // TODO(tkent): Investigate the failure.
- !document->Url().Protocol().StartsWith("chrome-error") &&
+ !frame_->PagePopupOwner() && !auto_size_info_ &&
!FirstMeaningfulPaintDetector::From(*frame_->GetDocument())
.SeenFirstMeaningfulPaint();
base::AutoReset<bool> deferred_shaping(
diff --git a/third_party/blink/renderer/core/layout/deferred_shaping_test.cc b/third_party/blink/renderer/core/layout/deferred_shaping_test.cc
index 6ee13518..b22bf59 100644
--- a/third_party/blink/renderer/core/layout/deferred_shaping_test.cc
+++ b/third_party/blink/renderer/core/layout/deferred_shaping_test.cc
@@ -797,4 +797,20 @@
EXPECT_FALSE(IsLocked("target"));
}
+TEST_F(DeferredShapingTest, NoDeferForAutoSizing) {
+ GetDocument().body()->setInnerHTML(R"HTML(
+ <style>
+ @media (max-height: 200px) {
+ #target { display: inline; }
+ }
+ </style>
+ <div style="height:1800px"></div>
+ <div id="target">IFC</div>)HTML",
+ ASSERT_NO_EXCEPTION);
+
+ GetFrame().View()->EnableAutoSizeMode({100, 100}, {1920, 4000});
+ UpdateAllLifecyclePhasesForTest();
+ // Pass if no DCHECK failures.
+}
+
} // namespace blink