- From: Johannes Wilm <johannes@fiduswriter.org>
- Date: Sat, 24 Oct 2015 16:45:47 +0900
- To: Ryosuke Niwa <rniwa@apple.com>
- Cc: Koji Ishii <kojiishi@gmail.com>, "public-editing-tf@w3.org" <public-editing-tf@w3.org>
- Message-ID: <CABkgm-R8cU4yxW2eVZs_gORS9iMhr3j9hG8hFOfbUCiNqsSLuA@mail.gmail.com>
On Sat, Oct 24, 2015 at 4:20 PM, Ryosuke Niwa <rniwa@apple.com> wrote: > > On Oct 24, 2015, at 12:01 AM, Johannes Wilm <johannes@fiduswriter.org> > wrote: > > On Fri, Oct 23, 2015 at 10:27 PM, Koji Ishii <kojiishi@gmail.com> wrote: > >> We had some discussions internally today. While I expect us to discuss >> more details next week, here are some short updates: >> >> - Ryosuke's approach looks interesting, we'd like to learn a little >> more details next week. >> - Re-confirmed that canceling compositionstart does not work on some >> platforms, so it's a choice of not to allow cancel, or cut off >> interoperability on some such platforms. >> >> > What platforms are those? And is this because of the IME are incapable of > being made to work this way or because the browser implementations of the > current spec is broken? > > I think it would help a lot to know which platforms we are talking about > when making such decisions. > > > Why is this an issue at all if we're letting JS modify DOM? You can't > cancel regular key down/press either in a sense but that doesn't prevent > authors from having full control over DOM, right? > I have a feeling we must be talking about different things. If a user presses a key, in Javascript I can do preventDefault on that event so that the DOM never changes. The same is not true for IME input. I can (currently) cancel compositionstart - but then I don't know what input would have been inserted had I let it continue, so in most cases this is not very useful. Anyway, this is what Koji apparently wants to take away. At any stage beyond compositionstart, I can not cancel the input. The IME modifies the DOM and there is nothing I can do about it, unless I am missing something. This is why keyboard input is something the editor has full control over, whereas IME input the editor has almost no control over. But I am sure you know this and I'm just repeating the obvious.. So I'm wondering if you meant something else than what I read into the phrase "cancel regular key down/press", etc. . > > >> - Moving focus during compositionstart may work if we can limit it to >> some criteria, such as: >> 1. To non-replaced elements/text nodes. >> 2. Only during compositionstart. >> >> > So not at compositionend? We would need that as well. > > >> >> 1. >> 2. There are no composition string (i.e., discussed about >> partial-commits; we were not sure how well partial-commits are defined nor >> interoperable though.) >> >> > So in other words: This would not work on recomposition for Android/iOS? > > >> >> 1. >> 2. The screen position of the caret does not change (i.e., >> inserting empty div and moving into it will not move.) >> 3. Shadow DOM is likely to cause some technical issues. It's >> workable, not sure worth. >> - These criteria looks ok for the Johaness's use case to me, unless I >> miss something. >> >> > If I understand this correctly, it solves one problem: Creating an <ins> > or a <strong> node or alike when new text is typed that will contain the > new text. > > But it does not solve the more fundamental problem of having the JS editor > keep control of what goes into it's part of the DOM and being able to do > atomic commits. > > Do I read that correctly? In that case, I think we need to try a little > harder. If this is a matter of having to spend a little more time to make > the caret be movable to the Shadow DOM in a specific browser, I think is > time you will need to invest. Otherwise we create a spec that will be > almost as problematic as what we currently have, and with more and more > text input moving from direct keyboard input to some form of IME, we will > be back trying to fix the same problem with a new spec in six months or so. > > > > >> /koji >> >> On Thu, Oct 22, 2015 at 1:51 AM, Johannes Wilm <johannes@fiduswriter.org> >> wrote: >> >>> >>> >>> On Wed, Oct 21, 2015 at 2:42 PM, Ryosuke Niwa <rniwa@apple.com> wrote: >>> >>>> Hi all, >>>> >>>> == Background == >>>> >>>> I've been thinking about various problems about IME, and I think we >>>> should go back to contenteditable=events because letting Web browsers make >>>> any DOM mutations is a slippery slope. >>>> >>>> We went with contenteditable=typing because the composition text had to >>>> be rendered differently than ordinary text and we couldn't expose every IME >>>> state (e.g. candidate states). But there is an alternative approach that >>>> doesn't invoke DOM mutations. >>>> >>>> We (Apple) have also found another issue with the current design. We >>>> need to remember when autocorrections are reverted by the user (via undo). >>>> In order for features like these to work, we need to attach meta data on >>>> text the user had typed. Furthermore, single text node model of IME doesn't >>>> work for more advanced text editors; e.g. one with a custom justification >>>> algorithm which needs to replace each character in a separate div. >>>> >>>> == Proposal == >>>> >>>> 1. We make all IME actions/commands simply requests from Web browsers. >>>> JS will have full control over what it does with those requests. >>>> 2. Web browsers automatically stylizes and remembers meta data for the >>>> typed text based on caret (collapsed selection) location and innerText of >>>> the closest editing host (root editable node). >>>> >>>> (2) is the key. Instead of browser taking the control of what's >>>> happening in IME, etc..., we'll get the state out of the Web apps. We would >>>> treat everything in the current contenteditable=events (except >>>> contenteditable=false contents) as the pre-existing text + user edited >>>> text. This will allow browsers to map the current content with what the >>>> user had typed, etc... This should work 99% of the time when the apps are >>>> respecting browser/user issued IME requests. >>>> >>>> >>> Do I understand correctly that the browser will keep a copy of the text >>> as it was when the browser page was initiated and will then once the page >>> changes simply compare the copy it kept with the current state and assume >>> that anything that was not there at the beginning was added by the user in >>> the current session? And it will then turn of spell checking, auto fixing >>> for those parts of the text that have been edited by the user in the >>> current session? Or the other way round? >>> >>> >>> This all sounds good to me in general, but a few smaller >>> remarks/questions: >>> >>> A. Earlier it was said that ti would be very hard to cancel IMEs or not >>> to allow their input directly into the DOM. I assume you have found a new >>> way that would make this possible? Do all the browser people agree that >>> this is possible? >>> >>> B. The hierarchy of modes we decided upon were, AFAIR: events, caret, >>> typing, true/all. The difference between caret and event is that caret will >>> include browser based caret movement. We had some back and forth with the >>> JS editor people where Koji's and my position was that block direction >>> caret movement would not be so difficult to implement in JS [1], but JS >>> editor developers from CKeditor and Prosemirror/Codemirror seemed to like >>> the idea better of this being controlled by the browser. So before >>> switching to cE=typing, I think the last mode we focus on was cE=caret. So >>> my question is: Should we switch back to caret or to events? >>> >>> C. What could such an IME interface look like for the JS developer? We >>> would get a composition start event and a series of other beforeInput >>> events that have no default action. We then need to write JS to actually >>> make the individual characters appear where the caret currently is, >>> correct? The IME would assume that we display the characters it produces in >>> the place where the caret was before compositionstart and no matter whether >>> we actually put them there or not, will act as if we did, right? >>> >>> So we might get something like the following events in this order: >>> >>> 1. compositionstart (no default action) >>> >>> 2. beforeInput/Edit replaceContent event w/ isComposing: true and >>> targetRanges: range that covers the word that is to be replaced >>> >>> 3. beforeInput/Edit insertCharacter >>> >>> 4. beforeInput/Edit insertCharacter >>> >>> 5. beforeInput/Edit insertCharacter >>> >>> 6. (user wants to go one position to the left within the composition) >>> selectionchange event >>> >>> 7. beforeInput/Edit deleteContent, data: 'backward'. >>> >>> 8. beforeInput/Edit insertCharacter >>> >>> 9. compositionend >>> >>> Right? >>> >>> D. Would this work even if we don't actually put the things into the DOM >>> the way it had been imagined? How about the selectionchange event -- I >>> assume this is something the IME will have to know about as well? >>> >>> E. How about the underline? Is this something we will have to add >>> ourselves (and be able to do), or will the browser simply assume that all >>> added content between compositionstart and compositionend is part of the >>> composition and will therefore be underlined during the time of the >>> composition? >>> >>> >>> >>> >>> >>>> - R. Niwa >>>> >>>> >>>> >>> >>> [1] https://github.com/w3c/editing/issues/65 >>> >>> -- >>> Johannes Wilm >>> Fidus Writer >>> http://www.fiduswriter.org >>> >> >> > > > -- > Johannes Wilm > Fidus Writer > http://www.fiduswriter.org > > -- Johannes Wilm Fidus Writer http://www.fiduswriter.org
Received on Saturday, 24 October 2015 07:46:17 UTC