// 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} */ 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} * @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, }; });