| 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 "bindings/core/v8/NodeOrString.h" | 5 #include "bindings/core/v8/NodeOrString.h" |
| 6 #include "core/dom/ClientRect.h" | 6 #include "core/dom/ClientRect.h" |
| 7 #include "core/frame/BrowserControls.h" | 7 #include "core/frame/BrowserControls.h" |
| 8 #include "core/frame/FrameHost.h" | 8 #include "core/frame/FrameHost.h" |
| 9 #include "core/frame/FrameView.h" | 9 #include "core/frame/FrameView.h" |
| 10 #include "core/frame/RootFrameViewport.h" | 10 #include "core/frame/RootFrameViewport.h" |
| (...skipping 724 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 735 // ViewportScrollCallback removed. Keep the scrolls to guard crashes | 735 // ViewportScrollCallback removed. Keep the scrolls to guard crashes |
| 736 // but the expectations on when a ViewportScrollCallback have changed | 736 // but the expectations on when a ViewportScrollCallback have changed |
| 737 // and should be updated. | 737 // and should be updated. |
| 738 // EXPECT_EQ(200, container->scrollTop()); | 738 // EXPECT_EQ(200, container->scrollTop()); |
| 739 } | 739 } |
| 740 | 740 |
| 741 // Reset explicitly to prevent lifetime issues with the RemoteFrameClient. | 741 // Reset explicitly to prevent lifetime issues with the RemoteFrameClient. |
| 742 m_helper.reset(); | 742 m_helper.reset(); |
| 743 } | 743 } |
| 744 | 744 |
| 745 GraphicsLayer* scrollingLayer(LayoutView& layoutView) { | |
| 746 if (RuntimeEnabledFeatures::rootLayerScrollingEnabled()) | |
| 747 return layoutView.layer()->compositedLayerMapping()->scrollingLayer(); | |
| 748 return layoutView.compositor()->rootContentLayer(); | |
| 749 } | |
| 750 | |
| 751 // Tests that clipping layers belonging to any compositors in the ancestor chain | |
| 752 // of the global root scroller have their masking bit removed. | |
| 753 TEST_F(RootScrollerTest, RemoveClippingOnCompositorLayers) { | |
| 754 initialize("root-scroller-iframe.html"); | |
| 755 | |
| 756 HTMLFrameOwnerElement* iframe = toHTMLFrameOwnerElement( | |
| 757 mainFrame()->document()->getElementById("iframe")); | |
| 758 Element* container = iframe->contentDocument()->getElementById("container"); | |
| 759 | |
| 760 RootScrollerController& mainController = | |
| 761 mainFrame()->document()->rootScrollerController(); | |
| 762 RootScrollerController& childController = | |
| 763 iframe->contentDocument()->rootScrollerController(); | |
| 764 TopDocumentRootScrollerController& globalController = | |
| 765 page().globalRootScrollerController(); | |
| 766 | |
| 767 LayoutView* mainLayoutView = mainFrameView()->layoutView(); | |
| 768 LayoutView* childLayoutView = iframe->contentDocument()->layoutView(); | |
| 769 PaintLayerCompositor* mainCompositor = mainLayoutView->compositor(); | |
| 770 PaintLayerCompositor* childCompositor = childLayoutView->compositor(); | |
| 771 | |
| 772 NonThrowableExceptionState nonThrow; | |
| 773 | |
| 774 // No root scroller set, on the main frame the root content layer should | |
| 775 // clip. Additionally, on the child frame, the overflow controls host and | |
| 776 // container layers should also clip. | |
| 777 { | |
| 778 EXPECT_TRUE( | |
| 779 scrollingLayer(*mainLayoutView)->platformLayer()->masksToBounds()); | |
| 780 EXPECT_FALSE( | |
| 781 mainCompositor->rootGraphicsLayer()->platformLayer()->masksToBounds()); | |
| 782 EXPECT_FALSE( | |
| 783 mainCompositor->containerLayer()->platformLayer()->masksToBounds()); | |
| 784 | |
| 785 EXPECT_TRUE( | |
| 786 scrollingLayer(*childLayoutView)->platformLayer()->masksToBounds()); | |
| 787 EXPECT_TRUE( | |
| 788 childCompositor->rootGraphicsLayer()->platformLayer()->masksToBounds()); | |
| 789 EXPECT_TRUE( | |
| 790 childCompositor->containerLayer()->platformLayer()->masksToBounds()); | |
| 791 } | |
| 792 | |
| 793 // Now set the root scrollers such that the container in the iframe is the | |
| 794 // global root scroller. All the previously clipping layers in both paint | |
| 795 // layer compositors should no longer clip. | |
| 796 { | |
| 797 iframe->contentDocument()->setRootScroller(container, nonThrow); | |
| 798 mainFrame()->document()->setRootScroller(iframe, nonThrow); | |
| 799 mainFrameView()->updateAllLifecyclePhases(); | |
| 800 | |
| 801 ASSERT_EQ(iframe, &mainController.effectiveRootScroller()); | |
| 802 ASSERT_EQ(container, &childController.effectiveRootScroller()); | |
| 803 | |
| 804 EXPECT_FALSE( | |
| 805 scrollingLayer(*mainLayoutView)->platformLayer()->masksToBounds()); | |
| 806 EXPECT_FALSE( | |
| 807 mainCompositor->rootGraphicsLayer()->platformLayer()->masksToBounds()); | |
| 808 EXPECT_FALSE( | |
| 809 mainCompositor->containerLayer()->platformLayer()->masksToBounds()); | |
| 810 | |
| 811 EXPECT_FALSE( | |
| 812 scrollingLayer(*childLayoutView)->platformLayer()->masksToBounds()); | |
| 813 EXPECT_FALSE( | |
| 814 childCompositor->rootGraphicsLayer()->platformLayer()->masksToBounds()); | |
| 815 EXPECT_FALSE( | |
| 816 childCompositor->containerLayer()->platformLayer()->masksToBounds()); | |
| 817 } | |
| 818 | |
| 819 // Now reset the iframe's root scroller. Since the iframe itself is now the | |
| 820 // global root scroller we want it to behave as if it were the main frame, | |
| 821 // which means it should clip only on its root content layer. | |
| 822 { | |
| 823 iframe->contentDocument()->setRootScroller(nullptr, nonThrow); | |
| 824 mainFrameView()->updateAllLifecyclePhases(); | |
| 825 | |
| 826 ASSERT_EQ(iframe, &mainController.effectiveRootScroller()); | |
| 827 ASSERT_EQ(iframe->contentDocument(), | |
| 828 &childController.effectiveRootScroller()); | |
| 829 ASSERT_EQ(iframe->contentDocument()->documentElement(), | |
| 830 globalController.globalRootScroller()); | |
| 831 | |
| 832 EXPECT_FALSE( | |
| 833 scrollingLayer(*mainLayoutView)->platformLayer()->masksToBounds()); | |
| 834 EXPECT_FALSE( | |
| 835 mainCompositor->rootGraphicsLayer()->platformLayer()->masksToBounds()); | |
| 836 EXPECT_FALSE( | |
| 837 mainCompositor->containerLayer()->platformLayer()->masksToBounds()); | |
| 838 | |
| 839 EXPECT_TRUE( | |
| 840 scrollingLayer(*childLayoutView)->platformLayer()->masksToBounds()); | |
| 841 EXPECT_FALSE( | |
| 842 childCompositor->rootGraphicsLayer()->platformLayer()->masksToBounds()); | |
| 843 EXPECT_FALSE( | |
| 844 childCompositor->containerLayer()->platformLayer()->masksToBounds()); | |
| 845 } | |
| 846 | |
| 847 // Now reset the main frame's root scroller. Its compositor should go back | |
| 848 // to clipping as well. Because the iframe is now no longer the global root | |
| 849 // scroller, it should go back to clipping its overflow host and container | |
| 850 // layers. This checks that we invalidate the compositing state even though | |
| 851 // the iframe's effective root scroller hasn't changed. | |
| 852 | |
| 853 { | |
| 854 mainFrame()->document()->setRootScroller(nullptr, nonThrow); | |
| 855 mainFrameView()->updateAllLifecyclePhases(); | |
| 856 | |
| 857 ASSERT_EQ(mainFrame()->document(), &mainController.effectiveRootScroller()); | |
| 858 ASSERT_EQ(iframe->contentDocument(), | |
| 859 &childController.effectiveRootScroller()); | |
| 860 ASSERT_EQ(mainFrame()->document()->documentElement(), | |
| 861 globalController.globalRootScroller()); | |
| 862 | |
| 863 EXPECT_TRUE( | |
| 864 scrollingLayer(*mainLayoutView)->platformLayer()->masksToBounds()); | |
| 865 EXPECT_FALSE( | |
| 866 mainCompositor->rootGraphicsLayer()->platformLayer()->masksToBounds()); | |
| 867 EXPECT_FALSE( | |
| 868 mainCompositor->containerLayer()->platformLayer()->masksToBounds()); | |
| 869 | |
| 870 EXPECT_TRUE( | |
| 871 scrollingLayer(*childLayoutView)->platformLayer()->masksToBounds()); | |
| 872 EXPECT_TRUE( | |
| 873 childCompositor->rootGraphicsLayer()->platformLayer()->masksToBounds()); | |
| 874 EXPECT_TRUE( | |
| 875 childCompositor->containerLayer()->platformLayer()->masksToBounds()); | |
| 876 } | |
| 877 | |
| 878 // Set the iframe back as the main frame's root scroller. Since its the | |
| 879 // global root scroller again, it should clip like the root frame. This | |
| 880 // checks that we invalidate the compositing state even though the iframe's | |
| 881 // effective root scroller hasn't changed. | |
| 882 { | |
| 883 mainFrame()->document()->setRootScroller(iframe, nonThrow); | |
| 884 mainFrameView()->updateAllLifecyclePhases(); | |
| 885 | |
| 886 ASSERT_EQ(iframe, &mainController.effectiveRootScroller()); | |
| 887 ASSERT_EQ(iframe->contentDocument(), | |
| 888 &childController.effectiveRootScroller()); | |
| 889 ASSERT_EQ(iframe->contentDocument()->documentElement(), | |
| 890 globalController.globalRootScroller()); | |
| 891 | |
| 892 EXPECT_FALSE( | |
| 893 scrollingLayer(*mainLayoutView)->platformLayer()->masksToBounds()); | |
| 894 EXPECT_FALSE( | |
| 895 mainCompositor->rootGraphicsLayer()->platformLayer()->masksToBounds()); | |
| 896 EXPECT_FALSE( | |
| 897 mainCompositor->containerLayer()->platformLayer()->masksToBounds()); | |
| 898 | |
| 899 EXPECT_TRUE( | |
| 900 scrollingLayer(*childLayoutView)->platformLayer()->masksToBounds()); | |
| 901 EXPECT_FALSE( | |
| 902 childCompositor->rootGraphicsLayer()->platformLayer()->masksToBounds()); | |
| 903 EXPECT_FALSE( | |
| 904 childCompositor->containerLayer()->platformLayer()->masksToBounds()); | |
| 905 } | |
| 906 | |
| 907 // Set just the iframe's root scroller. We should stop clipping the | |
| 908 // iframe's compositor's layers but not the main frame's. | |
| 909 { | |
| 910 mainFrame()->document()->setRootScroller(nullptr, nonThrow); | |
| 911 iframe->contentDocument()->setRootScroller(container, nonThrow); | |
| 912 mainFrameView()->updateAllLifecyclePhases(); | |
| 913 | |
| 914 ASSERT_EQ(mainFrame()->document(), &mainController.effectiveRootScroller()); | |
| 915 ASSERT_EQ(container, &childController.effectiveRootScroller()); | |
| 916 | |
| 917 EXPECT_TRUE( | |
| 918 scrollingLayer(*mainLayoutView)->platformLayer()->masksToBounds()); | |
| 919 EXPECT_FALSE( | |
| 920 mainCompositor->rootGraphicsLayer()->platformLayer()->masksToBounds()); | |
| 921 EXPECT_FALSE( | |
| 922 mainCompositor->containerLayer()->platformLayer()->masksToBounds()); | |
| 923 | |
| 924 EXPECT_FALSE( | |
| 925 scrollingLayer(*childLayoutView)->platformLayer()->masksToBounds()); | |
| 926 EXPECT_FALSE( | |
| 927 childCompositor->rootGraphicsLayer()->platformLayer()->masksToBounds()); | |
| 928 EXPECT_FALSE( | |
| 929 childCompositor->containerLayer()->platformLayer()->masksToBounds()); | |
| 930 } | |
| 931 } | |
| 932 | |
| 933 // Tests that the clipping layer is resized on the root scroller element even | 745 // Tests that the clipping layer is resized on the root scroller element even |
| 934 // if the layout height doesn't change. | 746 // if the layout height doesn't change. |
| 935 TEST_F(RootScrollerTest, BrowserControlsResizeClippingLayer) { | 747 TEST_F(RootScrollerTest, BrowserControlsResizeClippingLayer) { |
| 936 bool oldInertTopControls = RuntimeEnabledFeatures::inertTopControlsEnabled(); | 748 bool oldInertTopControls = RuntimeEnabledFeatures::inertTopControlsEnabled(); |
| 937 RuntimeEnabledFeatures::setInertTopControlsEnabled(true); | 749 RuntimeEnabledFeatures::setInertTopControlsEnabled(true); |
| 938 | 750 |
| 939 initialize("root-scroller.html"); | 751 initialize("root-scroller.html"); |
| 940 Element* container = mainFrame()->document()->getElementById("container"); | 752 Element* container = mainFrame()->document()->getElementById("container"); |
| 941 | 753 |
| 942 { | 754 { |
| (...skipping 366 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1309 // FrameView without a layout. | 1121 // FrameView without a layout. |
| 1310 iframe->remove(); | 1122 iframe->remove(); |
| 1311 | 1123 |
| 1312 EXPECT_EQ(mainFrameView()->layoutViewportScrollableArea(), | 1124 EXPECT_EQ(mainFrameView()->layoutViewportScrollableArea(), |
| 1313 &mainFrameView()->getRootFrameViewport()->layoutViewport()); | 1125 &mainFrameView()->getRootFrameViewport()->layoutViewport()); |
| 1314 } | 1126 } |
| 1315 | 1127 |
| 1316 } // namespace | 1128 } // namespace |
| 1317 | 1129 |
| 1318 } // namespace blink | 1130 } // namespace blink |
| OLD | NEW |