Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(78)

Side by Side Diff: chrome/android/java/src/org/chromium/chrome/browser/WebsiteSettingsPopup.java

Issue 330583002: Plausible fix for crash in GetCertificateChain. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | chrome/browser/ui/android/website_settings_popup_android.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package org.chromium.chrome.browser; 5 package org.chromium.chrome.browser;
6 6
7 import android.app.Dialog; 7 import android.app.Dialog;
8 import android.content.Context; 8 import android.content.Context;
9 import android.content.DialogInterface; 9 import android.content.DialogInterface;
10 import android.content.Intent; 10 import android.content.Intent;
11 import android.graphics.Color; 11 import android.graphics.Color;
12 import android.provider.Browser; 12 import android.provider.Browser;
13 import android.text.Html; 13 import android.text.Html;
14 import android.text.TextUtils; 14 import android.text.TextUtils;
15 import android.view.LayoutInflater; 15 import android.view.LayoutInflater;
16 import android.view.View; 16 import android.view.View;
17 import android.view.View.OnClickListener; 17 import android.view.View.OnClickListener;
18 import android.view.ViewGroup.LayoutParams; 18 import android.view.ViewGroup.LayoutParams;
19 import android.view.Window; 19 import android.view.Window;
20 import android.widget.ImageView; 20 import android.widget.ImageView;
21 import android.widget.LinearLayout; 21 import android.widget.LinearLayout;
22 import android.widget.ScrollView; 22 import android.widget.ScrollView;
23 import android.widget.TextView; 23 import android.widget.TextView;
24 24
25 import org.chromium.base.CalledByNative; 25 import org.chromium.base.CalledByNative;
26 import org.chromium.chrome.R; 26 import org.chromium.chrome.R;
27 import org.chromium.content.browser.ContentViewCore; 27 import org.chromium.content_public.browser.WebContents;
28 28
29 import java.net.URISyntaxException; 29 import java.net.URISyntaxException;
30 30
31 /** 31 /**
32 * Java side of Android implementation of the website settings UI. 32 * Java side of Android implementation of the website settings UI.
33 */ 33 */
34 class WebsiteSettingsPopup implements OnClickListener { 34 public class WebsiteSettingsPopup implements OnClickListener {
35 private static final String HELP_URL = 35 private static final String HELP_URL =
36 "http://www.google.com/support/chrome/bin/answer.py?answer=95617"; 36 "http://www.google.com/support/chrome/bin/answer.py?answer=95617";
37 private final Context mContext; 37 private final Context mContext;
38 private final Dialog mDialog; 38 private final Dialog mDialog;
39 private final LinearLayout mContainer; 39 private final LinearLayout mContainer;
40 private final ContentViewCore mContentViewCore; 40 private final WebContents mWebContents;
41 private final int mPadding; 41 private final int mPadding;
42 private TextView mCertificateViewer, mMoreInfoLink; 42 private TextView mCertificateViewer, mMoreInfoLink;
43 private String mLinkUrl; 43 private String mLinkUrl;
44 44
45 private WebsiteSettingsPopup(Context context, ContentViewCore contentViewCor e, 45 private WebsiteSettingsPopup(Context context, WebContents webContents) {
46 final long nativeWebsiteSettingsPopup) {
47 mContext = context; 46 mContext = context;
47 mWebContents = webContents;
48
49 mContainer = new LinearLayout(mContext);
50 mContainer.setOrientation(LinearLayout.VERTICAL);
51 mPadding = (int) context.getResources().getDimension(R.dimen.certificate _viewer_padding);
52 mContainer.setPadding(mPadding, 0, mPadding, 0);
53
48 mDialog = new Dialog(mContext); 54 mDialog = new Dialog(mContext);
49 mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE); 55 mDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
50 mDialog.setCanceledOnTouchOutside(true); 56 mDialog.setCanceledOnTouchOutside(true);
51 mDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { 57 // This needs to come after other member initialization.
58 final long nativeWebsiteSettingsPopup = nativeInit(this, webContents);
59 mDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
52 @Override 60 @Override
53 public void onCancel(DialogInterface dialogInterface) { 61 public void onDismiss(DialogInterface dialog) {
54 assert nativeWebsiteSettingsPopup != 0; 62 assert nativeWebsiteSettingsPopup != 0;
55 nativeDestroy(nativeWebsiteSettingsPopup); 63 nativeDestroy(nativeWebsiteSettingsPopup);
56 } 64 }
57 }); 65 });
58 mContainer = new LinearLayout(mContext);
59 mContainer.setOrientation(LinearLayout.VERTICAL);
60 mContentViewCore = contentViewCore;
61 mPadding = (int) context.getResources().getDimension(R.dimen.certificate _viewer_padding);
62 mContainer.setPadding(mPadding, 0, mPadding, 0);
63 } 66 }
64 67
65 /** Adds a section, which contains an icon, a headline, and a description. * / 68 /** Adds a section, which contains an icon, a headline, and a description. * /
66 @CalledByNative 69 @CalledByNative
67 private void addSection(int enumeratedIconId, String headline, String descri ption) { 70 private void addSection(int enumeratedIconId, String headline, String descri ption) {
68 View section = LayoutInflater.from(mContext).inflate(R.layout.website_se ttings, null); 71 View section = LayoutInflater.from(mContext).inflate(R.layout.website_se ttings, null);
69 ImageView i = (ImageView) section.findViewById(R.id.website_settings_ico n); 72 ImageView i = (ImageView) section.findViewById(R.id.website_settings_ico n);
70 int drawableId = ResourceId.mapToDrawableId(enumeratedIconId); 73 int drawableId = ResourceId.mapToDrawableId(enumeratedIconId);
71 i.setImageResource(drawableId); 74 i.setImageResource(drawableId);
72 75
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
111 mMoreInfoLink = new TextView(mContext); 114 mMoreInfoLink = new TextView(mContext);
112 mLinkUrl = url; 115 mLinkUrl = url;
113 mMoreInfoLink.setText(Html.fromHtml("<a href='#'>" + label + "</a>")); 116 mMoreInfoLink.setText(Html.fromHtml("<a href='#'>" + label + "</a>"));
114 mMoreInfoLink.setPadding(0, mPadding, 0, mPadding); 117 mMoreInfoLink.setPadding(0, mPadding, 0, mPadding);
115 mMoreInfoLink.setOnClickListener(this); 118 mMoreInfoLink.setOnClickListener(this);
116 mContainer.addView(mMoreInfoLink); 119 mContainer.addView(mMoreInfoLink);
117 } 120 }
118 121
119 /** Displays the WebsiteSettingsPopup. */ 122 /** Displays the WebsiteSettingsPopup. */
120 @CalledByNative 123 @CalledByNative
121 private void show() { 124 private void showDialog() {
122 ScrollView scrollView = new ScrollView(mContext); 125 ScrollView scrollView = new ScrollView(mContext);
123 scrollView.addView(mContainer); 126 scrollView.addView(mContainer);
124 mDialog.addContentView(scrollView, 127 mDialog.addContentView(scrollView,
125 new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PA RENT, 128 new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PA RENT,
126 LinearLayout.LayoutParams.MATCH_PARENT)); 129 LinearLayout.LayoutParams.MATCH_PARENT));
127 mDialog.show(); 130 mDialog.show();
128 } 131 }
129 132
130 @Override 133 @Override
131 public void onClick(View v) { 134 public void onClick(View v) {
132 mDialog.dismiss(); 135 mDialog.dismiss();
133 if (mCertificateViewer == v) { 136 if (mCertificateViewer == v) {
134 byte[][] certChain = nativeGetCertificateChain(mContentViewCore); 137 byte[][] certChain = nativeGetCertificateChain(mWebContents);
138 if (certChain == null) {
139 // The WebContents may have been destroyed/invalidated. If so,
140 // ignore this request.
141 return;
142 }
135 CertificateViewer.showCertificateChain(mContext, certChain); 143 CertificateViewer.showCertificateChain(mContext, certChain);
136 } else if (mMoreInfoLink == v) { 144 } else if (mMoreInfoLink == v) {
137 try { 145 try {
138 Intent i = Intent.parseUri(mLinkUrl, Intent.URI_INTENT_SCHEME); 146 Intent i = Intent.parseUri(mLinkUrl, Intent.URI_INTENT_SCHEME);
139 i.putExtra(Browser.EXTRA_CREATE_NEW_TAB, true); 147 i.putExtra(Browser.EXTRA_CREATE_NEW_TAB, true);
140 i.putExtra(Browser.EXTRA_APPLICATION_ID, mContext.getPackageName ()); 148 i.putExtra(Browser.EXTRA_APPLICATION_ID, mContext.getPackageName ());
141 mContext.startActivity(i); 149 mContext.startActivity(i);
142 } catch (URISyntaxException ex) {} 150 } catch (URISyntaxException ex) {}
143 } 151 }
144 } 152 }
145 153
146 @CalledByNative 154 /**
147 private static WebsiteSettingsPopup create(Context context, ContentViewCore contentViewCore, 155 * Shows a WebsiteSettings dialog for the provided WebContents.
148 long nativeWebsiteSettingsPopup) { 156 *
149 return new WebsiteSettingsPopup(context, contentViewCore, nativeWebsiteS ettingsPopup); 157 * The popup adds itself to the view hierarchy which owns the reference whil e it's
158 * visible.
159 *
160 * @param context Context which is used for launching a dialog.
161 * @param webContents The WebContents for which to show Website information. This
162 * information is retrieved for the visible entry.
163 */
164 @SuppressWarnings("unused")
165 public static void show(Context context, WebContents webContents) {
166 new WebsiteSettingsPopup(context, webContents);
150 } 167 }
151 168
169 private static native long nativeInit(WebsiteSettingsPopup popup, WebContent s webContents);
152 private native void nativeDestroy(long nativeWebsiteSettingsPopupAndroid); 170 private native void nativeDestroy(long nativeWebsiteSettingsPopupAndroid);
153 private native byte[][] nativeGetCertificateChain(ContentViewCore contentVie wCore); 171 private native byte[][] nativeGetCertificateChain(WebContents webContents);
154 } 172 }
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/ui/android/website_settings_popup_android.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698