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

Commit 95b7d6f9 authored by John Reck's avatar John Reck
Browse files

Prevent WebKit updates in loadViewState case

Change-Id: I466f10c308b43f8683e537620e1c3e922a2cd465
parent 5e02e095
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -16,7 +16,6 @@
package android.webkit;

import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.Region;
import android.webkit.WebViewCore.DrawData;

+66 −25
Original line number Diff line number Diff line
@@ -620,6 +620,9 @@ public class WebView extends AbsoluteLayout
    // SetBaseLayer time and to pause when WebView paused.
    private HTML5VideoViewProxy mHTML5VideoViewProxy;

    // If we are using a set picture, don't send view updates to webkit
    private boolean mBlockWebkitViewMessages = false;

    /*
     * Private message ids
     */
@@ -1815,8 +1818,8 @@ public class WebView extends AbsoluteLayout
     */
    public boolean loadViewState(InputStream stream) {
        try {
            mWebViewCore.sendMessage(EventHub.CLEAR_CONTENT);
            DrawData draw = ViewStateSerializer.deserializeViewState(stream, this);
            mBlockWebkitViewMessages = true;
            setNewPicture(draw);
            return true;
        } catch (IOException e) {
@@ -1825,6 +1828,16 @@ public class WebView extends AbsoluteLayout
        return false;
    }

    /**
     * Clears the view state set with {@link #loadViewState(InputStream)}.
     * This WebView will then switch to showing the content from webkit
     * @hide
     */
    public void clearViewState() {
        mBlockWebkitViewMessages = false;
        invalidate();
    }

    /**
     * Restore the state of this WebView from the given map used in
     * {@link android.app.Activity#onRestoreInstanceState}. This method should
@@ -2704,10 +2717,12 @@ public class WebView extends AbsoluteLayout
        calcOurContentVisibleRect(rect);
        // Rect.equals() checks for null input.
        if (!rect.equals(mLastVisibleRectSent)) {
            if (!mBlockWebkitViewMessages) {
                Point pos = new Point(rect.left, rect.top);
                mWebViewCore.removeMessages(EventHub.SET_SCROLL_OFFSET);
                mWebViewCore.sendMessage(EventHub.SET_SCROLL_OFFSET,
                        nativeMoveGeneration(), mSendScrollEvent ? 1 : 0, pos);
            }
            mLastVisibleRectSent = rect;
            mPrivateHandler.removeMessages(SWITCH_TO_LONGPRESS);
        }
@@ -2722,7 +2737,9 @@ public class WebView extends AbsoluteLayout
            // TODO: the global offset is only used by windowRect()
            // in ChromeClientAndroid ; other clients such as touch
            // and mouse events could return view + screen relative points.
            if (!mBlockWebkitViewMessages) {
                mWebViewCore.sendMessage(EventHub.SET_GLOBAL_BOUNDS, globalRect);
            }
            mLastGlobalRect = globalRect;
        }
        return rect;
@@ -2787,6 +2804,7 @@ public class WebView extends AbsoluteLayout
     * @return true if new values were sent
     */
    boolean sendViewSizeZoom(boolean force) {
        if (mBlockWebkitViewMessages) return false;
        if (mZoomManager.isPreventingWebkitUpdates()) return false;

        int viewWidth = getViewWidth();
@@ -3399,10 +3417,12 @@ public class WebView extends AbsoluteLayout
                }
                abortAnimation();
                mPrivateHandler.removeMessages(RESUME_WEBCORE_PRIORITY);
                if (!mBlockWebkitViewMessages) {
                    WebViewCore.resumePriority();
                    if (!mSelectingText) {
                        WebViewCore.resumeUpdatePicture(mWebViewCore);
                    }
                }
                if (oldX != mScrollX || oldY != mScrollY) {
                    sendOurVisibleRect();
                }
@@ -4259,7 +4279,7 @@ public class WebView extends AbsoluteLayout
    }

    void onFixedLengthZoomAnimationEnd() {
        if (!mSelectingText) {
        if (!mBlockWebkitViewMessages && !mSelectingText) {
            WebViewCore.resumeUpdatePicture(mWebViewCore);
        }
        onZoomAnimationEnd();
@@ -4360,7 +4380,7 @@ public class WebView extends AbsoluteLayout
            // synchronization problem with layers.
            int content = nativeDraw(canvas, color, extras, false);
            canvas.setDrawFilter(null);
            if (content != 0) {
            if (!mBlockWebkitViewMessages && content != 0) {
                mWebViewCore.sendMessage(EventHub.SPLIT_PICTURE_SET, content, 0);
            }
        }
@@ -4764,6 +4784,9 @@ public class WebView extends AbsoluteLayout

    @Override
    public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event) {
        if (mBlockWebkitViewMessages) {
            return false;
        }
        // send complex characters to webkit for use by JS and plugins
        if (keyCode == KeyEvent.KEYCODE_UNKNOWN && event.getCharacters() != null) {
            // pass the key to DOM
@@ -4788,6 +4811,9 @@ public class WebView extends AbsoluteLayout
                    + "keyCode=" + keyCode
                    + ", " + event + ", unicode=" + event.getUnicodeChar());
        }
        if (mBlockWebkitViewMessages) {
            return false;
        }

        // don't implement accelerator keys here; defer to host application
        if (event.isCtrlPressed()) {
@@ -4991,6 +5017,9 @@ public class WebView extends AbsoluteLayout
            Log.v(LOGTAG, "keyUp at " + System.currentTimeMillis()
                    + ", " + event + ", unicode=" + event.getUnicodeChar());
        }
        if (mBlockWebkitViewMessages) {
            return false;
        }

        if (mNativeClass == 0) {
            return false;
@@ -5575,10 +5604,12 @@ public class WebView extends AbsoluteLayout
    }

    private boolean shouldForwardTouchEvent() {
        return mFullScreenHolder != null || (mForwardTouchEvents
        if (mFullScreenHolder != null) return true;
        if (mBlockWebkitViewMessages) return false;
        return mForwardTouchEvents
                && !mSelectingText
                && mPreventDefault != PREVENT_DEFAULT_IGNORE
                && mPreventDefault != PREVENT_DEFAULT_NO);
                && mPreventDefault != PREVENT_DEFAULT_NO;
    }

    private boolean inFullScreenMode() {
@@ -5709,25 +5740,31 @@ public class WebView extends AbsoluteLayout
                        // commit the short press action for the previous tap
                        doShortPress();
                        mTouchMode = TOUCH_INIT_MODE;
                        mDeferTouchProcess = (!inFullScreenMode()
                                && mForwardTouchEvents) ? hitFocusedPlugin(
                                contentX, contentY) : false;
                        mDeferTouchProcess = !mBlockWebkitViewMessages
                                && (!inFullScreenMode() && mForwardTouchEvents)
                                ? hitFocusedPlugin(contentX, contentY)
                                : false;
                    }
                } else { // the normal case
                    mTouchMode = TOUCH_INIT_MODE;
                    mDeferTouchProcess = (!inFullScreenMode()
                            && mForwardTouchEvents) ? hitFocusedPlugin(
                            contentX, contentY) : false;
                    mDeferTouchProcess = !mBlockWebkitViewMessages
                            && (!inFullScreenMode() && mForwardTouchEvents)
                            ? hitFocusedPlugin(contentX, contentY)
                            : false;
                    if (!mBlockWebkitViewMessages) {
                        mWebViewCore.sendMessage(
                                EventHub.UPDATE_FRAME_CACHE_IF_LOADING);
                    }
                    if (getSettings().supportTouchOnly()) {
                        TouchHighlightData data = new TouchHighlightData();
                        data.mX = contentX;
                        data.mY = contentY;
                        data.mSlop = viewToContentDimension(mNavSlop);
                        if (!mBlockWebkitViewMessages) {
                            mWebViewCore.sendMessageDelayed(
                                    EventHub.GET_TOUCH_HIGHLIGHT_RECTS, data,
                                    ViewConfiguration.getTapTimeout());
                        }
                        if (DEBUG_TOUCH_HIGHLIGHT) {
                            if (getSettings().getNavDump()) {
                                mTouchHighlightX = (int) x + mScrollX;
@@ -5763,7 +5800,7 @@ public class WebView extends AbsoluteLayout
                            SWITCH_TO_LONGPRESS, LONG_PRESS_TIMEOUT);
                    if (inFullScreenMode() || mDeferTouchProcess) {
                        mPreventDefault = PREVENT_DEFAULT_YES;
                    } else if (mForwardTouchEvents) {
                    } else if (!mBlockWebkitViewMessages && mForwardTouchEvents) {
                        mPreventDefault = PREVENT_DEFAULT_MAYBE_YES;
                    } else {
                        mPreventDefault = PREVENT_DEFAULT_NO;
@@ -7875,6 +7912,10 @@ public class WebView extends AbsoluteLayout
                // after WebView's destroy() is called, skip handling messages.
                return;
            }
            if (mBlockWebkitViewMessages) {
                // Blocking messages from webkit
                return;
            }
            switch (msg.what) {
                case REMEMBER_PASSWORD: {
                    mDatabase.setUsernamePassword(