Commit eed597a7 authored by Marcin Wiacek's avatar Marcin Wiacek Committed by Commit Bot

Eliminate showing few times Certificate Viewer

1. Open "Page Info" screen for HTTPS site
2. Click on "Details" link
3. Click on "Certificate information" link

Without patch: fast clicking on link from point 3 can
result in opening Certificate Viewer few times.

With patch: Certificate Viewer is showed once.

Change-Id: I3fd98b2e9d3be76c2743e47a2ab1e3c86e45abea
Reviewed-on: https://chromium-review.googlesource.com/1070202Reviewed-by: default avatarMaria Khomenko <mariakhomenko@chromium.org>
Commit-Queue: Marcin Wiącek <marcin@mwiacek.com>
Cr-Commit-Position: refs/heads/master@{#564827}
parent 4f8f44f2
......@@ -44,36 +44,39 @@ class CertificateViewer implements OnItemSelectedListener {
private static final int SUBJECTALTERNATIVENAME_IPADDRESS_ID = 7;
private final Context mContext;
private final ArrayList<LinearLayout> mViews;
private final ArrayList<String> mTitles;
private final int mPadding;
private ArrayList<String> mTitles;
private ArrayList<LinearLayout> mViews;
private CertificateFactory mCertificateFactory;
private Dialog mDialog;
private ScrollView mScrollView;
private Spinner mSpinner;
public CertificateViewer(Context context) {
mContext = context;
mPadding =
(int) context.getResources().getDimension(R.dimen.connection_info_padding_wide) / 2;
mDialog = null;
}
/**
* Show a dialog with the provided certificate information.
* Dialog will contain spinner allowing the user to select
* which certificate to display.
*
* @param context The context this view should display in.
* @param derData DER-encoded data representing a X509 certificate chain.
*/
public static void showCertificateChain(Context context, byte[][] derData) {
CertificateViewer viewer = new CertificateViewer(context);
viewer.showCertificateChain(derData);
}
public void showCertificateChain(byte[][] derData) {
if (mDialog != null && mDialog.isShowing()) {
return;
}
private CertificateViewer(Context context) {
mContext = context;
mViews = new ArrayList<LinearLayout>();
mTitles = new ArrayList<String>();
mPadding = (int) context.getResources().getDimension(
R.dimen.connection_info_padding_wide) / 2;
}
// Show information about an array of DER-encoded data representing a X509 certificate chain.
// A spinner will be displayed allowing the user to select which certificate to display.
private void showCertificateChain(byte[][] derData) {
mViews = new ArrayList<LinearLayout>();
for (int i = 0; i < derData.length; i++) {
addCertificate(derData[i]);
}
ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(mContext,
android.R.layout.simple_spinner_item,
mTitles) {
......@@ -99,14 +102,14 @@ class CertificateViewer implements OnItemSelectedListener {
title.setPadding(mPadding, mPadding, mPadding, mPadding / 2);
dialogContainer.addView(title);
Spinner spinner = new Spinner(mContext);
ApiCompatibilityUtils.setTextAlignment(spinner, View.TEXT_ALIGNMENT_VIEW_START);
spinner.setAdapter(arrayAdapter);
spinner.setOnItemSelectedListener(this);
spinner.setDropDownWidth(ViewGroup.LayoutParams.MATCH_PARENT);
mSpinner = new Spinner(mContext);
ApiCompatibilityUtils.setTextAlignment(mSpinner, View.TEXT_ALIGNMENT_VIEW_START);
mSpinner.setAdapter(arrayAdapter);
mSpinner.setOnItemSelectedListener(this);
mSpinner.setDropDownWidth(ViewGroup.LayoutParams.MATCH_PARENT);
// Remove padding so that dropdown has same width as the spinner.
spinner.setPadding(0, 0, 0, 0);
dialogContainer.addView(spinner);
mSpinner.setPadding(0, 0, 0, 0);
dialogContainer.addView(mSpinner);
LinearLayout certContainer = new LinearLayout(mContext);
certContainer.setOrientation(LinearLayout.VERTICAL);
......@@ -117,21 +120,16 @@ class CertificateViewer implements OnItemSelectedListener {
}
certContainer.addView(certificateView);
}
ScrollView scrollView = new ScrollView(mContext);
scrollView.addView(certContainer);
dialogContainer.addView(scrollView);
showDialogForView(dialogContainer);
}
mScrollView = new ScrollView(mContext);
mScrollView.addView(certContainer);
dialogContainer.addView(mScrollView);
// Displays a dialog with scrolling for the given view.
private void showDialogForView(View view) {
Dialog dialog = new Dialog(mContext);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.addContentView(view,
mDialog = new Dialog(mContext);
mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
mDialog.addContentView(dialogContainer,
new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT));
dialog.show();
mDialog.show();
}
private void addCertificate(byte[] derData) {
......
......@@ -45,7 +45,8 @@ public class ConnectionInfoPopup implements OnClickListener {
private final WebContents mWebContents;
private final int mPaddingWide, mPaddingThin;
private final long mNativeConnectionInfoPopup;
private TextView mCertificateViewer, mMoreInfoLink;
private final CertificateViewer mCertificateViewer;
private TextView mCertificateViewerTextView, mMoreInfoLink;
private ViewGroup mCertificateLayout, mDescriptionLayout;
private Button mResetCertDecisionsButton;
private String mLinkUrl;
......@@ -54,6 +55,8 @@ public class ConnectionInfoPopup implements OnClickListener {
mContext = context;
mWebContents = webContents;
mCertificateViewer = new CertificateViewer(mContext);
mContainer = new LinearLayout(mContext);
mContainer.setOrientation(LinearLayout.VERTICAL);
mContainer.setBackgroundColor(Color.WHITE);
......@@ -141,15 +144,15 @@ public class ConnectionInfoPopup implements OnClickListener {
}
private void setCertificateViewer(String label) {
assert mCertificateViewer == null;
mCertificateViewer = new TextView(mContext);
mCertificateViewer.setText(label);
mCertificateViewer.setTextColor(
assert mCertificateViewerTextView == null;
mCertificateViewerTextView = new TextView(mContext);
mCertificateViewerTextView.setText(label);
mCertificateViewerTextView.setTextColor(
ApiCompatibilityUtils.getColor(mContext.getResources(), R.color.google_blue_700));
mCertificateViewer.setTextSize(DESCRIPTION_TEXT_SIZE_SP);
mCertificateViewer.setOnClickListener(this);
mCertificateViewer.setPadding(0, mPaddingThin, 0, 0);
mCertificateLayout.addView(mCertificateViewer);
mCertificateViewerTextView.setTextSize(DESCRIPTION_TEXT_SIZE_SP);
mCertificateViewerTextView.setOnClickListener(this);
mCertificateViewerTextView.setPadding(0, mPaddingThin, 0, 0);
mCertificateLayout.addView(mCertificateViewerTextView);
}
@CalledByNative
......@@ -205,14 +208,14 @@ public class ConnectionInfoPopup implements OnClickListener {
if (mResetCertDecisionsButton == v) {
nativeResetCertDecisions(mNativeConnectionInfoPopup, mWebContents);
mDialog.dismiss();
} else if (mCertificateViewer == v) {
} else if (mCertificateViewerTextView == v) {
byte[][] certChain = CertificateChainHelper.getCertificateChain(mWebContents);
if (certChain == null) {
// The WebContents may have been destroyed/invalidated. If so,
// ignore this request.
return;
}
CertificateViewer.showCertificateChain(mContext, certChain);
mCertificateViewer.showCertificateChain(certChain);
} else if (mMoreInfoLink == v) {
mDialog.dismiss();
try {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment