merge: 合并最新 dev(2925 模式选择)并修复测试 mock

- 解决 background.js 3 处冲突:保留 LuckMail 逻辑 + 采用 dev 的 isGeneratedAliasProvider(state) 新 API
- 解决 sidepanel.js 3 处冲突:保留 LuckMail UI + 采用 dev 的 mail2925Mode 参数
- step9 测试补充 normalizeMail2925Mode/getMail2925Mode 提取和 MAIL_2925_MODE 常量
- 全部 76 个测试通过
This commit is contained in:
笨笨
2026-04-15 00:09:11 +08:00
4 changed files with 120 additions and 18 deletions
+31 -6
View File
@@ -104,6 +104,9 @@ const AUTO_STEP_DELAY_MIN_ALLOWED_SECONDS = 0;
const AUTO_STEP_DELAY_MAX_ALLOWED_SECONDS = 600;
const LEGACY_AUTO_STEP_DELAY_KEYS = ['autoStepRandomDelayMinSeconds', 'autoStepRandomDelayMaxSeconds'];
const DEFAULT_LOCAL_CPA_STEP9_MODE = 'submit';
const MAIL_2925_MODE_PROVIDE = 'provide';
const MAIL_2925_MODE_RECEIVE = 'receive';
const DEFAULT_MAIL_2925_MODE = MAIL_2925_MODE_PROVIDE;
const HOTMAIL_SERVICE_MODE_REMOTE = 'remote';
const HOTMAIL_SERVICE_MODE_LOCAL = 'local';
const DEFAULT_HOTMAIL_REMOTE_BASE_URL = '';
@@ -135,6 +138,7 @@ const PERSISTED_SETTING_DEFAULTS = {
autoRunDelayMinutes: 30,
autoStepDelaySeconds: null,
mailProvider: '163',
mail2925Mode: DEFAULT_MAIL_2925_MODE,
emailGenerator: 'duck',
autoDeleteUsedIcloudAlias: false,
icloudHostPreference: 'auto',
@@ -372,6 +376,12 @@ function buildLuckmailSessionSettingsPayload(input = {}) {
return payload;
}
function normalizeMail2925Mode(value = '') {
return String(value || '').trim().toLowerCase() === MAIL_2925_MODE_RECEIVE
? MAIL_2925_MODE_RECEIVE
: DEFAULT_MAIL_2925_MODE;
}
function normalizeLocalCpaStep9Mode(value = '') {
return String(value || '').trim().toLowerCase() === 'bypass'
? 'bypass'
@@ -499,6 +509,8 @@ function normalizePersistentSettingValue(key, value) {
return normalizeAutoStepDelaySeconds(value, PERSISTED_SETTING_DEFAULTS.autoStepDelaySeconds);
case 'mailProvider':
return normalizeMailProvider(value);
case 'mail2925Mode':
return normalizeMail2925Mode(value);
case 'emailGenerator':
return normalizeEmailGenerator(value);
case 'autoDeleteUsedIcloudAlias':
@@ -1004,6 +1016,13 @@ function isCustomMailProvider(stateOrProvider) {
return provider === 'custom';
}
function getMail2925Mode(stateOrMode) {
if (typeof stateOrMode === 'string') {
return normalizeMail2925Mode(stateOrMode);
}
return normalizeMail2925Mode(stateOrMode?.mail2925Mode);
}
async function syncHotmailAccounts(accounts) {
const normalized = normalizeHotmailAccounts(accounts);
await setPersistentSettings({ hotmailAccounts: normalized });
@@ -1627,14 +1646,20 @@ function generateRandomSuffix(length = 6) {
return suffix;
}
function isGeneratedAliasProvider(provider) {
return provider === '2925';
function isGeneratedAliasProvider(stateOrProvider, mail2925Mode = undefined) {
const provider = typeof stateOrProvider === 'string'
? stateOrProvider
: stateOrProvider?.mailProvider;
const resolvedMail2925Mode = mail2925Mode !== undefined
? normalizeMail2925Mode(mail2925Mode)
: getMail2925Mode(stateOrProvider);
return provider === '2925' && resolvedMail2925Mode === MAIL_2925_MODE_PROVIDE;
}
function shouldUseCustomRegistrationEmail(state = {}) {
return isCustomMailProvider(state)
|| (!isHotmailProvider(state)
&& !isGeneratedAliasProvider(state.mailProvider)
&& !isGeneratedAliasProvider(state)
&& normalizeEmailGenerator(state.emailGenerator) === 'custom');
}
@@ -1646,7 +1671,7 @@ function buildGeneratedAliasEmail(state) {
throw new Error('2925 邮箱前缀未设置,请先在侧边栏填写。');
}
if (provider === '2925') {
if (provider === '2925' && isGeneratedAliasProvider(state)) {
return `${emailPrefix}${generateRandomSuffix(6)}@2925.com`;
}
@@ -5317,7 +5342,7 @@ async function ensureAutoEmailReady(targetRun, totalRuns, attemptRuns) {
return purchase.email_address;
}
if (isGeneratedAliasProvider(currentState.mailProvider)) {
if (isGeneratedAliasProvider(currentState)) {
if (!currentState.emailPrefix) {
throw new Error('2925 邮箱前缀未设置,请先在侧边栏填写。');
}
@@ -6449,7 +6474,7 @@ async function executeStep3(state) {
} else if (isLuckmailProvider(state)) {
const purchase = await ensureLuckmailPurchaseForFlow({ allowReuse: true });
resolvedEmail = purchase.email_address;
} else if (isGeneratedAliasProvider(state.mailProvider)) {
} else if (isGeneratedAliasProvider(state)) {
resolvedEmail = buildGeneratedAliasEmail(state);
}