Chromium Code Reviews| Index: third_party/WebKit/Source/core/layout/ScrollAnchor.cpp |
| diff --git a/third_party/WebKit/Source/core/layout/ScrollAnchor.cpp b/third_party/WebKit/Source/core/layout/ScrollAnchor.cpp |
| index 0b4a85d02dd0c068b629815050c143fe62b3e1c0..e1a4e7e1645f8b56163c30568ff8480ebfd6dda0 100644 |
| --- a/third_party/WebKit/Source/core/layout/ScrollAnchor.cpp |
| +++ b/third_party/WebKit/Source/core/layout/ScrollAnchor.cpp |
| @@ -4,6 +4,10 @@ |
| #include "core/layout/ScrollAnchor.h" |
| +#include "core/frame/FrameView.h" |
| +#include "core/layout/LayoutBox.h" |
| +#include "core/layout/LayoutView.h" |
| +#include "core/paint/PaintLayerScrollableArea.h" |
| #include "platform/scroll/ScrollableArea.h" |
| #include "wtf/Assertions.h" |
| @@ -20,16 +24,40 @@ ScrollAnchor::~ScrollAnchor() |
| { |
| } |
| +static LayoutBox* scrollerLayoutBox(const ScrollableArea* scroller) |
| +{ |
| + LayoutBox* box = scroller->isFrameView() |
| + ? toFrameView(scroller)->layoutView() |
| + : &toPaintLayerScrollableArea(scroller)->box(); |
| + ASSERT(box); |
| + return box; |
| +} |
| + |
| static LayoutObject* findAnchor(const ScrollableArea* scroller) |
| { |
| - // TODO(skobes): implement. |
| - return nullptr; |
| + LayoutBox* scrollerBox = scrollerLayoutBox(scroller); |
| + |
| + FloatRect absoluteVisibleRect = scroller->isFrameView() |
| + ? scroller->visibleContentRect() |
| + : scrollerBox->localToAbsoluteQuad( |
|
chrishtr
2016/02/02 17:56:15
absolute maps to the space of the containing view,
skobes
2016/02/02 23:03:55
I agree, however it may require some new plumbing
|
| + FloatQuad(FloatRect(scrollerBox->overflowClipRect(LayoutPoint())))).boundingBox(); |
| + |
| + LayoutObject* child = scrollerBox->nextInPreOrder(scrollerBox); |
| + LayoutObject* candidate = nullptr; |
| + while (child) { |
|
ojan
2016/02/02 06:26:41
I think we'll need to think about how out of flow
skobes
2016/02/02 23:03:55
Yes I expect we'll add a bunch of edge cases and e
|
| + FloatRect childRect = child->absoluteBoundingBoxFloatRect(); |
| + if (absoluteVisibleRect.intersects(childRect)) |
| + candidate = child; |
|
ojan
2016/02/02 06:26:41
I think we can make this more efficient by restart
skobes
2016/02/02 23:03:55
I was thinking we should prefer a fully-contained
ojan
2016/02/03 01:37:03
Do A and B both partially overlap the viewport in
skobes
2016/02/04 01:51:15
Yes, A and B both partially overlap (perhaps A con
|
| + if (absoluteVisibleRect.contains(childRect)) |
| + break; |
| + child = child->nextInPreOrder(scrollerBox); |
| + } |
| + return candidate; |
| } |
| static DoublePoint computeRelativeOffset(const ScrollableArea* scroller, const LayoutObject* layoutObject) |
| { |
| - // TODO(skobes): implement. |
| - return DoublePoint(); |
| + return DoublePoint(layoutObject->localToAbsolute() - scrollerLayoutBox(scroller)->localToAbsolute()); |
| } |
| void ScrollAnchor::save() |