diff options
author | gsennton <gsennton@chromium.org> | 2015-11-09 16:49:43 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-11-10 00:50:43 +0000 |
commit | bae3ff13e6959b713b872df3c4a734d6a1ea01ad (patch) | |
tree | 0a5d1c77e8f45253e9cb69efe568b349b58db888 /android_webview/java/src/org | |
parent | 839f73c696d017638d755ddb2fec18ee839e06ea (diff) | |
download | chromium_src-bae3ff13e6959b713b872df3c4a734d6a1ea01ad.zip chromium_src-bae3ff13e6959b713b872df3c4a734d6a1ea01ad.tar.gz chromium_src-bae3ff13e6959b713b872df3c4a734d6a1ea01ad.tar.bz2 |
Reland "Use resource throttle to implement shouldOverrideUrlLoading, core change"
Now that https://codereview.chromium.org/1381003004/ has landed we can
reland this patch since we now receive a didFinishLoad callback when
the current navigation finishes even in the case where a new navigation
has reached a provisional state.
This reverts commit e5c3091df04749b232359b6ef22938006af840d5.
TBR=palmer@chromium.org,jam@chromium.org
BUG=325351
Review URL: https://codereview.chromium.org/1424263003
Cr-Commit-Position: refs/heads/master@{#358719}
Diffstat (limited to 'android_webview/java/src/org')
3 files changed, 32 insertions, 25 deletions
diff --git a/android_webview/java/src/org/chromium/android_webview/AwContents.java b/android_webview/java/src/org/chromium/android_webview/AwContents.java index 18735e6..75a8dcfc 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwContents.java +++ b/android_webview/java/src/org/chromium/android_webview/AwContents.java @@ -291,10 +291,6 @@ public class AwContents implements SmartClipProvider, private PostMessageSender mPostMessageSender; - // This flag indicates that ShouldOverrideUrlNavigation should be posted - // through the resourcethrottle. This is only used for popup windows. - private boolean mDeferredShouldOverrideUrlLoadingIsPendingForPopup; - // This is a workaround for some qualcomm devices discarding buffer on // Activity restore. private boolean mInvalidateRootViewOnNextDraw; @@ -504,23 +500,38 @@ public class AwContents implements SmartClipProvider, @Override public boolean shouldIgnoreNavigation(NavigationParams navigationParams) { final String url = navigationParams.url; + + final int transitionType = navigationParams.pageTransitionType; + final boolean isLoadUrl = (transitionType & PageTransition.FROM_API) != 0; + final boolean isBackForward = (transitionType & PageTransition.FORWARD_BACK) != 0; + final boolean isReload = + (transitionType & PageTransition.CORE_MASK) == PageTransition.RELOAD; + final boolean isRedirect = navigationParams.isRedirect; + boolean ignoreNavigation = false; - if (mDeferredShouldOverrideUrlLoadingIsPendingForPopup) { - mDeferredShouldOverrideUrlLoadingIsPendingForPopup = false; - // If this is used for all navigations in future, cases for application initiated - // load, redirect and backforward should also be filtered out. - if (!navigationParams.isPost) { - ignoreNavigation = mContentsClient.shouldIgnoreNavigation( - mContext, url, navigationParams.isMainFrame, - navigationParams.hasUserGesture - || navigationParams.hasUserGestureCarryover, - navigationParams.isRedirect); - } + // Any navigation from loadUrl, goBack/Forward, or reload, are considered application + // initiated and hence will not yield a shouldOverrideUrlLoading() callback. + if ((!isLoadUrl || isRedirect) && !isBackForward && !isReload + && !navigationParams.isPost) { + ignoreNavigation = mContentsClient.shouldIgnoreNavigation(mContext, url, + navigationParams.isMainFrame, + navigationParams.hasUserGesture || navigationParams.hasUserGestureCarryover, + navigationParams.isRedirect); } + // The shouldOverrideUrlLoading call might have resulted in posting messages to the // UI thread. Using sendMessage here (instead of calling onPageStarted directly) // will allow those to run in order. - if (!ignoreNavigation) { + if (isRedirect) { + mContentsClient.getCallbackHelper().postOnPageStarted(url); + // We can post onPageFinished here since we know that the navigation will fail. + // Also AwWebContentsObserver.didFail does not call OnPageFinished when the + // navigation is overridden because we don't want an onPageFinished for such a + // navigation unless it is a redirect. + if (ignoreNavigation) { + mContentsClient.getCallbackHelper().postOnPageFinished(url); + } + } else if (!ignoreNavigation) { mContentsClient.getCallbackHelper().postOnPageStarted(url); } return ignoreNavigation; @@ -1015,7 +1026,6 @@ public class AwContents implements SmartClipProvider, // Recap: supplyContentsForPopup() is called on the parent window's content, this method is // called on the popup window's content. private void receivePopupContents(long popupNativeAwContents) { - mDeferredShouldOverrideUrlLoadingIsPendingForPopup = true; // Save existing view state. final boolean wasAttached = mIsAttachedToWindow; final boolean wasViewVisible = mIsViewVisible; diff --git a/android_webview/java/src/org/chromium/android_webview/AwContentsClientBridge.java b/android_webview/java/src/org/chromium/android_webview/AwContentsClientBridge.java index 5f34edc..c1b03a1 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwContentsClientBridge.java +++ b/android_webview/java/src/org/chromium/android_webview/AwContentsClientBridge.java @@ -259,13 +259,6 @@ public class AwContentsClientBridge { mClient.handleJsBeforeUnload(url, message, handler); } - @CalledByNative - private boolean shouldOverrideUrlLoading( - String url, boolean hasUserGesture, boolean isRedirect, boolean isMainFrame) { - return mClient.shouldIgnoreNavigation( - mContext, url, isMainFrame, hasUserGesture, isRedirect); - } - void confirmJsResult(int id, String prompt) { if (mNativeContentsClientBridge == 0) return; nativeConfirmJsResult(mNativeContentsClientBridge, id, prompt); diff --git a/android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java b/android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java index 85cf90c..53715c6 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java +++ b/android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java @@ -53,9 +53,13 @@ public class AwWebContentsObserver extends WebContentsObserver { String unreachableWebDataUrl = AwContentsStatics.getUnreachableWebDataUrl(); boolean isErrorUrl = unreachableWebDataUrl != null && unreachableWebDataUrl.equals(failingUrl); - if (isMainFrame && !isErrorUrl && errorCode == NetError.ERR_ABORTED) { + if (isMainFrame && !isErrorUrl && errorCode == NetError.ERR_ABORTED + && !wasIgnoredByHandler) { // Need to call onPageFinished for backwards compatibility with the classic webview. // See also AwContents.IoThreadClientImpl.onReceivedError. + // If the navigation was ignored because of shouldOverrideUrlLoading we have already + // called onPageFinished in + // AwContents.InterceptNavigationDelegateImpl.shouldIgnoreNavigation instead. client.getCallbackHelper().postOnPageFinished(failingUrl); } } |