summaryrefslogtreecommitdiff
path: root/core/java/android
diff options
context:
space:
mode:
authorMangesh Ghiware <mghiware@google.com>2012-02-02 16:19:54 -0800
committerMangesh Ghiware <mghiware@google.com>2012-02-06 15:01:57 -0800
commit5fe6f951ac0b013be76f2b34b8e87ca6d11010b3 (patch)
tree1e9263484fc884c4e1aa0a96b45c6465ff44f530 /core/java/android
parent229e25d404fde2880e3858b1df2d0d1b6f3ad9e0 (diff)
Use WebKit hit testing result for centering on double-tap zoom.
Iterate over the bounding boxes and find one large enough to fit the screen width at reading scale. Align to left edge of said box. Bug: 5175030 Bug: 5768421 Change-Id: Iac01e145336918b0a2b21d2864f46ba532aaf18f
Diffstat (limited to 'core/java/android')
-rw-r--r--core/java/android/webkit/WebView.java28
-rw-r--r--core/java/android/webkit/WebViewCore.java1
-rw-r--r--core/java/android/webkit/ZoomManager.java2
3 files changed, 30 insertions, 1 deletions
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java
index 4a42e92acb03..86ae7db9a3e0 100644
--- a/core/java/android/webkit/WebView.java
+++ b/core/java/android/webkit/WebView.java
@@ -2781,6 +2781,34 @@ public class WebView extends AbsoluteLayout
return result;
}
+ int getBlockLeftEdge(int x, int y, float readingScale) {
+ if (!sDisableNavcache) {
+ return nativeGetBlockLeftEdge(x, y, readingScale);
+ }
+
+ float invReadingScale = 1.0f / readingScale;
+ int readingWidth = (int) (getViewWidth() * invReadingScale);
+ int left = NO_LEFTEDGE;
+ if (mFocusedNode != null) {
+ final int length = mFocusedNode.mEnclosingParentRects.length;
+ for (int i = 0; i < length; i++) {
+ Rect rect = mFocusedNode.mEnclosingParentRects[i];
+ if (rect.width() < mFocusedNode.mHitTestSlop) {
+ // ignore bounding boxes that are too small
+ continue;
+ } else if (left != NO_LEFTEDGE && rect.width() > readingWidth) {
+ // stop when bounding box doesn't fit the screen width
+ // at reading scale
+ break;
+ }
+
+ left = rect.left;
+ }
+ }
+
+ return left;
+ }
+
// Called by JNI when the DOM has changed the focus. Clear the focus so
// that new keys will go to the newly focused field
private void domChangedFocus() {
diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java
index 395a638ab942..abfeb79d1697 100644
--- a/core/java/android/webkit/WebViewCore.java
+++ b/core/java/android/webkit/WebViewCore.java
@@ -872,6 +872,7 @@ public final class WebViewCore {
Rect[] mTouchRects;
boolean mEditable;
int mTapHighlightColor = WebView.HIGHLIGHT_COLOR;
+ Rect[] mEnclosingParentRects;
// These are the input values that produced this hit test
int mHitTestX;
diff --git a/core/java/android/webkit/ZoomManager.java b/core/java/android/webkit/ZoomManager.java
index 8ffba647ba82..ae2d6173cb84 100644
--- a/core/java/android/webkit/ZoomManager.java
+++ b/core/java/android/webkit/ZoomManager.java
@@ -717,7 +717,7 @@ class ZoomManager {
private void zoomToReadingLevel() {
final float readingScale = getReadingLevelScale();
- int left = mWebView.nativeGetBlockLeftEdge(mAnchorX, mAnchorY, mActualScale);
+ int left = mWebView.getBlockLeftEdge(mAnchorX, mAnchorY, readingScale);
if (left != WebView.NO_LEFTEDGE) {
// add a 5pt padding to the left edge.
int viewLeft = mWebView.contentToViewX(left < 5 ? 0 : (left - 5))