diff options
author | Steve Block <steveblock@google.com> | 2011-09-21 15:43:37 +0100 |
---|---|---|
committer | Steve Block <steveblock@google.com> | 2011-09-22 22:57:10 +0100 |
commit | 8782ca1236bac0bb13e08a6b63f8743e0b01e75a (patch) | |
tree | b3bf345515df5bf26b7df393ac4458c9dd57be86 /Source/WebCore/platform/graphics/android/ScrollableLayerAndroid.cpp | |
parent | 06ab37f33e994114ce0ec9fbb35fe48249ed6dbc (diff) | |
download | external_webkit-8782ca1236bac0bb13e08a6b63f8743e0b01e75a.zip external_webkit-8782ca1236bac0bb13e08a6b63f8743e0b01e75a.tar.gz external_webkit-8782ca1236bac0bb13e08a6b63f8743e0b01e75a.tar.bz2 |
Fix find-in-page to scroll scrollable layers
This requires the addition of the following methods ...
- Layer::contentIsScrollable()
- Layer::localToParent()
- ScrollableLayerAndroid::scrollRectIntoView()
Bug: 5262656
Change-Id: I2f1cf3342f73890f98a172f1b4e3f440c02dd9f4
Diffstat (limited to 'Source/WebCore/platform/graphics/android/ScrollableLayerAndroid.cpp')
-rw-r--r-- | Source/WebCore/platform/graphics/android/ScrollableLayerAndroid.cpp | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/Source/WebCore/platform/graphics/android/ScrollableLayerAndroid.cpp b/Source/WebCore/platform/graphics/android/ScrollableLayerAndroid.cpp index 2bb8b5c..bca2fd4 100644 --- a/Source/WebCore/platform/graphics/android/ScrollableLayerAndroid.cpp +++ b/Source/WebCore/platform/graphics/android/ScrollableLayerAndroid.cpp @@ -31,6 +31,35 @@ void ScrollableLayerAndroid::getScrollRect(SkIRect* out) const out->fBottom = getSize().height() - m_scrollLimits.height(); } +bool ScrollableLayerAndroid::scrollRectIntoView(const SkIRect& rect) +{ + // Apply the local transform to the rect to get it relative to the parent + // layer. + SkMatrix localTransform; + getLocalTransform(&localTransform); + SkRect transformedRect; + transformedRect.set(rect); + localTransform.mapRect(&transformedRect); + + // Test left before right to prioritize left alignment if transformedRect is wider than + // visible area. + int x = m_scrollLimits.fLeft; + if (transformedRect.fLeft < m_scrollLimits.fLeft) + x = transformedRect.fLeft; + else if (transformedRect.fRight > m_scrollLimits.fRight) + x = transformedRect.fRight - std::max(m_scrollLimits.width(), transformedRect.width()); + + // Test top before bottom to prioritize top alignment if transformedRect is taller than + // visible area. + int y = m_scrollLimits.fTop; + if (transformedRect.fTop < m_scrollLimits.fTop) + y = transformedRect.fTop; + else if (transformedRect.fBottom > m_scrollLimits.fBottom) + y = transformedRect.fBottom - std::max(m_scrollLimits.height(), transformedRect.height()); + + return scrollTo(x - getPosition().fX, y - getPosition().fY); +} + } // namespace WebCore #endif // USE(ACCELERATED_COMPOSITING) |