/** * Thing Extension - Popup 脚本 * 配置 RPC 地址、密钥等参数,存储到 chrome.storage.local */ const $ = (id) => document.getElementById(id) const DEFAULT_CONFIG = { rpcUrl: 'http://127.0.0.1:6800/jsonrpc', rpcSecret: '', interceptDownload: true, minSize: 0, excludeDomains: [], showNotifications: true } function setStatus(state, text) { const dot = $('statusDot') const txt = $('statusText') dot.className = 'dot ' + (state === 'ok' ? 'ok' : state === 'fail' ? 'fail' : '') txt.textContent = text } async function loadConfig() { return new Promise((resolve) => { chrome.runtime.sendMessage({ type: 'getConfig' }, (config) => { resolve(config || { ...DEFAULT_CONFIG }) }) }) } function fillForm(config) { $('rpcUrl').value = config.rpcUrl || DEFAULT_CONFIG.rpcUrl $('rpcSecret').value = config.rpcSecret || '' $('interceptDownload').checked = config.interceptDownload !== false $('showNotifications').checked = config.showNotifications !== false $('minSize').value = config.minSize || 0 $('excludeDomains').value = (config.excludeDomains || []).join(',') } function readForm() { return { rpcUrl: $('rpcUrl').value.trim() || DEFAULT_CONFIG.rpcUrl, rpcSecret: $('rpcSecret').value.trim(), interceptDownload: $('interceptDownload').checked, showNotifications: $('showNotifications').checked, minSize: parseInt($('minSize').value, 10) || 0, excludeDomains: $('excludeDomains').value .split(',') .map(s => s.trim()) .filter(Boolean) } } document.getElementById('configForm').addEventListener('submit', async (e) => { e.preventDefault() const config = readForm() chrome.runtime.sendMessage({ type: 'saveConfig', config }, (res) => { if (res && res.ok) { setStatus('', '已保存') setTimeout(() => window.close(), 500) } else { setStatus('fail', '保存失败:' + (res?.error || '未知错误')) } }) }) $('testBtn').addEventListener('click', () => { setStatus('', '测试中...') // 先保存当前表单值,再测试 const config = readForm() chrome.runtime.sendMessage({ type: 'saveConfig', config }, () => { chrome.runtime.sendMessage({ type: 'testConnection' }, (res) => { if (res && res.ok) { setStatus('ok', `已连接 · aria2 ${res.version}`) } else { setStatus('fail', '连接失败:' + (res?.error || '未知错误')) } }) }) }) // 初始化 ;(async () => { const config = await loadConfig() fillForm(config) // 自动测试一次连接 setStatus('', '检测中...') chrome.runtime.sendMessage({ type: 'testConnection' }, (res) => { if (res && res.ok) { setStatus('ok', `已连接 · aria2 ${res.version}`) } else { setStatus('fail', '未连接') } }) })()