Skip to content

The restore() function does not correctly set neither the caret position nor selection by code #128

Open
@angezid

Description

@angezid

This is not related only to FireFox!

See a demo of this bug and result of fixing: bug-demo.zip

...
const { anchorOffset, focusOffset } = getSelection(),
    // detects setting selection by code and deletion at the beginning of text node
    greaterThan = pos.start !== pos.end || anchorOffset === 0 && focusOffset === 0;

visit(editor, el => {
    if (el.nodeType !== Node.TEXT_NODE) return;
    const len = (el.nodeValue || '').length;

    if ( !greaterThan && current + len >= pos.start || greaterThan && current + len > pos.start) {
        if ( !startNode) {
            startNode = el;
            startOffset = pos.start - current;
        }
        if (current + len >= pos.end) {
            endNode = el;
            endOffset = pos.end - current;
            return 'stop';
        }
    }
    current += len;
});
...

For the pos.end the comparison should always be >=.

For the pos.start the comparisons should be:

  • for typing or deleting end character of a text node - >=
  • for programmatic selection - >
  • for deleting the start character of a text node or range that started at the beginning of a text node - >

The two conditions are used to switch necessary comparison:

  • pos.start !== pos.end detects programmatic selection
  • anchorOffset === 0 && focusOffset === 0 detects deletion at the start of a text node

It won't fix open #111 and #115 issues. I was messed up with testing related to the issues.

By the way, maybe it worthwhile adding if (typeof highlight === 'function') highlight(editor, pos)? It removes dependency on highlighting plugin.

Metadata

Metadata

Assignees

No one assigned

    Labels

    firefoxA bug in FireFox itself

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions