Skip to content

Commit 06e09f6

Browse files
committed
Expand WebKitHitTest and do some preliminary caching
Change-Id: Id9e9cc11f1482f434133e70b14970d7248a39008
1 parent ba8b97e commit 06e09f6

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)) {
@@ -8837,13 +8855,25 @@ public void handleMessage(Message msg) {
88378855

88388856
case HIT_TEST_RESULT:
88398857
WebKitHitTest hit = (WebKitHitTest) msg.obj;
8858+
mFocusedNode = hit;
88408859
setTouchHighlightRects(hit != null ? hit.mTouchRects : null);
88418860
if (hit == null) {
88428861
mInitialHitTestResult = null;
88438862
} else {
88448863
mInitialHitTestResult = new HitTestResult();
8845-
mInitialHitTestResult.mType = hit.mType;
8846-
mInitialHitTestResult.mExtra = hit.mExtra;
8864+
if (hit.mLinkUrl != null) {
8865+
mInitialHitTestResult.mType = HitTestResult.SRC_ANCHOR_TYPE;
8866+
mInitialHitTestResult.mExtra = hit.mLinkUrl;
8867+
if (hit.mImageUrl != null) {
8868+
mInitialHitTestResult.mType = HitTestResult.SRC_IMAGE_ANCHOR_TYPE;
8869+
mInitialHitTestResult.mExtra = hit.mImageUrl;
8870+
}
8871+
} else if (hit.mImageUrl != null) {
8872+
mInitialHitTestResult.mType = HitTestResult.IMAGE_TYPE;
8873+
mInitialHitTestResult.mExtra = hit.mImageUrl;
8874+
} else if (hit.mEditable) {
8875+
mInitialHitTestResult.mType = HitTestResult.EDIT_TEXT_TYPE;
8876+
}
88478877
}
88488878
break;
88498879

@@ -8882,8 +8912,10 @@ public void handleMessage(Message msg) {
88828912
}
88838913

88848914
private void setTouchHighlightRects(Rect[] rects) {
8885-
invalidate(mTouchHighlightRegion.getBounds());
8886-
mTouchHighlightRegion.setEmpty();
8915+
if (!mTouchHighlightRegion.isEmpty()) {
8916+
invalidate(mTouchHighlightRegion.getBounds());
8917+
mTouchHighlightRegion.setEmpty();
8918+
}
88878919
if (rects != null) {
88888920
for (Rect rect : rects) {
88898921
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 {
@@ -1512,13 +1524,12 @@ public void handleMessage(Message msg) {
15121524
break;
15131525

15141526
case REQUEST_CURSOR_HREF: {
1527+
WebKitHitTest hit = performHitTest(msg.arg1, msg.arg2, 1, false);
15151528
Message hrefMsg = (Message) msg.obj;
1516-
hrefMsg.getData().putString("url",
1517-
nativeRetrieveHref(mNativeClass, msg.arg1, msg.arg2));
1518-
hrefMsg.getData().putString("title",
1519-
nativeRetrieveAnchorText(mNativeClass, msg.arg1, msg.arg2));
1520-
hrefMsg.getData().putString("src",
1521-
nativeRetrieveImageSource(mNativeClass, msg.arg1, msg.arg2));
1529+
Bundle data = hrefMsg.getData();
1530+
data.putString(FocusNodeHref.URL,hit.mLinkUrl);
1531+
data.putString(FocusNodeHref.TITLE, hit.mAnchorText);
1532+
data.putString(FocusNodeHref.SRC, hit.mImageUrl);
15221533
hrefMsg.sendToTarget();
15231534
break;
15241535
}
@@ -1683,8 +1694,7 @@ public void handleMessage(Message msg) {
16831694
nativeScrollLayer(mNativeClass,
16841695
d.mNativeLayer, d.mNativeLayerRect);
16851696
}
1686-
WebKitHitTest hit = nativeHitTest(mNativeClass,
1687-
d.mX, d.mY, d.mSlop);
1697+
WebKitHitTest hit = performHitTest(d.mX, d.mY, d.mSlop, true);
16881698
mWebView.mPrivateHandler.obtainMessage(
16891699
WebView.HIT_TEST_RESULT, hit)
16901700
.sendToTarget();
@@ -1883,6 +1893,15 @@ void destroy() {
18831893
// WebViewCore private methods
18841894
//-------------------------------------------------------------------------
18851895

1896+
private WebKitHitTest performHitTest(int x, int y, int slop, boolean moveMouse) {
1897+
WebKitHitTest hit = nativeHitTest(mNativeClass, x, y, slop, moveMouse);
1898+
hit.mHitTestX = x;
1899+
hit.mHitTestY = y;
1900+
hit.mHitTestSlop = slop;
1901+
hit.mHitTestMovedMouse = moveMouse;
1902+
return hit;
1903+
}
1904+
18861905
private void clearCache(boolean includeDiskFiles) {
18871906
mBrowserFrame.clearCache();
18881907
if (includeDiskFiles) {
@@ -2933,7 +2952,8 @@ protected DeviceOrientationService getDeviceOrientationService() {
29332952
private native boolean nativeValidNodeAndBounds(int nativeClass, int frame,
29342953
int node, Rect bounds);
29352954

2936-
private native WebKitHitTest nativeHitTest(int nativeClass, int x, int y, int slop);
2955+
private native WebKitHitTest nativeHitTest(int nativeClass, int x, int y,
2956+
int slop, boolean moveMouse);
29372957

29382958
private native void nativeAutoFillForm(int nativeClass, int queryId);
29392959
private native void nativeScrollLayer(int nativeClass, int layer, Rect rect);

0 commit comments

Comments
 (0)