summaryrefslogtreecommitdiffstats
path: root/Source/WebCore/platform/graphics/android/ScrollableLayerAndroid.cpp
diff options
context:
space:
mode:
authorSteve Block <steveblock@google.com>2011-09-21 15:43:37 +0100
committerSteve Block <steveblock@google.com>2011-09-22 22:57:10 +0100
commit8782ca1236bac0bb13e08a6b63f8743e0b01e75a (patch)
treeb3bf345515df5bf26b7df393ac4458c9dd57be86 /Source/WebCore/platform/graphics/android/ScrollableLayerAndroid.cpp
parent06ab37f33e994114ce0ec9fbb35fe48249ed6dbc (diff)
downloadexternal_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.cpp29
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)