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

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

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

2014年2月6日

Bug-org 964626 [TSF] Fix some nits of logging code in nsTextStore 初回投稿日時: 2014年02月06日00時24分45秒
カテゴリ: Mozilla Core Mozilla29 TSF Windows バグ修正
固定リンク: id=2014020600
SNS: (list)

TSFモードのログが一部、レベル指定を間違っていたり、引数の値をログに残していなかったため、1や2では有用なログにならないことがあったというバグです。

提出して頂いたログを見ていて、このバグに気付いたので、急いで、29に滑り込ませました。

Bug-org 900802 WM_SYSDEADKEY ignored in some contexts 初回投稿日時: 2014年02月06日00時33分10秒
最終更新日時: 2014年02月06日00時43分41秒
カテゴリ: Mozilla Core Mozilla29 Windows バグ修正
固定リンク: id=2014020601
SNS: (list)

現在修正中のBug-org 962140の最初のパッチでどさくさに紛れて修正してしまいました。

このバグはもともと、キーイベントまわりのコードをウオッチしてた方から報告があり、パッチも提出されていたのですが、『パッチは書いたけど、テストは私の仕事ではない』と言い張って、書いたパッチの動作確認もされないし、レビュー結果にも従わない、という方で、どうしたもんかと思ってましたが、全然違うアプローチで修正できて良かったです。

最後まで責任を持って修正作業をされないのであれば、パッチの提出はして頂きたくないんですよね。そのパッチを参考にしたパッチをこちら名義でランディングしたりして、後で権利を主張したりしないかとか、法的にリスクが発生してしまうので。

Bug-org 964623 [TSF] nsTextStore::FlushPendingActions() shouldn't call OnLayouChange() and OnSelectionChange() 初回投稿日時: 2014年02月06日00時43分05秒
カテゴリ: Mozilla Core Mozilla30 TSF Windows バグ修正
固定リンク: id=2014020602
SNS: (list)

Bug-org 790516の修正時に、ドキュメントロック中にITextStoreACPSink::OnLayoutChange()ITextStoreACPSink::OnSelectionChange()等の呼び出しが必要になった場合、ドキュメントの更新が完了してから呼び出しを行うようにしていましたが、この時に、nsTextStore自体はロック状態のまま、これらを呼び出していたため、TIPがITextStoreACP::RequestLock()を呼び出しても、nsTextStoreはロック済みであると返していたため、実質、TIPは何もできなくなっている、というバグです。

呼び出しをさらに遅らせて、本当にnsTextStoreがドキュメントをアンロックした場合に、始めて、呼び出すようになっています。ただし、read-writeロックが来て、さらにこれらの通知が必要な状況にされた場合にはネストして、若干奇妙な動作になりますが、そこはTIP側の責任、ということで今回は無視しています。

実際にこの修正で日本語のTIPの動作が改善するということは確認できていません(呼び出しても無反応なものばかり)。

2014年2月22日

Bug-org 966612 Escape key should exit Print Preview 初回投稿日時: 2014年02月22日13時07分17秒
カテゴリ: Mozilla Core Mozilla30 バグ修正
固定リンク: id=2014022200
SNS: (list)

Bug-org 501496の修正によるregressionです。印刷プレビューの画面でEscキーを押しても終了しなくなっていました。

印刷プレビューのUI側では、keypressイベントでハンドリングされていましたが、nsPrintPreviewListenerがWebコンテンツやGecko自身にハンドリングされないように、keydownイベントでpreventDefault()を呼び出していたため、keypressイベントが発生しなくなっていたのが原因でした。

UI側で、keydownイベントを処理するように変更して修正しています。

Bug-org 950373 Up and Down Keyboard Arrows no longer work in the Restore Session frame / box 初回投稿日時: 2014年02月22日13時17分28秒
カテゴリ: Firefox Mozilla Core Mozilla30 バグ修正
固定リンク: id=2014022201
SNS: (list)

Bug-org 501496の修正によるregressionです。クラッシュ後に表示される、タブやウインドウの復元画面でキーボードで、ツリー(リストっぽく見えますが)を操作できないというバグです。

復元画面では、全体がPageUpPageDownHomeEndでスクロールしないようにこれらのkeydownイベントでpreventDefault()を呼び出していました。そのため、XULの<tree>要素がkeypressイベントでハンドリングできなくなっていました。

XULの<tree>要素は、keydownイベントをハンドリングするように修正し、復元画面のスクロール抑制のためのコードを削除して、スクロール機能も利用できるようにしています。

Bug-org 964153 Only WidgetTouchEvent copies the strong reference to widget at duplicating private event data 初回投稿日時: 2014年02月22日13時30分04秒
カテゴリ: Mozilla Core Mozilla30 バグ修正
固定リンク: id=2014022202
SNS: (list)

WidgetTouchEventだけ、プライベートデータをコピーする際に、なぜかnsIWidgetへの参照もコピーしていたというバグです。

