OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights | 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011, 2012 Apple Inc. All rights |
3 * reserved. | 3 * reserved. |
4 * | 4 * |
5 * Portions are Copyright (C) 1998 Netscape Communications Corporation. | 5 * Portions are Copyright (C) 1998 Netscape Communications Corporation. |
6 * | 6 * |
7 * Other contributors: | 7 * Other contributors: |
8 * Robert O'Callahan <roc+@cs.cmu.edu> | 8 * Robert O'Callahan <roc+@cs.cmu.edu> |
9 * David Baron <dbaron@fas.harvard.edu> | 9 * David Baron <dbaron@fas.harvard.edu> |
10 * Christian Biesinger <cbiesinger@gmail.com> | 10 * Christian Biesinger <cbiesinger@gmail.com> |
(...skipping 537 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
548 } | 548 } |
549 | 549 |
550 int PaintLayerScrollableArea::VisibleHeight() const { | 550 int PaintLayerScrollableArea::VisibleHeight() const { |
551 return Layer()->size().Height(); | 551 return Layer()->size().Height(); |
552 } | 552 } |
553 | 553 |
554 int PaintLayerScrollableArea::VisibleWidth() const { | 554 int PaintLayerScrollableArea::VisibleWidth() const { |
555 return Layer()->size().Width(); | 555 return Layer()->size().Width(); |
556 } | 556 } |
557 | 557 |
| 558 LayoutSize PaintLayerScrollableArea::ClientSize() const { |
| 559 if (RuntimeEnabledFeatures::rootLayerScrollingEnabled()) { |
| 560 bool is_main_frame_root_layer = |
| 561 layer_.IsRootLayer() && Box().GetDocument().GetFrame()->IsMainFrame(); |
| 562 if (is_main_frame_root_layer) { |
| 563 LayoutSize result(Box().GetFrameView()->GetLayoutSize()); |
| 564 result -= IntSize(VerticalScrollbarWidth(), HorizontalScrollbarHeight()); |
| 565 return result; |
| 566 } |
| 567 } |
| 568 return LayoutSize(Box().ClientWidth(), Box().ClientHeight()); |
| 569 } |
| 570 |
| 571 IntSize PaintLayerScrollableArea::PixelSnappedClientSize() const { |
| 572 if (RuntimeEnabledFeatures::rootLayerScrollingEnabled()) { |
| 573 bool is_main_frame_root_layer = |
| 574 layer_.IsRootLayer() && Box().GetDocument().GetFrame()->IsMainFrame(); |
| 575 if (is_main_frame_root_layer) { |
| 576 return ExcludeScrollbars(Box().GetFrameView()->GetLayoutSize()); |
| 577 } |
| 578 } |
| 579 return IntSize(Box().PixelSnappedClientWidth(), |
| 580 Box().PixelSnappedClientHeight()); |
| 581 } |
| 582 |
558 IntSize PaintLayerScrollableArea::ContentsSize() const { | 583 IntSize PaintLayerScrollableArea::ContentsSize() const { |
559 return IntSize(PixelSnappedScrollWidth(), PixelSnappedScrollHeight()); | 584 return IntSize(PixelSnappedScrollWidth(), PixelSnappedScrollHeight()); |
560 } | 585 } |
561 | 586 |
562 void PaintLayerScrollableArea::ContentsResized() { | 587 void PaintLayerScrollableArea::ContentsResized() { |
563 ScrollableArea::ContentsResized(); | 588 ScrollableArea::ContentsResized(); |
564 // Need to update the bounds of the scroll property. | 589 // Need to update the bounds of the scroll property. |
565 Box().SetNeedsPaintPropertyUpdate(); | 590 Box().SetNeedsPaintPropertyUpdate(); |
566 } | 591 } |
567 | 592 |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
820 | 845 |
821 { | 846 { |
822 // Hits in | 847 // Hits in |
823 // compositing/overflow/automatically-opt-into-composited-scrolling-after-st
yle-change.html. | 848 // compositing/overflow/automatically-opt-into-composited-scrolling-after-st
yle-change.html. |
824 DisableCompositingQueryAsserts disabler; | 849 DisableCompositingQueryAsserts disabler; |
825 | 850 |
826 UpdateScrollbarEnabledState(); | 851 UpdateScrollbarEnabledState(); |
827 | 852 |
828 // Set up the range (and page step/line step). | 853 // Set up the range (and page step/line step). |
829 if (Scrollbar* horizontal_scrollbar = this->HorizontalScrollbar()) { | 854 if (Scrollbar* horizontal_scrollbar = this->HorizontalScrollbar()) { |
830 int client_width = Box().PixelSnappedClientWidth(); | 855 int client_width = PixelSnappedClientSize().Width(); |
831 horizontal_scrollbar->SetProportion(client_width, | 856 horizontal_scrollbar->SetProportion(client_width, |
832 OverflowRect().Width().ToInt()); | 857 OverflowRect().Width().ToInt()); |
833 } | 858 } |
834 if (Scrollbar* vertical_scrollbar = this->VerticalScrollbar()) { | 859 if (Scrollbar* vertical_scrollbar = this->VerticalScrollbar()) { |
835 int client_height = Box().PixelSnappedClientHeight(); | 860 int client_height = PixelSnappedClientSize().Height(); |
836 vertical_scrollbar->SetProportion(client_height, | 861 vertical_scrollbar->SetProportion(client_height, |
837 OverflowRect().Height().ToInt()); | 862 OverflowRect().Height().ToInt()); |
838 } | 863 } |
839 } | 864 } |
840 | 865 |
841 if (!scrollbars_are_frozen && HasOverlayScrollbars()) { | 866 if (!scrollbars_are_frozen && HasOverlayScrollbars()) { |
842 if (!ScrollSize(kHorizontalScrollbar)) | 867 if (!ScrollSize(kHorizontalScrollbar)) |
843 SetHasHorizontalScrollbar(false); | 868 SetHasHorizontalScrollbar(false); |
844 if (!ScrollSize(kVerticalScrollbar)) | 869 if (!ScrollSize(kVerticalScrollbar)) |
845 SetHasVerticalScrollbar(false); | 870 SetHasVerticalScrollbar(false); |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
922 | 947 |
923 bool PaintLayerScrollableArea::HasHorizontalOverflow() const { | 948 bool PaintLayerScrollableArea::HasHorizontalOverflow() const { |
924 // TODO(szager): Make the algorithm for adding/subtracting overflow:auto | 949 // TODO(szager): Make the algorithm for adding/subtracting overflow:auto |
925 // scrollbars memoryless (crbug.com/625300). This clientWidth hack will | 950 // scrollbars memoryless (crbug.com/625300). This clientWidth hack will |
926 // prevent the spurious horizontal scrollbar, but it can cause a converse | 951 // prevent the spurious horizontal scrollbar, but it can cause a converse |
927 // problem: it can leave a sliver of horizontal overflow hidden behind the | 952 // problem: it can leave a sliver of horizontal overflow hidden behind the |
928 // vertical scrollbar without creating a horizontal scrollbar. This | 953 // vertical scrollbar without creating a horizontal scrollbar. This |
929 // converse problem seems to happen much less frequently in practice, so we | 954 // converse problem seems to happen much less frequently in practice, so we |
930 // bias the logic towards preventing unwanted horizontal scrollbars, which | 955 // bias the logic towards preventing unwanted horizontal scrollbars, which |
931 // are more common and annoying. | 956 // are more common and annoying. |
932 int client_width = Box().PixelSnappedClientWidth(); | 957 int client_width = PixelSnappedClientSize().Width(); |
933 if (NeedsRelayout() && !HadVerticalScrollbarBeforeRelayout()) | 958 if (NeedsRelayout() && !HadVerticalScrollbarBeforeRelayout()) |
934 client_width += VerticalScrollbarWidth(); | 959 client_width += VerticalScrollbarWidth(); |
935 return PixelSnappedScrollWidth() > client_width; | 960 return PixelSnappedScrollWidth() > client_width; |
936 } | 961 } |
937 | 962 |
938 bool PaintLayerScrollableArea::HasVerticalOverflow() const { | 963 bool PaintLayerScrollableArea::HasVerticalOverflow() const { |
939 return PixelSnappedScrollHeight() > Box().PixelSnappedClientHeight(); | 964 return PixelSnappedScrollHeight() > PixelSnappedClientSize().Height(); |
940 } | 965 } |
941 | 966 |
942 bool PaintLayerScrollableArea::HasScrollableHorizontalOverflow() const { | 967 bool PaintLayerScrollableArea::HasScrollableHorizontalOverflow() const { |
943 return HasHorizontalOverflow() && Box().ScrollsOverflowX(); | 968 return HasHorizontalOverflow() && Box().ScrollsOverflowX(); |
944 } | 969 } |
945 | 970 |
946 bool PaintLayerScrollableArea::HasScrollableVerticalOverflow() const { | 971 bool PaintLayerScrollableArea::HasScrollableVerticalOverflow() const { |
947 return HasVerticalOverflow() && Box().ScrollsOverflowY(); | 972 return HasVerticalOverflow() && Box().ScrollsOverflowY(); |
948 } | 973 } |
949 | 974 |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1037 const bool layers_changed = | 1062 const bool layers_changed = |
1038 topmost_scroll_child_ != next_topmost_scroll_child_; | 1063 topmost_scroll_child_ != next_topmost_scroll_child_; |
1039 topmost_scroll_child_ = next_topmost_scroll_child_; | 1064 topmost_scroll_child_ = next_topmost_scroll_child_; |
1040 next_topmost_scroll_child_ = nullptr; | 1065 next_topmost_scroll_child_ = nullptr; |
1041 return layers_changed; | 1066 return layers_changed; |
1042 } | 1067 } |
1043 | 1068 |
1044 void PaintLayerScrollableArea::UpdateAfterOverflowRecalc() { | 1069 void PaintLayerScrollableArea::UpdateAfterOverflowRecalc() { |
1045 UpdateScrollDimensions(); | 1070 UpdateScrollDimensions(); |
1046 if (Scrollbar* horizontal_scrollbar = this->HorizontalScrollbar()) { | 1071 if (Scrollbar* horizontal_scrollbar = this->HorizontalScrollbar()) { |
1047 int client_width = Box().PixelSnappedClientWidth(); | 1072 int client_width = PixelSnappedClientSize().Width(); |
1048 horizontal_scrollbar->SetProportion(client_width, | 1073 horizontal_scrollbar->SetProportion(client_width, |
1049 OverflowRect().Width().ToInt()); | 1074 OverflowRect().Width().ToInt()); |
1050 } | 1075 } |
1051 if (Scrollbar* vertical_scrollbar = this->VerticalScrollbar()) { | 1076 if (Scrollbar* vertical_scrollbar = this->VerticalScrollbar()) { |
1052 int client_height = Box().PixelSnappedClientHeight(); | 1077 int client_height = PixelSnappedClientSize().Height(); |
1053 vertical_scrollbar->SetProportion(client_height, | 1078 vertical_scrollbar->SetProportion(client_height, |
1054 OverflowRect().Height().ToInt()); | 1079 OverflowRect().Height().ToInt()); |
1055 } | 1080 } |
1056 | 1081 |
1057 bool needs_horizontal_scrollbar; | 1082 bool needs_horizontal_scrollbar; |
1058 bool needs_vertical_scrollbar; | 1083 bool needs_vertical_scrollbar; |
1059 ComputeScrollbarExistence(needs_horizontal_scrollbar, | 1084 ComputeScrollbarExistence(needs_horizontal_scrollbar, |
1060 needs_vertical_scrollbar); | 1085 needs_vertical_scrollbar); |
1061 | 1086 |
1062 bool horizontal_scrollbar_should_change = | 1087 bool horizontal_scrollbar_should_change = |
(...skipping 634 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1697 LayoutRect PaintLayerScrollableArea::ScrollIntoView( | 1722 LayoutRect PaintLayerScrollableArea::ScrollIntoView( |
1698 const LayoutRect& rect, | 1723 const LayoutRect& rect, |
1699 const ScrollAlignment& align_x, | 1724 const ScrollAlignment& align_x, |
1700 const ScrollAlignment& align_y, | 1725 const ScrollAlignment& align_y, |
1701 ScrollType scroll_type) { | 1726 ScrollType scroll_type) { |
1702 LayoutRect local_expose_rect( | 1727 LayoutRect local_expose_rect( |
1703 Box() | 1728 Box() |
1704 .AbsoluteToLocalQuad(FloatQuad(FloatRect(rect)), kUseTransforms) | 1729 .AbsoluteToLocalQuad(FloatQuad(FloatRect(rect)), kUseTransforms) |
1705 .BoundingBox()); | 1730 .BoundingBox()); |
1706 local_expose_rect.Move(-Box().BorderLeft(), -Box().BorderTop()); | 1731 local_expose_rect.Move(-Box().BorderLeft(), -Box().BorderTop()); |
1707 LayoutRect layer_bounds( | 1732 LayoutRect visible_rect(LayoutPoint(), ClientSize()); |
1708 LayoutPoint(), LayoutSize(Box().ClientWidth(), Box().ClientHeight())); | |
1709 LayoutRect r = ScrollAlignment::GetRectToExpose( | 1733 LayoutRect r = ScrollAlignment::GetRectToExpose( |
1710 layer_bounds, local_expose_rect, align_x, align_y); | 1734 visible_rect, local_expose_rect, align_x, align_y); |
1711 | 1735 |
1712 ScrollOffset old_scroll_offset = GetScrollOffset(); | 1736 ScrollOffset old_scroll_offset = GetScrollOffset(); |
1713 ScrollOffset new_scroll_offset(ClampScrollOffset(RoundedIntSize( | 1737 ScrollOffset new_scroll_offset(ClampScrollOffset(RoundedIntSize( |
1714 ToScrollOffset(FloatPoint(r.Location()) + old_scroll_offset)))); | 1738 ToScrollOffset(FloatPoint(r.Location()) + old_scroll_offset)))); |
1715 SetScrollOffset(new_scroll_offset, scroll_type, kScrollBehaviorInstant); | 1739 SetScrollOffset(new_scroll_offset, scroll_type, kScrollBehaviorInstant); |
1716 ScrollOffset scroll_offset_difference = GetScrollOffset() - old_scroll_offset; | 1740 ScrollOffset scroll_offset_difference = GetScrollOffset() - old_scroll_offset; |
1717 local_expose_rect.Move(-LayoutSize(scroll_offset_difference)); | 1741 local_expose_rect.Move(-LayoutSize(scroll_offset_difference)); |
1718 | 1742 |
1719 LayoutRect intersect = | 1743 LayoutRect intersect = |
1720 LocalToAbsolute(Box(), Intersection(layer_bounds, local_expose_rect)); | 1744 LocalToAbsolute(Box(), Intersection(visible_rect, local_expose_rect)); |
1721 if (intersect.IsEmpty() && !layer_bounds.IsEmpty() && | 1745 if (intersect.IsEmpty() && !visible_rect.IsEmpty() && |
1722 !local_expose_rect.IsEmpty()) { | 1746 !local_expose_rect.IsEmpty()) { |
1723 return LocalToAbsolute(Box(), local_expose_rect); | 1747 return LocalToAbsolute(Box(), local_expose_rect); |
1724 } | 1748 } |
1725 return intersect; | 1749 return intersect; |
1726 } | 1750 } |
1727 | 1751 |
1728 void PaintLayerScrollableArea::UpdateScrollableAreaSet(bool has_overflow) { | 1752 void PaintLayerScrollableArea::UpdateScrollableAreaSet(bool has_overflow) { |
1729 LocalFrame* frame = Box().GetFrame(); | 1753 LocalFrame* frame = Box().GetFrame(); |
1730 if (!frame) | 1754 if (!frame) |
1731 return; | 1755 return; |
(...skipping 417 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2149 | 2173 |
2150 void PaintLayerScrollableArea::DelayScrollOffsetClampScope:: | 2174 void PaintLayerScrollableArea::DelayScrollOffsetClampScope:: |
2151 ClampScrollableAreas() { | 2175 ClampScrollableAreas() { |
2152 for (auto& scrollable_area : *needs_clamp_) | 2176 for (auto& scrollable_area : *needs_clamp_) |
2153 scrollable_area->ClampScrollOffsetAfterOverflowChange(); | 2177 scrollable_area->ClampScrollOffsetAfterOverflowChange(); |
2154 delete needs_clamp_; | 2178 delete needs_clamp_; |
2155 needs_clamp_ = nullptr; | 2179 needs_clamp_ = nullptr; |
2156 } | 2180 } |
2157 | 2181 |
2158 } // namespace blink | 2182 } // namespace blink |
OLD | NEW |