So the upload placeholder replacement is triggered in composer-editor.js.es6 here (on cancel) and here (on success) and handled by d-editor.js.es6 here 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.