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

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

もずはっく日記(2012年10月)

2012年10月20日

Bug-org 786956 Rewrite NSFlagsChanged handler
初回投稿日時: 2012年10月20日12時14分21秒
最終更新日時: 2013年01月02日10時22分02秒
カテゴリ: Events Mozilla Core Mozilla20 バグ修正
SNS: (list)

Cocoaの、NSFlagsChangedイベントのハンドラをまるごと書き直して、まともなものにしよう、というバグです。

これまでは、前回のイベント時との、モディファイアフラグの差分から、その差分に応じて、イベントから通知されたkeyCodeを利用して、キーイベントを生成するという、不思議なコードになっていました。ですので、keyCode0の場合には、aキーのイベントが発生してしまったり、フラグの差分から、複数のイベントを同じキーのイベントとして発生させていたり、モディファイアフラグが変わらないモディファイアキーのイベント、例えば、左のshiftキーを押しながら、右のshiftキーを押した時にはイベントが発生しない、といった問題がありました。

今回の修正で、基本的にはkeyCodeを基に、単にキーイベントを生成するようになりました。通常、普通にキーを押した、離した、といった場合にはこれだけで完璧に動きます。

ややこしいのが、keyCode値が0のケースです。この場合、shiftoptioncommandcontrolのフラグの変化は分かるのですが、これだけだと、実際に変化したキーが、左右どちらのものか分かりません。そこで、ドキュメント化されていない、デバイス依存のモディファイアフラグを用いて、ややハッキーな形で修正を行っています。デバイス依存といっても、物理キーボードの種類によって変わる、というほどデリケートなものではないことは確認しているので、通常のキー押下時に、キーコードと、モディファイアフラグの関連づけを行い、それ以降に発生した、keyCode0NSFlagsChangedイベントハンドリング時に利用する形をとっていますので、かなり安全だとは思います。ちなみに、このイベントが発生するパターンとして、command (+ shift) + tabというパターンのみ、確認しています。

ひょっとすると、似たようなイベントを生成してくる、アクセシビリティ改善用の外部アプリがあると、うまく動かないかもしれませんが、このハンドラで動かないレベルだと他のアプリでも動くかどうかかなり怪しいので、無いんじゃないかと思います。もし、問題がありましたら、bugzillaに報告してもらえれれば対応していきます。

ちなみに、修正時にWebKitの動作も見ながら作業してましたが、それよりも期待通りに動くようになってしまってます。

当初、Mozilla 19での修正でしたが、問題が見つかったため、Mozilla 20に持ち越されました。詳細は、Bug-org 815383の修正の記事を参照してください。

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

bug-org 786956を含むエントリ