この日記はMozillaのプロダクトへの貢献者としての私の成果を中心に、気になったバグやWeb界隈の話題について書いていますが、 断り書きがある場合を除き、いかなる団体のオフィシャルな見解ではありません。あくまでも個人的なものです。 Mozilla Foundation、Mozilla Corporation、及び関連企業の公式情報ではないことに注意してください。

現在、XHTML 1.0 (もどき)から、HTML5なコンテンツに修正中です。古い日記は修正が完了していませんので表示が崩れます。 順次、修正していく予定ですのでしばらくお待ちください。

もずはっく日記(2014年12月)

2014年12月31日

Bug-org 1100862 Compatibility issue: The Win+V shortcut used by PlainText doesn't work in Firefox
初回投稿日時: 2014年12月31日15時46分25秒
カテゴリ: Mozilla Core Mozilla37 Windows バグ修正
SNS: (list)

Windows向けのユーティリティソフト、PlainTextを利用して、クリップボードの内容をHTMLとしてではなく、プレーンテキストとして貼り付けようとしても、貼り付け自体が動かないというバグです。

Spy++で挙動を確認してみると、このアプリは、Win + Vが押された時に、クリップボードの内容をプレーンテキストのみに変更した後、Ctrl + Vをエミュレーションして、アプリの貼り付けを強引に動かしているようです。しかし、Win + Vが押された時に、同期的に処理しているため、Winキーが押されたままなので、Win + Ctrl + Vが生成されていました。

WindowsとLinux GTKのネイティブアプリの挙動を確認してみると、GTKアプリでは、Win (Super)キーの状態を確認していて、Win + Ctrl + Vで貼り付けは動作しませんでしたが、WindowsではWinキーの状態を無視しているようで、Win + Ctrl + Vでも、Ctrl + Vが実行されました。Geckoでは、ショートカットキーは一般的に以下のような定義になっています。

<key key="v" modifiers="control"/>

これは、GTKのネイティブアプリと同じ動作となります。つまり、Ctrlキー以外のモディファイアキーはオフであることを条件としています。

これに対し、Windowsのネイティブアプリと同様の動作を実現するためには、以下のように記述しなくていけません。

<key key="v" modifiers="os any control"/>

anyキーワードよりも前に列挙されたモディファイアの状態を問わないということを意味しますので、Win + Ctrl + Vでも、Ctrl + Vでもマッチするようになります。

しかし、全てのショートカットキーをWindowsでのみ、このように書き換えていく訳にはいきません。そこで、そこで、Windowsでのみ、XULの<key>要素の動作を変更することにしました。

新しい動作では、まず、従来と同様に(つまり、他のOS上で動作している時と同様に)、ショートカットキーのマッチングを行います。そして、マッチする<key>要素が発見できず、なおかつ、Winキーが押されている場合、Winキーを無視してマッチングを行います。実例を挙げると、以下のような宣言があるとします。

<key key="v" modifiers="control"/>
<key key="v" modifiers="os control"/>

この場合、Winキーが押されている場合は、二つ目にマッチします。なぜなら、一回目のマッチングでは、Winキーの状態を無視しないからです。ですので、このような場合にはこのバグでの修正は良い意味で変化がないことになります。

関連するかもしれないエントリ

bug-org 1100862を含むエントリ