Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c83a666f authored by John Reck's avatar John Reck Committed by Android (Google) Code Review
Browse files

Merge "Expand WebKitHitTest and do some preliminary caching"

parents cc767191 06e09f69
Loading
Loading
Loading
Loading
+36 −4
Original line number Diff line number Diff line
@@ -611,6 +611,7 @@ public class WebView extends AbsoluteLayout
    private boolean mIsPaused;

    private HitTestResult mInitialHitTestResult;
    private WebKitHitTest mFocusedNode;

    /**
     * Customizable constant
@@ -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.
@@ -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) {
        if (!mTouchHighlightRegion.isEmpty()) {
            invalidate(mTouchHighlightRegion.getBounds());
            mTouchHighlightRegion.setEmpty();
        }
        if (rects != null) {
            for (Rect rect : rects) {
                Rect viewRect = contentToViewRect(rect);
+31 −11
Original line number Diff line number Diff line
@@ -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);