blob: ddc023ed1afde64dfbb79e46e7f0c733e9734664 [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* @fileoverview certificate-subentry represents an SSL certificate sub-entry.
*/
Polymer({
is: 'certificate-subentry',
behaviors: [I18nBehavior],
properties: {
/** @type {!CertificateSubnode} */
model: Object,
/** @type {!CertificateType} */
certificateType: String,
},
/** @private {certificate_manager.CertificatesBrowserProxy} */
browserProxy_: null,
/** @override */
created: function() {
this.browserProxy_ =
certificate_manager.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 {!CertificateAction} action
* @private
*/
dispatchCertificateActionEvent_: function(action) {
this.fire(
CertificateActionEvent,
/** @type {!CertificateActionEventDetail} */ ({
action: action,
subnode: this.model,
certificateType: this.certificateType,
anchor: this.$.dots,
}));
},
/**
* Handles the case where a call to the browser resulted in a rejected
* promise.
* @param {*} error Expects {?CertificatesError}.
* @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: error, anchor: this.$.dots});
},
/**
* @param {!Event} event
* @private
*/
onViewTap_: function(event) {
this.closePopupMenu_();
this.browserProxy_.viewCertificate(this.model.id);
},
/**
* @param {!Event} event
* @private
*/
onEditTap_: function(event) {
this.closePopupMenu_();
this.dispatchCertificateActionEvent_(CertificateAction.EDIT);
},
/**
* @param {!Event} event
* @private
*/
onDeleteTap_: function(event) {
this.closePopupMenu_();
this.dispatchCertificateActionEvent_(CertificateAction.DELETE);
},
/**
* @param {!Event} event
* @private
*/
onExportTap_: function(event) {
this.closePopupMenu_();
if (this.certificateType == CertificateType.PERSONAL) {
this.browserProxy_.exportPersonalCertificate(this.model.id).then(() => {
this.dispatchCertificateActionEvent_(CertificateAction.EXPORT_PERSONAL);
}, this.onRejected_.bind(this));
} else {
this.browserProxy_.exportCertificate(this.model.id);
}
},
/**
* @param {!CertificateType} certificateType
* @param {!CertificateSubnode} model
* @return {boolean} Whether the certificate can be edited.
* @private
*/
canEdit_: function(certificateType, model) {
return certificateType == CertificateType.CA && !model.policy;
},
/**
* @param {!CertificateType} certificateType
* @param {!CertificateSubnode} model
* @return {boolean} Whether the certificate can be exported.
* @private
*/
canExport_: function(certificateType, model) {
if (certificateType == CertificateType.PERSONAL) {
return model.extractable;
}
return true;
},
/**
* @param {!CertificateSubnode} model
* @return {boolean} Whether the certificate can be deleted.
* @private
*/
canDelete_: function(model) {
return !model.readonly && !model.policy;
},
/** @private */
closePopupMenu_: function() {
this.$$('cr-action-menu').close();
},
/** @private */
onDotsTap_: function() {
const actionMenu = /** @type {!CrActionMenuElement} */ (this.$.menu.get());
actionMenu.showAt(this.$.dots);
},
/** @private */
getPolicyIndicatorType_: function(model) {
return model.policy ? CrPolicyIndicatorType.USER_POLICY :
CrPolicyIndicatorType.NONE;
},
});