<div>This discussion stalled on whatwg a bit. Sending an update in the hopes that we can start getting code reviewed and checked in here.</div><div><br></div>In the discussion on whatwg, there weren&#39;t any vendors that opposed adding beforeInput/input, but there also wasn&#39;t outright support. There was hesitance from Boris Zbarsky about whether the complexity of a beforeInput event was worth it. I tried to get more feedback from other vendors, but I think this is all we&#39;re going to get. So, we&#39;d like to move forward where it makes sense.<div>

<br></div><div>The obvious case is firing the input event for contentEditable areas as well as text controls. There&#39;s a patch up at <span class="Apple-style-span" style="font-family: arial, sans-serif; font-size: 13px; border-collapse: collapse; "><a href="https://bugs.webkit.org/show_bug.cgi?id=26526" target="_blank" style="color: rgb(42, 93, 176); ">https://bugs.webkit.org/show_bug.cgi?id=26526</a> for this that I intend to start reviewing shortly.</span></div>

<div><font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse;"><br></span></font></div><div><font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse;">As for the beforeInput event, upon further inspection, the textInput event, which we currently support, already meets most of what we&#39;re looking from for beforeInput. So, instead of adding another event in addition to textInput, we&#39;re instead proposing that textInput be extended to fire for all the cases we fire input. <span class="Apple-style-span" style="font-size: 13px; ">I&#39;ve started a discussing this on www-dom: <a href="http://lists.w3.org/Archives/Public/www-dom/2010AprJun/0082.html" target="_blank" style="color: rgb(42, 93, 176); ">http://lists.w3.org/Archives/Public/www-dom/2010AprJun/0082.html</a>.</span></span></font></div>

<div><font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse;"><br></span></font></div><div><font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse;">So, I&#39;d like to see the following steps taken in this order:</span></font></div>

<div><font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse;">1. Add input to contentEditable</span></font></div><div><font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse;">2. Extend textInput to fire for all cases where we currently fire input.</span></font></div>

<div><font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse;">3. Add an action/inputMode property to textInput/input that specifies the user-action that caused the event.</span></font></div>

<div><font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse;"><br></span></font></div><div><font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse;">At some point, we might also want to rename/alias textInput to beforeInput.</span></font></div>

<div><font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse;"><br></span></font></div><div><font class="Apple-style-span" face="arial, sans-serif"><span class="Apple-style-span" style="border-collapse: collapse;">Ojan</span></font></div>

<div><div><br><div class="gmail_quote">On Fri, Feb 12, 2010 at 4:33 PM, Ojan Vafai <span dir="ltr">&lt;<a href="mailto:ojan@chromium.org">ojan@chromium.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

<div class="gmail_quote"><div class="im">On Wed, Feb 10, 2010 at 9:11 PM, Maciej Stachowiak <span dir="ltr">&lt;<a href="mailto:mjs@apple.com" target="_blank">mjs@apple.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


<div style="word-wrap:break-word"><div><div><div><div><div>On Feb 10, 2010, at 4:56 PM, Ojan Vafai wrote:</div><blockquote type="cite">We&#39;d like to implement this event and want to make sure there&#39;s no opposition before moving forward. I don&#39;t expect this to require huge rewrites to current webkit code, but it will definitely require some plumbing to make it so that all user-gestures that modify the DOM go through this codepath.<br>




<br>The proposal is that the input event be fired for any user-gesture that results in a modification to the DOM. This matches the input event for text controls. We&#39;d like to add an &#39;action&#39; property (open to better names) that indicates what the user-gesture was (e.g. paste, deleteword, undo, inserttext, etc). The goal is to simplify monitoring of changes to rich-text regions and to enable use-cases where the data is stored in a different model than HTML. This is needed so that, for example, an undo operation can be applied correctly on the model as well as the DOM.<br>




<br>The beforeinput event would fire before the DOM is modified and is cancelable. I don&#39;t think this should be too much more work than adding the input event, an exception might need to be made for IME input here though. Specifically, it might be hard to make IME events cancelable.<br>




<br>More details:<br><a href="https://bugs.webkit.org/show_bug.cgi?id=26526" target="_blank">https://bugs.webkit.org/show_bug.cgi?id=26526</a><br>Initial whatwg thread: <a href="http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2009-June/020553.html" target="_blank">http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2009-June/020553.html</a><br>




Hixie&#39;s response: <a href="http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2009-July/021101.html" target="_blank">http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2009-July/021101.html</a></blockquote></div></div>


