Index: chrome/browser/resources/settings/certificate_manager_page/certificate_subentry.js |
diff --git a/chrome/browser/resources/settings/certificate_manager_page/certificate_subentry.js b/chrome/browser/resources/settings/certificate_manager_page/certificate_subentry.js |
index b750ebbb3cdf58cfd2ec6a43cb9cb40fda073123..07c2ab953f337890b43a564b57cb99f20a00ed18 100644 |
--- a/chrome/browser/resources/settings/certificate_manager_page/certificate_subentry.js |
+++ b/chrome/browser/resources/settings/certificate_manager_page/certificate_subentry.js |
@@ -6,6 +6,43 @@ |
* @fileoverview settings-certificate-subentry represents an SSL certificate |
* sub-entry. |
*/ |
+ |
+/** |
+ * The payload of the certificate-action event that is emitted from this |
+ * component. |
+ * @typedef {{ |
+ * action: !settings.CertificateAction, |
+ * subnode: !CertificateSubnode, |
+ * certificateType: !settings.CertificateType |
+ * }} |
+ */ |
+var CertificateActionEventDetail; |
+ |
+cr.define('settings', function() { |
+ /** |
+ * Enumeration of actions that require a popup menu to be shown to the user. |
+ * @enum {number} |
+ */ |
+ var CertificateAction = { |
+ DELETE: 0, |
+ EDIT: 1, |
+ EXPORT_PERSONAL: 2, |
+ IMPORT_CA: 3, |
+ IMPORT_PERSONAL: 4, |
+ }; |
+ |
+ /** |
+ * The name of the event that is fired when a menu item is tapped. |
+ * @type {string} |
+ */ |
+ var CertificateActionEvent = 'certificate-action'; |
+ |
+ return { |
+ CertificateAction: CertificateAction, |
+ CertificateActionEvent: CertificateActionEvent, |
+ }; |
+}); |
+ |
Polymer({ |
is: 'settings-certificate-subentry', |
@@ -21,11 +58,45 @@ Polymer({ |
browserProxy_: null, |
/** @override */ |
- ready: function() { |
+ created: function() { |
this.browserProxy_ = settings.CertificatesBrowserProxyImpl.getInstance(); |
}, |
/** |
+ * Dispatches an event indicating which certificate action was tapped. It is |
+ * used by the parent of this element to display a modal dialog accordingly. |
+ * @param {!settings.CertificateAction} action |
+ * @private |
+ */ |
+ dispatchCertificateActionEvent_: function(action) { |
+ this.fire( |
+ settings.CertificateActionEvent, |
+ /** @type {!CertificateActionEventDetail} */ ({ |
+ action: action, |
+ subnode: this.model, |
+ certificateType: this.certificateType, |
+ })); |
+ }, |
+ |
+ /** |
+ * Handles the case where a call to the browser resulted in a rejected |
+ * promise. |
+ * @param {null|!CertificatesError|!CertificatesImportError} error |
+ * @private |
+ */ |
+ onRejected_: function(error) { |
+ if (error === null) { |
+ // Nothing to do here. Null indicates that the user clicked "cancel" on |
+ // the native file chooser dialog. |
+ return; |
+ } |
+ |
+ // Otherwise propagate the error to the parents, such that a dialog |
+ // displaying the error will be shown. |
+ this.fire('certificates-error', error); |
+ }, |
+ |
+ /** |
* @param {!Event} event |
* @private |
*/ |
@@ -40,7 +111,7 @@ Polymer({ |
*/ |
onEditTap_: function(event) { |
this.closePopupMenu_(); |
- // TODO(dpapad): Open edit dialog. |
+ this.dispatchCertificateActionEvent_(settings.CertificateAction.EDIT); |
}, |
/** |
@@ -49,7 +120,7 @@ Polymer({ |
*/ |
onDeleteTap_: function(event) { |
this.closePopupMenu_(); |
- // TODO(dpapad): Open delete confirmation dialog. |
+ this.dispatchCertificateActionEvent_(settings.CertificateAction.DELETE); |
}, |
/** |
@@ -59,7 +130,12 @@ Polymer({ |
onExportTap_: function(event) { |
this.closePopupMenu_(); |
if (this.certificateType == settings.CertificateType.PERSONAL) { |
- // TODO(dpapad): Open password encryption dialog. |
+ this.browserProxy_.exportPersonalCertificate(this.model.id).then( |
+ function() { |
+ this.dispatchCertificateActionEvent_( |
+ settings.CertificateAction.EXPORT_PERSONAL); |
+ }.bind(this), |
+ this.onRejected_.bind(this)); |
} else { |
this.browserProxy_.exportCertificate(this.model.id); |
} |
@@ -73,16 +149,21 @@ Polymer({ |
this.browserProxy_.importPersonalCertificate(false).then( |
function(showPasswordPrompt) { |
if (showPasswordPrompt) { |
- // TODO(dpapad): Show password decryption dialog. |
+ this.dispatchCertificateActionEvent_( |
+ settings.CertificateAction.IMPORT_PERSONAL); |
} |
- }.bind(this)); |
+ }.bind(this), |
+ this.onRejected_.bind(this)); |
} else if (this.certificateType == settings.CertificateType.CA) { |
this.browserProxy_.importCaCertificate().then( |
function(certificateName) { |
- // TODO(dpapad): Show import dialog. |
- }.bind(this)); |
+ this.dispatchCertificateActionEvent_( |
+ settings.CertificateAction.IMPORT_CA); |
+ }.bind(this), |
+ this.onRejected_.bind(this)); |
} else if (this.certificateType == settings.CertificateType.SERVER) { |
- this.browserProxy_.importServerCertificate(); |
+ this.browserProxy_.importServerCertificate().catch( |
+ this.onRejected_.bind(this)); |
} |
}, |