yamamoto-yuta / csv2md-shortcut

0 stars 0 forks source link

permission を activeTab で何とかできないか試す #20

Closed yamamoto-yuta closed 1 year ago

yamamoto-yuta commented 1 year ago

やっぱり広範囲なホスト権限は審査が通りにくいため…

関連Issue:

yamamoto-yuta commented 1 year ago

一回イベントアクションを発火させないとイベント登録がされず、書いたイベント処理が実行されない。なので、イベントアクションを Ctrl + j にして同じショートカットにするのが良さそう。

yamamoto-yuta commented 1 year ago
The callback parameter looks like:
(command: string, tab?: [tabs.Tab](https://developer.chrome.com/docs/extensions/reference/tabs/#type-Tab)) => void

https://developer.chrome.com/docs/extensions/reference/commands/#event-onCommand

yamamoto-yuta commented 1 year ago

On macOS Ctrl is automatically converted into Command.

To use the Control key on macOS, replace Ctrl with MacCtrl when defining the "mac" shortcut.

Using MacCtrl in the combination for another platform will cause a validation error and prevent the extension from being installed.

https://developer.chrome.com/docs/extensions/reference/commands/#key-combinations

yamamoto-yuta commented 1 year ago

e.ctrlKey は Windows ctrlキー、Mac controlキー、e.metaKey は Mac commandキーに割り当てられています。 JavaScript での Windows Ctrl キーと Mac Command キーの判定 | クロジカ

Manifest と逆なので注意

yamamoto-yuta commented 1 year ago

これ設定しても何回もイベントが登録されてしまった。 上記「Manifest と逆」問題が原因だった。そこ直したらちゃんと1回だけになった。

ただし、 Ctrl + j の Ctrl でonce、 j でonce という呼び方をされてしまって意図した挙動にならない…

if (((e.ctrlKey && !e.metaKey) || (!e.ctrlKey && e.metaKey)) && e.key === "j") の最後に removeEventLisner() を呼ぶことで解決した。おそらく↓になってる。

  1. Ctrl をホールドする
  2. chrome.commands.onCommand.addListener() が発火する
  3. document.addEventListener("keydown", handleShortcuts) が実行され、イベントリスナに handleShortcuts() が登録される
  4. j が押される
  5. chrome.commands.onCommand.addListener() が発火する
  6. document.addEventListener("keydown", handleShortcuts) が実行され、イベントリスナに handleShortcuts() が登録される
  7. handleShortcuts() が実行され、document.removeEventListener("keydown", handleShortcuts); が実行される

テキストエリア以外で Ctrl + j した場合もちゃんと document.removeEventListener() が実行される。 それ以外の場合はそもそも chrome.commands.onCommand.addListener() が発火しないので document.addEventListener() が実行されない。

Target.addEventListener(イベントの種類, 呼び出し関数, {once: true});

JavaScript | イベントを一度だけ実行して破棄する方法 | ONE NOTES

yamamoto-yuta commented 1 year ago

そもそもイベントリスナへの登録自体不要だった…

yamamoto-yuta commented 1 year ago

Windows だと Ctrl 系が予約されまくってるせいか chrome.commands では上書きできない模様…

参考: https://hanzochang.com/articles/3#keys

一旦、 Windows は Alt + j Mac は Cmd + j で行く