98 lines
2.8 KiB
JavaScript
98 lines
2.8 KiB
JavaScript
const input = document.getElementById("serverUrl");
|
|
const saveBtn = document.getElementById("save");
|
|
const savedEl = document.getElementById("saved");
|
|
|
|
const DEFAULT_URL = "https://threads-tool-dev.30cm.net";
|
|
|
|
chrome.storage.sync.get(["serverUrl"], ({ serverUrl }) => {
|
|
input.value = serverUrl ?? DEFAULT_URL;
|
|
});
|
|
|
|
function originPatterns(origin) {
|
|
const url = new URL(origin);
|
|
const port = url.port ? `:${url.port}` : "";
|
|
const origins = new Set([`${origin}/*`]);
|
|
if (url.hostname === "localhost") {
|
|
origins.add(`${url.protocol}//127.0.0.1${port}/*`);
|
|
} else if (url.hostname === "127.0.0.1") {
|
|
origins.add(`${url.protocol}//localhost${port}/*`);
|
|
}
|
|
return [...origins];
|
|
}
|
|
|
|
saveBtn.addEventListener("click", async () => {
|
|
const value = input.value.trim();
|
|
if (!value) return;
|
|
|
|
let origin;
|
|
try {
|
|
origin = new URL(value).origin;
|
|
} catch {
|
|
savedEl.textContent = "網址格式不正確";
|
|
savedEl.style.color = "#b45309";
|
|
return;
|
|
}
|
|
|
|
await chrome.storage.sync.set({ serverUrl: origin });
|
|
|
|
const patterns = originPatterns(origin);
|
|
let granted = false;
|
|
try {
|
|
granted = await chrome.permissions.contains({ origins: patterns });
|
|
if (!granted) {
|
|
granted = await chrome.permissions.request({ origins: patterns });
|
|
}
|
|
} catch (e) {
|
|
savedEl.textContent = `授權失敗:${e instanceof Error ? e.message : String(e)}`;
|
|
savedEl.style.color = "#b45309";
|
|
return;
|
|
}
|
|
|
|
if (!granted) {
|
|
savedEl.textContent =
|
|
"已儲存網址,但未授權存取該網站。請在彈窗按「允許」,否則巡樓頁無法偵測擴充。";
|
|
savedEl.style.color = "#b45309";
|
|
return;
|
|
}
|
|
|
|
try {
|
|
try {
|
|
await chrome.scripting.unregisterContentScripts({ ids: ["haixun-bridge"] });
|
|
} catch {
|
|
// ignore
|
|
}
|
|
await chrome.scripting.registerContentScripts([
|
|
{
|
|
id: "haixun-bridge",
|
|
matches: patterns,
|
|
js: ["content-haixun.js"],
|
|
runAt: "document_start",
|
|
},
|
|
]);
|
|
|
|
const groups = await Promise.all(
|
|
patterns.map((pattern) => chrome.tabs.query({ url: pattern })),
|
|
);
|
|
const seen = new Set();
|
|
let injected = 0;
|
|
for (const tab of groups.flat()) {
|
|
if (!tab.id || seen.has(tab.id)) continue;
|
|
seen.add(tab.id);
|
|
try {
|
|
await chrome.scripting.executeScript({
|
|
target: { tabId: tab.id },
|
|
files: ["content-haixun.js"],
|
|
});
|
|
injected += 1;
|
|
} catch {
|
|
// ignore restricted tabs
|
|
}
|
|
}
|
|
savedEl.textContent = `已儲存:${origin}(已授權,注入 ${injected} 個分頁)。請回巡樓分頁按 F5。`;
|
|
savedEl.style.color = "#166534";
|
|
} catch (e) {
|
|
savedEl.textContent = `注入失敗:${e instanceof Error ? e.message : String(e)}`;
|
|
savedEl.style.color = "#b45309";
|
|
}
|
|
});
|