Index: third_party/WebKit/Source/web/tests/ScrollingCoordinatorTest.cpp |
diff --git a/third_party/WebKit/Source/web/tests/ScrollingCoordinatorTest.cpp b/third_party/WebKit/Source/web/tests/ScrollingCoordinatorTest.cpp |
index 66b0374e619429a62e7d7b77a3a51b3a5ffa2e59..74162c927f34a4271044ac05f414d220404281a9 100644 |
--- a/third_party/WebKit/Source/web/tests/ScrollingCoordinatorTest.cpp |
+++ b/third_party/WebKit/Source/web/tests/ScrollingCoordinatorTest.cpp |
@@ -1047,7 +1047,7 @@ TEST_P(ScrollingCoordinatorTest, |
} |
} |
-class StyleRelatedMainThreadScrollingReasonTest |
+class NonCompositedMainThreadScrollingReasonTest |
: public ScrollingCoordinatorTest { |
static const uint32_t kLCDTextRelatedReasons = |
MainThreadScrollingReason::kHasOpacityAndLCDText | |
@@ -1055,132 +1055,188 @@ class StyleRelatedMainThreadScrollingReasonTest |
MainThreadScrollingReason::kBackgroundNotOpaqueInRectAndLCDText; |
protected: |
- StyleRelatedMainThreadScrollingReasonTest() { |
+ NonCompositedMainThreadScrollingReasonTest() { |
RegisterMockedHttpURLLoad("two_scrollable_area.html"); |
NavigateTo(base_url_ + "two_scrollable_area.html"); |
} |
- void TestStyle(const std::string& target, const uint32_t reason) { |
+ void TestNonCompositedReasons(const std::string& target, |
+ const uint32_t reason) { |
GetWebViewImpl()->GetSettings()->SetPreferCompositingToLCDTextEnabled( |
false); |
Document* document = GetFrame()->GetDocument(); |
Element* container = document->GetElementById("scroller1"); |
container->setAttribute("class", target.c_str(), ASSERT_NO_EXCEPTION); |
- container = document->GetElementById("scroller2"); |
- container->setAttribute("class", target.c_str(), ASSERT_NO_EXCEPTION); |
ForceFullCompositingUpdate(); |
+ PaintLayerScrollableArea* scrollable_area = |
+ ToLayoutBoxModelObject(container->GetLayoutObject()) |
+ ->GetScrollableArea(); |
+ ASSERT_TRUE(scrollable_area); |
+ EXPECT_TRUE(scrollable_area->GetNonCompositedMainThreadScrollingReasons() & |
+ reason); |
+ |
+ Element* container2 = document->GetElementById("scroller2"); |
+ PaintLayerScrollableArea* scrollable_area2 = |
+ ToLayoutBoxModelObject(container2->GetLayoutObject()) |
+ ->GetScrollableArea(); |
+ ASSERT_TRUE(scrollable_area2); |
+ // Different scrollable area should remain unaffected. |
+ EXPECT_FALSE( |
+ scrollable_area2->GetNonCompositedMainThreadScrollingReasons() & |
+ reason); |
+ |
FrameView* frame_view = GetFrame()->View(); |
ASSERT_TRUE(frame_view); |
- ASSERT_TRUE(frame_view->GetMainThreadScrollingReasons() & reason); |
- |
- // Remove the target attribute from one of the scrollers. |
- // Still need to scroll on main thread. |
- container = document->GetElementById("scroller1"); |
- DCHECK(container); |
- |
- container->removeAttribute("class"); |
- ForceFullCompositingUpdate(); |
- |
- ASSERT_TRUE(frame_view->GetMainThreadScrollingReasons() & reason); |
- |
- // Remove attribute from the other scroller would lead to |
- // scroll on impl. |
- container = document->GetElementById("scroller2"); |
- DCHECK(container); |
+ EXPECT_FALSE(frame_view->GetMainThreadScrollingReasons() & reason); |
+ // Remove attribute from the scroller 1 would lead to scroll on impl. |
container->removeAttribute("class"); |
ForceFullCompositingUpdate(); |
- ASSERT_FALSE(frame_view->GetMainThreadScrollingReasons() & reason); |
+ EXPECT_FALSE(scrollable_area->GetNonCompositedMainThreadScrollingReasons() & |
+ reason); |
+ EXPECT_FALSE(frame_view->GetMainThreadScrollingReasons() & reason); |
// Add target attribute would again lead to scroll on main thread |
container->setAttribute("class", target.c_str(), ASSERT_NO_EXCEPTION); |
ForceFullCompositingUpdate(); |
- ASSERT_TRUE(frame_view->GetMainThreadScrollingReasons() & reason); |
+ EXPECT_TRUE(scrollable_area->GetNonCompositedMainThreadScrollingReasons() & |
+ reason); |
+ EXPECT_FALSE(frame_view->GetMainThreadScrollingReasons() & reason); |
if ((reason & kLCDTextRelatedReasons) && |
!(reason & ~kLCDTextRelatedReasons)) { |
GetWebViewImpl()->GetSettings()->SetPreferCompositingToLCDTextEnabled( |
true); |
ForceFullCompositingUpdate(); |
- ASSERT_FALSE(frame_view->GetMainThreadScrollingReasons()); |
+ EXPECT_FALSE( |
+ scrollable_area->GetNonCompositedMainThreadScrollingReasons()); |
+ EXPECT_FALSE(frame_view->GetMainThreadScrollingReasons()); |
} |
} |
}; |
INSTANTIATE_TEST_CASE_P(All, |
- StyleRelatedMainThreadScrollingReasonTest, |
+ NonCompositedMainThreadScrollingReasonTest, |
::testing::Bool()); |
-// TODO(yigu): This test and all other style realted main thread scrolling |
-// reason tests below have been disabled due to https://crbug.com/701355. |
-TEST_P(StyleRelatedMainThreadScrollingReasonTest, DISABLED_TransparentTest) { |
- TestStyle("transparent", MainThreadScrollingReason::kHasOpacityAndLCDText); |
+TEST_P(NonCompositedMainThreadScrollingReasonTest, TransparentTest) { |
+ TestNonCompositedReasons("transparent", |
+ MainThreadScrollingReason::kHasOpacityAndLCDText); |
} |
-TEST_P(StyleRelatedMainThreadScrollingReasonTest, DISABLED_TransformTest) { |
- TestStyle("transform", MainThreadScrollingReason::kHasTransformAndLCDText); |
+TEST_P(NonCompositedMainThreadScrollingReasonTest, TransformTest) { |
+ TestNonCompositedReasons("transform", |
+ MainThreadScrollingReason::kHasTransformAndLCDText); |
} |
-TEST_P(StyleRelatedMainThreadScrollingReasonTest, |
- DISABLED_BackgroundNotOpaqueTest) { |
- TestStyle("background-not-opaque", |
- MainThreadScrollingReason::kBackgroundNotOpaqueInRectAndLCDText); |
+TEST_P(NonCompositedMainThreadScrollingReasonTest, BackgroundNotOpaqueTest) { |
+ TestNonCompositedReasons( |
+ "background-not-opaque", |
+ MainThreadScrollingReason::kBackgroundNotOpaqueInRectAndLCDText); |
} |
-TEST_P(StyleRelatedMainThreadScrollingReasonTest, DISABLED_BorderRadiusTest) { |
- TestStyle("border-radius", MainThreadScrollingReason::kHasBorderRadius); |
+TEST_P(NonCompositedMainThreadScrollingReasonTest, BorderRadiusTest) { |
+ TestNonCompositedReasons("border-radius", |
+ MainThreadScrollingReason::kHasBorderRadius); |
} |
-TEST_P(StyleRelatedMainThreadScrollingReasonTest, DISABLED_ClipTest) { |
- TestStyle("clip", MainThreadScrollingReason::kHasClipRelatedProperty); |
+TEST_P(NonCompositedMainThreadScrollingReasonTest, ClipTest) { |
+ TestNonCompositedReasons("clip", |
+ MainThreadScrollingReason::kHasClipRelatedProperty); |
} |
-TEST_P(StyleRelatedMainThreadScrollingReasonTest, DISABLED_ClipPathTest) { |
- uint32_t reason = MainThreadScrollingReason::kHasClipRelatedProperty; |
+TEST_P(NonCompositedMainThreadScrollingReasonTest, ClipPathTest) { |
+ uint32_t clip_reason = MainThreadScrollingReason::kHasClipRelatedProperty; |
GetWebViewImpl()->GetSettings()->SetPreferCompositingToLCDTextEnabled(false); |
Document* document = GetFrame()->GetDocument(); |
// Test ancestor with ClipPath |
Element* element = document->body(); |
- DCHECK(element); |
+ ASSERT_TRUE(element); |
element->setAttribute(HTMLNames::styleAttr, |
"clip-path:circle(115px at 20px 20px);"); |
+ Element* container = document->getElementById("scroller1"); |
+ ASSERT_TRUE(container); |
ForceFullCompositingUpdate(); |
+ PaintLayerScrollableArea* scrollable_area = |
+ ToLayoutBoxModelObject(container->GetLayoutObject())->GetScrollableArea(); |
+ ASSERT_TRUE(scrollable_area); |
+ EXPECT_TRUE(scrollable_area->GetNonCompositedMainThreadScrollingReasons() & |
+ clip_reason); |
+ |
FrameView* frame_view = GetFrame()->View(); |
ASSERT_TRUE(frame_view); |
- ASSERT_TRUE(frame_view->GetMainThreadScrollingReasons() & reason); |
+ EXPECT_FALSE(frame_view->GetMainThreadScrollingReasons() & clip_reason); |
// Remove clip path from ancestor. |
element->removeAttribute(HTMLNames::styleAttr); |
ForceFullCompositingUpdate(); |
- ASSERT_FALSE(frame_view->GetMainThreadScrollingReasons() & reason); |
+ EXPECT_FALSE(scrollable_area->GetNonCompositedMainThreadScrollingReasons() & |
+ clip_reason); |
+ EXPECT_FALSE(frame_view->GetMainThreadScrollingReasons() & clip_reason); |
// Test descendant with ClipPath |
element = document->GetElementById("content1"); |
- DCHECK(element); |
+ ASSERT_TRUE(element); |
element->setAttribute(HTMLNames::styleAttr, |
"clip-path:circle(115px at 20px 20px);"); |
ForceFullCompositingUpdate(); |
- ASSERT_TRUE(frame_view->GetMainThreadScrollingReasons() & reason); |
+ EXPECT_TRUE(scrollable_area->GetNonCompositedMainThreadScrollingReasons() & |
+ clip_reason); |
+ EXPECT_FALSE(frame_view->GetMainThreadScrollingReasons() & clip_reason); |
// Remove clip path from descendant. |
element->removeAttribute(HTMLNames::styleAttr); |
ForceFullCompositingUpdate(); |
- ASSERT_FALSE(frame_view->GetMainThreadScrollingReasons() & reason); |
+ EXPECT_FALSE(scrollable_area->GetNonCompositedMainThreadScrollingReasons() & |
+ clip_reason); |
+ EXPECT_FALSE(frame_view->GetMainThreadScrollingReasons() & clip_reason); |
+} |
+ |
+TEST_P(NonCompositedMainThreadScrollingReasonTest, LCDTextEnabledTest) { |
+ TestNonCompositedReasons("transparent border-radius", |
+ MainThreadScrollingReason::kHasOpacityAndLCDText | |
+ MainThreadScrollingReason::kHasBorderRadius); |
} |
-TEST_P(StyleRelatedMainThreadScrollingReasonTest, DISABLED_LCDTextEnabledTest) { |
- TestStyle("transparent border-radius", |
- MainThreadScrollingReason::kHasOpacityAndLCDText | |
- MainThreadScrollingReason::kHasBorderRadius); |
+TEST_P(NonCompositedMainThreadScrollingReasonTest, BoxShadowTest) { |
+ TestNonCompositedReasons( |
+ "box-shadow", MainThreadScrollingReason::kHasBoxShadowFromNonRootLayer); |
} |
-TEST_P(StyleRelatedMainThreadScrollingReasonTest, DISABLED_BoxShadowTest) { |
- TestStyle("box-shadow", |
- MainThreadScrollingReason::kHasBoxShadowFromNonRootLayer); |
+TEST_P(NonCompositedMainThreadScrollingReasonTest, |
+ CompositedWithLCDTextRelatedReasonsTest) { |
+ // With "will-change:transform" we composite elements with |
+ // LCDTextRelatedReasons only. For elements with other |
+ // NonCompositedReasons, we don't create scrollingLayer for their |
+ // CompositedLayerMapping therefore they don't get composited. |
+ GetWebViewImpl()->GetSettings()->SetPreferCompositingToLCDTextEnabled(false); |
+ Document* document = GetFrame()->GetDocument(); |
+ Element* container = document->getElementById("scroller1"); |
+ ASSERT_TRUE(container); |
+ container->setAttribute("class", "composited transparent", |
+ ASSERT_NO_EXCEPTION); |
+ ForceFullCompositingUpdate(); |
+ |
+ PaintLayerScrollableArea* scrollable_area = |
+ ToLayoutBoxModelObject(container->GetLayoutObject())->GetScrollableArea(); |
+ ASSERT_TRUE(scrollable_area); |
+ EXPECT_FALSE(scrollable_area->GetNonCompositedMainThreadScrollingReasons()); |
+ |
+ Element* container2 = document->getElementById("scroller2"); |
+ ASSERT_TRUE(container2); |
+ container2->setAttribute("class", "composited border-radius", |
+ ASSERT_NO_EXCEPTION); |
+ ForceFullCompositingUpdate(); |
+ PaintLayerScrollableArea* scrollable_area2 = |
+ ToLayoutBoxModelObject(container2->GetLayoutObject()) |
+ ->GetScrollableArea(); |
+ ASSERT_TRUE(scrollable_area2); |
+ EXPECT_TRUE(scrollable_area2->GetNonCompositedMainThreadScrollingReasons() & |
+ MainThreadScrollingReason::kHasBorderRadius); |
} |
} // namespace blink |