OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "platform/graphics/compositing/PaintArtifactCompositor.h" | 5 #include "platform/graphics/compositing/PaintArtifactCompositor.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "base/test/test_simple_task_runner.h" | 9 #include "base/test/test_simple_task_runner.h" |
10 #include "base/threading/thread_task_runner_handle.h" | 10 #include "base/threading/thread_task_runner_handle.h" |
11 #include "cc/layers/layer.h" | 11 #include "cc/layers/layer.h" |
12 #include "cc/test/fake_compositor_frame_sink.h" | 12 #include "cc/test/fake_compositor_frame_sink.h" |
13 #include "cc/test/geometry_test_utils.h" | 13 #include "cc/test/geometry_test_utils.h" |
14 #include "cc/trees/clip_node.h" | 14 #include "cc/trees/clip_node.h" |
15 #include "cc/trees/effect_node.h" | 15 #include "cc/trees/effect_node.h" |
16 #include "cc/trees/layer_tree_host.h" | 16 #include "cc/trees/layer_tree_host.h" |
17 #include "cc/trees/layer_tree_settings.h" | 17 #include "cc/trees/layer_tree_settings.h" |
18 #include "cc/trees/scroll_node.h" | 18 #include "cc/trees/scroll_node.h" |
19 #include "cc/trees/transform_node.h" | 19 #include "cc/trees/transform_node.h" |
20 #include "platform/graphics/paint/EffectPaintPropertyNode.h" | 20 #include "platform/graphics/paint/EffectPaintPropertyNode.h" |
21 #include "platform/graphics/paint/GeometryMapper.h" | 21 #include "platform/graphics/paint/GeometryMapper.h" |
22 #include "platform/graphics/paint/PaintArtifact.h" | 22 #include "platform/graphics/paint/PaintArtifact.h" |
23 #include "platform/graphics/paint/ScrollPaintPropertyNode.h" | 23 #include "platform/graphics/paint/ScrollPaintPropertyNode.h" |
24 #include "platform/testing/PaintPropertyTestHelpers.h" | 24 #include "platform/testing/PaintPropertyTestHelpers.h" |
25 #include "platform/testing/PictureMatchers.h" | 25 #include "platform/testing/PictureMatchers.h" |
26 #include "platform/testing/RuntimeEnabledFeaturesTestHelpers.h" | 26 #include "platform/testing/RuntimeEnabledFeaturesTestHelpers.h" |
27 #include "platform/testing/TestPaintArtifact.h" | 27 #include "platform/testing/TestPaintArtifact.h" |
28 #include "platform/testing/WebLayerTreeViewImplForTesting.h" | 28 #include "platform/testing/WebLayerTreeViewImplForTesting.h" |
| 29 #include "public/platform/WebLayerScrollClient.h" |
29 #include "testing/gmock/include/gmock/gmock.h" | 30 #include "testing/gmock/include/gmock/gmock.h" |
30 #include "testing/gtest/include/gtest/gtest.h" | 31 #include "testing/gtest/include/gtest/gtest.h" |
31 | 32 |
32 namespace blink { | 33 namespace blink { |
33 | 34 |
34 #define EXPECT_BLINK_FLOAT_RECT_EQ(expected, actual) \ | 35 #define EXPECT_BLINK_FLOAT_RECT_EQ(expected, actual) \ |
35 do { \ | 36 do { \ |
36 EXPECT_FLOAT_EQ((expected).x(), (actual).x()); \ | 37 EXPECT_FLOAT_EQ((expected).x(), (actual).x()); \ |
37 EXPECT_FLOAT_EQ((expected).y(), (actual).y()); \ | 38 EXPECT_FLOAT_EQ((expected).y(), (actual).y()); \ |
38 EXPECT_FLOAT_EQ((expected).width(), (actual).width()); \ | 39 EXPECT_FLOAT_EQ((expected).width(), (actual).width()); \ |
(...skipping 620 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
659 | 660 |
660 const cc::EffectNode& convertedEffect3 = *effectTree.Node(4); | 661 const cc::EffectNode& convertedEffect3 = *effectTree.Node(4); |
661 EXPECT_EQ(convertedRootEffect.id, convertedEffect3.parent_id); | 662 EXPECT_EQ(convertedRootEffect.id, convertedEffect3.parent_id); |
662 EXPECT_FLOAT_EQ(0.2, convertedEffect3.opacity); | 663 EXPECT_FLOAT_EQ(0.2, convertedEffect3.opacity); |
663 | 664 |
664 EXPECT_EQ(convertedEffect2.id, contentLayerAt(0)->effect_tree_index()); | 665 EXPECT_EQ(convertedEffect2.id, contentLayerAt(0)->effect_tree_index()); |
665 EXPECT_EQ(convertedEffect1.id, contentLayerAt(1)->effect_tree_index()); | 666 EXPECT_EQ(convertedEffect1.id, contentLayerAt(1)->effect_tree_index()); |
666 EXPECT_EQ(convertedEffect3.id, contentLayerAt(2)->effect_tree_index()); | 667 EXPECT_EQ(convertedEffect3.id, contentLayerAt(2)->effect_tree_index()); |
667 } | 668 } |
668 | 669 |
| 670 class FakeScrollClient : public WebLayerScrollClient { |
| 671 public: |
| 672 FakeScrollClient() : didScrollCount(0) {} |
| 673 |
| 674 void didScroll(const gfx::ScrollOffset& scrollOffset) final { |
| 675 didScrollCount++; |
| 676 lastScrollOffset = scrollOffset; |
| 677 }; |
| 678 |
| 679 gfx::ScrollOffset lastScrollOffset; |
| 680 unsigned didScrollCount; |
| 681 }; |
| 682 |
669 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, OneScrollNode) { | 683 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, OneScrollNode) { |
| 684 FakeScrollClient scrollClient; |
| 685 |
670 CompositorElementId expectedCompositorElementId = CompositorElementId(2, 0); | 686 CompositorElementId expectedCompositorElementId = CompositorElementId(2, 0); |
671 RefPtr<TransformPaintPropertyNode> scrollTranslation = | 687 RefPtr<TransformPaintPropertyNode> scrollTranslation = |
672 TransformPaintPropertyNode::createScrollTranslation( | 688 TransformPaintPropertyNode::createScrollTranslation( |
673 TransformPaintPropertyNode::root(), | 689 TransformPaintPropertyNode::root(), |
674 TransformationMatrix().translate(7, 9), FloatPoint3D(), false, 0, | 690 TransformationMatrix().translate(7, 9), FloatPoint3D(), false, 0, |
675 CompositingReasonNone, expectedCompositorElementId, | 691 CompositingReasonNone, expectedCompositorElementId, |
676 ScrollPaintPropertyNode::root(), IntSize(11, 13), IntSize(27, 31), | 692 ScrollPaintPropertyNode::root(), IntSize(11, 13), IntSize(27, 31), |
677 true, false, 0 /* mainThreadScrollingReasons */); | 693 true, false, 0 /* mainThreadScrollingReasons */, &scrollClient); |
678 | 694 |
679 TestPaintArtifact artifact; | 695 TestPaintArtifact artifact; |
680 artifact | 696 artifact |
681 .chunk(scrollTranslation, ClipPaintPropertyNode::root(), | 697 .chunk(scrollTranslation, ClipPaintPropertyNode::root(), |
682 EffectPaintPropertyNode::root()) | 698 EffectPaintPropertyNode::root()) |
683 .rectDrawing(FloatRect(11, 13, 17, 19), Color::white); | 699 .rectDrawing(FloatRect(11, 13, 17, 19), Color::white); |
684 update(artifact.build()); | 700 update(artifact.build()); |
685 | 701 |
686 const cc::ScrollTree& scrollTree = propertyTrees().scroll_tree; | 702 const cc::ScrollTree& scrollTree = propertyTrees().scroll_tree; |
687 // Node #0 reserved for null; #1 for root render surface. | 703 // Node #0 reserved for null; #1 for root render surface. |
(...skipping 10 matching lines...) Expand all Loading... |
698 EXPECT_EQ(expectedCompositorElementId, contentLayerAt(0)->element_id()); | 714 EXPECT_EQ(expectedCompositorElementId, contentLayerAt(0)->element_id()); |
699 | 715 |
700 const cc::TransformTree& transformTree = propertyTrees().transform_tree; | 716 const cc::TransformTree& transformTree = propertyTrees().transform_tree; |
701 const cc::TransformNode& transformNode = | 717 const cc::TransformNode& transformNode = |
702 *transformTree.Node(scrollNode.transform_id); | 718 *transformTree.Node(scrollNode.transform_id); |
703 EXPECT_TRUE(transformNode.local.IsIdentity()); | 719 EXPECT_TRUE(transformNode.local.IsIdentity()); |
704 EXPECT_EQ(gfx::ScrollOffset(-7, -9), transformNode.scroll_offset); | 720 EXPECT_EQ(gfx::ScrollOffset(-7, -9), transformNode.scroll_offset); |
705 | 721 |
706 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain, | 722 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain, |
707 scrollNode.main_thread_scrolling_reasons); | 723 scrollNode.main_thread_scrolling_reasons); |
| 724 |
| 725 auto* layer = contentLayerAt(0); |
| 726 EXPECT_EQ(layer->id(), scrollNode.owning_layer_id); |
| 727 auto scrollNodeIndexIt = |
| 728 propertyTrees().layer_id_to_scroll_node_index.find(layer->id()); |
| 729 EXPECT_EQ(scrollNodeIndexIt->second, scrollNode.id); |
| 730 |
| 731 EXPECT_EQ(0u, scrollClient.didScrollCount); |
| 732 layer->SetScrollOffsetFromImplSide(gfx::ScrollOffset(1, 2)); |
| 733 EXPECT_EQ(1u, scrollClient.didScrollCount); |
| 734 EXPECT_EQ(gfx::ScrollOffset(1, 2), scrollClient.lastScrollOffset); |
708 } | 735 } |
709 | 736 |
710 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, TransformUnderScrollNode) { | 737 TEST_F(PaintArtifactCompositorTestWithPropertyTrees, TransformUnderScrollNode) { |
711 RefPtr<TransformPaintPropertyNode> scrollTranslation = | 738 RefPtr<TransformPaintPropertyNode> scrollTranslation = |
712 TransformPaintPropertyNode::createScrollTranslation( | 739 TransformPaintPropertyNode::createScrollTranslation( |
713 TransformPaintPropertyNode::root(), | 740 TransformPaintPropertyNode::root(), |
714 TransformationMatrix().translate(7, 9), FloatPoint3D(), false, 0, | 741 TransformationMatrix().translate(7, 9), FloatPoint3D(), false, 0, |
715 CompositingReasonNone, CompositorElementId(), | 742 CompositingReasonNone, CompositorElementId(), |
716 ScrollPaintPropertyNode::root(), IntSize(11, 13), IntSize(27, 31), | 743 ScrollPaintPropertyNode::root(), IntSize(11, 13), IntSize(27, 31), |
717 true, false, 0 /* mainThreadScrollingReasons */); | 744 true, false, 0 /* mainThreadScrollingReasons */, nullptr); |
718 | 745 |
719 RefPtr<TransformPaintPropertyNode> transform = | 746 RefPtr<TransformPaintPropertyNode> transform = |
720 TransformPaintPropertyNode::create( | 747 TransformPaintPropertyNode::create( |
721 scrollTranslation, TransformationMatrix(), FloatPoint3D(), false, 0, | 748 scrollTranslation, TransformationMatrix(), FloatPoint3D(), false, 0, |
722 CompositingReason3DTransform); | 749 CompositingReason3DTransform); |
723 | 750 |
724 TestPaintArtifact artifact; | 751 TestPaintArtifact artifact; |
725 artifact | 752 artifact |
726 .chunk(scrollTranslation, ClipPaintPropertyNode::root(), | 753 .chunk(scrollTranslation, ClipPaintPropertyNode::root(), |
727 EffectPaintPropertyNode::root()) | 754 EffectPaintPropertyNode::root()) |
(...skipping 24 matching lines...) Expand all Loading... |
752 RefPtr<EffectPaintPropertyNode> effect = | 779 RefPtr<EffectPaintPropertyNode> effect = |
753 createOpacityOnlyEffect(EffectPaintPropertyNode::root(), 0.5); | 780 createOpacityOnlyEffect(EffectPaintPropertyNode::root(), 0.5); |
754 | 781 |
755 CompositorElementId expectedCompositorElementIdA = CompositorElementId(2, 0); | 782 CompositorElementId expectedCompositorElementIdA = CompositorElementId(2, 0); |
756 RefPtr<TransformPaintPropertyNode> scrollTranslationA = | 783 RefPtr<TransformPaintPropertyNode> scrollTranslationA = |
757 TransformPaintPropertyNode::createScrollTranslation( | 784 TransformPaintPropertyNode::createScrollTranslation( |
758 TransformPaintPropertyNode::root(), | 785 TransformPaintPropertyNode::root(), |
759 TransformationMatrix().translate(11, 13), FloatPoint3D(), false, 0, | 786 TransformationMatrix().translate(11, 13), FloatPoint3D(), false, 0, |
760 CompositingReasonNone, expectedCompositorElementIdA, | 787 CompositingReasonNone, expectedCompositorElementIdA, |
761 ScrollPaintPropertyNode::root(), IntSize(2, 3), IntSize(5, 7), false, | 788 ScrollPaintPropertyNode::root(), IntSize(2, 3), IntSize(5, 7), false, |
762 true, | 789 true, MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects, |
763 MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects); | 790 nullptr); |
764 | 791 |
765 CompositorElementId expectedCompositorElementIdB = CompositorElementId(3, 0); | 792 CompositorElementId expectedCompositorElementIdB = CompositorElementId(3, 0); |
766 RefPtr<TransformPaintPropertyNode> scrollTranslationB = | 793 RefPtr<TransformPaintPropertyNode> scrollTranslationB = |
767 TransformPaintPropertyNode::createScrollTranslation( | 794 TransformPaintPropertyNode::createScrollTranslation( |
768 scrollTranslationA, TransformationMatrix().translate(37, 41), | 795 scrollTranslationA, TransformationMatrix().translate(37, 41), |
769 FloatPoint3D(), false, 0, CompositingReasonNone, | 796 FloatPoint3D(), false, 0, CompositingReasonNone, |
770 expectedCompositorElementIdB, scrollTranslationA->scrollNode(), | 797 expectedCompositorElementIdB, scrollTranslationA->scrollNode(), |
771 IntSize(19, 23), IntSize(29, 31), true, false, | 798 IntSize(19, 23), IntSize(29, 31), true, false, |
772 0 /* mainThreadScrollingReasons */); | 799 0 /* mainThreadScrollingReasons */, nullptr); |
773 TestPaintArtifact artifact; | 800 TestPaintArtifact artifact; |
774 artifact.chunk(scrollTranslationA, ClipPaintPropertyNode::root(), effect) | 801 artifact.chunk(scrollTranslationA, ClipPaintPropertyNode::root(), effect) |
775 .rectDrawing(FloatRect(7, 11, 13, 17), Color::white); | 802 .rectDrawing(FloatRect(7, 11, 13, 17), Color::white); |
776 artifact.chunk(scrollTranslationB, ClipPaintPropertyNode::root(), effect) | 803 artifact.chunk(scrollTranslationB, ClipPaintPropertyNode::root(), effect) |
777 .rectDrawing(FloatRect(1, 2, 3, 5), Color::white); | 804 .rectDrawing(FloatRect(1, 2, 3, 5), Color::white); |
778 update(artifact.build()); | 805 update(artifact.build()); |
779 | 806 |
780 const cc::ScrollTree& scrollTree = propertyTrees().scroll_tree; | 807 const cc::ScrollTree& scrollTree = propertyTrees().scroll_tree; |
781 // Node #0 reserved for null; #1 for root render surface. | 808 // Node #0 reserved for null; #1 for root render surface. |
782 ASSERT_EQ(3u, scrollTree.size()); | 809 ASSERT_EQ(3u, scrollTree.size()); |
(...skipping 901 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1684 artifact | 1711 artifact |
1685 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), | 1712 .chunk(TransformPaintPropertyNode::root(), ClipPaintPropertyNode::root(), |
1686 effect.get()) | 1713 effect.get()) |
1687 .rectDrawing(FloatRect(100, 100, 200, 100), Color::black); | 1714 .rectDrawing(FloatRect(100, 100, 200, 100), Color::black); |
1688 update(artifact.build()); | 1715 update(artifact.build()); |
1689 | 1716 |
1690 EXPECT_EQ(2, elementIdToEffectNodeIndex(expectedCompositorElementId)); | 1717 EXPECT_EQ(2, elementIdToEffectNodeIndex(expectedCompositorElementId)); |
1691 } | 1718 } |
1692 | 1719 |
1693 } // namespace blink | 1720 } // namespace blink |
OLD | NEW |