summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author John Reck <jreck@google.com> 2012-01-17 09:00:49 -0800
committer Android (Google) Code Review <android-gerrit@google.com> 2012-01-17 09:00:49 -0800
commitc83a666fe6f808f99a88a34f3fe00ee16ed48fd9 (patch)
tree9d61ab838c9fef47facadf806ecc9cd76b68c843
parentcc767191cfb675f744e0165608b0a4196aba2b37 (diff)
parent06e09f6928ee50835ea156f55e95a3ccb4047f16 (diff)
Merge "Expand WebKitHitTest and do some preliminary caching"
-rw-r--r--core/java/android/webkit/WebView.java40
-rw-r--r--core/java/android/webkit/WebViewCore.java42
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);