It ignores widgets and nodes added by the view to work around browser issues (such as cursor wrappers and extra <br> nodes in empty textblocks). Pseudo elements aren’t part of the DOM data structure and can’t be observed by scripts (at least, not like this). This also makes it impossible to intentionally set the selection before or after them — they don’t get their own DOM offset, so you can’t specify whether a Range endpoint should be before or after it. (This is an area where the design of the DOM, CSS, and contentEditable interact in bloody awful ways that I guess the people designing them didn’t ever think about.)