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

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

もずはっく日記(2011年5月)

2011年5月19日

Bug-org 651694 Sort out NS_PLUGIN_EVENT 初回投稿日時: 2011年05月19日19時08分15秒
カテゴリ: Mozilla Core Mozilla6 バグ修正
固定リンク: id=2011051900
リンク元: 0件
SNS: (list)

windowlessプラグインにDOMイベントとは関係のない、ネイティブイベントを直接伝達するためのイベントの再設計です。

名前の変更だけが当初の目的でしたが、イベントの種類を再整理してすっきりとさせています。

Bug 6791 maxlengthが設定されているinput要素で、一文字も追加できない状況でIMEで文字を入力するとmaxlength値を超えた文字数の文字が入力できる 初回投稿日時: 2011年05月19日19時16分52秒
カテゴリ: HTML Mozilla Core Mozilla6 バグ修正
固定リンク: id=2011051901
リンク元: 0件
SNS: (list)

久しぶりにBugzilla-jpに報告されたバグの修正です。maxlengthが指定されている<input>要素で既に限界まで文字が入力されている状態で、IMEで文字列を入力して確定すると、未確定文字列がそのまま残り、valueプロパティ値には含まれてしまっているため、制限文字数を超えて入力できてしまう、というバグです。

原因は、maxlengthに到達している段階で文字を入力しようとすると、そのまま処理を中断するように修正されていたことでした。

未確定文字列は内部では独立したテキストノードとして挿入されていて、さらにこのテキストノードを内部処理用の特殊な選択範囲で選択していることにしています。今までは文字列がまったく入力できない状態でも、この未確定文字列を掃除する処理が走っていたのですが、前述の修正でこれまでスキップされるようになっていました。

IMEによる文字列の挿入時にはショートカットしないように修正して解決しています。

ちなみに、今回のように、ブラウザのバグで制限文字数を超えた値がサーバに送信されてしまう可能性もありますが、意図的な攻撃でそうなる可能性もありますので、Webアプリの開発者の方は必ず値の妥当性は検査するのを忘れないようにしてください。

Bug-org 651307 For Flash Text Input, previous characters disappear when changing IME input from one type to another 初回投稿日時: 2011年05月19日19時21分15秒
カテゴリ: Mozilla Core Mozilla6 バグ修正
固定リンク: id=2011051902
リンク元: 0件
SNS: (list)

MacでFlash等、プラグイン上でIMEを使っているときに、入力する言語を切り替えると未確定文字列が全て削除される、というバグです。例えば、ひながなで入力中にカタカナに途中で切り替えると再現していました。

コードを見ると意図的に削除していましたが、書いた張本人も理由は覚えてないとのこと。問題無いとは思いますが気持ち悪いので、設定で元の動作に戻せるようにだけして修正を入れました。

元の動作に戻したい場合は、ui.plugin.cancel_composition_at_input_source_changedtrueに変更して再起動してください。

Bug-org 605648 Support high resolution scrolling on Windows 初回投稿日時: 2011年05月19日19時50分58秒
カテゴリ: Mozilla Core Mozilla6 バグ修正
固定リンク: id=2011051903
リンク元: 0件
SNS: (list)

WindowsでVista以降、WM_MOUSEWHEELWM_MOUSEHWHEELのデルタ値が基準の120よりも小さい値をマウスのユーティリティが利用できるようになりました。このため、例えば1回のホイールイベントで0.5行だけスクロールする、といったイベントが利用できるようになりました。しかし、Geckoでは最低、1行分のデルタ値がたまったときに初めてスクロールを行っていました。

今回、Logitech (日本ではLogicool)のマウス・キーボードチームのマネージャの方からの要請で、彼らのドライバの精度に十分に対応できるように修正しました。

Macでは以前から、トラックパッドのスクロールイベントはOSからピクセル単位で発生していたため、Gecko内部のホイールイベントに、ピクセルスクロール、というものがありました。本格的に小数の精度でスクロールする処理に対応すると作業量が多いので、ひとまず、これを利用したアドホックなやり方で対応しようというのが今回の修正のテーマでしたが、ここに色々と落とし穴があって、現在もregression対応に追われています。

どのように実装したのかというと、小さなデルタ値で上記メッセージを受け取ったら、ひとまずそれが、何行分のスクロールになるのかを小数込みで計算します。このとき、1行以上であれば、その行数分のホイールイベントを発行します。そして、1未満の小数部分を未送信のデルタ値として保存しておきます。

この内部イベントの生成時に、スクロールターゲットの行高等を確認し、ネイティブイベントのデルタ値で何ピクセルスクロールすべきなのかを、やはり小数を含めて計算し、ピクセルスクロールイベントを生成します。当然、余った1ピクセル未満の端数は内部で保存しておきます。

実際のスクロールは、通常はピクセルスクロールイベントで行われます。XULのツリー等、行単位でしかスクロールできない要素は、ピクセルスクロールは無視し、従来からあるホイールスクロールイベントを利用します。

そして、それ以降に来るネイティブイベントは、保存してある端数を考慮して同様に処理していきます。

