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 AUTO_STEP_DELAY_MAX_ALLOWED_SECONDS = 600;
const LEGACY_AUTO_STEP_DELAY_KEYS = ['autoStepRandomDelayMinSeconds', 'autoStepRandomDelayMaxSeconds']; const LEGACY_AUTO_STEP_DELAY_KEYS = ['autoStepRandomDelayMinSeconds', 'autoStepRandomDelayMaxSeconds'];
const DEFAULT_LOCAL_CPA_STEP9_MODE = 'submit'; 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_REMOTE = 'remote';
const HOTMAIL_SERVICE_MODE_LOCAL = 'local'; const HOTMAIL_SERVICE_MODE_LOCAL = 'local';
const DEFAULT_HOTMAIL_REMOTE_BASE_URL = ''; const DEFAULT_HOTMAIL_REMOTE_BASE_URL = '';
@@ -135,6 +138,7 @@ const PERSISTED_SETTING_DEFAULTS = {
autoRunDelayMinutes: 30, autoRunDelayMinutes: 30,
autoStepDelaySeconds: null, autoStepDelaySeconds: null,
mailProvider: '163', mailProvider: '163',
mail2925Mode: DEFAULT_MAIL_2925_MODE,
emailGenerator: 'duck', emailGenerator: 'duck',
autoDeleteUsedIcloudAlias: false, autoDeleteUsedIcloudAlias: false,
icloudHostPreference: 'auto', icloudHostPreference: 'auto',
@@ -372,6 +376,12 @@ function buildLuckmailSessionSettingsPayload(input = {}) {
return payload; 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 = '') { function normalizeLocalCpaStep9Mode(value = '') {
return String(value || '').trim().toLowerCase() === 'bypass' return String(value || '').trim().toLowerCase() === 'bypass'
? 'bypass' ? 'bypass'
@@ -499,6 +509,8 @@ function normalizePersistentSettingValue(key, value) {
return normalizeAutoStepDelaySeconds(value, PERSISTED_SETTING_DEFAULTS.autoStepDelaySeconds); return normalizeAutoStepDelaySeconds(value, PERSISTED_SETTING_DEFAULTS.autoStepDelaySeconds);
case 'mailProvider': case 'mailProvider':
return normalizeMailProvider(value); return normalizeMailProvider(value);
case 'mail2925Mode':
return normalizeMail2925Mode(value);
case 'emailGenerator': case 'emailGenerator':
return normalizeEmailGenerator(value); return normalizeEmailGenerator(value);
case 'autoDeleteUsedIcloudAlias': case 'autoDeleteUsedIcloudAlias':
@@ -1004,6 +1016,13 @@ function isCustomMailProvider(stateOrProvider) {
return provider === 'custom'; return provider === 'custom';
} }
function getMail2925Mode(stateOrMode) {
if (typeof stateOrMode === 'string') {
return normalizeMail2925Mode(stateOrMode);
}
return normalizeMail2925Mode(stateOrMode?.mail2925Mode);
}
async function syncHotmailAccounts(accounts) { async function syncHotmailAccounts(accounts) {
const normalized = normalizeHotmailAccounts(accounts); const normalized = normalizeHotmailAccounts(accounts);
await setPersistentSettings({ hotmailAccounts: normalized }); await setPersistentSettings({ hotmailAccounts: normalized });
@@ -1627,14 +1646,20 @@ function generateRandomSuffix(length = 6) {
return suffix; return suffix;
} }
function isGeneratedAliasProvider(provider) { function isGeneratedAliasProvider(stateOrProvider, mail2925Mode = undefined) {
return provider === '2925'; 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 = {}) { function shouldUseCustomRegistrationEmail(state = {}) {
return isCustomMailProvider(state) return isCustomMailProvider(state)
|| (!isHotmailProvider(state) || (!isHotmailProvider(state)
&& !isGeneratedAliasProvider(state.mailProvider) && !isGeneratedAliasProvider(state)
&& normalizeEmailGenerator(state.emailGenerator) === 'custom'); && normalizeEmailGenerator(state.emailGenerator) === 'custom');
} }
@@ -1646,7 +1671,7 @@ function buildGeneratedAliasEmail(state) {
throw new Error('2925 邮箱前缀未设置,请先在侧边栏填写。'); throw new Error('2925 邮箱前缀未设置,请先在侧边栏填写。');
} }
if (provider === '2925') { if (provider === '2925' && isGeneratedAliasProvider(state)) {
return `${emailPrefix}${generateRandomSuffix(6)}@2925.com`; return `${emailPrefix}${generateRandomSuffix(6)}@2925.com`;
} }
@@ -5317,7 +5342,7 @@ async function ensureAutoEmailReady(targetRun, totalRuns, attemptRuns) {
return purchase.email_address; return purchase.email_address;
} }
if (isGeneratedAliasProvider(currentState.mailProvider)) { if (isGeneratedAliasProvider(currentState)) {
if (!currentState.emailPrefix) { if (!currentState.emailPrefix) {
throw new Error('2925 邮箱前缀未设置,请先在侧边栏填写。'); throw new Error('2925 邮箱前缀未设置,请先在侧边栏填写。');
} }
@@ -6449,7 +6474,7 @@ async function executeStep3(state) {
} else if (isLuckmailProvider(state)) { } else if (isLuckmailProvider(state)) {
const purchase = await ensureLuckmailPurchaseForFlow({ allowReuse: true }); const purchase = await ensureLuckmailPurchaseForFlow({ allowReuse: true });
resolvedEmail = purchase.email_address; resolvedEmail = purchase.email_address;
} else if (isGeneratedAliasProvider(state.mailProvider)) { } else if (isGeneratedAliasProvider(state)) {
resolvedEmail = buildGeneratedAliasEmail(state); resolvedEmail = buildGeneratedAliasEmail(state);
} }
+7
View File
@@ -165,6 +165,13 @@
<button id="btn-mail-login" class="btn btn-outline btn-sm data-inline-btn" type="button" disabled>登录</button> <button id="btn-mail-login" class="btn btn-outline btn-sm data-inline-btn" type="button" disabled>登录</button>
</div> </div>
</div> </div>
<div class="data-row" id="row-mail-2925-mode" style="display:none;">
<span class="data-label">2925 模式</span>
<div id="mail-2925-mode-group" class="choice-group" role="group" aria-label="2925 邮箱模式">
<button type="button" class="choice-btn" data-mail-2925-mode="provide">提供邮箱</button>
<button type="button" class="choice-btn" data-mail-2925-mode="receive">接收邮箱</button>
</div>
</div>
<div class="data-row" id="row-email-generator"> <div class="data-row" id="row-email-generator">
<span class="data-label">邮箱生成</span> <span class="data-label">邮箱生成</span>
<select id="select-email-generator" class="data-select"> <select id="select-email-generator" class="data-select">
+77 -12
View File
@@ -66,6 +66,8 @@ const rowSub2ApiGroup = document.getElementById('row-sub2api-group');
const inputSub2ApiGroup = document.getElementById('input-sub2api-group'); const inputSub2ApiGroup = document.getElementById('input-sub2api-group');
const selectMailProvider = document.getElementById('select-mail-provider'); const selectMailProvider = document.getElementById('select-mail-provider');
const btnMailLogin = document.getElementById('btn-mail-login'); const btnMailLogin = document.getElementById('btn-mail-login');
const rowMail2925Mode = document.getElementById('row-mail-2925-mode');
const mail2925ModeButtons = Array.from(document.querySelectorAll('[data-mail-2925-mode]'));
const rowEmailGenerator = document.getElementById('row-email-generator'); const rowEmailGenerator = document.getElementById('row-email-generator');
const selectEmailGenerator = document.getElementById('select-email-generator'); const selectEmailGenerator = document.getElementById('select-email-generator');
const rowTempEmailBaseUrl = document.getElementById('row-temp-email-base-url'); const rowTempEmailBaseUrl = document.getElementById('row-temp-email-base-url');
@@ -188,6 +190,9 @@ const AUTO_RUN_MAX_RETRIES_PER_ROUND = 3;
const AUTO_STEP_DELAY_MIN_SECONDS = 0; const AUTO_STEP_DELAY_MIN_SECONDS = 0;
const AUTO_STEP_DELAY_MAX_SECONDS = 600; const AUTO_STEP_DELAY_MAX_SECONDS = 600;
const DEFAULT_LOCAL_CPA_STEP9_MODE = 'submit'; 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 AUTO_SKIP_FAILURES_PROMPT_DISMISSED_STORAGE_KEY = 'multipage-auto-skip-failures-prompt-dismissed'; const AUTO_SKIP_FAILURES_PROMPT_DISMISSED_STORAGE_KEY = 'multipage-auto-skip-failures-prompt-dismissed';
const AUTO_RUN_FALLBACK_RISK_PROMPT_DISMISSED_STORAGE_KEY = 'multipage-auto-run-fallback-risk-prompt-dismissed'; const AUTO_RUN_FALLBACK_RISK_PROMPT_DISMISSED_STORAGE_KEY = 'multipage-auto-run-fallback-risk-prompt-dismissed';
const AUTO_RUN_FALLBACK_RISK_WARNING_MIN_RUNS = 15; const AUTO_RUN_FALLBACK_RISK_WARNING_MIN_RUNS = 15;
@@ -304,7 +309,8 @@ const LOG_LEVEL_LABELS = {
}; };
function usesGeneratedAliasMailProvider(provider) { function usesGeneratedAliasMailProvider(provider) {
return provider === '2925'; return String(provider || '').trim() === '2925'
&& getSelectedMail2925Mode() === MAIL_2925_MODE_PROVIDE;
} }
function showToast(message, type = 'error', duration = 4000) { function showToast(message, type = 'error', duration = 4000) {
@@ -1090,6 +1096,7 @@ function collectSettingsPayload() {
sub2apiGroupName: inputSub2ApiGroup.value.trim(), sub2apiGroupName: inputSub2ApiGroup.value.trim(),
customPassword: inputPassword.value, customPassword: inputPassword.value,
mailProvider: selectMailProvider.value, mailProvider: selectMailProvider.value,
mail2925Mode: getSelectedMail2925Mode(),
emailGenerator: selectEmailGenerator.value, emailGenerator: selectEmailGenerator.value,
autoDeleteUsedIcloudAlias: checkboxAutoDeleteIcloud?.checked, autoDeleteUsedIcloudAlias: checkboxAutoDeleteIcloud?.checked,
icloudHostPreference: selectIcloudHostPreference?.value || 'auto', icloudHostPreference: selectIcloudHostPreference?.value || 'auto',
@@ -1124,6 +1131,12 @@ function normalizeLocalCpaStep9Mode(value = '') {
: DEFAULT_LOCAL_CPA_STEP9_MODE; : DEFAULT_LOCAL_CPA_STEP9_MODE;
} }
function normalizeMail2925Mode(value = '') {
return String(value || '').trim().toLowerCase() === MAIL_2925_MODE_RECEIVE
? MAIL_2925_MODE_RECEIVE
: DEFAULT_MAIL_2925_MODE;
}
function normalizeHotmailServiceMode(value = '') { function normalizeHotmailServiceMode(value = '') {
return HOTMAIL_SERVICE_MODE_LOCAL; return HOTMAIL_SERVICE_MODE_LOCAL;
} }
@@ -1142,6 +1155,20 @@ function setLocalCpaStep9Mode(mode) {
}); });
} }
function getSelectedMail2925Mode() {
const activeButton = mail2925ModeButtons.find((button) => button.classList.contains('is-active'));
return normalizeMail2925Mode(activeButton?.dataset.mail2925Mode);
}
function setMail2925Mode(mode) {
const resolvedMode = normalizeMail2925Mode(mode);
mail2925ModeButtons.forEach((button) => {
const active = button.dataset.mail2925Mode === resolvedMode;
button.classList.toggle('is-active', active);
button.setAttribute('aria-pressed', String(active));
});
}
function getSelectedHotmailServiceMode() { function getSelectedHotmailServiceMode() {
const activeButton = hotmailServiceModeButtons.find((button) => button.classList.contains('is-active')); const activeButton = hotmailServiceModeButtons.find((button) => button.classList.contains('is-active'));
return normalizeHotmailServiceMode(activeButton?.dataset.hotmailServiceMode); return normalizeHotmailServiceMode(activeButton?.dataset.hotmailServiceMode);
@@ -1388,13 +1415,14 @@ function applySettingsState(state) {
? 'custom' ? 'custom'
: '163'); : '163');
selectMailProvider.value = restoredMailProvider; selectMailProvider.value = restoredMailProvider;
setMail2925Mode(state?.mail2925Mode);
{ {
const restoredGenerator = String(state?.emailGenerator || '').trim().toLowerCase(); const restoredEmailGenerator = String(state?.emailGenerator || '').trim().toLowerCase();
if (restoredGenerator === 'icloud') { if (restoredEmailGenerator === 'icloud') {
selectEmailGenerator.value = 'icloud'; selectEmailGenerator.value = 'icloud';
} else if (restoredGenerator === 'cloudflare') { } else if (restoredEmailGenerator === 'cloudflare') {
selectEmailGenerator.value = 'cloudflare'; selectEmailGenerator.value = 'cloudflare';
} else if (restoredGenerator === 'cloudflare-temp-email') { } else if (restoredEmailGenerator === 'cloudflare-temp-email') {
selectEmailGenerator.value = 'cloudflare-temp-email'; selectEmailGenerator.value = 'cloudflare-temp-email';
} else { } else {
selectEmailGenerator.value = 'duck'; selectEmailGenerator.value = 'duck';
@@ -2253,9 +2281,13 @@ function isCurrentEmailManagedByLuckmail(state = latestState) {
return inputEmailValue === luckmailEmail || stateEmailValue === luckmailEmail; return inputEmailValue === luckmailEmail || stateEmailValue === luckmailEmail;
} }
function isCurrentEmailManagedByGeneratedAlias(provider = latestState?.mailProvider, state = latestState) { function isCurrentEmailManagedByGeneratedAlias(
provider = latestState?.mailProvider,
state = latestState,
mail2925Mode = latestState?.mail2925Mode
) {
const normalizedProvider = String(provider || '').trim(); const normalizedProvider = String(provider || '').trim();
if (!usesGeneratedAliasMailProvider(normalizedProvider)) { if (!(normalizedProvider === '2925' && normalizeMail2925Mode(mail2925Mode) === MAIL_2925_MODE_PROVIDE)) {
return false; return false;
} }
@@ -2490,7 +2522,8 @@ function renderHotmailAccounts() {
function updateMailProviderUI() { function updateMailProviderUI() {
const use2925 = selectMailProvider.value === '2925'; const use2925 = selectMailProvider.value === '2925';
const useGeneratedAlias = usesGeneratedAliasMailProvider(selectMailProvider.value); const mail2925Mode = getSelectedMail2925Mode();
const useGeneratedAlias = use2925 && mail2925Mode === MAIL_2925_MODE_PROVIDE;
const useInbucket = selectMailProvider.value === 'inbucket'; const useInbucket = selectMailProvider.value === 'inbucket';
const useHotmail = selectMailProvider.value === 'hotmail-api'; const useHotmail = selectMailProvider.value === 'hotmail-api';
const useLuckmail = isLuckmailProvider(); const useLuckmail = isLuckmailProvider();
@@ -2498,6 +2531,9 @@ function updateMailProviderUI() {
const useEmailGenerator = !useHotmail && !useLuckmail && !useGeneratedAlias && !useCustomEmail; const useEmailGenerator = !useHotmail && !useLuckmail && !useGeneratedAlias && !useCustomEmail;
const useCloudflareTempEmailProvider = selectMailProvider.value === 'cloudflare-temp-email'; const useCloudflareTempEmailProvider = selectMailProvider.value === 'cloudflare-temp-email';
updateMailLoginButtonState(); updateMailLoginButtonState();
if (rowMail2925Mode) {
rowMail2925Mode.style.display = use2925 ? '' : 'none';
}
rowEmailPrefix.style.display = useGeneratedAlias ? '' : 'none'; rowEmailPrefix.style.display = useGeneratedAlias ? '' : 'none';
const hotmailServiceMode = getSelectedHotmailServiceMode(); const hotmailServiceMode = getSelectedHotmailServiceMode();
rowInbucketHost.style.display = useInbucket ? '' : 'none'; rowInbucketHost.style.display = useInbucket ? '' : 'none';
@@ -2565,7 +2601,7 @@ function updateMailProviderUI() {
? '由 Hotmail 账号池自动分配' ? '由 Hotmail 账号池自动分配'
: (useLuckmail : (useLuckmail
? '步骤 3 自动购买 LuckMail 邮箱并回填' ? '步骤 3 自动购买 LuckMail 邮箱并回填'
: (use2925 ? '步骤 3 自动生成 2925 邮箱并回填' : uiCopy.placeholder)); : (useGeneratedAlias ? '步骤 3 自动生成 2925 邮箱并回填' : uiCopy.placeholder));
btnFetchEmail.disabled = useGeneratedAlias || useLuckmail || useCustomEmail || isAutoRunLockedPhase(); btnFetchEmail.disabled = useGeneratedAlias || useLuckmail || useCustomEmail || isAutoRunLockedPhase();
if (!btnFetchEmail.disabled) { if (!btnFetchEmail.disabled) {
btnFetchEmail.textContent = uiCopy.buttonLabel; btnFetchEmail.textContent = uiCopy.buttonLabel;
@@ -4292,6 +4328,7 @@ inputPassword.addEventListener('blur', () => {
selectMailProvider.addEventListener('change', async () => { selectMailProvider.addEventListener('change', async () => {
const previousProvider = latestState?.mailProvider || ''; const previousProvider = latestState?.mailProvider || '';
const previousMail2925Mode = latestState?.mail2925Mode;
const nextProvider = selectMailProvider.value; const nextProvider = selectMailProvider.value;
updateMailProviderUI(); updateMailProviderUI();
const leavingHotmail = previousProvider === 'hotmail-api' const leavingHotmail = previousProvider === 'hotmail-api'
@@ -4300,9 +4337,12 @@ selectMailProvider.addEventListener('change', async () => {
const leavingLuckmail = previousProvider === LUCKMAIL_PROVIDER const leavingLuckmail = previousProvider === LUCKMAIL_PROVIDER
&& nextProvider !== LUCKMAIL_PROVIDER && nextProvider !== LUCKMAIL_PROVIDER
&& isCurrentEmailManagedByLuckmail(); && isCurrentEmailManagedByLuckmail();
const leavingGeneratedAlias = previousProvider !== nextProvider const leavingGeneratedAlias = (
&& usesGeneratedAliasMailProvider(previousProvider) previousProvider !== nextProvider
&& isCurrentEmailManagedByGeneratedAlias(previousProvider); || (previousProvider === '2925' && normalizeMail2925Mode(previousMail2925Mode) !== getSelectedMail2925Mode())
) && previousProvider === '2925'
&& normalizeMail2925Mode(previousMail2925Mode) === MAIL_2925_MODE_PROVIDE
&& isCurrentEmailManagedByGeneratedAlias(previousProvider, latestState, previousMail2925Mode);
if (leavingHotmail || leavingLuckmail || leavingGeneratedAlias) { if (leavingHotmail || leavingLuckmail || leavingGeneratedAlias) {
await clearRegistrationEmail({ silent: true }).catch(() => { }); await clearRegistrationEmail({ silent: true }).catch(() => { });
} }
@@ -4313,6 +4353,30 @@ selectMailProvider.addEventListener('change', async () => {
saveSettings({ silent: true }).catch(() => { }); saveSettings({ silent: true }).catch(() => { });
}); });
mail2925ModeButtons.forEach((button) => {
button.addEventListener('click', async () => {
const nextMode = normalizeMail2925Mode(button.dataset.mail2925Mode);
const previousMode = normalizeMail2925Mode(latestState?.mail2925Mode);
if (nextMode === getSelectedMail2925Mode()) {
return;
}
setMail2925Mode(nextMode);
updateMailProviderUI();
const leavingGeneratedAlias = selectMailProvider.value === '2925'
&& previousMode === MAIL_2925_MODE_PROVIDE
&& nextMode !== MAIL_2925_MODE_PROVIDE
&& isCurrentEmailManagedByGeneratedAlias('2925', latestState, previousMode);
if (leavingGeneratedAlias) {
await clearRegistrationEmail({ silent: true }).catch(() => { });
}
markSettingsDirty(true);
saveSettings({ silent: true }).catch(() => { });
});
});
selectEmailGenerator.addEventListener('change', () => { selectEmailGenerator.addEventListener('change', () => {
updateMailProviderUI(); updateMailProviderUI();
clearRegistrationEmail({ silent: true }).catch(() => { }); clearRegistrationEmail({ silent: true }).catch(() => { });
@@ -4832,6 +4896,7 @@ initHotmailListExpandedState();
updateSaveButtonState(); updateSaveButtonState();
updateConfigMenuControls(); updateConfigMenuControls();
setLocalCpaStep9Mode(DEFAULT_LOCAL_CPA_STEP9_MODE); setLocalCpaStep9Mode(DEFAULT_LOCAL_CPA_STEP9_MODE);
setMail2925Mode(DEFAULT_MAIL_2925_MODE);
initializeReleaseInfo().catch((err) => { initializeReleaseInfo().catch((err) => {
console.error('Failed to initialize release info:', err); console.error('Failed to initialize release info:', err);
}); });
@@ -53,6 +53,8 @@ function extractFunction(name) {
const bundle = [ const bundle = [
extractFunction('getTabRegistry'), extractFunction('getTabRegistry'),
extractFunction('normalizeEmailGenerator'), extractFunction('normalizeEmailGenerator'),
extractFunction('normalizeMail2925Mode'),
extractFunction('getMail2925Mode'),
extractFunction('parseUrlSafely'), extractFunction('parseUrlSafely'),
extractFunction('isHotmailProvider'), extractFunction('isHotmailProvider'),
extractFunction('isCustomMailProvider'), extractFunction('isCustomMailProvider'),
@@ -70,6 +72,9 @@ const api = new Function(`
const HOTMAIL_PROVIDER = 'hotmail-api'; const HOTMAIL_PROVIDER = 'hotmail-api';
const CLOUDFLARE_TEMP_EMAIL_PROVIDER = 'cloudflare-temp-email'; const CLOUDFLARE_TEMP_EMAIL_PROVIDER = 'cloudflare-temp-email';
const CLOUDFLARE_TEMP_EMAIL_GENERATOR = 'cloudflare-temp-email'; const CLOUDFLARE_TEMP_EMAIL_GENERATOR = 'cloudflare-temp-email';
const MAIL_2925_MODE_PROVIDE = 'provide';
const MAIL_2925_MODE_RECEIVE = 'receive';
const DEFAULT_MAIL_2925_MODE = MAIL_2925_MODE_PROVIDE;
let currentState = { let currentState = {
tabRegistry: { tabRegistry: {
'signup-page': { tabId: 1, ready: true }, 'signup-page': { tabId: 1, ready: true },