この日記は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 バグ修正
固定リンク: id=2014123100
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 900372 Update key names for the latest D3E draft 初回投稿日時: 2014年12月31日16時25分57秒
カテゴリ: Events Mozilla Core Mozilla37
固定リンク: id=2014123101
SNS: (list)

D3EKeyboardEvent.keyの値を最新の仕様案にあわせて更新しようというバグです。まだ、一部のキー名についてはワーキンググループに確認をとっているところで、本来はこれが終わってから全ての修正を一度に行う予定でしたが、約半年、ワーキンググループから回答が来ていないので、安定している部分に関してのみ、修正を先行させることにしました。

今回、このバグ名義での修正は、キーの名前の変更を予告していたワーニングメッセージの削除のみを行っています(Bug-org 1024864のバックアウト)。

Bug-org 912864 Rename key names "MediaNextTrack", "MediaPreviousTrack" and "SelectMedia" with "MediaTrackNext", "MediaTrackPrevious" and "MediaSelect" 初回投稿日時: 2014年12月31日16時44分19秒
最終更新日時: 2014年12月31日16時44分37秒
カテゴリ: Events Mozilla Core Mozilla37 バグ修正
固定リンク: id=2014123107
SNS: (list)

最新のD3E仕様にあわせて、MediaNextTrackMediaTrackNextに、MediaPreviousTrackMediaTrackPreviousに、SelectMediaMediaSelectに変更しました。

Bug-org 912866 Rename key names "Red", "Green", "Yellow" and "Blue" with "ColorF0Red", "ColorF1Green", "ColorF2Yellow" and "ColorF3Blue" 初回投稿日時: 2014年12月31日21時33分10秒
カテゴリ: Events Mozilla Core Mozilla37 バグ修正
固定リンク: id=2014123108
SNS: (list)

最新のD3E仕様にあわせて、リモコンで見かけるカラーキーの名前を、RedColorF0Redに、GreenColorF1Greenに、YellowColorF2Yellowに、BlueColorF3Blueに変更しました。

余談ですが、テレビ等のカラーボタンの配列は、日本と欧米(?)では異なっているので、青、赤、緑、黄の順で数字が上がっていっていないので注意してください。

Bug-org 912869 Rename key names, "Apps" and "FastFwd" to "MediaApps" and "MediaFastForward" 初回投稿日時: 2014年12月31日21時37分14秒
最終更新日時: 2014年12月31日21時52分59秒
カテゴリ: Android Events Firefox OS Gonk Mozilla Core Mozilla37 バグ修正
固定リンク: id=2014123109
SNS: (list)

最新のD3E仕様にあわせて、AppsMediaAppsに、FastFwdMediaFastForwardに変更しました。

この修正により、AndroidのKEYCODE_APP_SWITCHキーは、Unidentifiedになっていますので注意してください。

Bug-org 896348 "Eisu" (英数) key of JIS keyboard for Mac shouldn't be mapped with "RomanCharacters" 初回投稿日時: 2014年12月31日21時41分05秒
カテゴリ: Android Events Firefox OS Gonk Mac Mozilla Core Mozilla37 バグ修正
固定リンク: id=2014123110
SNS: (list)

最新のD3E仕様では、Macの日本語キーボードにある英数キー用にEisuが定義されました。そこで、RomanCharactersから、Eisuにマッピングを変更しています。

また、AndroidとFirefox OSも今回、Macと同様にマッピングを行っています。

Bug-org 936315 Replace key names "Nonconvert", "HalfWidth", RomanCharacters" and "FullWidth" with "NonConvert", "Hankaku", "Romaji" and "Zenkaku" 初回投稿日時: 2014年12月31日21時44分24秒
カテゴリ: Mozilla Core Mozilla37 バグ修正
固定リンク: id=2014123111
SNS: (list)

最新のD3E仕様では、日本語環境固有のキーにはラベルに即した名前が再定義されました。これにより、NonconvertNonConvertに、HalfWidthHankakuに、FullWidthZenkakuに、RomanCharactersRomajiに変更しました。

Bug-org 938987 Drop all dead key names since the latest D3E WD dropped them and use "Dead" instead. 初回投稿日時: 2014年12月31日21時48分03秒
カテゴリ: Events Mozilla Core Mozilla37 バグ修正
固定リンク: id=2014123112
SNS: (list)

以前のD3E仕様案では、デッドキーは、入力されるであろう文字ごとに名前が定義されていましたが、その数が膨大になっていく問題と、一部のプラットフォームでは、ネイティブイベントが示す、非合成文字から、合成文字を推測し、キー名にマッピングしなくてはいけないので、ブラウザ間での互換性の維持が困難という問題がありました。そのため、全てのデッドキーは、Deadというkey値で表現されるようになりました。

