Why are checkCaretVisibility || hasChanged("isFocused") also reasons to call updateCaretHeightAndPosition()? Don't see that dependency yet. What I see is:
* updateCaretSize, because that is the explicit request.
* hasChanged("isVisible") because caretState.isVisible === false would have blocked any intermediate requests by updateCaretSize
I also wonder about all changes hidden by cursor.getSelectionType() !== ops.OdtCursor.RangeSelection. How to know what to do exactly when the type again switches to RangeSelection?

Would it perhaps make sense to only reset "dirty" flags in branches where they are handled? Hm. Somehow the logic as proposed in updateCaret() does not yet make me feel good. No alternative proposal yet.