`HTMLEditor::DoSplitNode` does:
1. Insert a new right node
2. Move content in left node into the right node
`HTMLEditor::DoJoinNodes` does:
1. Move content of the right node to the left node
2. Delete the left node
So, all things are done when connected. Therefore `IMEContentObserver` uses its
cache and it's harder to debug. Additionally, temporarily the touching range
becomes wider then the result at joining nodes. That could cause IME gets
received longer text change range. Therefore, they should do:
`HTMLEditor::DoSplitNode`:
1. Move content in left node to the orphan new right node (then, only removing
content is handled by `IMEContentObserver`)
2. Insert the right node (then, `IMEContentObserver` can compute the offset and
length only once)
`HTMLEditor::DoJoinNodes`:
1. Delete the right node (then, all moving content is treated as removed by
`IMEContentObserver`, i.e., it needs to compute offset/length once)
2. Move the non-connected right node children into the left node (then,
`IMEContentObserver` can cache all moving nodes and compute offset/length once)
Differential Revision: https://phabricator.services.mozilla.com/D232882