Merge "When a page's main resource uses an invalid SSL certificate, reflect this in 'Page Info'"
diff --git a/src/com/android/browser/PageDialogsHandler.java b/src/com/android/browser/PageDialogsHandler.java
index 89c2745..013eaf1 100644
--- a/src/com/android/browser/PageDialogsHandler.java
+++ b/src/com/android/browser/PageDialogsHandler.java
@@ -244,9 +244,7 @@
         }
 
         mSSLCertificateView = tab;
-        // TODO: We should pass the certificate error for the page's main
-        // resource, if present. See http://b/5248376.
-        mSSLCertificateDialog = createSslCertificateDialog(cert, null)
+        mSSLCertificateDialog = createSslCertificateDialog(cert, tab.getSslCertificateError())
                 .setPositiveButton(R.string.ok,
                         new DialogInterface.OnClickListener() {
                             public void onClick(DialogInterface dialog,
diff --git a/src/com/android/browser/Tab.java b/src/com/android/browser/Tab.java
index 839280e..e948d01 100644
--- a/src/com/android/browser/Tab.java
+++ b/src/com/android/browser/Tab.java
@@ -210,9 +210,11 @@
         String mOriginalUrl;
         String mTitle;
         SecurityState mSecurityState;
+        // This is non-null only when mSecurityState is SECURITY_STATE_BAD_CERTIFICATE.
+        SslError mSslCertificateError;
         Bitmap mFavicon;
-        boolean mIsBookmarkedSite = false;
-        boolean mIncognito = false;
+        boolean mIsBookmarkedSite;
+        boolean mIncognito;
 
         PageState(Context c, boolean incognito) {
             mIncognito = incognito;
@@ -223,14 +225,12 @@
                 mOriginalUrl = mUrl = "";
                 mTitle = c.getString(R.string.new_tab);
             }
-            mFavicon = null;
             mSecurityState = SecurityState.SECURITY_STATE_NOT_SECURE;
         }
 
         PageState(Context c, boolean incognito, String url, Bitmap favicon) {
             mIncognito = incognito;
             mOriginalUrl = mUrl = url;
-            mTitle = null;
             if (URLUtil.isHttpsUrl(url)) {
                 mSecurityState = SecurityState.SECURITY_STATE_SECURE;
             } else {
@@ -925,6 +925,7 @@
             // In case we stop when loading an HTTPS page from an HTTP page
             // but before a provisional load occurred
             mCurrentState.mSecurityState = SecurityState.SECURITY_STATE_NOT_SECURE;
+            mCurrentState.mSslCertificateError = null;
         }
         mCurrentState.mIncognito = view.isPrivateBrowsingEnabled();
     }
@@ -1905,8 +1906,13 @@
         return mErrorConsole;
     }
 
+    /**
+     * Sets the security state, clears the SSL certificate error and informs
+     * the controller.
+     */
     private void setSecurityState(SecurityState securityState) {
         mCurrentState.mSecurityState = securityState;
+        mCurrentState.mSslCertificateError = null;
         mWebViewController.onUpdatedSecurityState(this);
     }
 
@@ -1917,6 +1923,15 @@
         return mCurrentState.mSecurityState;
     }
 
+    /**
+     * Gets the SSL certificate error, if any, for the page's main resource.
+     * This is only non-null when the security state is
+     * SECURITY_STATE_BAD_CERTIFICATE.
+     */
+    SslError getSslCertificateError() {
+        return mCurrentState.mSslCertificateError;
+    }
+
     int getLoadProgress() {
         if (mInPageLoad) {
             return mPageLoadProgress;
@@ -2278,7 +2293,10 @@
         if (error.getUrl().equals(mCurrentState.mUrl)) {
             // The security state should currently be SECURITY_STATE_SECURE.
             setSecurityState(SecurityState.SECURITY_STATE_BAD_CERTIFICATE);
+            mCurrentState.mSslCertificateError = error;
         } else if (getSecurityState() == SecurityState.SECURITY_STATE_SECURE) {
+            // The page's main resource is secure and this error is for a
+            // sub-resource.
             setSecurityState(SecurityState.SECURITY_STATE_MIXED);
         }
     }