// Copyright 2015 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/page_info/android/connection_info_view_android.h"
#include "base/android/jni_android.h"
#include "base/android/jni_array.h"
#include "base/android/jni_string.h"
#include "components/page_info/android/page_info_client.h"
#include "components/page_info/page_info.h"
#include "components/page_info/page_info_delegate.h"
#include "components/page_info/page_info_ui_delegate.h"
#include "components/security_state/core/security_state.h"
#include "components/strings/grit/components_strings.h"
#include "content/public/browser/browser_context.h"
#include "content/public/browser/navigation_controller.h"
#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/ssl_status.h"
#include "content/public/browser/web_contents.h"
#include "net/cert/x509_certificate.h"
#include "ui/base/l10n/l10n_util.h"
// Must come after all headers that specialize FromJniType() / ToJniType().
#include "components/page_info/android/jni_headers/ConnectionInfoView_jni.h"
using base::android::CheckException;
using base::android::ConvertUTF16ToJavaString;
using base::android::ConvertUTF8ToJavaString;
using base::android::GetClass;
using base::android::JavaParamRef;
using base::android::ScopedJavaLocalRef;
using content::WebContents;
// static
static jlong JNI_ConnectionInfoView_Init(
JNIEnv* env,
const JavaParamRef<jobject>& obj,
const JavaParamRef<jobject>& java_web_contents) {
content::WebContents* web_contents =
content::WebContents::FromJavaWebContents(java_web_contents);
DCHECK(web_contents);
return reinterpret_cast<intptr_t>(
new ConnectionInfoViewAndroid(env, obj, web_contents));
}
ConnectionInfoViewAndroid::ConnectionInfoViewAndroid(
JNIEnv* env,
jobject java_page_info_pop,
WebContents* web_contents) {
page_info_client_ = page_info::GetPageInfoClient();
DCHECK(page_info_client_);
// Important to use GetVisibleEntry to match what's showing in the omnibox.
content::NavigationEntry* nav_entry =
web_contents->GetController().GetVisibleEntry();
if (nav_entry->IsInitialEntry())
return;
popup_jobject_.Reset(env, java_page_info_pop);
presenter_ = std::make_unique<PageInfo>(
page_info_client_->CreatePageInfoDelegate(web_contents), web_contents,
nav_entry->GetURL());
presenter_->InitializeUiState(this, base::DoNothing());
}
ConnectionInfoViewAndroid::~ConnectionInfoViewAndroid() {}
void ConnectionInfoViewAndroid::Destroy(JNIEnv* env,
const JavaParamRef<jobject>& obj) {
delete this;
}
void ConnectionInfoViewAndroid::ResetCertDecisions(
JNIEnv* env,
const JavaParamRef<jobject>& obj,
const JavaParamRef<jobject>& java_web_contents) {
presenter_->OnRevokeSSLErrorBypassButtonPressed();
}
void ConnectionInfoViewAndroid::SetIdentityInfo(
const IdentityInfo& identity_info) {
JNIEnv* env = base::android::AttachCurrentThread();
{
int icon_id = page_info_client_->GetJavaResourceId(
PageInfoUI::GetIdentityIconID(identity_info.identity_status));
int icon_color_id = page_info_client_->GetJavaResourceId(
PageInfoUI::GetIdentityIconColorID(identity_info.identity_status));
// The headline and the certificate dialog link of the site's identity
// section is only displayed if the site's identity was verified. If the
// site's identity was verified, then the headline contains the organization
// name from the provided certificate. If the organization name is not
// available than the hostname of the site is used instead.
std::string headline;
if (identity_info.certificate) {
headline = identity_info.site_identity;
}
ScopedJavaLocalRef<jstring> description = ConvertUTF8ToJavaString(
env, identity_info.identity_status_description_android);
std::u16string certificate_label;
// Only show the certificate viewer link if the connection actually used a
// certificate.
if (identity_info.identity_status !=
PageInfo::SITE_IDENTITY_STATUS_NO_CERT) {
certificate_label =
l10n_util::GetStringUTF16(IDS_PAGE_INFO_CERT_INFO_BUTTON);
}
Java_ConnectionInfoView_addCertificateSection(
env, popup_jobject_, icon_id, ConvertUTF8ToJavaString(env, headline),
description, ConvertUTF16ToJavaString(env, certificate_label),
icon_color_id);
if (identity_info.show_ssl_decision_revoke_button) {
std::u16string reset_button_label = l10n_util::GetStringUTF16(
IDS_PAGE_INFO_RESET_INVALID_CERTIFICATE_DECISIONS_BUTTON);
Java_ConnectionInfoView_addResetCertDecisionsButton(
env, popup_jobject_,
ConvertUTF16ToJavaString(env, reset_button_label));
}
}
{
ScopedJavaLocalRef<jstring> description = ConvertUTF8ToJavaString(
env, identity_info.connection_status_description);
Java_ConnectionInfoView_addDescriptionSection(
env, popup_jobject_, /*iconId=*/0, nullptr, description,
/*iconColorId=*/0);
}
Java_ConnectionInfoView_addMoreInfoLink(
env, popup_jobject_,
ConvertUTF8ToJavaString(
env, l10n_util::GetStringUTF8(IDS_PAGE_INFO_HELP_CENTER_LINK)));
Java_ConnectionInfoView_onReady(env, popup_jobject_);
}