blob: c740d566ea38bde1a522101ffc81e0e6c1c87d9e [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 KeyboardShortcutDelegate {
/**
* Called when shortcut capturing changes in order to suspend or re-enable
* global shortcut handling. This is important so that the shortcuts aren't
* processed normally as the user types them.
* TODO(devlin): From very brief experimentation, it looks like preventing
* the default handling on the event also does this. Investigate more in the
* future.
* @param {boolean} isCapturing
*/
setShortcutHandlingSuspended(isCapturing) {}
/**
* Updates an extension command's keybinding.
* @param {string} extensionId
* @param {string} commandName
* @param {string} keybinding
*/
updateExtensionCommandKeybinding(extensionId, commandName, keybinding) {}
/**
* Updates an extension command's scope.
* @param {string} extensionId
* @param {string} commandName
* @param {chrome.developerPrivate.CommandScope} scope
*/
updateExtensionCommandScope(extensionId, commandName, scope) {}
}
// The UI to display and manage keyboard shortcuts set for extension commands.
const KeyboardShortcuts = Polymer({
is: 'extensions-keyboard-shortcuts',
behaviors: [CrContainerShadowBehavior, extensions.ItemBehavior],
properties: {
/** @type {!extensions.KeyboardShortcutDelegate} */
delegate: Object,
/** @type {Array<!chrome.developerPrivate.ExtensionInfo>} */
items: Array,
/**
* Proxying the enum to be used easily by the html template.
* @private
*/
CommandScope_: {
type: Object,
value: chrome.developerPrivate.CommandScope,
},
},
listeners: {
'view-enter-start': 'onViewEnter_',
},
/** @private */
onViewEnter_: function() {
chrome.metricsPrivate.recordUserAction('Options_ExtensionCommands');
},
/**
* @return {!Array<!chrome.developerPrivate.ExtensionInfo>}
* @private
*/
calculateShownItems_: function() {
return this.items.filter(function(item) {
return item.commands.length > 0;
});
},
/**
* A polymer bug doesn't allow for databinding of a string property as a
* boolean, but it is correctly interpreted from a function.
* Bug: https://github.com/Polymer/polymer/issues/3669
* @param {string} keybinding
* @return {boolean}
* @private
*/
hasKeybinding_: function(keybinding) {
return !!keybinding;
},
/**
* Determines whether to disable the dropdown menu for the command's scope.
* @param {!chrome.developerPrivate.Command} command
* @return {boolean}
* @private
*/
computeScopeDisabled_: function(command) {
return command.isExtensionAction || !command.isActive;
},
/**
* This function exists to force trigger an update when CommandScope_
* becomes available.
* @param {string} scope
* @return {string}
*/
triggerScopeChange_: function(scope) {
return scope;
},
/** @private */
onCloseButtonClick_: function() {
this.fire('close');
},
/**
* @param {!{target: HTMLSelectElement, model: Object}} event
* @private
*/
onScopeChanged_: function(event) {
this.delegate.updateExtensionCommandScope(
event.model.get('item.id'), event.model.get('command.name'),
/** @type {chrome.developerPrivate.CommandScope} */
(event.target.value));
},
});
return {
KeyboardShortcutDelegate: KeyboardShortcutDelegate,
KeyboardShortcuts: KeyboardShortcuts,
};
});