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

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

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

2012年6月18日

Bug-org 757688 Refactor KeyboardLayout
初回投稿日時: 2012年06月18日11時20分39秒
最終更新日時: 2012年06月18日11時20分57秒
カテゴリ: Mozilla Core Mozilla16 Windows バグ修正
SNS: (list)

Windowsのキーイベントから、入力された文字を算出してデッドキーの入力処理や、ショートカットキーの入力処理に利用しているmozilla::widget::KeyboardLayoutのリファクタリングを行いました。

KeyboardLayoutnsWindowWM_KEYDOWNを受け取ったときに、KeyboardLayout::OnKeyDown()が呼び出されることを前提に動作しています。このメソッド内で押されたキー、生成される文字列、デッドキーの状態を保存し、いくつかのメソッドがこの情報を外部(nsWindow)に返すようになっています。

しかし、こんなstatefulなクラスは使いにくくて仕方がないので、DOM KeyboardEventの作業前に修正してしまいました。

まず、OnKeyDown()はデッドキーの状態以外を保存しません。この状態のみ、statefulでしか効率的に管理できないので諦めました。その代わり、このデッドキーの状態は、OnKeyDown()内でしか参照されず、他のメソッドは全てstatelessになりました。

現在のキーで入力される文字列は、OnKeyDown()が戻り値として返すようになっています。これにより、最後のOnKeyDown()が呼ばれた際の入力される文字列を返していたGetUniChars()は廃止され、任意のモディファイアの状態を指定できていたGetUniCharsWithShiftState()が、GetUniCharsAndModifiers()に置き換えられ、より使いやすくなっています。

またさらに、このリファクタリングの副作用で、デッドキーも自動テストでテストできるようになっています。ただ、今までの自動テストはショートカットキー以外はあまり有用ではありませんでしたので、文字が入力される場合にはnsWindow::OnKeyDown()内でKeyboardLayout::OnKeyDown()の戻り値とAPIで指定された文字(疑似WM_CHARの内容)とを比較し、異なる場合にはデバッグビルドではそのままクラッシュするようにし、テストの信頼性を向上させています。キーボード周りをハックされる方は注意してください。

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

bug-org 757688を含むエントリ