Commit 3d69d15e authored by Xianzhu Wang's avatar Xianzhu Wang Committed by Commit Bot

Force subtree update when visual viewport adds/removes paint property nodes

This is like what we do for paint properties in the document.

Bug: 984881
Change-Id: Ib799e852017642d31de2616a5ebab554cbeb3770
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1752502Reviewed-by: default avatarPhilip Rogers <pdr@chromium.org>
Commit-Queue: Xianzhu Wang <wangxianzhu@chromium.org>
Cr-Commit-Position: refs/heads/master@{#686504}
parent aa206989
...@@ -101,6 +101,13 @@ PaintPropertyChangeType VisualViewportPaintPropertyTreeBuilder::Update( ...@@ -101,6 +101,13 @@ PaintPropertyChangeType VisualViewportPaintPropertyTreeBuilder::Update(
context.absolute_position.scroll = visual_viewport.GetScrollNode(); context.absolute_position.scroll = visual_viewport.GetScrollNode();
context.fixed_position.scroll = visual_viewport.GetScrollNode(); context.fixed_position.scroll = visual_viewport.GetScrollNode();
if (property_changed >= PaintPropertyChangeType::kNodeAddedOrRemoved) {
// Force piercing subtree update for the worst case (scroll node added/
// removed). Not a big deal for performance because this is rare.
full_context.force_subtree_update_reasons |=
PaintPropertyTreeBuilderContext::kSubtreeUpdateIsolationPiercing;
}
#if DCHECK_IS_ON() #if DCHECK_IS_ON()
paint_property_tree_printer::UpdateDebugNames(visual_viewport); paint_property_tree_printer::UpdateDebugNames(visual_viewport);
#endif #endif
......
...@@ -836,6 +836,60 @@ TEST_P(PaintPropertyTreeUpdateTest, ...@@ -836,6 +836,60 @@ TEST_P(PaintPropertyTreeUpdateTest,
EXPECT_EQ(IntSize(800, 600), visual_viewport.GetScrollNode()->ContentsSize()); EXPECT_EQ(IntSize(800, 600), visual_viewport.GetScrollNode()->ContentsSize());
} }
TEST_P(PaintPropertyTreeUpdateTest, ViewportAddRemoveDeviceEmulationNode) {
SetBodyInnerHTML(
"<style>body {height: 10000px; width: 10000px; margin: 0;}</style>");
auto& visual_viewport = GetDocument().GetPage()->GetVisualViewport();
EXPECT_FALSE(visual_viewport.GetDeviceEmulationTransformNode());
// The LayoutView (instead of VisualViewport) creates scrollbars because
// viewport is disabled.
ASSERT_FALSE(GetDocument().GetPage()->GetSettings().GetViewportEnabled());
EXPECT_FALSE(visual_viewport.LayerForHorizontalScrollbar());
EXPECT_FALSE(visual_viewport.LayerForVerticalScrollbar());
auto* scrollbar_layer =
GetLayoutView().GetScrollableArea()->LayerForHorizontalScrollbar();
if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) {
ASSERT_TRUE(scrollbar_layer);
EXPECT_EQ(&TransformPaintPropertyNode::Root(),
&scrollbar_layer->GetPropertyTreeState().Transform());
} else {
// TODO(wangxianzhu): Test for CompositeAfterPaint.
EXPECT_FALSE(scrollbar_layer);
}
// These emulate WebViewImpl::SetDeviceEmulationTransform().
GetChromeClient().SetDeviceEmulationTransform(
TransformationMatrix().Scale(2));
visual_viewport.SetNeedsPaintPropertyUpdate();
UpdateAllLifecyclePhasesForTest();
EXPECT_TRUE(visual_viewport.GetDeviceEmulationTransformNode());
if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) {
ASSERT_TRUE(scrollbar_layer);
EXPECT_EQ(visual_viewport.GetDeviceEmulationTransformNode(),
&scrollbar_layer->GetPropertyTreeState().Transform());
} else {
// TODO(wangxianzhu): Test for CompositeAfterPaint.
EXPECT_FALSE(scrollbar_layer);
}
// These emulate WebViewImpl::SetDeviceEmulationTransform().
GetChromeClient().SetDeviceEmulationTransform(TransformationMatrix());
visual_viewport.SetNeedsPaintPropertyUpdate();
UpdateAllLifecyclePhasesForTest();
EXPECT_FALSE(visual_viewport.GetDeviceEmulationTransformNode());
if (!RuntimeEnabledFeatures::CompositeAfterPaintEnabled()) {
ASSERT_TRUE(scrollbar_layer);
EXPECT_EQ(&TransformPaintPropertyNode::Root(),
&scrollbar_layer->GetPropertyTreeState().Transform());
} else {
// TODO(wangxianzhu): Test for CompositeAfterPaint.
EXPECT_FALSE(scrollbar_layer);
}
}
TEST_P(PaintPropertyTreeUpdateTest, ScrollbarWidthChange) { TEST_P(PaintPropertyTreeUpdateTest, ScrollbarWidthChange) {
SetBodyInnerHTML(R"HTML( SetBodyInnerHTML(R"HTML(
<style>::-webkit-scrollbar {width: 20px; height: 20px}</style> <style>::-webkit-scrollbar {width: 20px; height: 20px}</style>
......
...@@ -89,8 +89,16 @@ class RenderingTestChromeClient : public EmptyChromeClient { ...@@ -89,8 +89,16 @@ class RenderingTestChromeClient : public EmptyChromeClient {
return layer_tree_->layer_tree_host(); return layer_tree_->layer_tree_host();
} }
void SetDeviceEmulationTransform(const TransformationMatrix& t) {
device_emulation_transform_ = t;
}
TransformationMatrix GetDeviceEmulationTransform() const override {
return device_emulation_transform_;
}
private: private:
std::unique_ptr<LayerTreeHostEmbedder> layer_tree_; std::unique_ptr<LayerTreeHostEmbedder> layer_tree_;
TransformationMatrix device_emulation_transform_;
}; };
class RenderingTest : public PageTestBase, public UseMockScrollbarSettings { class RenderingTest : public PageTestBase, public UseMockScrollbarSettings {
......
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