fix: 避免快速停止重新开启网页录音

停止请求早于网页录音状态落地时,等待实际进入录音后再点击一次停止;网页仍在录音或尚未点击停止时不再完成外部会话。

AI-assisted-by: Codex
AI-model: gpt-5.6-sol
AI-reasoning-effort: medium
Co-authored-by: Codex <codex@openai.com>
This commit is contained in:
2026-09-04 17:32:12 +08:00
co-authored by Codex
parent e9f7bc99e9
commit 29809d9cd3
5 changed files with 43 additions and 13 deletions
+10 -1
View File
@@ -1,6 +1,6 @@
import assert from 'node:assert/strict';
import test from 'node:test';
import { shouldClickMicrophoneOnCancel } from '../src/preload/speech-session-state';
import { shouldClickMicrophoneOnCancel, shouldClickMicrophoneOnStop } from '../src/preload/speech-session-state';
test('停止命令已经点击过麦克风后,取消不得再次点击并重新开启录音', () => {
assert.equal(shouldClickMicrophoneOnCancel(true, true), false);
@@ -13,3 +13,12 @@ test('录音期间直接取消时仍应点击麦克风停止网页录音', () =>
test('本地会话未激活时取消不得点击麦克风', () => {
assert.equal(shouldClickMicrophoneOnCancel(false, false), false);
});
test('停止到达但网页尚未开始录音时不得再次点击开始按钮', () => {
assert.equal(shouldClickMicrophoneOnStop(false, false), false);
});
test('网页异步进入录音后只点击一次停止按钮', () => {
assert.equal(shouldClickMicrophoneOnStop(true, false), true);
assert.equal(shouldClickMicrophoneOnStop(true, true), false);
});
+11 -3
View File
@@ -5,7 +5,7 @@ import { shouldFinishAfterStop } from '../src/preload/stop-completion';
const base = {
elapsedMs: 700,
quietMs: 500,
wasRecordingAtStop: true,
stopClicked: true,
isRecording: false,
minimumWaitMs: 250,
quietWindowMs: 450,
@@ -16,6 +16,10 @@ test('网页仍在录音时不得提前提交', () => {
assert.equal(shouldFinishAfterStop({ ...base, isRecording: true }), false);
});
test('尚未点击停止时不得提交', () => {
assert.equal(shouldFinishAfterStop({ ...base, stopClicked: false }), false);
});
test('网页结束且最终文本静默窗口满足时立即提交', () => {
assert.equal(shouldFinishAfterStop(base), true);
});
@@ -24,6 +28,10 @@ test('网页结束后仍有文本修正时继续等待', () => {
assert.equal(shouldFinishAfterStop({ ...base, quietMs: 120 }), false);
});
test('网页状态未回切时由超时兜底结束', () => {
assert.equal(shouldFinishAfterStop({ ...base, elapsedMs: 4_500, isRecording: true }), true);
test('网页仍在录音时超时也不得提交', () => {
assert.equal(shouldFinishAfterStop({ ...base, elapsedMs: 4_500, isRecording: true }), false);
});
test('网页已停止时超时可以结束静默等待', () => {
assert.equal(shouldFinishAfterStop({ ...base, elapsedMs: 4_500, quietMs: 120 }), true);
});