Loading core/java/android/webkit/WebView.java +36 −4 Original line number Diff line number Diff line Loading @@ -611,6 +611,7 @@ public class WebView extends AbsoluteLayout private boolean mIsPaused; private HitTestResult mInitialHitTestResult; private WebKitHitTest mFocusedNode; /** * Customizable constant Loading Loading @@ -1072,6 +1073,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. Loading Loading @@ -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)) { Loading Loading @@ -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; Loading Loading @@ -8884,8 +8914,10 @@ public class WebView extends AbsoluteLayout } private void setTouchHighlightRects(Rect[] rects) { if (!mTouchHighlightRegion.isEmpty()) { invalidate(mTouchHighlightRegion.getBounds()); mTouchHighlightRegion.setEmpty(); } if (rects != null) { for (Rect rect : rects) { Rect viewRect = contentToViewRect(rect); Loading core/java/android/webkit/WebViewCore.java +31 −11 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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 { Loading Loading @@ -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; } Loading Loading @@ -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(); Loading Loading @@ -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) { Loading Loading @@ -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); Loading Loading
core/java/android/webkit/WebView.java +36 −4 Original line number Diff line number Diff line Loading @@ -611,6 +611,7 @@ public class WebView extends AbsoluteLayout private boolean mIsPaused; private HitTestResult mInitialHitTestResult; private WebKitHitTest mFocusedNode; /** * Customizable constant Loading Loading @@ -1072,6 +1073,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. Loading Loading @@ -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)) { Loading Loading @@ -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; Loading Loading @@ -8884,8 +8914,10 @@ public class WebView extends AbsoluteLayout } private void setTouchHighlightRects(Rect[] rects) { if (!mTouchHighlightRegion.isEmpty()) { invalidate(mTouchHighlightRegion.getBounds()); mTouchHighlightRegion.setEmpty(); } if (rects != null) { for (Rect rect : rects) { Rect viewRect = contentToViewRect(rect); Loading
core/java/android/webkit/WebViewCore.java +31 −11 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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 { Loading Loading @@ -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; } Loading Loading @@ -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(); Loading Loading @@ -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) { Loading Loading @@ -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); Loading