Bug-org 1020877 Rename key name, 'Live' to 'LiveContent' and it shouldn't be mapped to TV button of Android 初回投稿日時: 2014年12月31日21時52分09秒
カテゴリ: Android Events Gonk Mozilla Core Mozilla37 バグ修正
固定リンク: id=2014123113
SNS: (list)

最新のD3E仕様では、Liveキーが、LiveContentに変更になりました。また、これまでGeckoは、AndroidのKEYCODE_TVをこれにマッピングしていましたが、それはおかしい、意図していない使い方であると、D3Eのワーキンググループから指摘されたので、このマッピングを廃止しています。

Geckoは、LiveContentをどのプラットフォームのどのキーにもマッピングしていません。

Bug-org 900382 Define new key names, "Standby", "PowerOff", "WakeUp", "LogOff", "Suspend" and "Hibernate" for Windows, GTK and Qt 初回投稿日時: 2014年12月31日21時58分12秒
カテゴリ: Events GTK Mozilla Core Mozilla37 Qt バグ修正
固定リンク: id=2014123115
SNS: (list)

最新のD3E仕様では、新たに、StandbyPowerOffWakeUpLogOffSuspendHibernateキーが定義されました。これにあわせて、GTK、Qt、Windowsでは該当するキーにマッピングしました。

Bug-org 900384 Define new key name "Redo" for GTK 初回投稿日時: 2014年12月31日22時00分25秒
カテゴリ: Events GTK Mozilla Core Mozilla37 バグ修正
固定リンク: id=2014123116
SNS: (list)

D3E仕様には、Undoキーはありましたが、Redoキーがありませんでした。しかし、GTKでは定義されているため、新たに定義されました。このバグでは、簡単にマッピングが可能なGTKでのみ、マッピングを行っています。

Bug-org 900392 Define new key name "SingleCandidate" for GTK and Qt 初回投稿日時: 2014年12月31日22時05分20秒
カテゴリ: Events GTK Mozilla Core Mozilla37 Qt バグ修正
固定リンク: id=2014123117
SNS: (list)

GTKとQtでは、IBMのAIXの韓国語IME用に、単一候補を変換するキーが定義されていました。これに対応するため、D3Eの最新仕様ではSingleCandidateキーを定義し、Geckoは、各キーコードをこれにマッピングしています。

Bug-org 900400 Define new key names, "HiraganaKatakana" and "ZenkakuHankaku" for GTK, Qt and Android 初回投稿日時: 2014年12月31日22時10分51秒
カテゴリ: Android Events Firefox OS Gonk GTK Mozilla Core Mozilla37 Qt バグ修正
固定リンク: id=2014123118
SNS: (list)

Linux、Android系のプラットフォームでは、半角/全角キーや、カタカナ/ひらがなキーが、同じキーコードでキーイベントを生成するため、アプリ側は、イベントからはどちらのモードへの切り替えが行われているのか判別できません。これに対応するため、最新のD3E仕様では、不明な場合に物理的なキーの判別を手軽に行えるように、ZenkakuHankakuキーと、HiraganaKatakanaキーの二つを定義しました。Webアプリがこれらのキーを直接ハンドリングすることはほとんど無いと思いますが、これらのキーを処理する場合、Windows版Geckoでは、ZenkakuHankakuHiraganaKatakanaキーになっていることに注意してください。

Bug-org 936322 Support new key names "GroupNext", "GroupPrevious", "GroupFirst" and "GroupLast" for keyboard layout switching key 初回投稿日時: 2014年12月31日22時14分57秒
カテゴリ: Android Events Firefox OS Gonk GTK Mozilla Core Mozilla37 バグ修正
固定リンク: id=2014123119
SNS: (list)

GTKでは、キーボードレイアウトを変更するキーのキーコードが定義されています。また、Androidでも、KEYCODE_LANGUAGE_SWITCHというキーが定義されています。これにあわせて、最新のD3E仕様では、GroupNextGroupPreviousGroupFirstGroupLastキーが定義され、Geckoはこれらをマッピングしました。ちなみに、Android・Firefox OSのKEYCODE_LANGUAGE_SWITCHは、GroupNextにマッピングしています。

Bug-org 1023062 Define "TV", "TVInput", "TVPower", "AVInput", "AVPower", "STBInput", "STBPower" and map them 初回投稿日時: 2014年12月31日22時18分10秒
カテゴリ: Android Events Firefox OS Gonk Mozilla Core Mozilla37 バグ修正
固定リンク: id=2014123120
SNS: (list)

