Skip to content

Commit b7c9932

Browse files
committed
fix(cat): clear stale compact mirror timers
在 CAT1 compact mirror 的立即关闭路径中清理 pending settled timer,避免延迟回调在状态变化后再次触发 inactive。\n\n保留 compact-surface-settled 的一次性延迟关闭语义,补充静态契约测试覆盖 timer 清理顺序。
1 parent 46c10ad commit b7c9932

2 files changed

Lines changed: 15 additions & 0 deletions

File tree

static/avatar-ui-buttons.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1436,6 +1436,10 @@ function _setNekoIdleCat1CompactMirrorActive(button, container, active, options
14361436
}
14371437
return true;
14381438
}
1439+
if (container.__nekoIdleCat1CompactMirrorSettleTimer) {
1440+
clearTimeout(container.__nekoIdleCat1CompactMirrorSettleTimer);
1441+
container.__nekoIdleCat1CompactMirrorSettleTimer = 0;
1442+
}
14391443
if (!container.__nekoIdleCat1CompactMirrorActive) return true;
14401444
container.__nekoIdleCat1CompactMirrorActive = false;
14411445
container.classList.remove('is-cat1-compact-mirror-active');

tests/unit/test_avatar_return_button_idle_tiers_static.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -464,6 +464,17 @@ def test_cat1_walk_to_minimized_chat_contract_is_present():
464464
assert "via: 'local'" in source
465465
assert "return dispatchedLocal;" in source
466466
assert "assetUrl: options.assetUrl || _getNekoIdleReturnAssetUrl(_NEKO_IDLE_TIER_CAT1)" in source
467+
mirror_state_block = source.split("function _setNekoIdleCat1CompactMirrorActive", 1)[1].split(
468+
"const surfaceScreenRect = _getNekoIdleScreenRectFromCompactSurfaceRect(options.surfaceRect)",
469+
1,
470+
)[0]
471+
assert "inactiveReason === 'compact-surface-settled'" in mirror_state_block
472+
assert "clearTimeout(container.__nekoIdleCat1CompactMirrorSettleTimer);" in mirror_state_block
473+
immediate_clear_index = mirror_state_block.rindex("clearTimeout(container.__nekoIdleCat1CompactMirrorSettleTimer);")
474+
assert mirror_state_block.index("inactiveReason === 'compact-surface-settled'") < immediate_clear_index
475+
assert immediate_clear_index < mirror_state_block.index(
476+
"if (!container.__nekoIdleCat1CompactMirrorActive) return true;"
477+
)
467478
assert "_syncNekoIdleCat1CompactMirrorReaction(button, container, reactionSrc, 'cat1-sound-reaction')" in source
468479
assert "_getNekoIdleGifDurationMs(reactionSrc)" in source
469480
assert "const remainingMs = Math.max(0, (Number(durationMs) || 0) - elapsedMs);" in source

0 commit comments

Comments
 (0)