From f13b90b7dbea8fc18e691f97d7b95196790726d4 Mon Sep 17 00:00:00 2001 From: QLHazyCoder <2825305047@qq.com> Date: Sat, 18 Apr 2026 21:47:51 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0=E4=BC=9A=E8=AF=9D?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD=EF=BC=8C=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E5=B7=B2=E8=A7=81=E4=BB=A3=E7=A0=81=E7=9A=84=E6=8C=81=E4=B9=85?= =?UTF-8?q?=E5=8C=96=E5=92=8C=E9=87=8D=E7=BD=AE=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- content/mail-2925.js | 49 ++++++++++++++++++++++++++++-- tests/mail-2925-content.test.js | 54 +++++++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+), 3 deletions(-) diff --git a/content/mail-2925.js b/content/mail-2925.js index 0197ce7..404477c 100644 --- a/content/mail-2925.js +++ b/content/mail-2925.js @@ -11,10 +11,22 @@ if (!isTopFrame) { } else { let seenCodes = new Set(); +let seenCodeSessionKey = ''; +let seenCodesReadyPromise = null; async function loadSeenCodes() { try { - const data = await chrome.storage.session.get('seen2925Codes'); + const data = await chrome.storage.session.get(['seen2925CodeState', 'seen2925Codes']); + const state = data?.seen2925CodeState || null; + if (state && typeof state === 'object') { + seenCodeSessionKey = String(state.sessionKey || ''); + if (Array.isArray(state.codes)) { + seenCodes = new Set(state.codes); + } + console.log(MAIL2925_PREFIX, `Loaded ${seenCodes.size} seen codes for session ${seenCodeSessionKey || 'default'}`); + return; + } + if (data.seen2925Codes && Array.isArray(data.seen2925Codes)) { seenCodes = new Set(data.seen2925Codes); console.log(MAIL2925_PREFIX, `Loaded ${seenCodes.size} previously seen codes`); @@ -24,16 +36,46 @@ async function loadSeenCodes() { } } -loadSeenCodes(); +seenCodesReadyPromise = loadSeenCodes(); async function persistSeenCodes() { try { - await chrome.storage.session.set({ seen2925Codes: [...seenCodes] }); + await chrome.storage.session.set({ + seen2925Codes: [...seenCodes], + seen2925CodeState: { + sessionKey: seenCodeSessionKey, + codes: [...seenCodes], + }, + }); } catch (err) { console.warn(MAIL2925_PREFIX, 'Could not persist seen codes, continuing in-memory only:', err?.message || err); } } +function buildSeenCodeSessionKey(step, payload = {}) { + const timestamp = Number(payload?.filterAfterTimestamp); + if (Number.isFinite(timestamp) && timestamp > 0) { + return `${step}:${timestamp}`; + } + return `${step}:default`; +} + +async function ensureSeenCodesSession(step, payload = {}) { + if (seenCodesReadyPromise) { + await seenCodesReadyPromise; + seenCodesReadyPromise = null; + } + + const nextSessionKey = buildSeenCodeSessionKey(step, payload); + if (seenCodeSessionKey === nextSessionKey) { + return; + } + + seenCodeSessionKey = nextSessionKey; + seenCodes = new Set(); + await persistSeenCodes(); +} + chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { if (message.type === 'POLL_EMAIL') { resetStopState(); @@ -473,6 +515,7 @@ async function refreshInbox() { } async function handlePollEmail(step, payload) { + await ensureSeenCodesSession(step, payload); const { senderFilters, subjectFilters, diff --git a/tests/mail-2925-content.test.js b/tests/mail-2925-content.test.js index ad54311..30df390 100644 --- a/tests/mail-2925-content.test.js +++ b/tests/mail-2925-content.test.js @@ -116,6 +116,7 @@ async function openMailAndDeleteAfterRead(item) { return item.id === 'new' ? 'Your ChatGPT code is 654321' : 'No code here'; } +async function ensureSeenCodesSession() {} function persistSeenCodes() {} function log() {} @@ -199,6 +200,7 @@ async function openMailAndDeleteAfterRead(item) { return item.text; } +async function ensureSeenCodesSession() {} function persistSeenCodes() {} function log() {} @@ -224,6 +226,58 @@ return { assert.deepEqual(api.getReadAndDeleteCalls(), ['mail-1']); }); +test('ensureSeenCodesSession resets tried codes only when a new verification step session starts', async () => { + const bundle = [ + extractFunction('buildSeenCodeSessionKey'), + extractFunction('ensureSeenCodesSession'), + ].join('\n'); + + const api = new Function(` +let seenCodes = new Set(['111111']); +let seenCodeSessionKey = ''; +let seenCodesReadyPromise = Promise.resolve(); +const persisted = []; + +async function persistSeenCodes() { + persisted.push({ + sessionKey: seenCodeSessionKey, + codes: [...seenCodes], + }); +} + +${bundle} + +return { + ensureSeenCodesSession, + getSeenCodes() { + return [...seenCodes]; + }, + getSessionKey() { + return seenCodeSessionKey; + }, + getPersisted() { + return persisted.slice(); + }, +}; +`)(); + + await api.ensureSeenCodesSession(4, { filterAfterTimestamp: 1000 }); + assert.equal(api.getSessionKey(), '4:1000'); + assert.deepEqual(api.getSeenCodes(), []); + + await api.ensureSeenCodesSession(4, { filterAfterTimestamp: 1000 }); + assert.deepEqual(api.getPersisted(), [ + { sessionKey: '4:1000', codes: [] }, + ]); + + await api.ensureSeenCodesSession(8, { filterAfterTimestamp: 2000 }); + assert.equal(api.getSessionKey(), '8:2000'); + assert.deepEqual(api.getPersisted(), [ + { sessionKey: '4:1000', codes: [] }, + { sessionKey: '8:2000', codes: [] }, + ]); +}); + test('openMailAndGetMessageText always returns to inbox after opening a 2925 message', async () => { const bundle = [ extractFunction('returnToInbox'),