Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1710)

Unified Diff: chrome/browser/resources/md_extensions/shortcut_input.js

Issue 2101933005: [MD Extensions] Implement keyboard shortcuts page (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: nits + latest master Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/resources/md_extensions/shortcut_input.js
diff --git a/chrome/browser/resources/md_extensions/shortcut_input.js b/chrome/browser/resources/md_extensions/shortcut_input.js
new file mode 100644
index 0000000000000000000000000000000000000000..e32cc6e256f17f76144f45562b478d004ec5d52f
--- /dev/null
+++ b/chrome/browser/resources/md_extensions/shortcut_input.js
@@ -0,0 +1,159 @@
+// 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';
+
+ // The UI to display and manage keyboard shortcuts set for extension commands.
+ var ShortcutInput = Polymer({
+ is: 'extensions-shortcut-input',
+
+ properties: {
+ item: {
+ type: String,
+ value: '',
+ },
+ commandName: {
+ type: String,
+ value: '',
+ },
+ shortcut: {
+ type: String,
+ value: '',
+ },
+ /** @private */
+ capturing_: {
+ type: Boolean,
+ value: false,
+ },
+ /** @private */
+ pendingShortcut_: {
+ type: String,
+ value: '',
+ },
+ },
+
+ behaviors: [I18nBehavior],
+
+ ready: function() {
+ var node = this.$['input'];
+ node.addEventListener('mouseup', this.startCapture_.bind(this));
+ node.addEventListener('blur', this.endCapture_.bind(this));
+ node.addEventListener('focus', this.startCapture_.bind(this));
+ node.addEventListener('keydown', this.onKeyDown_.bind(this));
+ node.addEventListener('keyup', this.onKeyUp_.bind(this));
+ },
+
+ /** @private */
+ startCapture_: function() {
+ if (this.capturing_)
+ return;
+ this.capturing_ = true;
+ this.fire('shortcut-capture-started');
+ },
+
+ /** @private */
+ endCapture_: function() {
+ if (!this.capturing_)
+ return;
+ this.pendingShortcut_ = '';
+ this.capturing_ = false;
+ this.$['input'].blur();
+ this.fire('shortcut-capture-ended');
+ },
+
+ /**
+ * @param {!KeyboardEvent} e
+ * @private
+ */
+ onKeyDown_: function(e) {
+ if (e.keyCode == extensions.Key.Escape) {
+ if (!this.capturing_) {
+ // If we're not currently capturing, allow escape to propagate.
+ return;
+ }
+ // Otherwise, escape cancels capturing.
+ this.endCapture_();
+ e.preventDefault();
+ e.stopPropagation();
+ return;
+ }
+ if (e.keyCode == extensions.Key.Tab) {
+ // Allow tab propagation for keyboard navigation.
+ return;
+ }
+
+ if (!this.capturing_)
+ this.startCapture_();
+
+ this.handleKey_(e);
+ },
+
+ /**
+ * @param {!KeyboardEvent} e
+ * @private
+ */
+ onKeyUp_: function(e) {
+ if (e.keyCode == extensions.Key.Escape || e.keyCode == extensions.Key.Tab)
+ return;
+
+ this.handleKey_(e);
+ },
+
+ /**
+ * @param {!KeyboardEvent} e
+ * @private
+ */
+ handleKey_: function(e) {
+ // While capturing, we prevent all events from bubbling, to prevent
+ // shortcuts lacking the right modifier (F3 for example) from activating
+ // and ending capture prematurely.
+ e.preventDefault();
+ e.stopPropagation();
+
+ // We don't allow both Ctrl and Alt in the same keybinding.
+ // TODO(devlin): This really should go in extensions.hasValidModifiers,
+ // but that requires updating the existing page as well.
+ if ((e.ctrlKey && e.altKey) || !extensions.hasValidModifiers(e)) {
+ this.pendingShortcut_ = 'invalid';
+ return;
+ }
+
+ this.pendingShortcut_ = extensions.keystrokeToString(e);
+
+ if (extensions.isValidKeyCode(e.keyCode)) {
+ this.commitPending_();
+ this.endCapture_();
+ }
+ },
+
+ /** @private */
+ commitPending_: function() {
+ this.shortcut = this.pendingShortcut_;
+ this.fire('shortcut-updated', {keybinding: this.shortcut,
+ item: this.item,
+ commandName: this.commandName});
+ },
+
+ /**
+ * @return {string} The text to be displayed in the shortcut field.
+ * @private
+ */
+ computeText_: function() {
+ if (this.capturing_)
+ return this.pendingShortcut_ || this.i18n('shortcutTypeAShortcut');
+ return this.shortcut || this.i18n('shortcutNotSet');
+ },
+
+ /** @private */
+ onClearTap_: function() {
+ if (this.shortcut) {
+ this.pendingShortcut_ = '';
+ this.commitPending_();
+ }
+ },
+ });
+
+ return {ShortcutInput: ShortcutInput};
+});
« no previous file with comments | « chrome/browser/resources/md_extensions/shortcut_input.html ('k') | chrome/browser/ui/webui/extensions/extensions_ui.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698