これにより、高精度なホイールイベントを生成するマウスを持っている方は、スムーズスクロールを有効にしなくても、今までよりもなめらかなスクロールが行える様になりました。しかし、副作用として当然、それだけ再描画回数が増えるのでスクロール時の負荷は高くなっています。

マイクロソフトのマウスでは設定値にもよりますが、あまり修正前と動作に違いはありません。また、OS標準のドライバをそのまま利用する安価なマウスでも効果はありません。Logitech (日本ではLogicool)のSetPoint 6.20以降だとかなり精度の高い数字でイベントを生成するので効果があります。ただし、同じLogitech (日本ではLogicool)製のマウスでもゲーミングマウスは高精度なイベントを生成しませんのでご注意ください。

上記の解説の通り、Webコンテンツ作者から見た場合にほとんど動作に差異は無いと思われますが、DOMMouseScrollイベントと、スクロールのlistenerを併用している場合、処理順序が変わることになりますのでご注意ください。

Bug-org 657865 High resolution scrolling should be able to be disabled by pref 初回投稿日時: 2011年05月19日19時55分59秒
カテゴリ: Mozilla Core Mozilla6 バグ修正
固定リンク: id=2011051904
リンク元: 0件
SNS: (list)

mousewheel.enable_pixel_scrollingでピクセルスクロールの利用を無効化し、以前の状態に戻せるようにすべきだというバグです。この設定の存在自体、知らず、別バグでの実装となりました。

この修正時に、デフォルト設定で無効にするようにしています。これで、様々なregressionがひとまず再現しなくなっていますが、テストに参加されている方は是非、有効にして色々とテストしてみてください。

ちなみに、この設定値は変更後、再起動が必要です。

Bug-org 657648 Don't use high resolution scrolling when acceleration is enabled 初回投稿日時: 2011年05月19日20時00分30秒
カテゴリ: Mozilla Core Mozilla6 バグ修正
固定リンク: id=2011051905
リンク元: 0件
SNS: (list)

以前、物議を醸したマウスホイールの加速機能が有効になっている場合、高精度ホイールスクロールを無効にすべきだというバグです。

加速機能はイベントの発生回数から加速度を決定しているため、イベントの生成回数が増える高精度ホイールスクロールとは根本的に共存が不能なので単純に従来の動作に戻るように修正しました。

2011年5月21日

Bug-org 652486 Computed value of text-decoration should be empty when its style or color is not initial value 初回投稿日時: 2011年05月21日08時21分47秒
カテゴリ: CSS Mozilla Core Mozilla6 バグ修正
固定リンク: id=2011052100
リンク元: 1件
SNS: (list)

text-decorationcomputed valueに問題がある、というバグです。以前、懸念事項としてここに書いたものです。

今回の修正で、computed valueがより正しく返されるようになりました。text-decorationプロパティのみ指定している場合、従来と全く同じcomputed valueが返されます。それに対して、-moz-text-decoration-colorを利用したり、-moz-text-decoration-styleを利用したりで、これらの値が初期値以外のものになっていた場合、そのWebデザイナはtext-decorationshorthand propertyに変更された、という事実を知っていますので、DOM2 Styleの仕様に従い、getPropertyValue()は空文字列("")を返し、getPropertyCSSValue()nullを返すようになりました。

DOM2 Styleはプロパティがlonghandからshorthandに変更になる、という事態が想定外のようだったので、今後、W3Cの方へフィードバックしておく必要がありそうです。

2011年5月22日

Bug-org 657634 Don't use high resolution scrolling when scrolling speed is customized by prefs 初回投稿日時: 2011年05月22日21時37分55秒
カテゴリ: Mozilla Core Mozilla6 バグ修正
固定リンク: id=2011052200
リンク元: 0件
SNS: (list)

ユーザがシステム設定を無視してGeckoでのみ、独自のスクロール速度でスクロールさせようとしている場合、高精度スクロールを無効にしてしまおうという修正です。

設定でカスタマイズしていた場合にも高精度スクロールを有効にしようというのはBug-org 658155で扱っていますが、こちらはFirefox 6には入れないつもりです。

2011年5月23日

Bug-org 308590 SVG patterns, gradients and filters don't work when SVG is loaded from a data: URL 初回投稿日時: 2011年05月23日00時05分05秒
カテゴリ: Mozilla Core Mozilla6 バグ修正
固定リンク: id=2011052300
リンク元: 0件
SNS: (list)

