在长度超过 ~125,000 个字符的文档中,每次退格都会出现 RangeError
□ 这只虫
过去大约125,000个字符,每个删除或扩展选择的按键投出一个字符:
未抓取范围错误: 最大调用堆栈大小已超过Ucs2encode',由Composition#deleteIndiction'-Get Expeded RangeIndiction'-TranslateUTF16 Postition from Offset'-`UTF16String#offsetTUCS2Offset'达成。
后空格, 删除和 < kbd> shift </ kbd>+rarow > 永久停止工作, 只要文档保持那么长。 打入仍然会插入,因此文档会不断增长,而且编辑器再也不能从键盘上被缩短. 内容是完好无损的——它只是无法编辑的.
□ 重现
时间轴 : <trix-editor}/ trix-editor> (中文(简体) ). 脚本 > const 编辑器 = 文档.querySelector ("trix-editor"). editor 编辑器。 插入String ("a"). repeat (200000) 编辑器. set 所选 Range (2000-00) (简体中文)
将Cursor放入尾部并按回放空间. 或者,没有键盘:
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你来干什么?
文档.querySelector ("trix-editor").editor.getDocument (.toUTF16String (. offsetTOUCS2Offset (2000.
// 范围错误: 最大调用堆栈大小超过Chrome 138.0.7204.101 / macOS 15.4.1, Trix 2.1.19. V8上的任何内容都应再生;带有下引号盖的引擎应更早地再生.
为什么
`ucs2encode'将整个阵列分散为一个调用:
{\fn黑体\fs22\bord1\shad0\3aHBE\4aH00\fscx67\fscy66\2cHFFFFFF\3cH808080}你来干什么? ucs2encode = (array) QQ String. from CodePoint (. Array. from (array QQ [)) 互联网档案馆的存檔,存档日期2014-12-02.
一个调用可以传播多少个参数被引擎所封住,以及调用时还剩下多少堆. 在节点24/V8上,上限测量为124,479个参数;在一个浏览器中,在更深的堆放下,它更低而没有固定. 过了它,调用 而不是返回字符串。
有两条路径到达“ ucs2encode ” ,其阵列与整个文档相同:
- XQUTF16String#offsetTOUCS2Offset 将整个前缀编码为去掉`.长'。 "组合#翻译UTF16 Position FromOffset"称每次倒闭的选秀都要如此.
`删除指令 ' 和`扩大选择 ' " 指示 " ——上面的链条,这就是每一个后方空间。
- `UTF16String. from Codepoints',取自`Utf16StringDifififififes',取自`SummarizeStringChange',其中`混合观察员'在区块内的每个文本上都有变化。 一个长段落是
够了。
在悬崖下方,同一个代码悄悄地昂贵: " offsetTOUCS2Offset " 在Cursor之前为每个键盘分配一份新的所有文件副本,因此每个后空格一个10万个字符复制一个数字。
这不是倒退。 " ucs2encode " 的倒置分支 -- -- 在 " String. fromCodePoint " 缺失的地方使用 -- -- 用 " foreach " 和 " join " 来建立绳子,没有这种限制;只有快道才是如此。 它自2021年解法后就已扩散,并在此之前被"Function.prototype.apply"所镀出,而"Function.prototype.apply"同样封顶.
□ 修补
以块进行编码,在单个共享函数中既修正调用路径,又计算代码单位而不是编码
. . . . . . .内容来源: basecamp/trix