diff options
author | 2012-01-17 09:00:49 -0800 | |
---|---|---|
committer | 2012-01-17 09:00:49 -0800 | |
commit | c83a666fe6f808f99a88a34f3fe00ee16ed48fd9 (patch) | |
tree | 9d61ab838c9fef47facadf806ecc9cd76b68c843 | |
parent | cc767191cfb675f744e0165608b0a4196aba2b37 (diff) | |
parent | 06e09f6928ee50835ea156f55e95a3ccb4047f16 (diff) |
Merge "Expand WebKitHitTest and do some preliminary caching"
-rw-r--r-- | core/java/android/webkit/WebView.java | 40 | ||||
-rw-r--r-- | core/java/android/webkit/WebViewCore.java | 42 |
2 files changed, 67 insertions, 15 deletions
diff --git a/core/java/android/webkit/WebView.java b/core/java/android/webkit/WebView.java index ab4665a96fe5..e46c88e72f1f 100644 --- a/core/java/android/webkit/WebView.java +++ b/core/java/android/webkit/WebView.java @@ -611,6 +611,7 @@ public class WebView extends AbsoluteLayout private boolean mIsPaused; private HitTestResult mInitialHitTestResult; + private WebKitHitTest mFocusedNode; /** * Customizable constant @@ -1073,6 +1074,15 @@ public class WebView extends AbsoluteLayout } /** + * Refer to {@link WebView#requestFocusNodeHref(Message)} for more information + */ + static class FocusNodeHref { + static final String TITLE = "title"; + static final String URL = "url"; + static final String SRC = "src"; + } + + /** * Construct a new WebView with a Context object. * @param context A Context object used to access application assets. */ @@ -2704,6 +2714,14 @@ public class WebView extends AbsoluteLayout } int contentX = viewToContentX(mLastTouchX + mScrollX); int contentY = viewToContentY(mLastTouchY + mScrollY); + if (mFocusedNode != null && mFocusedNode.mHitTestX == contentX + && mFocusedNode.mHitTestY == contentY) { + hrefMsg.getData().putString(FocusNodeHref.URL, mFocusedNode.mLinkUrl); + hrefMsg.getData().putString(FocusNodeHref.TITLE, mFocusedNode.mAnchorText); + hrefMsg.getData().putString(FocusNodeHref.SRC, mFocusedNode.mImageUrl); + hrefMsg.sendToTarget(); + return; + } if (nativeHasCursorNode()) { Rect cursorBounds = nativeGetCursorRingBounds(); if (!cursorBounds.contains(contentX, contentY)) { @@ -8839,13 +8857,25 @@ public class WebView extends AbsoluteLayout case HIT_TEST_RESULT: WebKitHitTest hit = (WebKitHitTest) msg.obj; + mFocusedNode = hit; setTouchHighlightRects(hit != null ? hit.mTouchRects : null); if (hit == null) { mInitialHitTestResult = null; } else { mInitialHitTestResult = new HitTestResult(); - mInitialHitTestResult.mType = hit.mType; - mInitialHitTestResult.mExtra = hit.mExtra; + if (hit.mLinkUrl != null) { + mInitialHitTestResult.mType = HitTestResult.SRC_ANCHOR_TYPE; + mInitialHitTestResult.mExtra = hit.mLinkUrl; + if (hit.mImageUrl != null) { + mInitialHitTestResult.mType = HitTestResult.SRC_IMAGE_ANCHOR_TYPE; + mInitialHitTestResult.mExtra = hit.mImageUrl; + } + } else if (hit.mImageUrl != null) { + mInitialHitTestResult.mType = HitTestResult.IMAGE_TYPE; + mInitialHitTestResult.mExtra = hit.mImageUrl; + } else if (hit.mEditable) { + mInitialHitTestResult.mType = HitTestResult.EDIT_TEXT_TYPE; + } } break; @@ -8884,8 +8914,10 @@ public class WebView extends AbsoluteLayout } private void setTouchHighlightRects(Rect[] rects) { - invalidate(mTouchHighlightRegion.getBounds()); - mTouchHighlightRegion.setEmpty(); + if (!mTouchHighlightRegion.isEmpty()) { + invalidate(mTouchHighlightRegion.getBounds()); + mTouchHighlightRegion.setEmpty(); + } if (rects != null) { for (Rect rect : rects) { Rect viewRect = contentToViewRect(rect); diff --git a/core/java/android/webkit/WebViewCore.java b/core/java/android/webkit/WebViewCore.java index 962a8f16e552..fb9c98a1cbe6 100644 --- a/core/java/android/webkit/WebViewCore.java +++ b/core/java/android/webkit/WebViewCore.java @@ -26,6 +26,7 @@ import android.graphics.Region; import android.media.MediaFile; import android.net.ProxyProperties; import android.net.Uri; +import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; @@ -37,6 +38,7 @@ import android.view.KeyEvent; import android.view.MotionEvent; import android.view.SurfaceView; import android.view.View; +import android.webkit.WebView.FocusNodeHref; import junit.framework.Assert; @@ -861,9 +863,19 @@ public final class WebViewCore { } static class WebKitHitTest { - int mType; - String mExtra; + String mLinkUrl; + String mAnchorText; + String mImageUrl; + String mAltDisplayString; + String mTitle; Rect[] mTouchRects; + boolean mEditable; + + // These are the input values that produced this hit test + int mHitTestX; + int mHitTestY; + int mHitTestSlop; + boolean mHitTestMovedMouse; } static class AutoFillData { @@ -1514,13 +1526,12 @@ public final class WebViewCore { break; case REQUEST_CURSOR_HREF: { + WebKitHitTest hit = performHitTest(msg.arg1, msg.arg2, 1, false); Message hrefMsg = (Message) msg.obj; - hrefMsg.getData().putString("url", - nativeRetrieveHref(mNativeClass, msg.arg1, msg.arg2)); - hrefMsg.getData().putString("title", - nativeRetrieveAnchorText(mNativeClass, msg.arg1, msg.arg2)); - hrefMsg.getData().putString("src", - nativeRetrieveImageSource(mNativeClass, msg.arg1, msg.arg2)); + Bundle data = hrefMsg.getData(); + data.putString(FocusNodeHref.URL,hit.mLinkUrl); + data.putString(FocusNodeHref.TITLE, hit.mAnchorText); + data.putString(FocusNodeHref.SRC, hit.mImageUrl); hrefMsg.sendToTarget(); break; } @@ -1685,8 +1696,7 @@ public final class WebViewCore { nativeScrollLayer(mNativeClass, d.mNativeLayer, d.mNativeLayerRect); } - WebKitHitTest hit = nativeHitTest(mNativeClass, - d.mX, d.mY, d.mSlop); + WebKitHitTest hit = performHitTest(d.mX, d.mY, d.mSlop, true); mWebView.mPrivateHandler.obtainMessage( WebView.HIT_TEST_RESULT, hit) .sendToTarget(); @@ -1890,6 +1900,15 @@ public final class WebViewCore { // WebViewCore private methods //------------------------------------------------------------------------- + private WebKitHitTest performHitTest(int x, int y, int slop, boolean moveMouse) { + WebKitHitTest hit = nativeHitTest(mNativeClass, x, y, slop, moveMouse); + hit.mHitTestX = x; + hit.mHitTestY = y; + hit.mHitTestSlop = slop; + hit.mHitTestMovedMouse = moveMouse; + return hit; + } + private void clearCache(boolean includeDiskFiles) { mBrowserFrame.clearCache(); if (includeDiskFiles) { @@ -2940,7 +2959,8 @@ public final class WebViewCore { private native boolean nativeValidNodeAndBounds(int nativeClass, int frame, int node, Rect bounds); - private native WebKitHitTest nativeHitTest(int nativeClass, int x, int y, int slop); + private native WebKitHitTest nativeHitTest(int nativeClass, int x, int y, + int slop, boolean moveMouse); private native void nativeAutoFillForm(int nativeClass, int queryId); private native void nativeScrollLayer(int nativeClass, int layer, Rect rect); |