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 c3dcf5fc2a9a88ea94878a54c8eba71e1f94facf..d9fcb92a61ba4b3385310f4740c28caa277e3389 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(); |
} |
@@ -634,7 +635,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() { |
@@ -684,9 +687,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 = |
@@ -1153,15 +1161,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()); |
+ } |
NOTREACHED(); |
return IntSize(); |
@@ -1390,20 +1398,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 |
@@ -1446,7 +1457,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; |
@@ -1458,7 +1469,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() |
@@ -1475,10 +1486,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(), |
@@ -1534,8 +1545,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); |
} |