Androidでは、マルチメディアプレーヤーの、リモコン用のキーが定義されています。これを表現するために、最新のD3E仕様では、TVTVInputTVPowerAVInputAVPowerSTBInputSTBPwerが定義されました。Geckoでは単純に、該当するキーにマッピングを行いました。

Bug-org 1026939 Support new key names "LaunchFoo" for launching specific applications 初回投稿日時: 2014年12月31日22時22分57秒
カテゴリ: Android Events Firefox OS Gonk GTK Mozilla Core Mozilla37 Qt バグ修正
固定リンク: id=2014123121
SNS: (list)

Linux系と、Android系のプラットフォームでは、特定のアプリを起動するキーが多数定義されています。これにあわせて、D3E最新仕様では、Launchというプリフィックスの後ろに、アプリ名を入れることで、キー名をブラウザベンダが定義できるようにしています。今回の修正では、Webアプリにとって、さほど重要なキーではないことから、仕様でサンプルとして定義しているキーのみを追加し、マッピングしています。

Bug-org 1027007 Support multimedia keyboard's key values ("Close", "MailForward", "MailReply", "MailSend", "New", "Open", "Print", "Save" and "SpellCheck") 初回投稿日時: 2014年12月31日22時28分06秒
カテゴリ: GTK Mozilla Core Mozilla37 Qt バグ修正
固定リンク: id=2014123122
SNS: (list)

Microsoft社が出した、マルチメディアキーボードには、メーラーを操作するキーや、新規ドキュメント作成等の編集作業に便利なキーがありますが、GTKやQtでは、これらのキーのキーコードも定義しています。そこで、これらに対応するため、最新のD3E仕様では、CloseMailForwardMailReplyMailSendNewOpenPrintSaveSpellCheckキーが定義されました。GeckoではGTK、Qt上ではシンプルにこれらのキーをマッピングしています。

Bug-org 1027472 Support "Symbol" key value on Android and Gonk 初回投稿日時: 2014年12月31日22時31分10秒
カテゴリ: Android Events Firefox OS Gonk Mozilla Core Mozilla37 バグ修正
固定リンク: id=2014123123
SNS: (list)

Androidでは、KEYCODE_SYMというキーコードで、Symbolというモディファイアキーが定義されています。何に使用されているキーかは不明ですが、これを表現するために、D3Eの最新仕様ではSymbolキーが定義されました。Geckoではこれを単純にマッピングしています。

Bug-org 1027474 Support "VideoModeNext" on GTK 初回投稿日時: 2014年12月31日22時34分17秒
カテゴリ: Events GTK Mozilla Core Mozilla37 バグ修正
固定リンク: id=2014123124
SNS: (list)

最新のD3E仕様で定義されたキーの中に、VideoModeNextというキーがあります。これは、仕様書で参照している仕様で定義されているものですが、GTKに名前が同じ意味になるものが、存在していたので、Geckoではひとまず、マッピングを行いました。

Bug-org 1027477 Don't map Home button of Android to "Exit" key value 初回投稿日時: 2014年12月31日22時38分07秒
カテゴリ: Android Events Firefox OS Gonk Mozilla Core Mozilla37 バグ修正
固定リンク: id=2014123125
SNS: (list)

スマホには、ホームスクリーンへ戻る、Homeボタンが存在しています。これは、全てのアプリから戻るということで、Exitを割り当てていましたが、そのマッピングはおかしいと、D3Eのワーキンググループから指摘があったので、このマッピングを廃止しています。

ちなみに、Webブラウザでは、スマホのホームボタンはキーイベントすら発生しませんので、この修正による影響はFirefox OSのGaia等に限定された話となります。

Bug-org 865561 When WM_APPCOMMAND is caused by a key press, the handler should dispatch key event with D3E's KeyboardEvent.key 初回投稿日時: 2014年12月31日22時47分11秒
カテゴリ: Events Mozilla Core Mozilla37 Windows バグ修正
固定リンク: id=2014123127
SNS: (list)

Windowsでは、マルチメディアキーボードの、メール関連のキーや、編集関連のキー等が押された場合に、通常のWM_KEYDOWNメッセージではなく、WM_APPCOMMANDというメッセージがアプリに送信されます。Geckoはこれを受け取ると、内部向けのコマンドイベントを生成し、処理していますが、WM_APPCOMMANDは、その原因がキー操作かそれ以外かが分かるようになっていますので、D3Eで定義されたキーであれば、最初にkeydownイベントを生成し、これがpreventDefault()で、デフォルトアクションをキャンセルされていなければ、従来通り、内部向けのコマンドイベントを生成し、最後に、keyupイベントを生成するようにしました。

色々と細かい話があったはずなのですが、半年前に書いて、塩漬けになっていたパッチですので、細かいことは忘れてしまいました……