Index: android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java |
diff --git a/android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java b/android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d7703dc20a47f27b628ba738324c3a9d7e107703 |
--- /dev/null |
+++ b/android_webview/java/src/org/chromium/android_webview/AwWebContentsObserver.java |
@@ -0,0 +1,70 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+package org.chromium.android_webview; |
+ |
+import org.chromium.content.browser.WebContentsObserverAndroid; |
+import org.chromium.content_public.browser.WebContents; |
+import org.chromium.net.NetError; |
+ |
+/** |
+ * Routes notifications from WebContents to AwContentsClient and other listeners. |
+ */ |
+public class AwWebContentsObserver extends WebContentsObserverAndroid { |
+ private final AwContentsClient mAwContentsClient; |
+ |
+ public AwWebContentsObserver(WebContents webContents, AwContentsClient awContentsClient) { |
+ super(webContents); |
+ mAwContentsClient = awContentsClient; |
+ } |
+ |
+ @Override |
+ public void didFinishLoad(long frameId, String validatedUrl, boolean isMainFrame) { |
+ String unreachableWebDataUrl = AwContentsStatics.getUnreachableWebDataUrl(); |
+ boolean isErrorUrl = |
+ unreachableWebDataUrl != null && unreachableWebDataUrl.equals(validatedUrl); |
+ if (isMainFrame && !isErrorUrl) { |
+ mAwContentsClient.onPageFinished(validatedUrl); |
+ } |
+ } |
+ |
+ @Override |
+ public void didFailLoad(boolean isProvisionalLoad, |
+ boolean isMainFrame, int errorCode, String description, String failingUrl) { |
+ String unreachableWebDataUrl = AwContentsStatics.getUnreachableWebDataUrl(); |
+ boolean isErrorUrl = |
+ unreachableWebDataUrl != null && unreachableWebDataUrl.equals(failingUrl); |
+ if (isMainFrame && !isErrorUrl) { |
+ if (errorCode != NetError.ERR_ABORTED) { |
+ // This error code is generated for the following reasons: |
+ // - WebView.stopLoading is called, |
+ // - the navigation is intercepted by the embedder via shouldOverrideNavigation. |
+ // |
+ // The Android WebView does not notify the embedder of these situations using |
+ // this error code with the WebViewClient.onReceivedError callback. |
+ mAwContentsClient.onReceivedError( |
+ ErrorCodeConversionHelper.convertErrorCode(errorCode), description, |
+ failingUrl); |
+ } |
+ // Need to call onPageFinished after onReceivedError (if there is an error) for |
+ // backwards compatibility with the classic webview. |
+ mAwContentsClient.onPageFinished(failingUrl); |
+ } |
+ } |
+ |
+ @Override |
+ public void didNavigateMainFrame(String url, String baseUrl, |
+ boolean isNavigationToDifferentPage, boolean isFragmentNavigation) { |
+ // This is here to emulate the Classic WebView firing onPageFinished for main frame |
+ // navigations where only the hash fragment changes. |
+ if (isFragmentNavigation) { |
+ mAwContentsClient.onPageFinished(url); |
+ } |
+ } |
+ |
+ @Override |
+ public void didNavigateAnyFrame(String url, String baseUrl, boolean isReload) { |
+ mAwContentsClient.doUpdateVisitedHistory(url, isReload); |
+ } |
+} |