Skip to content

Commit c83a666

Browse files
jreckAndroid (Google) Code Review
authored andcommitted
Merge "Expand WebKitHitTest and do some preliminary caching"
2 parents cc76719 + 06e09f6 commit c83a666

File tree

2 files changed

+67
-15
lines changed

2 files changed

+67
-15
lines changed

core/java/android/webkit/WebView.java

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -611,6 +611,7 @@ public void onTrimMemory(int level) {
611611
private boolean mIsPaused;
612612

613613
private HitTestResult mInitialHitTestResult;
614+
private WebKitHitTest mFocusedNode;
614615

615616
/**
616617
* Customizable constant
@@ -1072,6 +1073,15 @@ public String getExtra() {
10721073
}
10731074
}
10741075

1076+
/**
1077+
* Refer to {@link WebView#requestFocusNodeHref(Message)} for more information
1078+
*/
1079+
static class FocusNodeHref {
1080+
static final String TITLE = "title";
1081+
static final String URL = "url";
1082+
static final String SRC = "src";
1083+
}
1084+
10751085
/**
10761086
* Construct a new WebView with a Context object.
10771087
* @param context A Context object used to access application assets.
@@ -2704,6 +2714,14 @@ public void requestFocusNodeHref(Message hrefMsg) {
27042714
}
27052715
int contentX = viewToContentX(mLastTouchX + mScrollX);
27062716
int contentY = viewToContentY(mLastTouchY + mScrollY);
2717+
if (mFocusedNode != null && mFocusedNode.mHitTestX == contentX
2718+
&& mFocusedNode.mHitTestY == contentY) {
2719+
hrefMsg.getData().putString(FocusNodeHref.URL, mFocusedNode.mLinkUrl);
2720+
hrefMsg.getData().putString(FocusNodeHref.TITLE, mFocusedNode.mAnchorText);
2721+
hrefMsg.getData().putString(FocusNodeHref.SRC, mFocusedNode.mImageUrl);
2722+
hrefMsg.sendToTarget();
2723+
return;
2724+
}
27072725
if (nativeHasCursorNode()) {
27082726
Rect cursorBounds = nativeGetCursorRingBounds();
27092727
if (!cursorBounds.contains(contentX, contentY)) {
@@ -8839,13 +8857,25 @@ public void handleMessage(Message msg) {
88398857

88408858
case HIT_TEST_RESULT:
88418859
WebKitHitTest hit = (WebKitHitTest) msg.obj;
8860+
mFocusedNode = hit;
88428861
setTouchHighlightRects(hit != null ? hit.mTouchRects : null);
88438862
if (hit == null) {
88448863
mInitialHitTestResult = null;
88458864
} else {
88468865
mInitialHitTestResult = new HitTestResult();
8847-
mInitialHitTestResult.mType = hit.mType;
8848-
mInitialHitTestResult.mExtra = hit.mExtra;
8866+
if (hit.mLinkUrl != null) {
8867+
mInitialHitTestResult.mType = HitTestResult.SRC_ANCHOR_TYPE;
8868+
mInitialHitTestResult.mExtra = hit.mLinkUrl;
8869+
if (hit.mImageUrl != null) {
8870+
mInitialHitTestResult.mType = HitTestResult.SRC_IMAGE_ANCHOR_TYPE;
8871+
mInitialHitTestResult.mExtra = hit.mImageUrl;
8872+
}
8873+
} else if (hit.mImageUrl != null) {
8874+
mInitialHitTestResult.mType = HitTestResult.IMAGE_TYPE;
8875+
mInitialHitTestResult.mExtra = hit.mImageUrl;
8876+
} else if (hit.mEditable) {
8877+
mInitialHitTestResult.mType = HitTestResult.EDIT_TEXT_TYPE;
8878+
}
88498879
}
88508880
break;
88518881

@@ -8884,8 +8914,10 @@ public void handleMessage(Message msg) {
88848914
}
88858915

88868916
private void setTouchHighlightRects(Rect[] rects) {
8887-
invalidate(mTouchHighlightRegion.getBounds());
8888-
mTouchHighlightRegion.setEmpty();
8917+
if (!mTouchHighlightRegion.isEmpty()) {
8918+
invalidate(mTouchHighlightRegion.getBounds());
8919+
mTouchHighlightRegion.setEmpty();
8920+
}
88898921
if (rects != null) {
88908922
for (Rect rect : rects) {
88918923
Rect viewRect = contentToViewRect(rect);

core/java/android/webkit/WebViewCore.java

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import android.media.MediaFile;
2727
import android.net.ProxyProperties;
2828
import android.net.Uri;
29+
import android.os.Bundle;
2930
import android.os.Handler;
3031
import android.os.Looper;
3132
import android.os.Message;
@@ -37,6 +38,7 @@
3738
import android.view.MotionEvent;
3839
import android.view.SurfaceView;
3940
import android.view.View;
41+
import android.webkit.WebView.FocusNodeHref;
4042

4143
import junit.framework.Assert;
4244

@@ -861,9 +863,19 @@ static class TouchHighlightData {
861863
}
862864

863865
static class WebKitHitTest {
864-
int mType;
865-
String mExtra;
866+
String mLinkUrl;
867+
String mAnchorText;
868+
String mImageUrl;
869+
String mAltDisplayString;
870+
String mTitle;
866871
Rect[] mTouchRects;
872+
boolean mEditable;
873+
874+
// These are the input values that produced this hit test
875+
int mHitTestX;
876+
int mHitTestY;
877+
int mHitTestSlop;
878+
boolean mHitTestMovedMouse;
867879
}
868880

869881
static class AutoFillData {
@@ -1514,13 +1526,12 @@ public void handleMessage(Message msg) {
15141526
break;
15151527

15161528
case REQUEST_CURSOR_HREF: {
1529+
WebKitHitTest hit = performHitTest(msg.arg1, msg.arg2, 1, false);
15171530
Message hrefMsg = (Message) msg.obj;
1518-
hrefMsg.getData().putString("url",
1519-
nativeRetrieveHref(mNativeClass, msg.arg1, msg.arg2));
1520-
hrefMsg.getData().putString("title",
1521-
nativeRetrieveAnchorText(mNativeClass, msg.arg1, msg.arg2));
1522-
hrefMsg.getData().putString("src",
1523-
nativeRetrieveImageSource(mNativeClass, msg.arg1, msg.arg2));
1531+
Bundle data = hrefMsg.getData();
1532+
data.putString(FocusNodeHref.URL,hit.mLinkUrl);
1533+
data.putString(FocusNodeHref.TITLE, hit.mAnchorText);
1534+
data.putString(FocusNodeHref.SRC, hit.mImageUrl);
15241535
hrefMsg.sendToTarget();
15251536
break;
15261537
}
@@ -1685,8 +1696,7 @@ public void handleMessage(Message msg) {
16851696
nativeScrollLayer(mNativeClass,
16861697
d.mNativeLayer, d.mNativeLayerRect);
16871698
}
1688-
WebKitHitTest hit = nativeHitTest(mNativeClass,
1689-
d.mX, d.mY, d.mSlop);
1699+
WebKitHitTest hit = performHitTest(d.mX, d.mY, d.mSlop, true);
16901700
mWebView.mPrivateHandler.obtainMessage(
16911701
WebView.HIT_TEST_RESULT, hit)
16921702
.sendToTarget();
@@ -1890,6 +1900,15 @@ void destroy() {
18901900
// WebViewCore private methods
18911901
//-------------------------------------------------------------------------
18921902

1903+
private WebKitHitTest performHitTest(int x, int y, int slop, boolean moveMouse) {
1904+
WebKitHitTest hit = nativeHitTest(mNativeClass, x, y, slop, moveMouse);
1905+
hit.mHitTestX = x;
1906+
hit.mHitTestY = y;
1907+
hit.mHitTestSlop = slop;
1908+
hit.mHitTestMovedMouse = moveMouse;
1909+
return hit;
1910+
}
1911+
18931912
private void clearCache(boolean includeDiskFiles) {
18941913
mBrowserFrame.clearCache();
18951914
if (includeDiskFiles) {
@@ -2940,7 +2959,8 @@ protected DeviceOrientationService getDeviceOrientationService() {
29402959
private native boolean nativeValidNodeAndBounds(int nativeClass, int frame,
29412960
int node, Rect bounds);
29422961

2943-
private native WebKitHitTest nativeHitTest(int nativeClass, int x, int y, int slop);
2962+
private native WebKitHitTest nativeHitTest(int nativeClass, int x, int y,
2963+
int slop, boolean moveMouse);
29442964

29452965
private native void nativeAutoFillForm(int nativeClass, int queryId);
29462966
private native void nativeScrollLayer(int nativeClass, int layer, Rect rect);

0 commit comments

Comments
 (0)