blob: fa59087eda7fc000f5a639394907f4502139ddd1 [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.
cr.define('extensions', function() {
'use strict';
/** @interface */
class PackDialogDelegate {
/**
* Opens a file browser for the user to select the root directory.
* @return {Promise<string>} A promise that is resolved with the path the
* user selected.
*/
choosePackRootDirectory() {}
/**
* Opens a file browser for the user to select the private key file.
* @return {Promise<string>} A promise that is resolved with the path the
* user selected.
*/
choosePrivateKeyPath() {}
/**
* Packs the extension into a .crx.
* @param {string} rootPath
* @param {string} keyPath
* @param {number=} flag
* @param {function(chrome.developerPrivate.PackDirectoryResponse)=}
* callback
*/
packExtension(rootPath, keyPath, flag, callback) {}
}
const PackDialog = Polymer({
is: 'extensions-pack-dialog',
properties: {
/** @type {extensions.PackDialogDelegate} */
delegate: Object,
/** @private */
packDirectory_: {
type: String,
value: '', // Initialized to trigger binding when attached.
},
/** @private */
keyFile_: String,
/** @private {?chrome.developerPrivate.PackDirectoryResponse} */
lastResponse_: Object,
},
/** @override */
attached: function() {
this.$.dialog.showModal();
},
/** @private */
onRootBrowse_: function() {
this.delegate.choosePackRootDirectory().then(path => {
if (path)
this.set('packDirectory_', path);
});
},
/** @private */
onKeyBrowse_: function() {
this.delegate.choosePrivateKeyPath().then(path => {
if (path)
this.set('keyFile_', path);
});
},
/** @private */
onCancelTap_: function() {
this.$.dialog.cancel();
},
/** @private */
onConfirmTap_: function() {
this.delegate.packExtension(
this.packDirectory_, this.keyFile_, 0,
this.onPackResponse_.bind(this));
},
/**
* @param {chrome.developerPrivate.PackDirectoryResponse} response the
* response from request to pack an extension.
* @private
*/
onPackResponse_: function(response) {
this.lastResponse_ = response;
},
/**
* In the case that the alert dialog was a success message, the entire
* pack-dialog should close. Otherwise, we detach the alert by setting
* lastResponse_ null. Additionally, if the user selected "proceed anyway"
* in the dialog, we pack the extension again with override flags.
* @param {!Event} e
* @private
*/
onAlertClose_: function(e) {
e.stopPropagation();
if (this.lastResponse_.status ==
chrome.developerPrivate.PackStatus.SUCCESS) {
this.$.dialog.close();
return;
}
// This is only possible for a warning dialog.
if (this.$$('extensions-pack-dialog-alert').returnValue == 'success') {
this.delegate.packExtension(
this.lastResponse_.item_path, this.lastResponse_.pem_path,
this.lastResponse_.override_flags, this.onPackResponse_.bind(this));
}
this.lastResponse_ = null;
},
});
return {PackDialog: PackDialog, PackDialogDelegate: PackDialogDelegate};
});