From e20915bec2009e94fb5b97421d6d2eb22c9d4e32 Mon Sep 17 00:00:00 2001 From: PathGao <42336971+PathGao@users.noreply.github.com> Date: Tue, 27 Oct 2026 10:27:07 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=BE=E7=BD=AE=EF=BC=9A=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=9C=B0=E5=9D=80=E5=8E=BB=E6=96=9C=E6=9D=A0=E5=92=8C=E5=8F=96?= =?UTF-8?q?=20origin=20=E5=8F=AA=E5=9C=A8=20settings.js=20=E5=86=99?= =?UTF-8?q?=E4=B8=80=E4=BB=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 设置页和后台各有一份相同的 trimBaseUrl / urlOrigin,合到 MdgSettings。 --- extension/background.js | 15 +++------------ extension/options.js | 21 ++++----------------- extension/options.selftest.js | 20 ++++++++++---------- extension/settings.js | 12 ++++++++++++ extension/settings.selftest.js | 5 ++++- 5 files changed, 33 insertions(+), 40 deletions(-) diff --git a/extension/background.js b/extension/background.js index 68b84002..c794baaf 100644 --- a/extension/background.js +++ b/extension/background.js @@ -892,13 +892,7 @@ async function importSettings(file) { // A saved key belongs to the host it was saved for (options.js savedKeyApplies): a key whose platform row, or the // Obsidian address, points at another origin after an import is dropped, never sent there; the user enters it again. async function dropMovedKeys(before, after) { - const origin = (url) => { - try { - return new URL(String(url).trim()).origin; - } catch { - return ""; - } - }; + const origin = MdgSettings.urlOrigin; const origins = (settings) => new Map((Array.isArray(settings[AI_PROVIDERS]) ? settings[AI_PROVIDERS] : []).map((p) => [String(p?.id || "").trim(), origin(p?.baseUrl)])); const [was, now] = [origins(before), origins(after)]; const keys = await loadAiProviderKeys(); @@ -912,9 +906,6 @@ async function dropMovedKeys(before, after) { const { aiApiKeys: AI_PROVIDER_KEYS_STORAGE, aiProviderList: AI_PROVIDERS } = MdgLimits.KEYS; -// An AI platform's address as requests use it: no spaces, no trailing slashes. -const trimBaseUrl = (url) => String(url || "").trim().replace(/\/+$/, ""); - function normalizeAiProvider(item) { if (!item || typeof item !== "object") return null; const id = String(item.id || "").trim(); @@ -923,7 +914,7 @@ function normalizeAiProvider(item) { id, presetId: String(item.presetId || "custom"), name: String(item.name || "").trim() || MdgErrors.LABEL.customAi, - baseUrl: trimBaseUrl(item.baseUrl), + baseUrl: MdgSettings.trimBaseUrl(item.baseUrl), model: String(item.model || "").trim(), temperature: typeof item.temperature === "number" ? item.temperature : 0.7, requiresKey: item.requiresKey !== false, @@ -1264,7 +1255,7 @@ async function testAiConnection({ baseUrl, apiKey, model, requiresKey }) { return { ok: false, error: problem.text, code: problem.code }; } return probeAiChatCompletion({ - baseUrl: trimBaseUrl(baseUrl), + baseUrl: MdgSettings.trimBaseUrl(baseUrl), apiKey, model: String(model).trim() }); diff --git a/extension/options.js b/extension/options.js index 8c9bc0ae..1020ed56 100644 --- a/extension/options.js +++ b/extension/options.js @@ -513,7 +513,7 @@ function syncObsidianKeyTag() { // While a save or a test runs it stays disabled; setBusy(null) calls this again. // The result next to it is for the 地址 and Key it tested: an edit away from them clears it. function syncObsidianTest() { - const typed = { obsidianApiBaseUrl: normalizeBaseUrl(elements.obsidianApiBaseUrl.value), obsidianApiKey: MdgSettings.normalizeApiKey(elements.obsidianApiKey.value) }; + const typed = { obsidianApiBaseUrl: MdgSettings.trimBaseUrl(elements.obsidianApiBaseUrl.value), obsidianApiKey: MdgSettings.normalizeApiKey(elements.obsidianApiKey.value) }; if (obsidianTest && obsidianTest.target !== obsidianTarget(typed)) { obsidianTests.next(); setTestResult(""); @@ -552,7 +552,7 @@ function readFormPayload() { const normalized = MdgSettings.normalizeSyncSettings(form); return { ...Object.fromEntries(Object.keys(form).map((k) => [k, normalized[k]])), - obsidianApiBaseUrl: normalizeBaseUrl(elements.obsidianApiBaseUrl.value), + obsidianApiBaseUrl: MdgSettings.trimBaseUrl(elements.obsidianApiBaseUrl.value), obsidianApiKey: MdgSettings.normalizeApiKey(elements.obsidianApiKey.value) }; } @@ -988,11 +988,6 @@ function closeAllFixedPropertyMenus() { }); } -function normalizeBaseUrl(value) { - return String(value || "").trim().replace(/\/+$/g, ""); -} - - async function testConnection() { clearInputErrors(); const payload = collectFormPayload(); @@ -1118,7 +1113,7 @@ function addAiProviderRow(item = {}) { row.className = "ai-provider-row"; row.dataset.providerId = id; row.dataset.hasSavedKey = hasSavedKey ? "1" : "0"; - row.dataset.keyOrigin = urlOrigin(baseUrl); + row.dataset.keyOrigin = MdgSettings.urlOrigin(baseUrl); row.dataset.currentPresetId = presetId; row.innerHTML = `