書いた本人に確認したところ、意図的にそうした訳ではない(単にデフォルトコンストラクタに頼っただけ?)、という回答が来たので、一応、他と同様、コピーしないように修正しました。

JS側でタッチイベントを保存しておいて、ウインドウを閉じても、そのウインドウのインスタンスが保持されてるため、メモリリークが発生していた可能性もゼロではないのですが、まあ、狙ってやらない限り無理なので、実際には問題は起きてなかったと思います。

Bug-org 969219 Simplify constructor of InternalTransitionEvent 初回投稿日時: 2014年02月22日13時59分57秒
最終更新日時: 2014年02月22日14時00分18秒
カテゴリ: Mozilla Core Mozilla30 バグ修正
固定リンク: id=2014022203
SNS: (list)

全イベントのコンストラクタをできるだけ同じ形にして、各メンバは明示的に初期化するようにしよう、というバグの、InternalTransitionEvent版です。

InternalTransitionEvent(bool aIsTrusted, uint32_t aMessage,
                        const nsAString& aPropertyName,
                        float aElapsedTime,
                        const nsAString& aPseudoElement);

を、

InternalTransitionEvent(bool aIsTrusted, uint32_t aMessage);

に変更しています。これ、何が問題化というと、次のようなコードを書いた時、何が何だか分からないんですよね。

InternalTransitionEvent event(false, 0, EmptyString(), 0.0f, EmptyString());

メンバに直接代入するようにすれば、無駄を省けるし、何に対して値を設定しているのか明瞭になるので、コードが読みやすくなり、イージーミスも減るという訳です。

Bug-org 968725 Simplify constructor of InternalAnimationEvent 初回投稿日時: 2014年02月22日14時04分39秒
カテゴリ: Mozilla Core Mozilla30 バグ修正
固定リンク: id=2014022204
SNS: (list)

全イベントのコンストラクタをできるだけ同じ形にして、各メンバは明示的に初期化するようにしよう、というバグの、InternalAnimationEvent版です。

InternalAnimationEvent(bool aIsTrusted, uint32_t aMessage,
                       const nsAString& aAnimationName,
                       float aElapsedTime,
                       const nsAString& aPseudoElement);

を、

InternalAnimationEvent(bool aIsTrusted, uint32_t aMessage);

に変更しています。

Bug-org 968721 Simplify constructor of WidgetPointerEvent 初回投稿日時: 2014年02月22日14時07分45秒
カテゴリ: Mozilla Core Mozilla30 バグ修正
固定リンク: id=2014022205
SNS: (list)

全イベントのコンストラクタをできるだけ同じ形にして、各メンバは明示的に初期化するようにしよう、というバグの、WidgetPointerEvent版です。が、複雑なメンバ初期化を行うコンストラクタを利用してるコードが既にどこにもなかったので、複雑なものを削除しただけです。

Bug-org 960866 Make nsEditor store composition with TextComposition 初回投稿日時: 2014年02月22日14時14分53秒
最終更新日時: 2014年02月26日15時51分56秒
カテゴリ: Mozilla Core Mozilla30 バグ修正
固定リンク: id=2014022206
SNS: (list)

今まではIME関係のイベントの配信状態を管理しているだけだったmozilla::TextCompositionクラスをnsEditorで利用して、より、シンプルな設計にしようというバグです。

この修正によって、nsEditor内部でのみ管理していた未確定文字列の状態等の一部が、mozilla::TextComposition側で保存されるようになり、エディタ以外からもnsIWidgetnsPresContextからインスタンスを取得して参照可能になっています。

一方、nsEditorは、compositionstartイベントを受け取った場合にmozilla::TextCompositionをstrong referenceで保存し、compositionendイベントを受け取った際に、解放するようにしています。そしてこの間は、mozilla::TextComposition側にもハンドリング中のエディタへのweak referenceが保存されているので、相互参照可能になっています。

Bug-org 969247 Get rid of related code of NS_VK_ENTER and nsIDOMKeyEvent::DOM_VK_ENTER 初回投稿日時: 2014年02月22日14時29分33秒
カテゴリ: Events Javascript Mozilla Core Mozilla30 バグ修正
固定リンク: id=2014022207
SNS: (list)

Geckoには開発初期段階から、VK_RETURNというキーコードと、VK_ENTERというキーコードの二つがあり、コア開発者、UI開発者共にその違いに悩まされてました。実際には、VK_ENTERはGonkが間違ったマッピングを行っていた以外には使われていないものなので、削除することにしました。

この修正により、VK_ENTERのハンドラは削除され、テストでVK_ENTERを送信していた無意味なテストは、VK_RETURNを用いるように書きなおされ、実際のユーザの操作で走るコードパスがテストされるようになっています。

リスキーですが、Javascriptから見た場合に、KeyboardEvent.DOM_VK_ENTERundefinedになっています。これによって、これを参照していた条件が、KeyboardEvent.keyCodeがゼロの場合に一致してバグを産まないかという点が懸念されますが、他のブラウザではKeyboardEvent.DOM_VK_*は定義されていないので、問題があるとしたら、アドオンのみだと思います。

