A user (claas) reported an issue where the cursor is overridden when an image upload finishes, landing behind the uploaded image. codinghorror thought this might be expected behavior due to the text replacement, but claas argued that it’s not ideal for the user experience and proposed saving the cursor position before replacing the text.
codinghorror expressed concerns about the potential issues when typing actively while the image is being uploaded, but claas found that the only issue was a single omitted character when typing quickly.
To fix the issue, claas identified the relevant code in composer-editor.js.es6 and d-editor.js.es6 and suggested preserving the cursor position when replacing the text. A pull request (#4630) was submitted, and after codinghorror and zogstrip reviewed it, it was approved for merge once the tests are fixed.
It’s certainly a side effect of replacing the text, but it’s also not so nice for the user. I think we could save the cursor position before we replace the text and restore it thereafter.
Just tried it out a couple of times and all I could reproduce is that, if I type very fast, one character is omitted. Is this what you refer to as “weird stuff”?
I would say though that these are two phenomena that add up and getting rid of each of them is desirable, or isn’t it?
So the upload placeholder replacement is triggered in composer-editor.js.es6here (on cancel) and here (on success) and handled by d-editor.js.es6here or here respectively:
This would be the place where we could preserve the cursor position, given that we replace the text in a synchronous fashion (*):
If the cursor position is before the needle, preserve it.
If the cursor position is in the needle, set it to the end of the replacement.
If the cursor position is behind the needle, add (replacement.length - needle.length) to the cursor.
(*) = …but _setSelection (which is used by _replaceText to explicitly set the cursor behind the image) works in an asynchronous fashion.