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

Commit 06e09f69 authored by John Reck's avatar John Reck
Browse files

Expand WebKitHitTest and do some preliminary caching

Change-Id: Id9e9cc11f1482f434133e70b14970d7248a39008
parent ba8b97e2
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)) {
@@ -8837,13 +8855,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;

@@ -8882,8 +8912,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 {
@@ -1512,13 +1524,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;
                        }
@@ -1683,8 +1694,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();
@@ -1883,6 +1893,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) {
@@ -2933,7 +2952,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);