もし、それ以外に何か問題を見つけたら、早めにバグ報告をお願いします。影響が大きい場合は、KeyboardEvent.DOM_VK_ENTERだけを元に戻せば互換性を維持しつつ、修正も活かすことができるので。

Bug-org 970248 Simplify constructor of InternalUIEvent 初回投稿日時: 2014年02月22日14時37分50秒
最終更新日時: 2014年02月22日14時38分06秒
カテゴリ: Mozilla Core Mozilla30 バグ修正
固定リンク: id=2014022208
SNS: (list)

全イベントのコンストラクタをできるだけ同じ形にして、各メンバは明示的に初期化するようにしよう、というバグの、InternalUIEvent版です。

InternalUIEvent(bool aIsTrusted, uint32_t aMessage, int32_t aDetail);

を、

InternalUIEvent(bool aIsTrusted, uint32_t aMessage);

に変更しています。

しかし、この修正で思いましたが、Event.detail値がゼロ以外になることってほとんどないんですね。

Bug-org 971489 Simplify constructor of WidgetSimpleGestureEvent 初回投稿日時: 2014年02月22日14時46分06秒
カテゴリ: Mozilla Core Mozilla30 バグ修正
固定リンク: id=2014022209
SNS: (list)

全イベントのコンストラクタをできるだけ同じ形にして、各メンバは明示的に初期化するようにしよう、というバグの、WidgetSimpleGestureEvent版です。

WidgetSimpleGestureEvent(bool aIsTrusted, uint32_t aMessage, nsIWidget* aWidget,
                         uint32_t aDirection,
                         double aDelta);

を、

WidgetSimpleGestureEvent(bool aIsTrusted, uint32_t aMessage, nsIWidget* aWidget);

に変更しています。

これは、uint32_tdoubleが並んでるので、変数を渡してない限り、本当に意味不明な初期化になっていました。

Bug-org 965685 Merge nsIWidget::NotifyIMEOfTextChange() and nsIWidget::NotifyIME() 初回投稿日時: 2014年02月22日14時54分21秒
最終更新日時: 2014年02月22日14時55分36秒
カテゴリ: Mozilla Core Mozilla30 バグ修正
固定リンク: id=2014022210
SNS: (list)

nsIWidget::NotifyIME()は、通知内容を数字ひとつ渡しているだけだったので、nsIWidget::NotifyIMEOfTextChange()だけが特別扱いになっているのが以前から気になっていました。

この修正で、数値ではなく、構造体を渡すようにしたので、今後、簡単に追加情報を含めて、IME関係の通知後にある典型的な処理を省いたりすることで、単純化・ランタイムコストの削減を行いたいと思っています。引数は以下のIMENotification構造体のみになります。

enum IMEMessage MOZ_ENUM_TYPE(int8_t)
{
  // XXX We should replace NOTIFY_IME_OF_CURSOR_POS_CHANGED with
  //     NOTIFY_IME_OF_SELECTION_CHANGE later.
  NOTIFY_IME_OF_CURSOR_POS_CHANGED,
  // An editable content is getting focus
  NOTIFY_IME_OF_FOCUS,
  // An editable content is losing focus
  NOTIFY_IME_OF_BLUR,
  // Selection in the focused editable content is changed
  NOTIFY_IME_OF_SELECTION_CHANGE,
  // Text in the focused editable content is changed
  NOTIFY_IME_OF_TEXT_CHANGE,
  // Composition string has been updated
  NOTIFY_IME_OF_COMPOSITION_UPDATE,
  // Request to commit current composition to IME
  // (some platforms may not support)
  REQUEST_TO_COMMIT_COMPOSITION,
  // Request to cancel current composition to IME
  // (some platforms may not support)
  REQUEST_TO_CANCEL_COMPOSITION
};

struct IMENotification
{
  IMENotification(IMEMessage aMessage)
    : mMessage(aMessage)
  {
    switch (aMessage) {
      case NOTIFY_IME_OF_TEXT_CHANGE:
        mTextChangeData.mStartOffset = 0;
        mTextChangeData.mOldEndOffset = 0;
        mTextChangeData.mNewEndOffset = 0;
        break;
      default:
        break;
    }
  }

  IMEMessage mMessage;

  union
  {
    // NOTIFY_IME_OF_TEXT_CHANGE specific data
    struct
    {
      uint32_t mStartOffset;
      uint32_t mOldEndOffset;
      uint32_t mNewEndOffset;

      uint32_t OldLength() const { return mOldEndOffset - mStartOffset; }
      uint32_t NewLength() const { return mNewEndOffset - mStartOffset; }
      int32_t AdditionalLength() const
      {
        return static_cast<int32_t>(mNewEndOffset - mOldEndOffset);
      }
      bool IsInInt32Range() const
      {
        return mStartOffset <= INT32_MAX &&
               mOldEndOffset <= INT32_MAX &&
               mNewEndOffset <= INT32_MAX;
      }
    } mTextChangeData;
  };

private:
  IMENotification();
};