私は Firefox アドオンを作成しており、キー イベントをプログラムで生成する必要があり、ユーザーがそれらのキーを入力したかのようにブラウザが実行するすべてのアクションを実行する必要があります。
DOMWindowUtils ( https://developer.mozilla.org/en-US/docs/XPCOM_Interface_Reference/nsIDOMWindowUtils ) の sendKeyEvent を使用しようとしています。次の問題が見つかりました。
contentEditable フィールド内で左矢印/右矢印などのイベントを生成すると、ブラウザーはカーソル位置を変更しません。なんで?(注:「a」、「b」などの文字のイベントを生成すると、ブラウザは contentEditable 領域内のテキストを適切に更新するため、コードに明らかな欠陥はありません)。非 contentEditable フィールドの場合、期待どおりに動作します。
Tools->Web Developer->Scratchpad で、環境「Browser」で実行できるサンプル コード (コードには chrome 権限が必要です)。
var doc = gBrowser.contentDocument,
win = doc.defaultView;
var domWindowUtils = win.QueryInterface(Components.interfaces.nsIInterfaceRequestor)
.getInterface(Components.interfaces.nsIDOMWindowUtils);
var div = doc.getElementById('contentEditableDiv');
div.focus();
['keydown', 'keypress', 'keyup'].forEach(function(type) {
// if I generate characters like 'a', 'b' they work
// domWindowUtils.sendKeyEvent(type, 65, 97, 0, 0);
// 37 is left arrow, 38 right arrow
domWindowUtils.sendKeyEvent(type, 37, 0, 0, 0);
});
使ってみinitEvent/dispatchEvent
ましたが同じ結果です。
イベントを確実に生成し、ブラウザーにすべてのアクションを実行させる方法はありますか?