ショートカットキー(キーバインド)

ショートカットキーから拡張機能を実行したい。

結論

大きく分けて方法は2つ。

  • commands を定義する。

    • 標準のキーバインドが優先される。 バインド可能なキーが限定される。
  • content_script がキーイベントをハンドルする。

    • 自由にバインドできる。 標準のキーバインドを上書きしてしまうので要注意!

方法1: commands を定義する

  • Menifest に commands (suggested_key) を定義する。

  • background に chrome.commands.onCommand を実装する。

Manifest.json

  "background": {
    "scripts": [ "background.js" ]
  },

  "commands": {
    "command1": {
      "suggested_key": {
        "default": "Ctrl+Shift+Y"
      },
      "description": "command1"
    }
  },

background.js

chrome.commands.onCommand.addListener(function(command) {
  if (command === 'command1') {
     console.log('Do your stuff');
  }
});

方法2: content_script が key イベントをハンドルする

Manifest.json

  "content_scripts": [{
    "matches": [ "*://*/*" ],
    "js": [ "content.js" ]
  }],

content_script

window.addEventListener('keydown', function(event) {
  if ((!isMac && !event.ctrlKey) || (isMac && ! event.metaKey)) return;
  if (!event.shiftKey) return;
  var key = event.key
  which (key) {
  case 89: //'Y'
    console.log('Do your stuff');
    break;
  }
}, true);

keyCode

KeyboardEvent.keyCode は非推奨。

代わりに、KeyboardEvent.key を使うこと、と書いてある(説明不足)。

押されたキーは KeyboardEvent.code を使う仕様である。

手元の Chrome 47.0.2526.80 では、

  • keyCode : 現役

  • key と code : 未実装

のため、keyCode によって判定した。

将来的には、次のように直さなければならないのかも知れない:

  which (event.code) {
  case 'KeyY':
    console.log('Do your stuff');
    break;
  }

Gecho 系ではすでに key と code が実装されている。

簡単にストラテジーを切り替えられるライブラリがあるのかも知れない

(が、目的は Chrome 拡張なので調査していない)。