From a5c8472a374c1c2b2026fa9dbb39235e198768ef Mon Sep 17 00:00:00 2001
From: Andrew Grieve <agrieve@chromium.org>
Date: Tue, 4 Feb 2014 00:12:11 -0500
Subject: [PATCH] Ignore multiple onPageFinished() callbacks & onReceivedError
 due to stopLoading()

I believe this happens only when using custom schemes.
---
 .../src/org/apache/cordova/CordovaWebView.java     |  5 +++++
 .../org/apache/cordova/CordovaWebViewClient.java   | 14 +++++++++++++-
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/framework/src/org/apache/cordova/CordovaWebView.java b/framework/src/org/apache/cordova/CordovaWebView.java
index b30ea78c..b0e3d433 100755
--- a/framework/src/org/apache/cordova/CordovaWebView.java
+++ b/framework/src/org/apache/cordova/CordovaWebView.java
@@ -541,6 +541,11 @@ public class CordovaWebView extends WebView {
         this.loadUrlIntoView(url);
     }
     
+    @Override
+    public void stopLoading() {
+        viewClient.isCurrentlyLoading = false;
+        super.stopLoading();
+    }
     
     public void onScrollChanged(int l, int t, int oldl, int oldt)
     {
diff --git a/framework/src/org/apache/cordova/CordovaWebViewClient.java b/framework/src/org/apache/cordova/CordovaWebViewClient.java
index e465ffa8..0b7b8003 100755
--- a/framework/src/org/apache/cordova/CordovaWebViewClient.java
+++ b/framework/src/org/apache/cordova/CordovaWebViewClient.java
@@ -62,6 +62,7 @@ public class CordovaWebViewClient extends WebViewClient {
     CordovaInterface cordova;
     CordovaWebView appView;
     private boolean doClearHistory = false;
+    private boolean isCurrentlyLoading;
 
     /** The authorization tokens. */
     private Hashtable<String, AuthenticationToken> authenticationTokens = new Hashtable<String, AuthenticationToken>();
@@ -266,7 +267,9 @@ public class CordovaWebViewClient extends WebViewClient {
      */
     @Override
     public void onPageStarted(WebView view, String url, Bitmap favicon) {
-
+        super.onPageStarted(view, url, favicon);
+        isCurrentlyLoading = true;
+        LOG.d(TAG, "onPageStarted(" + url + ")");
         // Flush stale messages.
         this.appView.jsMessageQueue.reset();
 
@@ -290,6 +293,11 @@ public class CordovaWebViewClient extends WebViewClient {
     @Override
     public void onPageFinished(WebView view, String url) {
         super.onPageFinished(view, url);
+        // Ignore excessive calls.
+        if (!isCurrentlyLoading) {
+            return;
+        }
+        isCurrentlyLoading = false;
         LOG.d(TAG, "onPageFinished(" + url + ")");
 
         /**
@@ -344,6 +352,10 @@ public class CordovaWebViewClient extends WebViewClient {
      */
     @Override
     public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
+        // Ignore error due to stopLoading().
+        if (!isCurrentlyLoading) {
+            return;
+        }
         LOG.d(TAG, "CordovaWebViewClient.onReceivedError: Error code=%s Description=%s URL=%s", errorCode, description, failingUrl);
 
         // Clear timeout flag