Commit 2605f2b3 authored by yigu's avatar yigu Committed by Commit bot

Record non-stacking-context as main thread scrolling reasons

There is another common main thread scrolling reason that needs
to be added. A scrollable area with an opaque background
is not a stacking context therefore we don't composite it for
now.

BUG=660907
TEST=ScrollingCoordinatorTest.StackingContextTest
CQ_INCLUDE_TRYBOTS=master.tryserver.blink:linux_trusty_blink_rel;master.tryserver.chromium.linux:linux_layout_tests_slimming_paint_v2

Review-Url: https://codereview.chromium.org/2841603003
Cr-Commit-Position: refs/heads/master@{#468122}
parent c76599f4
...@@ -44,7 +44,8 @@ struct MainThreadScrollingReason { ...@@ -44,7 +44,8 @@ struct MainThreadScrollingReason {
kHasBorderRadius = 1 << 19, kHasBorderRadius = 1 << 19,
kHasClipRelatedProperty = 1 << 20, kHasClipRelatedProperty = 1 << 20,
kHasBoxShadowFromNonRootLayer = 1 << 21, kHasBoxShadowFromNonRootLayer = 1 << 21,
kNonCompositedReasonsLast = 21, kIsNotStackingContextAndLCDText = 1 << 22,
kNonCompositedReasonsLast = 22,
// Transient scrolling reasons. These are computed for each scroll begin. // Transient scrolling reasons. These are computed for each scroll begin.
kNonFastScrollableRegion = 1 << 5, kNonFastScrollableRegion = 1 << 5,
...@@ -59,13 +60,14 @@ struct MainThreadScrollingReason { ...@@ -59,13 +60,14 @@ struct MainThreadScrollingReason {
// New flags should increment this number but it should never be decremented // New flags should increment this number but it should never be decremented
// because the values are used in UMA histograms. It should also be noted // because the values are used in UMA histograms. It should also be noted
// that it excludes the kNotScrollingOnMain value. // that it excludes the kNotScrollingOnMain value.
kMainThreadScrollingReasonCount = 22, kMainThreadScrollingReasonCount = 23,
}; };
static const uint32_t kNonCompositedReasons = static const uint32_t kNonCompositedReasons =
kHasOpacityAndLCDText | kHasTransformAndLCDText | kHasOpacityAndLCDText | kHasTransformAndLCDText |
kBackgroundNotOpaqueInRectAndLCDText | kHasBorderRadius | kBackgroundNotOpaqueInRectAndLCDText | kHasBorderRadius |
kHasClipRelatedProperty | kHasBoxShadowFromNonRootLayer; kHasClipRelatedProperty | kHasBoxShadowFromNonRootLayer |
kIsNotStackingContextAndLCDText;
// Returns true if the given MainThreadScrollingReason can be set by the main // Returns true if the given MainThreadScrollingReason can be set by the main
// thread. // thread.
...@@ -140,6 +142,8 @@ struct MainThreadScrollingReason { ...@@ -140,6 +142,8 @@ struct MainThreadScrollingReason {
tracedValue->AppendString("Has clip related property"); tracedValue->AppendString("Has clip related property");
if (reasons & MainThreadScrollingReason::kHasBoxShadowFromNonRootLayer) if (reasons & MainThreadScrollingReason::kHasBoxShadowFromNonRootLayer)
tracedValue->AppendString("Has box shadow from non-root layer"); tracedValue->AppendString("Has box shadow from non-root layer");
if (reasons & MainThreadScrollingReason::kIsNotStackingContextAndLCDText)
tracedValue->AppendString("Is not stacking context and LCD text");
// Transient scrolling reasons. // Transient scrolling reasons.
if (reasons & MainThreadScrollingReason::kNonFastScrollableRegion) if (reasons & MainThreadScrollingReason::kNonFastScrollableRegion)
......
...@@ -1876,6 +1876,10 @@ bool PaintLayerScrollableArea::ComputeNeedsCompositedScrolling( ...@@ -1876,6 +1876,10 @@ bool PaintLayerScrollableArea::ComputeNeedsCompositedScrolling(
non_composited_main_thread_scrolling_reasons_ |= non_composited_main_thread_scrolling_reasons_ |=
MainThreadScrollingReason::kBackgroundNotOpaqueInRectAndLCDText; MainThreadScrollingReason::kBackgroundNotOpaqueInRectAndLCDText;
} }
if (!layer->GetLayoutObject().Style()->IsStackingContext()) {
non_composited_main_thread_scrolling_reasons_ |=
MainThreadScrollingReason::kIsNotStackingContextAndLCDText;
}
needs_composited_scrolling = false; needs_composited_scrolling = false;
} }
......
...@@ -347,9 +347,10 @@ TEST_F(NonCompositedMainThreadScrollingReasonRecordTest, NestedScrollersTest) { ...@@ -347,9 +347,10 @@ TEST_F(NonCompositedMainThreadScrollingReasonRecordTest, NestedScrollersTest) {
// areas from the chain have corresponding reasons. // areas from the chain have corresponding reasons.
EXPECT_WHEEL_BUCKET(kHasOpacityAndLCDText, 1); EXPECT_WHEEL_BUCKET(kHasOpacityAndLCDText, 1);
EXPECT_WHEEL_BUCKET(kBackgroundNotOpaqueInRectAndLCDText, 1); EXPECT_WHEEL_BUCKET(kBackgroundNotOpaqueInRectAndLCDText, 1);
EXPECT_WHEEL_BUCKET(kIsNotStackingContextAndLCDText, 1);
EXPECT_WHEEL_BUCKET(kHasBorderRadius, 1); EXPECT_WHEEL_BUCKET(kHasBorderRadius, 1);
EXPECT_WHEEL_BUCKET(kHasTransformAndLCDText, 0); EXPECT_WHEEL_BUCKET(kHasTransformAndLCDText, 0);
EXPECT_WHEEL_TOTAL(3); EXPECT_WHEEL_TOTAL(4);
} }
} // namespace } // namespace
......
...@@ -1052,7 +1052,8 @@ class NonCompositedMainThreadScrollingReasonTest ...@@ -1052,7 +1052,8 @@ class NonCompositedMainThreadScrollingReasonTest
static const uint32_t kLCDTextRelatedReasons = static const uint32_t kLCDTextRelatedReasons =
MainThreadScrollingReason::kHasOpacityAndLCDText | MainThreadScrollingReason::kHasOpacityAndLCDText |
MainThreadScrollingReason::kHasTransformAndLCDText | MainThreadScrollingReason::kHasTransformAndLCDText |
MainThreadScrollingReason::kBackgroundNotOpaqueInRectAndLCDText; MainThreadScrollingReason::kBackgroundNotOpaqueInRectAndLCDText |
MainThreadScrollingReason::kIsNotStackingContextAndLCDText;
protected: protected:
NonCompositedMainThreadScrollingReasonTest() { NonCompositedMainThreadScrollingReasonTest() {
...@@ -1207,6 +1208,35 @@ TEST_P(NonCompositedMainThreadScrollingReasonTest, BoxShadowTest) { ...@@ -1207,6 +1208,35 @@ TEST_P(NonCompositedMainThreadScrollingReasonTest, BoxShadowTest) {
"box-shadow", MainThreadScrollingReason::kHasBoxShadowFromNonRootLayer); "box-shadow", MainThreadScrollingReason::kHasBoxShadowFromNonRootLayer);
} }
TEST_P(NonCompositedMainThreadScrollingReasonTest, StackingContextTest) {
GetWebViewImpl()->GetSettings()->SetPreferCompositingToLCDTextEnabled(false);
Document* document = GetFrame()->GetDocument();
Element* container = document->getElementById("scroller1");
ASSERT_TRUE(container);
ForceFullCompositingUpdate();
// If a scroller contains all its children, it's not a stacking context.
PaintLayerScrollableArea* scrollable_area =
ToLayoutBoxModelObject(container->GetLayoutObject())->GetScrollableArea();
ASSERT_TRUE(scrollable_area);
EXPECT_TRUE(scrollable_area->GetNonCompositedMainThreadScrollingReasons() &
MainThreadScrollingReason::kIsNotStackingContextAndLCDText);
GetWebViewImpl()->GetSettings()->SetPreferCompositingToLCDTextEnabled(true);
ForceFullCompositingUpdate();
EXPECT_FALSE(scrollable_area->GetNonCompositedMainThreadScrollingReasons() &
MainThreadScrollingReason::kIsNotStackingContextAndLCDText);
GetWebViewImpl()->GetSettings()->SetPreferCompositingToLCDTextEnabled(false);
// Adding "contain: paint" to force a stacking context leads to promotion.
container->setAttribute("style", "contain: paint", ASSERT_NO_EXCEPTION);
ForceFullCompositingUpdate();
EXPECT_FALSE(scrollable_area->GetNonCompositedMainThreadScrollingReasons());
}
TEST_P(NonCompositedMainThreadScrollingReasonTest, TEST_P(NonCompositedMainThreadScrollingReasonTest,
CompositedWithLCDTextRelatedReasonsTest) { CompositedWithLCDTextRelatedReasonsTest) {
// With "will-change:transform" we composite elements with // With "will-change:transform" we composite elements with
......
...@@ -104547,6 +104547,7 @@ from previous Chrome versions. ...@@ -104547,6 +104547,7 @@ from previous Chrome versions.
<int value="20" label="Has border radius"/> <int value="20" label="Has border radius"/>
<int value="21" label="Has clip related property"/> <int value="21" label="Has clip related property"/>
<int value="22" label="Has box shadow from non-root layer"/> <int value="22" label="Has box shadow from non-root layer"/>
<int value="23" label="Is not stacking context"/>
</enum> </enum>
<enum name="MakeChromeDefaultResult" type="int"> <enum name="MakeChromeDefaultResult" type="int">
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