Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(637)

Unified Diff: third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp

Issue 2816873002: Update PaintLayer size during layout, not after.
Patch Set: Speculatively remove call to UpdateScrollbars() Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp b/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp
index ce48c55fb9b17b064537b3b24b6160eee2b6f83b..be5d4a156f1491fc17e23dab4682692afa355fdc 100644
--- a/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp
+++ b/third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.cpp
@@ -309,9 +309,10 @@ IntRect PaintLayerScrollableArea::ScrollCornerRect() const {
bool has_vertical_bar = VerticalScrollbar();
bool has_resizer = Box().Style()->Resize() != RESIZE_NONE;
if ((has_horizontal_bar && has_vertical_bar) ||
- (has_resizer && (has_horizontal_bar || has_vertical_bar)))
+ (has_resizer && (has_horizontal_bar || has_vertical_bar))) {
return CornerRect(Box(), HorizontalScrollbar(), VerticalScrollbar(),
- Box().PixelSnappedBorderBoxRect());
+ IntRect(IntPoint(), layer_.size()));
+ }
return IntRect();
}
@@ -555,6 +556,29 @@ int PaintLayerScrollableArea::VisibleWidth() const {
return Layer()->size().Width();
}
+LayoutSize PaintLayerScrollableArea::ClientSize() const {
+ if (RuntimeEnabledFeatures::rootLayerScrollingEnabled()) {
+ bool is_main_frame_root_layer =
+ layer_.IsRootLayer() && Box().GetDocument().GetFrame()->IsMainFrame();
+ if (is_main_frame_root_layer) {
+ return LayoutSize(Box().GetFrameView()->GetLayoutSize());
+ }
+ }
+ return LayoutSize(Box().ClientWidth(), Box().ClientHeight());
+}
+
+IntSize PaintLayerScrollableArea::PixelSnappedClientSize() const {
+ if (RuntimeEnabledFeatures::rootLayerScrollingEnabled()) {
+ bool is_main_frame_root_layer =
+ layer_.IsRootLayer() && Box().GetDocument().GetFrame()->IsMainFrame();
+ if (is_main_frame_root_layer) {
+ return Box().GetFrameView()->GetLayoutSize();
+ }
+ }
+ return IntSize(Box().PixelSnappedClientWidth(),
+ Box().PixelSnappedClientHeight());
+}
+
IntSize PaintLayerScrollableArea::ContentsSize() const {
return IntSize(PixelSnappedScrollWidth(), PixelSnappedScrollHeight());
}
@@ -609,7 +633,9 @@ bool PaintLayerScrollableArea::ScrollbarsCanBeActive() const {
}
IntRect PaintLayerScrollableArea::ScrollableAreaBoundingBox() const {
- return Box().AbsoluteBoundingBoxRect(kTraverseDocumentBoundaries);
+ FloatQuad quad(FloatRect(FloatPoint(), FloatSize(layer_.size())));
+ quad = Box().LocalToAbsoluteQuad(quad, kTraverseDocumentBoundaries);
+ return quad.EnclosingBoundingBox();
}
void PaintLayerScrollableArea::RegisterForAnimation() {
@@ -659,9 +685,14 @@ bool PaintLayerScrollableArea::ShouldPlaceVerticalScrollbarOnLeft() const {
}
int PaintLayerScrollableArea::PageStep(ScrollbarOrientation orientation) const {
+ // Note: For the root layer of the main frame, pageStep() will not be based
+ // on the scrollable area size (which matches the layout viewport), but
+ // instead on the initial containing block size. It's unclear whether this
+ // is "correct" behavior; there is no spec guidance on the scroll distance
+ // of page scrolling in this circumstance.
int length = (orientation == kHorizontalScrollbar)
- ? Box().PixelSnappedClientWidth()
- : Box().PixelSnappedClientHeight();
+ ? PixelSnappedClientSize().Width()
+ : PixelSnappedClientSize().Height();
int min_page_step = static_cast<float>(length) *
ScrollableArea::MinFractionToStepWhenPaging();
int page_step =
@@ -827,12 +858,12 @@ void PaintLayerScrollableArea::UpdateAfterLayout() {
// Set up the range (and page step/line step).
if (Scrollbar* horizontal_scrollbar = this->HorizontalScrollbar()) {
- int client_width = Box().PixelSnappedClientWidth();
+ int client_width = PixelSnappedClientSize().Width();
horizontal_scrollbar->SetProportion(client_width,
OverflowRect().Width().ToInt());
}
if (Scrollbar* vertical_scrollbar = this->VerticalScrollbar()) {
- int client_height = Box().PixelSnappedClientHeight();
+ int client_height = PixelSnappedClientSize().Height();
vertical_scrollbar->SetProportion(client_height,
OverflowRect().Height().ToInt());
}
@@ -929,14 +960,14 @@ bool PaintLayerScrollableArea::HasHorizontalOverflow() const {
// converse problem seems to happen much less frequently in practice, so we
// bias the logic towards preventing unwanted horizontal scrollbars, which
// are more common and annoying.
- int client_width = Box().PixelSnappedClientWidth();
+ int client_width = PixelSnappedClientSize().Width();
if (NeedsRelayout() && !HadVerticalScrollbarBeforeRelayout())
client_width += VerticalScrollbarWidth();
return PixelSnappedScrollWidth() > client_width;
}
bool PaintLayerScrollableArea::HasVerticalOverflow() const {
- return PixelSnappedScrollHeight() > Box().PixelSnappedClientHeight();
+ return PixelSnappedScrollHeight() > PixelSnappedClientSize().Height();
}
bool PaintLayerScrollableArea::HasScrollableHorizontalOverflow() const {
@@ -1044,12 +1075,12 @@ bool PaintLayerScrollableArea::UpdateAfterCompositingChange() {
void PaintLayerScrollableArea::UpdateAfterOverflowRecalc() {
UpdateScrollDimensions();
if (Scrollbar* horizontal_scrollbar = this->HorizontalScrollbar()) {
- int client_width = Box().PixelSnappedClientWidth();
+ int client_width = PixelSnappedClientSize().Width();
horizontal_scrollbar->SetProportion(client_width,
OverflowRect().Width().ToInt());
}
if (Scrollbar* vertical_scrollbar = this->VerticalScrollbar()) {
- int client_height = Box().PixelSnappedClientHeight();
+ int client_height = PixelSnappedClientSize().Height();
vertical_scrollbar->SetProportion(client_height,
OverflowRect().Height().ToInt());
}
@@ -1128,15 +1159,15 @@ int PaintLayerScrollableArea::HorizontalScrollbarStart(int min_x) const {
IntSize PaintLayerScrollableArea::ScrollbarOffset(
const Scrollbar& scrollbar) const {
if (&scrollbar == VerticalScrollbar()) {
- return IntSize(VerticalScrollbarStart(0, Box().Size().Width().ToInt()),
+ return IntSize(VerticalScrollbarStart(0, layer_.size().Width()),
Box().BorderTop().ToInt());
}
- if (&scrollbar == HorizontalScrollbar())
- return IntSize(
- HorizontalScrollbarStart(0),
- (Box().Size().Height() - Box().BorderBottom() - scrollbar.Height())
- .ToInt());
+ if (&scrollbar == HorizontalScrollbar()) {
+ return IntSize(HorizontalScrollbarStart(0),
+ layer_.size().Height() - Box().BorderBottom().ToInt() -
+ scrollbar.Height());
+ }
ASSERT_NOT_REACHED();
return IntSize();
@@ -1365,20 +1396,23 @@ void PaintLayerScrollableArea::PositionOverflowControls() {
if (!HasScrollbar() && !Box().CanResize())
return;
- const IntRect border_box = Box().PixelSnappedBorderBoxRect();
+ const IntRect layer_bounds(IntPoint(), layer_.size());
if (Scrollbar* vertical_scrollbar = this->VerticalScrollbar())
- vertical_scrollbar->SetFrameRect(RectForVerticalScrollbar(border_box));
+ vertical_scrollbar->SetFrameRect(RectForVerticalScrollbar(layer_bounds));
- if (Scrollbar* horizontal_scrollbar = this->HorizontalScrollbar())
- horizontal_scrollbar->SetFrameRect(RectForHorizontalScrollbar(border_box));
+ if (Scrollbar* horizontal_scrollbar = this->HorizontalScrollbar()) {
+ horizontal_scrollbar->SetFrameRect(
+ RectForHorizontalScrollbar(layer_bounds));
+ }
const IntRect& scroll_corner = ScrollCornerRect();
if (scroll_corner_)
scroll_corner_->SetFrameRect(LayoutRect(scroll_corner));
- if (resizer_)
+ if (resizer_) {
resizer_->SetFrameRect(
- LayoutRect(ResizerCornerRect(border_box, kResizerForPointer)));
+ LayoutRect(ResizerCornerRect(layer_bounds, kResizerForPointer)));
+ }
// FIXME, this should eventually be removed, once we are certain that
// composited controls get correctly positioned on a compositor update. For
@@ -1421,7 +1455,7 @@ bool PaintLayerScrollableArea::HitTestOverflowControls(
IntRect resize_control_rect;
if (Box().Style()->Resize() != RESIZE_NONE) {
- resize_control_rect = ResizerCornerRect(Box().PixelSnappedBorderBoxRect(),
+ resize_control_rect = ResizerCornerRect(IntRect(IntPoint(), layer_.size()),
kResizerForPointer);
if (resize_control_rect.Contains(local_point))
return true;
@@ -1433,7 +1467,7 @@ bool PaintLayerScrollableArea::HitTestOverflowControls(
LayoutRect v_bar_rect(
VerticalScrollbarStart(0, Box().Size().Width().ToInt()),
Box().BorderTop().ToInt(), VerticalScrollbar()->ScrollbarThickness(),
- Box().Size().Height().ToInt() -
+ layer_.size().Height() -
(Box().BorderTop() + Box().BorderBottom()).ToInt() -
(HasHorizontalScrollbar()
? HorizontalScrollbar()->ScrollbarThickness()
@@ -1450,10 +1484,10 @@ bool PaintLayerScrollableArea::HitTestOverflowControls(
// TODO(crbug.com/638981): Are the conversions to int intentional?
LayoutRect h_bar_rect(
HorizontalScrollbarStart(0),
- (Box().Size().Height() - Box().BorderBottom() -
+ (layer_.size().Height() - Box().BorderBottom() -
HorizontalScrollbar()->ScrollbarThickness())
.ToInt(),
- (Box().Size().Width() - (Box().BorderLeft() + Box().BorderRight()) -
+ (layer_.size().Width() - (Box().BorderLeft() + Box().BorderRight()) -
(HasVerticalScrollbar() ? VerticalScrollbar()->ScrollbarThickness()
: resize_control_size))
.ToInt(),
@@ -1509,8 +1543,7 @@ bool PaintLayerScrollableArea::IsPointInResizeControl(
IntPoint local_point =
RoundedIntPoint(Box().AbsoluteToLocal(absolute_point, kUseTransforms));
- IntRect local_bounds(0, 0, Box().PixelSnappedWidth(),
- Box().PixelSnappedHeight());
+ IntRect local_bounds(IntPoint(), layer_.size());
return ResizerCornerRect(local_bounds, resizer_hit_test_type)
.Contains(local_point);
}
@@ -1704,10 +1737,9 @@ LayoutRect PaintLayerScrollableArea::ScrollIntoView(
.AbsoluteToLocalQuad(FloatQuad(FloatRect(rect)), kUseTransforms)
.BoundingBox());
local_expose_rect.Move(-Box().BorderLeft(), -Box().BorderTop());
- LayoutRect layer_bounds(
- LayoutPoint(), LayoutSize(Box().ClientWidth(), Box().ClientHeight()));
+ LayoutRect visible_rect(LayoutPoint(), ClientSize());
LayoutRect r = ScrollAlignment::GetRectToExpose(
- layer_bounds, local_expose_rect, align_x, align_y);
+ visible_rect, local_expose_rect, align_x, align_y);
ScrollOffset old_scroll_offset = GetScrollOffset();
ScrollOffset new_scroll_offset(ClampScrollOffset(RoundedIntSize(
@@ -1717,8 +1749,8 @@ LayoutRect PaintLayerScrollableArea::ScrollIntoView(
local_expose_rect.Move(-LayoutSize(scroll_offset_difference));
LayoutRect intersect =
- LocalToAbsolute(Box(), Intersection(layer_bounds, local_expose_rect));
- if (intersect.IsEmpty() && !layer_bounds.IsEmpty() &&
+ LocalToAbsolute(Box(), Intersection(visible_rect, local_expose_rect));
+ if (intersect.IsEmpty() && !visible_rect.IsEmpty() &&
!local_expose_rect.IsEmpty()) {
return LocalToAbsolute(Box(), local_expose_rect);
}
« no previous file with comments | « third_party/WebKit/Source/core/paint/PaintLayerScrollableArea.h ('k') | third_party/WebKit/Source/web/ChromeClientImpl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698