Google ChromeでKeyboardEventの生成方法

閲覧: 2,733 回
最初の未読メッセージにスキップ

teramako

未読、
2011/10/21 9:47:072011/10/21
To: chrome-api-d...@googlegroups.com
こんにちは

とあるキーボード系の拡張機能で、keypressイベント等を拾ってアクションを起
こすものがあります。
このセキュリティ的なテストとして、コンテンツ側からキーボードイベントを生
成し、ディスパッチした時に、拡張側が拾ってしまわないかどうかを行いたいの
ですが、生成方法が分かりません。

var evt = document.createEvent("KeyboardEvent");
としたあと、evt.initKeyboardEvent(....)の引数は何を指定すれば良いでしょ
うか?

試した限りでは、DOM Level 3 に批准しているようにも思えません。
どこか、正確なドキュメントは無いのでしょうか?

よろしくお願いします。

Constellation

未読、
2011/10/21 11:31:452011/10/21
To: chrome-api-d...@googlegroups.com
どうもですー.

Google Chromeには, なんと! WebKitという良質なdocumentが!!! という冗談は置いておいて,
というわけでDOM specに沿っていないらしく

を見るに,

ev.initKeyboardEvent("keypress", true, true, window, "U+004A", KeyboardEvent.DOM_KEY_LOCATION_STANDARD, false, false, false, false, false);

とかでしょうかー.

ただし, keyCode, which, charCodeが0になるbugがあるので, 大抵handlerがそれで認識しているために, うまくはいかないようですー.
お力になれず申し訳ないです.


Shogo Ohta

未読、
2011/10/21 12:50:042011/10/21
To: chrome-api-d...@googlegroups.com
こんにちは。

Constellationさんがあげた https://bugs.webkit.org/show_bug.cgi?id=13368
にもありますが、仕様に沿ってないと言うより、古いバージョンの仕様に準拠しているといった状況ですね。

http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/events.html#Events-KeyboardEvent-initKeyboardEvent
より、具体的なコードにすると、

var e = document.createEvent('KeyboardEvent');var o = {
type:'keydown',  canBubble: true,  cancelable: true,  view: window,
keyIdentifier: 'U+0051',  keyLocation: 0,  ctrlKey: false,  shiftKey:
false,  altKey: false,  metaKey: false,  altGraphKey:
false};e.initKeyboardEvent(o.type, o.canBubble, o.cancelable, o.view,
o.keyIdentifier, o.keyLocation, o.ctrlKey, o.shiftKey, o.altKey,
o.metaKey, o.altGraphKey);document.dispatchEvent(e);
こんな感じです。
このあたりは古い仕様と最近の仕様を共存させる方法がなくて難しいですし、どのバージョンに準拠しているのかドキュメントがないのは辛いですね。。
ちなみに、次のように強引にKeyboardEventのように見せかけることはできなくはないです。(__proto__など、推奨はできませんが…)

var e = document.createEvent('Event');
var o = {
type:'keydown',
canBubble: true,
cancelable: true
};
var ko = {
view: window,
detail: 0,
keyIdentifier: 'U+0051',
keyLocation: 0,
ctrlKey: false,
shiftKey: false,
altKey: false,
metaKey: false,
altGraphKey: false,
keyCode: 81,
charCode: 81,
which: 81,
layerX: 0,
layerY: 0,
pageX: 0,
pageY: 0
};
e.initEvent(o.type, o.canBubble, o.cancelable);
Object.keys(ko).forEach(function(k) {
e[k] = ko[k];
});
e.__proto__ = document.createEvent('KeyboardEvent').__proto__;
document.dispatchEvent(e);


2011年10月22日0:31 Constellation <utata...@gmail.com>:

> --
> このメールは Google グループのグループ「Chrome API Developers JP」の登録者に送られています。
> このグループに投稿するには、chrome-api-d...@googlegroups.com にメールを送信してください。
> このグループから退会するには、chrome-api-develop...@googlegroups.com
> にメールを送信してください。
> 詳細については、http://groups.google.com/group/chrome-api-developers-jp?hl=ja
> からこのグループにアクセスしてください。
>

teramako

未読、
2011/10/21 20:47:202011/10/21
To: chrome-api-d...@googlegroups.com
こんにちは

Constellation さん、 os0x さん、ご回答ありがとうございます。
ドキュメントが無いのは厳しい>< WebKit版MDN (旧MDC) が欲しいところです。

os0x さんの方法でキーボードイベントを生成してみましたが、拡張機能からは反応無しなので、現状では問題ないであろうという結論に至りました。
(逆に言うと、スクリプトから生成したイベントを拾う術はない、ということになりそうですが。。。)

重ね重ね、ありがとうございました。

全員に返信
投稿者に返信
転送
新着メール 0 件