</div><div>Sounds like there are basically three changes here:</div><div><br></div><div>1) Fire &quot;input&quot; event for contentEditable areas as well as for text-entry form controls.</div><div>2) For every case where we&#39;d fire &quot;input&quot; per #1, add a new &quot;beforeinput&quot; event.</div>


<div>3) Add a new InputEvent (or something) interface with an &quot;action&quot; attribute to use for &quot;input&quot; and &quot;beforeinput&quot; events.</div></div></div></blockquote><div><br></div></div><div>Exactly. </div>

<div class="im">
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div><div></div><div>All of this seems reasonable on the face of it. Here is some specific feedback:</div>


<div><br></div><div>A) We should treat these as three separate changes. Let&#39;s do a separate bug, patch and set of tests for each.</div></div></div></blockquote><div><br></div></div><div>Makes sense. </div><div class="im">

<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div style="word-wrap:break-word"><div><div></div><div>B) Let&#39;s go back to the standards groups again (either whatwg or public-html is fine), this time with the additional information that we&#39;re planning to implement this soon. I&#39;d like to see if other vendors are at least roughly on board with this direction.</div>


</div></div></blockquote><div><br></div></div><div>Also makes sense.</div><div class="im"><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word">

<div>
<div>C) &quot;input&quot; is defined as allowing batching of changes (so it can coalesce typing for instance). It seems like &quot;beforeinput&quot; couldn&#39;t do that, if it&#39;s supposed to fire before the DOM is changed. So there might not end up being a one-to-one correspondence between &quot;beforeinput&quot; and &quot;input&quot; events.</div>


</div></div></blockquote><div><br></div></div><div>That seems OK to me. It&#39;s a bit weird, but it&#39;s not unlike having repeated keydown events followed by a single keyup event. I&#39;m a bit ambivalent that beforeinput loses the batching behavior, but it&#39;s necessary for the event to be useful. Also, we would need to spec that only input events with the same action can be batched. For example, you can&#39;t batch input events for an undo and a text-entry, but you can coalesce typing.</div>

<div class="im">
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div><div>It seems like it may be tricky to define exactly when it is supposed to fire and how often, especially in the presence of input methods. I&#39;d also like to understand the relationship to the DOM Level 3 Events textInput event: &lt;<a href="http://www.w3.org/TR/DOM-Level-3-Events/#event-type-textInput" target="_blank">http://www.w3.org/TR/DOM-Level-3-Events/#event-type-textInput</a>&gt;. Clearly &quot;beforeinput&quot; is more broadly applicable, but when both would fire, which comes first?</div>


</div></div></blockquote><div><br></div></div><div>I agree that we should be explicit about this, but for any use case I can think of, it doesn&#39;t matter which fires first as long as we&#39;re consistent. Conceptually, I think of beforeInput as before any changes have been made to the DOM and input being after all changes have been made, so it kind of makes sense to me that textInput would fire before input.</div>


<div><br></div><div>In general, input is a superset of textInput, except that textInput also fires for changes initiated by script and textInput tells you what text is getting inserted. Firing for script-initiated text input seems wrong to me, so I&#39;d say we should lobby to drop that requirement from textInput. It might be worth considering not adding an InputEvent and instead extending the TextEvent &lt;<a href="http://www.w3.org/TR/DOM-Level-3-Events/#events-Events-TextEvent" target="_blank">http://www.w3.org/TR/DOM-Level-3-Events/#events-Events-TextEvent</a>&gt;. In that world, &quot;action&quot; becomes &quot;inputMethod&quot; and &quot;data&quot; is the empty string for any inputMethods that are not text-entry. If we did that, I think we should drop it and use the input event assuming there&#39;s no compat problem. I know Google Wave uses textInput, but they would stop using it once we implemented input.</div>

<div class="im">
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><div><div>It might be good to roughly hash out the design of &quot;beforeinput&quot; in writing, if we eventually want to take it to standards, so there is some design information besides our implementation to go on.</div>


</div></div></blockquote><div><br></div></div><div>Agreed. I&#39;ll take a stab at that and propose both ideas (having input replace textInput and having input live side-by-side with textInput). </div><div><br></div><div>

Thanks for your feedback. It gives a good starting place. I think the hardest part will be the complexity of input methods.</div>
<div><br></div><div>Ojan</div></div><br>
</blockquote></div><br></div></div>