data URLで、SVGでxlinkを利用して色々な機能が使えないというバグです。きちんと読んでいないのですが、data URLにはref(#以降)が無いのでどうしようもない、という話だったのですが、修正されました。

これで、data:text/html,<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><symbol id="a" fill="lightblue" fill-opacity="0.5"><rect width="50" height="50"/></symbol><use x="10" y="10" xlink:href="#a"/></svg>のようなテストケースが書けるようになったので、非常に便利ですね。

2011年5月24日

Bug-org 656826 Redesign nsPrefService for helpful static utility methods 初回投稿日時: 2011年05月24日12時32分56秒
カテゴリ: Mozilla Core Mozilla6 バグ修正
固定リンク: id=2011052400
リンク元: 0件
SNS: (list)

C++のコードで設定を読むには、nsIPrefBranchを取得してアクセスするか、nsContentUtilsのstaticメソッドを使うしかありませんでした。前者は取得にかかるコストと、ロジックとは無関係のコードが入ってしまう、という点が問題で、後者はnsContentUtils.hの依存関係が巨大すぎて気軽に使えない、低レベルの戻り値を知ることができない、という点が問題でした。

今回、nsPrefServiceをシングルトンに修正し、mozilla::Preferencesに改名してpublicに移動しました。さらにmozilla::Preferencesにstaticメソッドを追加して利用しやすくしています。

Firefox 6向けのAuroraでもmozilla-centralと同じパッチが使えるように、Mozilla 6に滑り込みで間に合わせました。今後、順次、prefにアクセスする箇所は修正していく予定です。

Bug-org 657935 Should refer computed delta value at dispatching pixel scroll event 初回投稿日時: 2011年05月24日12時41分32秒
カテゴリ: Mozilla Core Mozilla6 バグ修正
固定リンク: id=2011052401
リンク元: 0件
SNS: (list)

マウスホイールのスクロール速度システム設定を上書きする機能が高精度スクロール有効時に使えなくなっていたバグです。

nsEventStateManagerで算出したデルタ値を参考に、ピクセルスクロールイベントのデルタ値を算出するように修正して、この機能が高精度スクロールと共に利用できるように修正しています。

Bug-org 658153 At using high resolution scrolling, the mouse wheel transaction doesn't work fine 初回投稿日時: 2011年05月24日12時47分11秒
カテゴリ: Mozilla Core Mozilla6 バグ修正
固定リンク: id=2011052402
リンク元: 0件
SNS: (list)

高精度スクロールを有効にしていると、マウスホイールのトランザクション処理が壊れてしまって、意図した場所をスクロールできない、というバグです。

高精度スクロールのための、スクロール対象の情報を取得するイベントのハンドリング時にマウスの移動量を確認しないままトランザクションを更新していたのが一つ目の原因で、このバグのパッチで修正されています。

もうひとつ、情報取得イベントのデルタ値が垂直方向のイベントの時に、正負が逆になってしまっていて、逆方向へのトランザクションを作ろうとしてしまっていた、というバグもありましたが、こちらはBug-org 657935の修正時に修正されています。

Bug-org 658111 Enable Windows high resolution scrolling in default settings 初回投稿日時: 2011年05月24日12時50分08秒
カテゴリ: Mozilla Core Mozilla6 バグ修正
固定リンク: id=2011052403
リンク元: 0件
SNS: (list)

見つかったregressionは全て修正が完了したので、このバグのパッチの投入により、今夜のビルドから再び高精度スクロールがWindows版ではデフォルトで有効になります。もし、修正にリスクを伴うバグが発見された場合、このパッチのみをバックアウトして、Firefox 6ではデフォルトで無効にする予定ですので、是非、テストしてバグ報告をお願いします。

2011年5月25日

2011年5月27日

Bug-org 659820 Replace nsContentUtils::GetCharPref() and nsContentUtils::GetStringPref() with Preferences::GetCString() and Preferences::GetString() 初回投稿日時: 2011年05月27日17時39分33秒
カテゴリ: Mozilla Core Mozilla7 バグ修正
固定リンク: id=2011052700
リンク元: 0件
SNS: (list)

この修正でnsContentUtils::GetCharPref()nsContentUtils::GetStringPref()は削除されました。

また、Preferences::GetChar()のうち、nsACStringで値を返すものはPreferences::GetCString()に、nsAStringで値を返すものはPreferences::GetString()に改名され、同様にPreferences::GetLocalizedCString()Preferences::GetLocalizedString()Preferences::SetCString()Preferences::SetString()といった感じになりました。

また、Get*String()はダイレクトに戻り値として文字列を返すものも追加されました。

2011年5月30日

Bug-org 659913 Remove nsContentUtils::GetPrefBranch() 初回投稿日時: 2011年05月30日14時42分29秒
カテゴリ: Mozilla Core Mozilla7 バグ修正
固定リンク: id=2011053000
リンク元: 0件
SNS: (list)

nsContentUtilsがキャッシュしていた、nsIPrefBranchのポインタを外部に公開しているこのメソッドを削除しました。

単純にPreferences::GetRootBranch()に置き換えたわけではなく、AddStrongObservers()AddWeakObservers()RemoveObservers()メソッドを追加して呼び出し側をシンプルにしています。

Bug-org 660121 Remove all other nsContentUtils methods related to pref 初回投稿日時: 2011年05月30日14時45分29秒
カテゴリ: Mozilla Core Mozilla7 バグ修正
固定リンク: id=2011053001
リンク元: 0件
SNS: (list)

残る、nsContentUtils::RegisterPrefCallback()nsContentUtils::UnregisterPrefCallback()nsContentUtils::AddBoolPrefVarCache()nsContentUtils::AddIntPrefVarCache()を削除しました。

これで、nsContentUtilsの修正は終了しました。今後は主要なディレクトリ内のnsIPrefBranchの利用部分を修正していきます。