Prevent typing past document length in read-only mode

In CM6, EditorView.editable.of(false) disables focus and cursor, whereas EditorState.readOnly.of(true) keeps focus and cursor enabled, so that in this second case typing advances the cursor but does not alter document content.

I found that, if I type past the final char in a document having EditorState.readOnly.of(true), this (1) triggers the error RangeError: Selection points outside of document (stack trace below) and (2) whatever was typed is actually added to the document.

Is being able to type past document length in read-only mode a bug?

If not a bug, how can I preempt the error and the addition? I have tried filtering out with EditorView.updateListener.of() and EditorState.transactionFilter.of() but in both cases, the error above is triggered before these hooks get a chance to be called.

For more context, my only registered extension is EditorState.readOnly.of(true). Searching the forum, the only seemingly relevant thread is this, but they were not triggering the error by using EditorState.readOnly.of(true).

Stack trace for reference
RangeError: Selection points outside of document
    checkSelection index.js:1541
    Transaction index.js:2240
    create index.js:2248
    resolveTransaction index.js:2421
    update index.js:2593
    dispatch index.js:6277
    applyDOMChange index.js:5654
    flush index.js:6056
    observer index.js:5765
    DOMObserver index.js:5748
    EditorView index.js:6217
    mounted ExpressionModalOutput.vue:54
    VueJS 17
    reload plugin-vue2:hmr-runtime:187
    reload plugin-vue2:hmr-runtime:185
    tryWrap plugin-vue2:hmr-runtime:60
    <anonymous> ExpressionModalOutput.vue:96
    accept client.ts:424
    fetchUpdate client.ts:340
    queueUpdate client.ts:195
    queueUpdate client.ts:195
    handleMessage client.ts:74
    handleMessage client.ts:72
    <anonymous> client.ts:45
    EventListener.handleEvent* client.ts:44

Thank you very much for your time.

This bug should be fixed already in recent versions of @codemirror/view.

1 Like

Confirmed, this bug was fixed very recently in:

Thank you again!