| Index: content/browser/ssl/ssl_manager.cc
|
| diff --git a/content/browser/ssl/ssl_manager.cc b/content/browser/ssl/ssl_manager.cc
|
| index a4b1b910fa00ff53b33e4a96986804608b44ad7d..b50f3a10290849ad63c962124d48243813130ab5 100644
|
| --- a/content/browser/ssl/ssl_manager.cc
|
| +++ b/content/browser/ssl/ssl_manager.cc
|
| @@ -96,6 +96,10 @@ class SSLManagerSet : public base::SupportsUserData::Data {
|
| DISALLOW_COPY_AND_ASSIGN(SSLManagerSet);
|
| };
|
|
|
| +// On Android, HandleSSLErrorOnUI can cause a Java exception to be thrown - in
|
| +// such a case we cannot allow calls back into Java afterwards. Make sure that
|
| +// nothing calls into Java after calling this method - the easiest way to do so
|
| +// is to post this as a separate task.
|
| void HandleSSLErrorOnUI(
|
| const base::Callback<WebContents*(void)>& web_contents_getter,
|
| const base::WeakPtr<SSLErrorHandler::Delegate>& delegate,
|
| @@ -125,6 +129,9 @@ void HandleSSLErrorOnUI(
|
|
|
| SSLManager* manager = controller->ssl_manager();
|
| manager->OnCertError(std::move(handler));
|
| + // On Android, OnCertError can cause a Java exception to be thrown - in such a
|
| + // case we cannot allow calls back into Java here. If adding any additional
|
| + // code here, make sure it cannot call into Java.
|
| }
|
|
|
| } // namespace
|
| @@ -310,6 +317,9 @@ void SSLManager::OnCertError(std::unique_ptr<SSLErrorHandler> handler) {
|
| if (expired_previous_decision)
|
| options_mask |= EXPIRED_PREVIOUS_DECISION;
|
| OnCertErrorInternal(std::move(handler), options_mask);
|
| + // On Android, OnCertErrorInternal can cause a Java exception to be thrown
|
| + // - in such a case we cannot allow calls back into Java here. If adding
|
| + // any additional code here, make sure it cannot call into Java.
|
| break;
|
| case net::ERR_CERT_NO_REVOCATION_MECHANISM:
|
| // Ignore this error.
|
| @@ -330,6 +340,9 @@ void SSLManager::OnCertError(std::unique_ptr<SSLErrorHandler> handler) {
|
| if (expired_previous_decision)
|
| options_mask |= EXPIRED_PREVIOUS_DECISION;
|
| OnCertErrorInternal(std::move(handler), options_mask);
|
| + // On Android, OnCertErrorInternal can cause a Java exception to be thrown
|
| + // - in such a case we cannot allow calls back into Java here. If adding
|
| + // any additional code here, make sure it cannot call into Java.
|
| break;
|
| default:
|
| NOTREACHED();
|
| @@ -399,6 +412,9 @@ void SSLManager::OnCertErrorInternal(std::unique_ptr<SSLErrorHandler> handler,
|
| web_contents, cert_error, ssl_info, request_url, resource_type,
|
| overridable, strict_enforcement, expired_previous_decision,
|
| base::Bind(&OnAllowCertificateWithRecordDecision, true, callback));
|
| + // On Android, AllowCertificateError can cause a Java exception to be thrown
|
| + // - in such a case we cannot allow calls back into Java here. If adding any
|
| + // additional code here, make sure it cannot call into Java.
|
| }
|
|
|
| void SSLManager::UpdateEntry(NavigationEntryImpl* entry,
|
|
|