Firefoxでコピー/ペーストが機能しない
問題
タイトル通りです
アプリボタン経由のコピー/ペーストがFirefoxで機能しません
すみません!! odiak.icon
応急処置
about:configにてdom.events.asyncClipboard.clipboardItemをtrueにする
キーボードショートカット経由でコピペできるようになる
原因
Clipboard APIの読み取り機能がFirefoxに存在しない
セキュリティの観点からnavigator.clipboard.read()が拡張機能以外で使えないようになっている
古いAPIを使いたくなかったのでClipboard APIを使っていたんですが、やっぱりFirefoxにも対応したいですね... odiak.icon
メインがFirefoxなので、とてもほしいですtakker.icon
下にも書きましたが、今のところコピーした図形の貼り付け先がKakeruしかないので、clipboardを使わずlocal storageで完結させても問題ないと思います
まあそうですね。将来的には、画像データも入れ込んで他のアプリなどにもペーストできたらという狙いもありましたodiak.icon
/vim-jp-emojis/便利そう.icontakker.icon
それを念頭に置くと、確かにclipboardでやり取りしたいところですね……
すみません、コピペできないは誤りでした。特定の方法を使うと、現状でもFirefoxでコピペできるとわかりましたtakker.icon
Firefoxでの詳しい動作状況
アプリのボタンを使ったコピペ
❌コピー/切り取り
ClipboardItemが通常のFirefoxで使えない
about:configにてdom.events.asyncClipboard.clipboardItemをtrueにすると使えるようになる
cf. https://developer.mozilla.org/en-US/docs/Web/API/ClipboardItem#browser_compatibility
❌ペースト
navigator.clipboard.read()を使用しているため
これはどうあがいてもFirefoxでは使えない
ブラウザ機能(Ctrl+Cなど)を使ったコピペ
❌コピー/切り取り
アプリのボタン経由のコピーと同じ
✅ペースト
これだけはFirefoxでも設定無しに動く
内部ではElement: pasteのClipboardEventの値を取り出しているだけ
cf. https://github.com/odiak/draw/commit/ce467f4af79dc6c2b3ed01d216b4fa8d0b2ea733#diff-cdbc2425b36c6ab2a9e98f5680be874660e6c56a405a982fa625886c2e72dd5aR1723-R1741
clipboardの読み込み操作を一切行っていないので、Firefoxでも設定なしに使える
おそらくSafariでも使えるはず
設定なしだとコピーが機能しないため、実質貼り付けできない状態になっている
つまり、Firefoxでも、dom.events.asyncClipboard.clipboardItemさえtrueにすれば、Ctrl+C/Ctrl+Vでコピペできるということです
Element: copyイベント時のコピー操作を、ClipboardItemではなくClipboardEvent.clipboardDataを使った実装に置き換えれば、設定なしでもCtrl+C/Ctrl+Vでコピペできるようになると思われます
about:configで設定をいじれば、navigator.clipboard.read()も使えるようになるっぽい?takker.icon
FirefoxでAsynchronous Clipboard APIのwrite, read, readText関数を使う方法 - @ledsun blog
これは知らなかった
MDNだとブラウザ拡張機能内でしか使えないとあるが、実際にはwebアプリでも使えるようだ
Kakeruの貼り付けボタンから貼り付けできるようになった
解決策
Clipboardを使用せずにコピー/ペーストを実装する
他のアプリからのデータを貼り付けることは考えていないので、Clipboardを経由しないコピペにしても問題ない
Emac key bindings (scrapbox)の実装方法が参考になります
この方針で修正かけてみようと思いますtakker.icon
paste eventを監視する
/shokai/exec-copyを使う
Firefoxなどではデータを貼り付けるpromptが表示される
バイナリデータだと難しいかもtakker.icon