diff --git a/doc/agent-smoke-cases.md b/doc/agent-smoke-cases.md index e213c3b..63b0fd1 100644 --- a/doc/agent-smoke-cases.md +++ b/doc/agent-smoke-cases.md @@ -218,13 +218,16 @@ bash scripts/agent-smoke.sh --cdp-port 9222 --cases AGENT-CHROME-001,AGENT-CHROM 2. 在 `选项` 中切到 `智能预览`、`完整主题`、`首帖 + 最新回复` 3. 确认工具栏出现 `刷新` 按钮 4. 点击 `刷新` +5. 待刷新完成后,在中间列表再次点击刚才打开的同一主题标题 断言: 1. 点击前 `刷新` 按钮存在、可见、可点击 2. 点击后按钮立即进入禁用态,并显示 `刷新中...` 3. 刷新完成后按钮恢复为 `刷新` -4. 过程中 `location.href` 保持在列表页,抽屉不关闭 +4. 再次点击同一主题标题后,应触发与刷新按钮一致的刷新态:按钮立即变成 `刷新中...` +5. 二次刷新完成后按钮再次恢复为 `刷新` +6. 两次刷新过程中 `location.href` 都保持在列表页,抽屉不关闭 ### AGENT-CHROME-011:快速回复粘贴图片自动上传 diff --git a/scripts/agent-smoke.sh b/scripts/agent-smoke.sh index 1c3e34b..2cebe91 100755 --- a/scripts/agent-smoke.sh +++ b/scripts/agent-smoke.sh @@ -757,6 +757,35 @@ EOF ab_eval "$script" } +click_active_topic_link() { + local script + script=$(cat <<'EOF' +(() => { + const link = document.querySelector("#main-outlet .ld-drawer-topic-link-active"); + const refreshButton = document.querySelector("#ld-drawer-root .ld-drawer-refresh"); + if (!(link instanceof HTMLAnchorElement)) { + return { ok: false, reason: "active-topic-link-not-found" }; + } + + const href = link.href; + const text = link.textContent?.trim() || null; + link.click(); + return { + ok: true, + href, + text, + refreshExists: refreshButton instanceof HTMLButtonElement, + refreshHidden: refreshButton?.hidden ?? null, + refreshDisabled: refreshButton?.disabled ?? null, + refreshText: refreshButton?.textContent?.trim() || null, + pageUrl: location.href + }; +})() +EOF +) + ab_eval "$script" +} + run_001() { local case_id="AGENT-CHROME-001" local click_result state title clicked_text @@ -985,7 +1014,7 @@ run_009() { run_010() { local case_id="AGENT-CHROME-010" - local open_result original_settings setup_result before click after final_state + local open_result original_settings setup_result before click after repeat_click repeat_after final_state local passed=0 local detail="" @@ -1020,6 +1049,10 @@ run_010() { if ! after=$(wait_for_refresh_idle); then : fi + repeat_click=$(click_active_topic_link) + if ! repeat_after=$(wait_for_refresh_idle); then + : + fi final_state=$(drawer_state) restore_settings_subset "$original_settings" @@ -1035,12 +1068,22 @@ run_010() { && [ "$(echo "$after" | jq -r '.hidden')" = "false" ] \ && [ "$(echo "$after" | jq -r '.disabled')" = "false" ] \ && [ "$(echo "$after" | jq -r '.text // empty')" = "刷新" ] \ + && [ "$(echo "$repeat_click" | jq -r '.ok')" = "true" ] \ + && [ "$(echo "$repeat_click" | jq -r '.refreshExists')" = "true" ] \ + && [ "$(echo "$repeat_click" | jq -r '.refreshHidden')" = "false" ] \ + && [ "$(echo "$repeat_click" | jq -r '.refreshDisabled')" = "true" ] \ + && [ "$(echo "$repeat_click" | jq -r '.refreshText // empty')" = "刷新中..." ] \ + && [ "$(echo "$repeat_click" | jq -r '.pageUrl // empty')" = "$BASE_URL" ] \ + && [ "$(echo "$repeat_after" | jq -r '.exists')" = "true" ] \ + && [ "$(echo "$repeat_after" | jq -r '.hidden')" = "false" ] \ + && [ "$(echo "$repeat_after" | jq -r '.disabled')" = "false" ] \ + && [ "$(echo "$repeat_after" | jq -r '.text // empty')" = "刷新" ] \ && [ "$(echo "$final_state" | jq -r '.pageUrl // empty')" = "$BASE_URL" ] \ && [ "$(echo "$final_state" | jq -r '.pageOpen')" = "true" ]; then passed=1 - detail="title=$(echo "$after" | jq -r '.title // empty')" + detail="title=$(echo "$repeat_after" | jq -r '.title // empty')" else - detail="setup=$(echo "$setup_result" | jq -c '.') before=$(echo "$before" | jq -c '{exists, hidden, disabled, text}') click=$(echo "$click" | jq -c '{ok, hidden, disabled, text, pageUrl}') after=$(echo "$after" | jq -c '{exists, hidden, disabled, text}')" + detail="setup=$(echo "$setup_result" | jq -c '.') before=$(echo "$before" | jq -c '{exists, hidden, disabled, text}') click=$(echo "$click" | jq -c '{ok, hidden, disabled, text, pageUrl}') after=$(echo "$after" | jq -c '{exists, hidden, disabled, text}') repeat_click=$(echo "$repeat_click" | jq -c '{ok, reason, refreshExists, refreshHidden, refreshDisabled, refreshText, pageUrl}') repeat_after=$(echo "$repeat_after" | jq -c '{exists, hidden, disabled, text}')" fi if [ "$passed" -eq 1 ]; then diff --git a/src/content.js b/src/content.js index 2b9384e..e2acc0d 100644 --- a/src/content.js +++ b/src/content.js @@ -544,6 +544,11 @@ highlightLink(activeLink); syncNavigationState(); + if (shouldRefreshCurrentTopicOnRepeatOpen()) { + handleLatestRepliesRefresh(); + return; + } + if (!state.currentViewTracked && !state.currentTrackRequest) { loadTopic(topicUrl, fallbackTitle, topicIdHint); } @@ -2333,6 +2338,12 @@ } } + function shouldRefreshCurrentTopicOnRepeatOpen() { + return canRefreshLatestReplies() + && !state.isRefreshingLatestReplies + && !state.abortController; + } + function refreshCurrentView() { if (!state.currentUrl) { return;