Add WebViewClient.onProceededAfterSslError()

This is used to notify the host application that an SSL error occurred while
loading a resource, but the WebView but chose to proceed anyway based on a
decision retained from a previous response to onReceivedSslError().

Bug: 5403366
Change-Id: I51a25b93d7824b7eb7b6d5a961cba948e37c85db
diff --git a/core/java/android/webkit/BrowserFrame.java b/core/java/android/webkit/BrowserFrame.java
index 8c22da0..c8b67a8 100644
--- a/core/java/android/webkit/BrowserFrame.java
+++ b/core/java/android/webkit/BrowserFrame.java
@@ -471,6 +471,7 @@
 
     /**
      * We have received an SSL certificate for the main top-level page.
+     * Used by the Android HTTP stack only.
      */
     void certificate(SslCertificate certificate) {
         if (mIsMainFrame) {
@@ -1178,6 +1179,7 @@
 
         if (SslCertLookupTable.getInstance().isAllowed(sslError)) {
             nativeSslCertErrorProceed(handle);
+            mCallbackProxy.onProceededAfterSslError(sslError);
             return;
         }
 
@@ -1267,7 +1269,8 @@
     }
 
     /**
-     * Called by JNI when we load a page over SSL.
+     * Called by JNI when we recieve a certificate for the page's main resource.
+     * Used by the Chromium HTTP stack only.
      */
     private void setCertificate(byte cert_der[]) {
         try {
diff --git a/core/java/android/webkit/CallbackProxy.java b/core/java/android/webkit/CallbackProxy.java
index 5ee90a4..75ee338 100644
--- a/core/java/android/webkit/CallbackProxy.java
+++ b/core/java/android/webkit/CallbackProxy.java
@@ -77,53 +77,54 @@
     // Used to call startActivity during url override.
     private final Context mContext;
 
-    // Message Ids
-    private static final int PAGE_STARTED                        = 100;
-    private static final int RECEIVED_ICON                       = 101;
-    private static final int RECEIVED_TITLE                      = 102;
-    private static final int OVERRIDE_URL                        = 103;
-    private static final int AUTH_REQUEST                        = 104;
-    private static final int SSL_ERROR                           = 105;
-    private static final int PROGRESS                            = 106;
-    private static final int UPDATE_VISITED                      = 107;
-    private static final int LOAD_RESOURCE                       = 108;
-    private static final int CREATE_WINDOW                       = 109;
-    private static final int CLOSE_WINDOW                        = 110;
-    private static final int SAVE_PASSWORD                       = 111;
-    private static final int JS_ALERT                            = 112;
-    private static final int JS_CONFIRM                          = 113;
-    private static final int JS_PROMPT                           = 114;
-    private static final int JS_UNLOAD                           = 115;
-    private static final int ASYNC_KEYEVENTS                     = 116;
-    private static final int DOWNLOAD_FILE                       = 118;
-    private static final int REPORT_ERROR                        = 119;
-    private static final int RESEND_POST_DATA                    = 120;
-    private static final int PAGE_FINISHED                       = 121;
-    private static final int REQUEST_FOCUS                       = 122;
-    private static final int SCALE_CHANGED                       = 123;
-    private static final int RECEIVED_CERTIFICATE                = 124;
-    private static final int SWITCH_OUT_HISTORY                  = 125;
-    private static final int EXCEEDED_DATABASE_QUOTA             = 126;
-    private static final int REACHED_APPCACHE_MAXSIZE            = 127;
-    private static final int JS_TIMEOUT                          = 128;
-    private static final int ADD_MESSAGE_TO_CONSOLE              = 129;
-    private static final int GEOLOCATION_PERMISSIONS_SHOW_PROMPT = 130;
-    private static final int GEOLOCATION_PERMISSIONS_HIDE_PROMPT = 131;
-    private static final int RECEIVED_TOUCH_ICON_URL             = 132;
-    private static final int GET_VISITED_HISTORY                 = 133;
-    private static final int OPEN_FILE_CHOOSER                   = 134;
-    private static final int ADD_HISTORY_ITEM                    = 135;
-    private static final int HISTORY_INDEX_CHANGED               = 136;
-    private static final int AUTH_CREDENTIALS                    = 137;
-    private static final int SET_INSTALLABLE_WEBAPP              = 138;
-    private static final int NOTIFY_SEARCHBOX_LISTENERS          = 139;
-    private static final int AUTO_LOGIN                          = 140;
-    private static final int CLIENT_CERT_REQUEST                 = 141;
-    private static final int SEARCHBOX_IS_SUPPORTED_CALLBACK     = 142;
-    private static final int SEARCHBOX_DISPATCH_COMPLETE_CALLBACK= 143;
+    // Message IDs
+    private static final int PAGE_STARTED                         = 100;
+    private static final int RECEIVED_ICON                        = 101;
+    private static final int RECEIVED_TITLE                       = 102;
+    private static final int OVERRIDE_URL                         = 103;
+    private static final int AUTH_REQUEST                         = 104;
+    private static final int SSL_ERROR                            = 105;
+    private static final int PROGRESS                             = 106;
+    private static final int UPDATE_VISITED                       = 107;
+    private static final int LOAD_RESOURCE                        = 108;
+    private static final int CREATE_WINDOW                        = 109;
+    private static final int CLOSE_WINDOW                         = 110;
+    private static final int SAVE_PASSWORD                        = 111;
+    private static final int JS_ALERT                             = 112;
+    private static final int JS_CONFIRM                           = 113;
+    private static final int JS_PROMPT                            = 114;
+    private static final int JS_UNLOAD                            = 115;
+    private static final int ASYNC_KEYEVENTS                      = 116;
+    private static final int DOWNLOAD_FILE                        = 118;
+    private static final int REPORT_ERROR                         = 119;
+    private static final int RESEND_POST_DATA                     = 120;
+    private static final int PAGE_FINISHED                        = 121;
+    private static final int REQUEST_FOCUS                        = 122;
+    private static final int SCALE_CHANGED                        = 123;
+    private static final int RECEIVED_CERTIFICATE                 = 124;
+    private static final int SWITCH_OUT_HISTORY                   = 125;
+    private static final int EXCEEDED_DATABASE_QUOTA              = 126;
+    private static final int REACHED_APPCACHE_MAXSIZE             = 127;
+    private static final int JS_TIMEOUT                           = 128;
+    private static final int ADD_MESSAGE_TO_CONSOLE               = 129;
+    private static final int GEOLOCATION_PERMISSIONS_SHOW_PROMPT  = 130;
+    private static final int GEOLOCATION_PERMISSIONS_HIDE_PROMPT  = 131;
+    private static final int RECEIVED_TOUCH_ICON_URL              = 132;
+    private static final int GET_VISITED_HISTORY                  = 133;
+    private static final int OPEN_FILE_CHOOSER                    = 134;
+    private static final int ADD_HISTORY_ITEM                     = 135;
+    private static final int HISTORY_INDEX_CHANGED                = 136;
+    private static final int AUTH_CREDENTIALS                     = 137;
+    private static final int SET_INSTALLABLE_WEBAPP               = 138;
+    private static final int NOTIFY_SEARCHBOX_LISTENERS           = 139;
+    private static final int AUTO_LOGIN                           = 140;
+    private static final int CLIENT_CERT_REQUEST                  = 141;
+    private static final int SEARCHBOX_IS_SUPPORTED_CALLBACK      = 142;
+    private static final int SEARCHBOX_DISPATCH_COMPLETE_CALLBACK = 143;
+    private static final int PROCEEDED_AFTER_SSL_ERROR            = 144;
 
     // Message triggered by the client to resume execution
-    private static final int NOTIFY                              = 200;
+    private static final int NOTIFY                               = 200;
 
     // Result transportation object for returning results across thread
     // boundaries.
@@ -349,6 +350,13 @@
                 }
                 break;
 
+            case PROCEEDED_AFTER_SSL_ERROR:
+                if (mWebViewClient != null) {
+                    mWebViewClient.onProceededAfterSslError(mWebView,
+                            (SslError) msg.obj);
+                }
+                break;
+
             case CLIENT_CERT_REQUEST:
                 if (mWebViewClient != null) {
                     HashMap<String, Object> map =
@@ -1024,6 +1032,15 @@
         sendMessage(msg);
     }
 
+    public void onProceededAfterSslError(SslError error) {
+        if (mWebViewClient == null) {
+            return;
+        }
+        Message msg = obtainMessage(PROCEEDED_AFTER_SSL_ERROR);
+        msg.obj = error;
+        sendMessage(msg);
+    }
+
     public void onReceivedClientCertRequest(ClientCertRequestHandler handler, String host_and_port) {
         // Do an unsynchronized quick check to avoid posting if no callback has
         // been set.
diff --git a/core/java/android/webkit/WebViewClient.java b/core/java/android/webkit/WebViewClient.java
index d3be2bf..81de356 100644
--- a/core/java/android/webkit/WebViewClient.java
+++ b/core/java/android/webkit/WebViewClient.java
@@ -186,11 +186,11 @@
     }
 
     /**
-     * Notify the host application to handle a SSL certificate error request
-     * (display the error to the user and ask whether to proceed or not). The
-     * host application has to call either handler.cancel() or handler.proceed()
-     * as the connection is suspended and waiting for the response. The default
-     * behavior is to cancel the load.
+     * Notify the host application that an SSL error occurred while loading a
+     * resource. The host application must call either handler.cancel() or
+     * handler.proceed(). Note that the decision may be retained for use in
+     * response to future SSL errors. The default behavior is to cancel the
+     * load.
      *
      * @param view The WebView that is initiating the callback.
      * @param handler An SslErrorHandler object that will handle the user's
@@ -203,6 +203,15 @@
     }
 
     /**
+     * Notify the host application that an SSL error occurred while loading a
+     * resource, but the WebView but chose to proceed anyway based on a
+     * decision retained from a previous response to onReceivedSslError().
+     * @hide
+     */
+    public void onProceededAfterSslError(WebView view, SslError error) {
+    }
+
+    /**
      * Notify the host application to handle a SSL client certificate
      * request (display the request to the user and ask whether to
      * proceed with a client certificate or not). The host application