Commit f1735ff5 authored by Xianzhu Wang's avatar Xianzhu Wang Committed by Commit Bot

More accurate reasoning for non-opaque text blocking composited scrolling

Bug: 1074395
Change-Id: I6fb83b0466eb58fbcae1cfa15bc0b2a04dd642ac
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2212813
Commit-Queue: Xianzhu Wang <wangxianzhu@chromium.org>
Reviewed-by: default avatarPhilip Rogers <pdr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#771292}
parent adb0beaf
......@@ -44,8 +44,8 @@ void MainThreadScrollingReason::AddToTracedValue(
traced_value.AppendString("Handling scroll from main thread");
if (reasons & kHasTransformAndLCDText)
traced_value.AppendString("Has transform and LCD text");
if (reasons & kBackgroundNotOpaqueInRectAndLCDText)
traced_value.AppendString("Background is not opaque in rect and LCD text");
if (reasons & kNotOpaqueForTextAndLCDText)
traced_value.AppendString("Not opaque for text and LCD text");
if (reasons & kCantPaintScrollingBackground)
traced_value.AppendString("Can't paint scrolling background");
if (reasons & kHasClipRelatedProperty)
......
......@@ -44,7 +44,7 @@ struct CC_EXPORT MainThreadScrollingReason {
// screen position; transparency and transforms break this.
kNonCompositedReasonsFirst = 17,
kHasTransformAndLCDText = 1 << 17,
kBackgroundNotOpaqueInRectAndLCDText = 1 << 18,
kNotOpaqueForTextAndLCDText = 1 << 18,
kCantPaintScrollingBackground = 1 << 19,
kHasClipRelatedProperty = 1 << 20,
kNonCompositedReasonsLast = 22,
......@@ -68,7 +68,7 @@ struct CC_EXPORT MainThreadScrollingReason {
};
static const uint32_t kNonCompositedReasons =
kHasTransformAndLCDText | kBackgroundNotOpaqueInRectAndLCDText |
kHasTransformAndLCDText | kNotOpaqueForTextAndLCDText |
kCantPaintScrollingBackground | kHasClipRelatedProperty;
// Returns true if the given MainThreadScrollingReason can be set by the main
......
......@@ -20,7 +20,7 @@ TEST_F(MainThreadScrollingReasonTest, AsText) {
"Frame overlay, "
"Handling scroll from main thread, "
"Has transform and LCD text, "
"Background is not opaque in rect and LCD text, "
"Not opaque for text and LCD text, "
"Can't paint scrolling background, "
"Has clip related property, "
"Non fast scrollable region, "
......
......@@ -299,7 +299,7 @@ class NonCompositedMainThreadScrollingReasonsTest
: public MainThreadScrollingReasonsTest {
static const uint32_t kLCDTextRelatedReasons =
cc::MainThreadScrollingReason::kHasTransformAndLCDText |
cc::MainThreadScrollingReason::kBackgroundNotOpaqueInRectAndLCDText;
cc::MainThreadScrollingReason::kNotOpaqueForTextAndLCDText;
protected:
NonCompositedMainThreadScrollingReasonsTest() {
......@@ -386,7 +386,7 @@ TEST_F(NonCompositedMainThreadScrollingReasonsTest, TransformTest) {
TEST_F(NonCompositedMainThreadScrollingReasonsTest, BackgroundNotOpaqueTest) {
TestNonCompositedReasons(
"background-not-opaque",
cc::MainThreadScrollingReason::kBackgroundNotOpaqueInRectAndLCDText);
cc::MainThreadScrollingReason::kNotOpaqueForTextAndLCDText);
}
TEST_F(NonCompositedMainThreadScrollingReasonsTest,
......@@ -456,8 +456,13 @@ TEST_F(NonCompositedMainThreadScrollingReasonsTest, StackingContextTest) {
cc::MainThreadScrollingReason::kNotScrollingOnMain);
}
TEST_F(NonCompositedMainThreadScrollingReasonsTest, BorderRadiusTest) {
TestNonCompositedReasons("border-radius",
cc::MainThreadScrollingReason::kNotScrollingOnMain);
}
TEST_F(NonCompositedMainThreadScrollingReasonsTest,
CompositedWithLCDTextRelatedReasonsTest) {
ForcedComositingWithLCDRelatedReasons) {
// With "will-change:transform" we composite elements with
// LCDTextRelatedReasons only. For elements with other
// NonCompositedReasons, we don't create scrollingLayer for their
......
......@@ -145,17 +145,17 @@ TEST_F(NonCompositedMainThreadScrollingReasonRecordTest,
// Test touch scroll.
Scroll(box, WebGestureDevice::kTouchscreen);
EXPECT_TOUCH_BUCKET(kHasTransformAndLCDText, 1);
EXPECT_TOUCH_BUCKET(kBackgroundNotOpaqueInRectAndLCDText, 1);
EXPECT_TOUCH_BUCKET(kNotOpaqueForTextAndLCDText, 1);
Scroll(box, WebGestureDevice::kTouchscreen);
EXPECT_TOUCH_BUCKET(kHasTransformAndLCDText, 2);
EXPECT_TOUCH_BUCKET(kBackgroundNotOpaqueInRectAndLCDText, 2);
EXPECT_TOUCH_BUCKET(kNotOpaqueForTextAndLCDText, 2);
EXPECT_TOUCH_TOTAL(4);
// Test wheel scroll.
Scroll(box, WebGestureDevice::kTouchpad);
EXPECT_WHEEL_BUCKET(kHasTransformAndLCDText, 1);
EXPECT_WHEEL_BUCKET(kBackgroundNotOpaqueInRectAndLCDText, 1);
EXPECT_WHEEL_BUCKET(kNotOpaqueForTextAndLCDText, 1);
EXPECT_WHEEL_TOTAL(2);
}
......@@ -182,7 +182,7 @@ TEST_F(NonCompositedMainThreadScrollingReasonRecordTest,
Scroll(box, WebGestureDevice::kTouchpad);
EXPECT_WHEEL_BUCKET(kHasTransformAndLCDText, 1);
EXPECT_WHEEL_BUCKET(kBackgroundNotOpaqueInRectAndLCDText, 1);
EXPECT_WHEEL_BUCKET(kNotOpaqueForTextAndLCDText, 1);
EXPECT_WHEEL_TOTAL(2);
box->setAttribute("class", "composited transform box");
......@@ -192,7 +192,7 @@ TEST_F(NonCompositedMainThreadScrollingReasonRecordTest,
->GetScrollableArea()
->GetNonCompositedMainThreadScrollingReasons());
EXPECT_WHEEL_BUCKET(kHasTransformAndLCDText, 1);
EXPECT_WHEEL_BUCKET(kBackgroundNotOpaqueInRectAndLCDText, 1);
EXPECT_WHEEL_BUCKET(kNotOpaqueForTextAndLCDText, 1);
EXPECT_WHEEL_TOTAL(2);
}
......@@ -216,14 +216,14 @@ TEST_F(NonCompositedMainThreadScrollingReasonRecordTest,
Scroll(box, WebGestureDevice::kTouchpad);
EXPECT_WHEEL_BUCKET(kHasTransformAndLCDText, 1);
EXPECT_WHEEL_BUCKET(kBackgroundNotOpaqueInRectAndLCDText, 1);
EXPECT_WHEEL_BUCKET(kNotOpaqueForTextAndLCDText, 1);
EXPECT_WHEEL_TOTAL(2);
box->setAttribute("class", "hidden transform box");
UpdateAllLifecyclePhases();
Scroll(box, WebGestureDevice::kTouchpad);
EXPECT_WHEEL_BUCKET(kHasTransformAndLCDText, 1);
EXPECT_WHEEL_BUCKET(kBackgroundNotOpaqueInRectAndLCDText, 1);
EXPECT_WHEEL_BUCKET(kNotOpaqueForTextAndLCDText, 1);
EXPECT_WHEEL_TOTAL(2);
}
......@@ -258,7 +258,7 @@ TEST_F(NonCompositedMainThreadScrollingReasonRecordTest, NestedScrollersTest) {
// Scrolling the inner box will gather reasons from the scrolling chain. The
// inner box itself has no reason because it's composited. Other scrollable
// areas from the chain have corresponding reasons.
EXPECT_WHEEL_BUCKET(kBackgroundNotOpaqueInRectAndLCDText, 1);
EXPECT_WHEEL_BUCKET(kNotOpaqueForTextAndLCDText, 1);
EXPECT_WHEEL_BUCKET(kHasTransformAndLCDText, 0);
EXPECT_WHEEL_TOTAL(1);
}
......
......@@ -2525,10 +2525,13 @@ bool PaintLayerScrollableArea::ComputeNeedsCompositedScrollingInternal(
cc::MainThreadScrollingReason::kHasTransformAndLCDText;
needs_composited_scrolling = false;
}
if (!layer_->BackgroundIsKnownToBeOpaqueInRect(
box->PhysicalPaddingBoxRect(), true)) {
if (!box->TextIsKnownToBeOnOpaqueBackground() ||
// TODO(wangxianzhu): This is temporary to continue to disable
// composited scrolling by default for sub-LayoutViews. Will enable in a
// followup. See LayoutView::BackgroundIsKnownToBeOpaqueInRect().
(box->IsLayoutView() && !box->GetFrame()->IsMainFrame())) {
non_composited_main_thread_scrolling_reasons_ |=
cc::MainThreadScrollingReason::kBackgroundNotOpaqueInRectAndLCDText;
cc::MainThreadScrollingReason::kNotOpaqueForTextAndLCDText;
needs_composited_scrolling = false;
}
if (!(background_paint_location_if_composited &
......
......@@ -93,3 +93,7 @@ crbug.com/1047359 http/tests/subresource_filter/ad-highlight-frame-resized.html
compositing/gestures/gesture-tapHighlight-composited-img.html [ Pass Failure ]
http/tests/images/image-decode-in-frame.html [ Pass Failure ]
# Failures after crrev.com/c/2212813
external/wpt/html/rendering/non-replaced-elements/the-fieldset-and-legend-elements/fieldset-overflow.html [ Crash ]
fast/table/cell-percent-padding.html [ Crash ]
......@@ -42772,7 +42772,7 @@ from previous Chrome versions.
<int value="16" label="Requires hit testing on custom scrollbars (obsolete)"/>
<int value="17" label="Has opacity (obsolete)"/>
<int value="18" label="Has transform"/>
<int value="19" label="Background not opaque in rect"/>
<int value="19" label="Not opaque for text"/>
<int value="20" label="Can't paint scrolling background"/>
<int value="21" label="Has clip related property"/>
<int value="22" label="Has box shadow from non-root layer (obsolete)"/>
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment