AppFlowy-IO/appflowy-editor

[Bug] replaceText has the possibility of throwing `Bad state: no element`

Opened this issue · 0 comments

Bug Description

The transaction of replaceText does not check the length of the Delta before calling .first.

How to Reproduce

Immediately after inserting a TextDelta with no attribute, call replaceText.

Eg.

  final transaction = editorState.transaction
    ..insertTextDelta(
      node,
      selection.end.offset,
      Delta(operations: [TextInsert('insert')]),
    )
    ..replaceText(
      node,
      selection.end.offset - 3,
      3,
      'replacement',
    );

Expected Behavior

Change the code in replaceText:

    var newAttributes = attributes;
    if (index != 0 && attributes == null) {
      newAttributes = delta.slice(max(index - 1, 0), index).first.attributes;
      if (newAttributes == null) {
        final slicedDelta = delta.slice(index, index + length);
        if (slicedDelta.isNotEmpty) {
          newAttributes = slicedDelta.first.attributes;
        }
      }
    }

To add a required check and make sure the logic is correct.

Specifically the call to .first on delta.slice(max(index - 1, 0), index) is what might fail.

Operating System

AppFlowy Editor Version(s)

main

Screenshots

No response

Additional Context

No response