- From: Oliver Hunt <oliver@apple.com>
- Date: Wed, 1 Aug 2007 14:42:52 -0700
- To: public-webapi@w3.org
Hi all, Recently Doug Schepers contacted the Apple WebKit team for feedback on the DOM3 key event model (http://www.w3.org/TR/DOM- Level-3-Events/keyset.html), and after some discussion asked if i could bring some of the details into a public thread. While it is good to see work being done to define the behaviour of key events there are a couple of points that we find to be cause for concern: * The behaviour and interaction (and existence) of a keypress event is completely absent. While the keypress events are (to a greater or lesser extent) evil, they are used extensively on many websites, and are supported by all major browsers, so not defining behaviour will leave us trapped in the awful quagmire of incompatibility that already exists. * Defining IME composition events is an incredibly good plan, however I am concerned that overloading the meaning of keydown/up events will lead to awkward bugs on sites that do not account for the existence of IMs. There are many sites that already treat the keydown event as being an appropriate time to process input, and subsequently break under IMs unless the event model is very careful, and sending full strings to indicate composition events seems likely to cause a variety of annoying bugs to users of IMs. Anyhoo, just for reference the WebKit key press handling is (approximately) as follows: function handleKeyEvent(event) { if (event.isKeyUpEvent) { // Fire a DOM KeyUp event fireKeyUpEvent(event); return; } // We need to call the input method now as the our behaviour changes according to whether // the event was handled by the Input Method if (inputMethod.handleEvent(event)) { // The event was handled by the Input Method, if the IM would insert/change the current composition as a result // of this event then the change has *already* happened // A number of sites break under IMs if we just send the correct keyCode for the keyDown for an IM handled event // So we set the keyCode to 229, which matches IE :-/ event.keyCode = 229; // Fire a DOM keydown event fireKeyDownEvent(event); return; } // Even though the IM has not "handled" the event the content of the text region may have // changed (eg. confirmation of a composition with various Korean IMs) bool defaultHandled = fireKeyDownEvent(event); defaultHandled = fireKeyPressEvent(event) || defaultHandled; if (!defaultHandled) fireTextInputEvent(event); } This behaviour is not something that should be used to standardise on as it has been designed with the goal of website compatibility rather than to be "nice". Important things to note: * preventDefault on KeyDown will *not* prevent KeyPress events from being fired (this matches Firefox behaviour, and is needed for a couple of sites) * preventDefault on KeyDown *or*KeyPress will prevent the TextInput event, eg. no text will be inserted * autorepeat keys trigger keydown and keypress events (otherwise we break sites that expect keydown for all keyevents) * KeyPress and TextInput events are *not* fired if an Input Method has handled the event * the keyCode for a KeyDown event that has been handled by the Input Method will be 229, this is needed to not break a number of sites -- might be reducible to only mask the keycode for control keys, but that's difficult to verify. People do really stupid things on keydown. * the Input Method *may* have side effects that occur before any key event has been fired. This is kind of icky, but matches IE behaviour, but i strongly doubt any sites exist that depend on this behaviour. --Oliver
Received on Wednesday, 1 August 2007 21:57:39 UTC