Skip to content

fix(input): 写回前不比对框的长度上限,原生插入把超出 maxlength 的部分静默截掉 → 译文装不下时不写回,框里留原文、译文走提示条,刚好装得下照常替换(#654) - #700

Merged
Teeeeeeeerry merged 2 commits into
mainfrom
fix/654-maxlength-writeback
Oct 5, 2026

Conversation

@Teeeeeeeerry

Copy link
Copy Markdown
Owner

问题

输入翻译的译文比输入框的长度上限(maxlength)长时,写回后超出的部分被浏览器静默截掉。框里留下半句译文,用户可能直接把半句话发出去,比不翻更糟。这违反 ADR-0005 的出发点:宁可不猜,也不要让用户把一段不对的文字发出去。

根因

写回走浏览器原生插入(execCommand('insertText')),插入受 maxlength 约束,超出部分直接丢弃且不报错。写回判定 decideWriteBack() 只看原文快照与焦点(#646),代码里没有任何长度上限的处理。

修复

  • 同一个纯判定 decideWriteBack() 新增两项显式输入:translation(要写回的译文)与 maxLength(框的长度上限,没有时为 null)
  • 译文长度超过上限时返回 { write: false, reason: 'too-long' };长度按浏览器的口径数 UTF-16 码元
  • 在写回之前比对,不靠插入之后检查;收场与 输入翻译:送翻后框内内容已变动就不写回,译文走提示条(#633) #646 放弃写回相同:框里留原文,译文弹在提示条里让用户自取
  • 新增 inputMaxLength():单行与多行输入框读 maxLength(没写时浏览器给 -1,记为 null);contenteditable 没有 maxlength,恒为 null,本票对它不生效

验证

  • 单元(纯判定层):input-writeback.test.ts 新增 5 条,修复前红 3 条,另 2 条是照常写回的回归保护
    • 上限比译文短一个字符,不写回
    • 刚好等于译文长度,照常写回
    • 没有上限,照常写回
    • 增补平面字符按两个码元计
    • 上限为 0
  • 端到端 TC-E2E-132:多行文本框与单行文本框各跑一遍
    • 上限设为译文长度减一:框里还是原文,提示条里是完整译文
    • 上限设为译文长度:照常替换
    • 在未修复的代码上跑过,红
  • pnpm test 114 个文件 1412 条全绿;pnpm typecheck 通过;pnpm build 通过
  • pnpm test:e2e:core 88 过、2 跳过、1 不稳定:TC-E2E-126 是 DeepL 打桩加整页翻译的路径,与本票无关,重试通过,单独连跑 5 次都过

Closes #654

Teeeeeeeerry and others added 2 commits October 5, 2026 12:09
…译文走提示条,刚好装得下照常替换(#654)

Co-Authored-By: zhexuancai-uts <261878103+zhexuancai-uts@users.noreply.github.com>
Co-Authored-By: zhexuancai-uts <261878103+zhexuancai-uts@users.noreply.github.com>
@Teeeeeeeerry
Teeeeeeeerry merged commit f4980d9 into main Oct 5, 2026
6 checks passed
@Teeeeeeeerry
Teeeeeeeerry deleted the fix/654-maxlength-writeback branch October 5, 2026 01:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

输入翻译:长度上限装不下译文时不写回,译文走提示条(#633)

1 participant