From dded3d2fac3c229e675a3f8a2b8818222d985da7 Mon Sep 17 00:00:00 2001 From: wt Date: Fri, 9 Oct 2026 15:53:24 +0700 Subject: [PATCH] initial commit --- .gitignore | 1 + Makefile | 7 + README.md | 99 ++++ background.js | 238 +++++++++ config-manager.js | 146 ++++++ icons/proxy-switcher-128.png | Bin 0 -> 14588 bytes icons/proxy-switcher-16.png | Bin 0 -> 763 bytes icons/proxy-switcher-32.png | Bin 0 -> 2126 bytes icons/proxy-switcher-48.png | Bin 0 -> 3815 bytes icons/proxy-switcher-512.png | Bin 0 -> 123392 bytes icons/proxy-switcher-64.png | Bin 0 -> 5745 bytes icons/proxy-switcher-96.png | Bin 0 -> 9804 bytes manifest.json | 48 ++ options.css | 511 +++++++++++++++++++ options.html | 248 +++++++++ options.js | 940 +++++++++++++++++++++++++++++++++++ popup.css | 245 +++++++++ popup.html | 97 ++++ popup.js | 308 ++++++++++++ 19 files changed, 2888 insertions(+) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 README.md create mode 100644 background.js create mode 100644 config-manager.js create mode 100644 icons/proxy-switcher-128.png create mode 100644 icons/proxy-switcher-16.png create mode 100644 icons/proxy-switcher-32.png create mode 100644 icons/proxy-switcher-48.png create mode 100644 icons/proxy-switcher-512.png create mode 100644 icons/proxy-switcher-64.png create mode 100644 icons/proxy-switcher-96.png create mode 100644 manifest.json create mode 100644 options.css create mode 100644 options.html create mode 100644 options.js create mode 100644 popup.css create mode 100644 popup.html create mode 100644 popup.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..44ce34d --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +web-ext-artifacts diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c89ff7a --- /dev/null +++ b/Makefile @@ -0,0 +1,7 @@ +default: build + +build: + web-ext build --overwrite-dest --filename proxyswitcherforkbywt.xpi + +clean: + rm -rvf web-ext-artifacts diff --git a/README.md b/README.md new file mode 100644 index 0000000..34b02d5 --- /dev/null +++ b/README.md @@ -0,0 +1,99 @@ +# Firefox Proxy Switcher + +A Firefox extension that allows selective application of proxy servers to specific domains, providing flexible proxy management for different websites. + +## Features + +- **Domain-specific proxy configuration**: Apply different proxy settings to different domains +- **Proxy profiles**: Save and reuse proxy configurations +- **HTTP and SOCKS5 support**: Support for both HTTP and SOCKS5 proxy types +- **Authentication support**: Username/password authentication for proxies +- **Tag-based organization**: Organize domains with custom tags +- **Quick toggle**: Enable/disable proxy for domains with one click + +## Security and Privacy + +This extension is designed with user privacy and security in mind: + +### Data Storage +- All configuration data (domains, profiles, proxy settings) is stored locally in the browser using Firefox's `browser.storage.local` API +- Proxy credentials (usernames/passwords) are encrypted and stored only in the local browser storage +- No data is transmitted to external servers or collected by the extension + +### Network Permissions +The extension requests the following permissions necessary for its functionality: + +- `proxy`: Required to configure and manage proxy settings +- `storage`: Required to save user configuration locally +- `tabs`: Required to determine the current domain when configuring proxy settings +- `activeTab`: Required to access the current tab for configuration +- `webRequest`: Required to handle proxy authentication requests +- `webRequestBlocking`: Required to intercept and modify network requests for proxy routing +- ``: Required to apply proxy settings to any website the user visits + +### How Proxy Routing Works +1. When a user visits a website, the extension checks if that domain has proxy configuration +2. If configured, the extension routes the traffic through the specified proxy server +3. If not configured, traffic uses the direct connection (no proxy) +4. Authentication credentials are only used when required by the proxy server and are transmitted securely + +### Security Considerations +- **No data collection**: The extension does not collect, store, or transmit any browsing data +- **Local-only storage**: All settings remain on the user's device +- **Transparent operation**: Users can see exactly which domains use which proxies +- **No external dependencies**: The extension works entirely offline once configured + +## Installation + +1. Download the extension package +2. Open Firefox and navigate to `about:addons` +3. Click the gear icon and select "Install Add-on From File" +4. Select the downloaded extension file +5. The extension will be installed and ready to use + +For Firefox Android, install the signed XPI from the extension's AMO page or use +Firefox's self-distributed add-on installation flow. The manifest declares Android +compatibility through `browser_specific_settings.gecko_android`; unsigned local +packages are still rejected by Firefox's extension signing policy. + +### Advanced Settings + +Open **Advanced Settings** from the extension popup to manage all domains and +profiles. The **Theme** selector supports **System**, **Light**, and **Dark** and +is stored locally for use in both the options page and popup. + +## Usage + +### Basic Setup +1. Click the Proxy Switcher icon in the Firefox toolbar +2. Configure proxy settings for the current domain or access full settings + +### Advanced Configuration +1. Right-click the extension icon and select "Options" +2. Add proxy profiles for reuse across domains +3. Configure domain-specific proxy settings +4. Use tags to organize your proxy configurations + +## Permissions Explanation + +### Required Permissions +- **proxy**: Allows the extension to configure Firefox's proxy settings +- **storage**: Enables saving your proxy configurations locally +- **tabs**: Lets the extension know which domain you're currently viewing +- **activeTab**: Provides access to the currently active tab for configuration +- **webRequest**: Handles authentication with proxy servers +- **webRequestBlocking**: Intercepts and routes network requests through proxies +- ****: Applies proxy settings to any website you visit + +All permissions are used solely for proxy management and do not enable data collection or tracking. + +## Support + +If you encounter issues or have questions: +1. Check that all required permissions are granted +2. Verify your proxy server settings are correct +3. Ensure the proxy server is accessible from your network + +## Version + +Current version: 1.0.1 diff --git a/background.js b/background.js new file mode 100644 index 0000000..f2e5d8f --- /dev/null +++ b/background.js @@ -0,0 +1,238 @@ +// Global configuration reference for backward compatibility +// configManager is available via window.configManager from config-manager.js +let config = window.configManager.getConfig(); + +// Initialization +async function init() { + await configManager.load(); + config = configManager.getConfig(); // Update global reference + setupProxyListener(); + + // Subscribe to configuration changes + configManager.addListener((event, data) => { + config = configManager.getConfig(); // Update global reference + }); +} + +// Setup proxy listener +// SECURITY NOTE: The extension only routes traffic through user-configured proxies. +// No data is collected or transmitted externally. All proxy settings are user-controlled. +function setupProxyListener() { + // Listen for all URLs to apply domain-specific proxy routing + // This permission is required but only routes traffic through user-specified proxies + browser.proxy.onRequest.addListener( + handleProxyRequest, + { urls: [""] } + ); + + // Listener for automatic proxy authentication + // SECURITY NOTE: Credentials are only used for proxy authentication and stored locally + browser.webRequest.onAuthRequired.addListener( + handleAuthRequired, + { urls: [""] }, + ["blocking"] + ); + + // Track tabs to determine origin domain for proxy configuration + // SECURITY NOTE: Only tracks domain names, no URL content or personal data + browser.tabs.onUpdated.addListener((tabId, changeInfo, tab) => { + if (changeInfo.status === 'loading' && tab.url) { + updateTabOrigin(tabId, tab.url); + } + }); + + browser.tabs.onRemoved.addListener((tabId) => { + delete config.activeTabs[tabId]; + }); +} + +// Extract domain from URL +function getDomainFromUrl(url) { + try { + const urlObj = new URL(url); + return urlObj.hostname.replace(/^www\./, ''); + } catch (e) { + return null; + } +} + +// Determine origin for tab +function updateTabOrigin(tabId, url) { + const domain = getDomainFromUrl(url); + if (domain) { + config.activeTabs[tabId] = domain; + } +} + +// Get proxy settings for domain +function getProxyConfigForDomain(domain) { + return config.domains[domain]; +} + +// Proxy request handler +function handleProxyRequest(requestInfo) { + const { tabId, url, originUrl, type } = requestInfo; + + // Determine request domain + let domain; + + if (originUrl) { + // For sub-requests use origin + domain = getDomainFromUrl(originUrl); + } else if (tabId in config.activeTabs) { + // For main requests use stored tab origin + domain = config.activeTabs[tabId]; + } else { + // Fallback option + domain = getDomainFromUrl(url); + } + + if (!domain) { + return { type: 'direct' }; + } + + // Check domain configuration + const proxyConfig = getProxyConfigForDomain(domain); + + if (!proxyConfig || !proxyConfig.enabled) { + return { type: 'direct' }; + } + + // Form proxy object + const proxyObj = { + type: proxyConfig.type, + host: proxyConfig.host, + port: parseInt(proxyConfig.port, 10) + }; + + // Add authentication if present + if (proxyConfig.username) { + proxyObj.username = proxyConfig.username; + } + + if (proxyConfig.password) { + proxyObj.password = proxyConfig.password; + } + + return proxyObj; +} + +// Authentication request handler +function handleAuthRequired(details) { + const { url, originUrl, tabId, isProxy, realm } = details; + + // Process only proxy authentication + if (!isProxy) { + return {}; + } + + // Determine request domain + let domain; + + if (originUrl) { + domain = getDomainFromUrl(originUrl); + } else if (tabId in config.activeTabs) { + domain = config.activeTabs[tabId]; + } else { + domain = getDomainFromUrl(url); + } + + if (!domain) { + return {}; + } + + // Get proxy configuration for domain + const proxyConfig = getProxyConfigForDomain(domain); + + if (!proxyConfig || !proxyConfig.enabled || !proxyConfig.username || !proxyConfig.password) { + return {}; + } + + // Return credentials for authentication + return { + authCredentials: { + username: proxyConfig.username, + password: proxyConfig.password + } + }; +} + +// Message handler from other extension parts +browser.runtime.onMessage.addListener((message, sender, sendResponse) => { + if (message.action === 'getConfig') { + sendResponse({ config: configManager.getConfig() }); + } else if (message.action === 'updateDomain') { + configManager.updateDomain(message.domain, message.domainConfig) + .then(() => sendResponse({ success: true })) + .catch(error => sendResponse({ success: false, error: error.message })); + return true; // Async response + } else if (message.action === 'removeDomain') { + configManager.removeDomain(message.domain) + .then(() => sendResponse({ success: true })) + .catch(error => sendResponse({ success: false, error: error.message })); + return true; // Async response + } else if (message.action === 'toggleProxy') { + // Quick enable/disable proxy for domain + const domain = message.domain; + const enabled = message.enabled; + const domainConfig = configManager.getDomainConfig(domain); + + if (domainConfig) { + // If domain is already configured, just change enabled + domainConfig.enabled = enabled; + configManager.updateDomain(domain, domainConfig) + .then(() => sendResponse({ success: true })) + .catch(error => sendResponse({ success: false, error: error.message })); + } else { + // If domain is not configured, send error + sendResponse({ success: false, error: 'Domain not configured' }); + } + return true; // Async response + } else if (message.action === 'reloadConfig') { + configManager.reload() + .then(() => sendResponse({ success: true })) + .catch(error => sendResponse({ success: false, error: error.message })); + return true; // Async response + } else if (message.action === 'getProfiles') { + sendResponse({ profiles: configManager.getProfiles() }); + } else if (message.action === 'updateProfile') { + configManager.updateProfile(message.profileName, message.profileConfig) + .then(() => sendResponse({ success: true })) + .catch(error => sendResponse({ success: false, error: error.message })); + return true; // Async response + } else if (message.action === 'removeProfile') { + configManager.removeProfile(message.profileName) + .then(() => sendResponse({ success: true })) + .catch(error => sendResponse({ success: false, error: error.message })); + return true; // Async response + } else if (message.action === 'getProfile') { + sendResponse({ profile: configManager.getProfileConfig(message.profileName) }); + } else if (message.action === 'updateSettings') { + configManager.updateSettings(message.settings || {}) + .then(() => sendResponse({ success: true, settings: configManager.getConfig().settings })) + .catch(error => sendResponse({ success: false, error: error.message })); + return true; + } else if (message.action === 'clearAllDomains') { + configManager.config.domains = {}; + configManager.save() + .then(() => sendResponse({ success: true })) + .catch(error => sendResponse({ success: false, error: error.message })); + return true; + } else if (message.action === 'clearAllProfiles') { + configManager.config.profiles = {}; + configManager.save() + .then(() => sendResponse({ success: true })) + .catch(error => sendResponse({ success: false, error: error.message })); + return true; + } else if (message.action === 'clearEverything') { + configManager.config.domains = {}; + configManager.config.profiles = {}; + configManager.save() + .then(() => sendResponse({ success: true })) + .catch(error => sendResponse({ success: false, error: error.message })); + return true; + } +}); + +// Initialization on load +init(); diff --git a/config-manager.js b/config-manager.js new file mode 100644 index 0000000..0c22717 --- /dev/null +++ b/config-manager.js @@ -0,0 +1,146 @@ +// Centralized configuration manager for Firefox Proxy Switcher + +// Default configuration +const DEFAULT_CONFIG = { + domains: {}, + profiles: {}, // profileName -> profileConfig + settings: { + theme: 'system' + }, + activeTabs: {} // tabId -> domain for tracking active tabs +}; + +// Centralized configuration manager +class ConfigManager { + constructor() { + this.config = { ...DEFAULT_CONFIG }; + this.listeners = []; + } + + // Load configuration from storage + // SECURITY NOTE: Data is stored locally only, never transmitted externally + async load() { + try { + const stored = await browser.storage.local.get('config'); + this.config = { + ...DEFAULT_CONFIG, + ...stored.config, + settings: { ...DEFAULT_CONFIG.settings, ...(stored.config && stored.config.settings) } + }; + + this.notifyListeners('loaded'); + return this.config; + } catch (error) { + console.error('Failed to load config:', error); + throw error; + } + } + + // Save configuration to storage + // SECURITY NOTE: All proxy credentials and settings remain on user's device + async save() { + try { + await browser.storage.local.set({ config: this.config }); + + this.notifyListeners('saved'); + return true; + } catch (error) { + console.error('Failed to save config:', error); + throw error; + } + } + + // Reload configuration + async reload() { + return await this.load(); + } + + // Get current configuration + getConfig() { + return { ...this.config }; + } + + // Update general extension settings + async updateSettings(settings) { + this.config.settings = { ...this.config.settings, ...settings }; + await this.save(); + this.notifyListeners('settingsUpdated', this.config.settings); + } + + // Update domain + async updateDomain(domain, domainConfig) { + // Ensure tags is an array of strings + if (domainConfig.tags && typeof domainConfig.tags === 'string') { + domainConfig.tags = domainConfig.tags.split(',').map(tag => tag.trim()).filter(tag => tag); + } else if (!domainConfig.tags) { + domainConfig.tags = []; + } + this.config.domains[domain] = domainConfig; + await this.save(); + this.notifyListeners('domainUpdated', { domain, config: domainConfig }); + } + + // Remove domain + async removeDomain(domain) { + if (this.config.domains[domain]) { + delete this.config.domains[domain]; + await this.save(); + this.notifyListeners('domainRemoved', { domain }); + } + } + + // Get domain configuration + getDomainConfig(domain) { + return this.config.domains[domain] || null; + } + + // Update profile + async updateProfile(profileName, profileConfig) { + this.config.profiles[profileName] = profileConfig; + await this.save(); + this.notifyListeners('profileUpdated', { profileName, config: profileConfig }); + } + + // Remove profile + async removeProfile(profileName) { + if (this.config.profiles[profileName]) { + delete this.config.profiles[profileName]; + await this.save(); + this.notifyListeners('profileRemoved', { profileName }); + } + } + + // Get profile configuration + getProfileConfig(profileName) { + return this.config.profiles[profileName] || null; + } + + // Get all profiles + getProfiles() { + return { ...this.config.profiles }; + } + + // Add change listener + addListener(callback) { + this.listeners.push(callback); + } + + // Notify listeners + notifyListeners(event, data) { + this.listeners.forEach(callback => { + try { + callback(event, data); + } catch (error) { + console.error('Error in config listener:', error); + } + }); + } +} + +// Create global instance of configuration manager +const configManager = new ConfigManager(); + +// Create global variable for use in other scripts +window.ConfigManager = ConfigManager; +window.configManager = configManager; +window.DEFAULT_CONFIG = DEFAULT_CONFIG; diff --git a/icons/proxy-switcher-128.png b/icons/proxy-switcher-128.png new file mode 100644 index 0000000000000000000000000000000000000000..fd06fe334b5564c9808febd8199f393c2ff1b6b0 GIT binary patch literal 14588 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 literal 0 HcmV?d00001 diff --git a/icons/proxy-switcher-16.png b/icons/proxy-switcher-16.png new file mode 100644 index 0000000000000000000000000000000000000000..ad19257efd0e0d5dd29657f253fdc21462516aec GIT binary patch literal 763 zcmV6eCTea$g(H1kYUQsFbL6F*jf_MxHQYa#{ zh=r8UQk2G4@JTBAprRld)-2Nd++uC@IJPx z1(k7iRPx+d$hhW9;sdZ#V`RM;ih%Qo7HJ=MW{kiHQJ>p{F~?QxFm<_q*x{dMYi>QLI9xiR#5IC?XTUDxN~}=k#xG!}e?qi+ zx-1(&@62tWYxssg2VgqLOrH!5GMzF;>L?Aot(4U4mlX5!6 zLV2W|@8y=PjF(YS`irJk?{yHnT`P_*;lGY0lKe8w%m=6T%dQt{Zr@Q^d%(k1ufqT> zEmoc;n&?bS8#R;DnW#3}r>3{HV|2aI%8jyMPq!@C)6LYH4I`G5?t4F(u6u20dkEKc z^3~_}qju=;Ri>x4T~f)jxNc}%6q=ihY$|!)^tATUb2sl5bOijXqmps zT$9330t@;kyHtvc))E9=!H`!^#mD`)uA#9p$P1_nV32%B?6c&jnBa5Gdh-xet^i_m^8|@ic`G(C)HUz({{v%!B~*e!bNm1R002ovPDHLkV1f)bec}KB literal 0 HcmV?d00001 diff --git a/icons/proxy-switcher-32.png b/icons/proxy-switcher-32.png new file mode 100644 index 0000000000000000000000000000000000000000..7d4cf679deaba2a5697ff093e44530345f1f2709 GIT binary patch literal 2126 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 literal 0 HcmV?d00001 diff --git a/icons/proxy-switcher-512.png b/icons/proxy-switcher-512.png new file mode 100644 index 0000000000000000000000000000000000000000..aa8b3f378fc83605bb810713faebba3ceb065434 GIT binary patch literal 123392 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

B!U_oHp3N&+FUDb^U2oZ^a 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 literal 0 HcmV?d00001 diff --git a/icons/proxy-switcher-96.png b/icons/proxy-switcher-96.png new file mode 100644 index 0000000000000000000000000000000000000000..bf3c770db287b51dc88f48d733e5950e377846ac GIT binary patch literal 9804 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" + ], + "background": { + "scripts": ["config-manager.js", "background.js"], + "persistent": true + }, + "browser_action": { + "default_popup": "popup.html", + "default_icon": "icons/proxy-switcher-16.png" + }, + "options_ui": { + "page": "options.html", + "open_in_tab": true + }, + "browser_specific_settings": { + "gecko": { + "id": "proxy-switcher-for-by-wt@9c0b2d3d", + "strict_min_version": "91.1.0", + "data_collection_permissions": { + "required": ["none"] + } + }, + "gecko_android": { + "strict_min_version": "91.1.0" + } + } +} diff --git a/options.css b/options.css new file mode 100644 index 0000000..bbc5fc8 --- /dev/null +++ b/options.css @@ -0,0 +1,511 @@ +:root { + --primary-color: #0066cc; + --secondary-color: #6c757d; + --success-color: #28a745; + --danger-color: #dc3545; + --background-color: #f8f9fa; + --card-background: #ffffff; + --border-color: #dee2e6; + --text-color: #212529; + --text-secondary: #6c757d; + --input-background: #ffffff; + --input-text: #212529; +} + +:root[data-theme="dark"] { + color-scheme: dark; + --background-color: #202124; + --card-background: #2b2d31; + --border-color: #4a4d52; + --text-color: #f1f3f4; + --text-secondary: #bdc1c6; + --input-background: #303134; + --input-text: #f1f3f4; +} + +@media (prefers-color-scheme: dark) { + :root[data-theme="system"] { + color-scheme: dark; + --background-color: #202124; + --card-background: #2b2d31; + --border-color: #4a4d52; + --text-color: #f1f3f4; + --text-secondary: #bdc1c6; + --input-background: #303134; + --input-text: #f1f3f4; + } +} + +select option { + background-color: var(--input-background); + color: var(--input-text); +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; + background-color: var(--background-color); + color: var(--text-color); + line-height: 1.6; +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 20px; +} + +header { + margin-bottom: 30px; + padding-bottom: 20px; + border-bottom: 1px solid var(--border-color); +} + +header h1 { + display: flex; + align-items: center; + gap: 10px; + margin-bottom: 8px; +} + +.subtitle { + color: var(--text-secondary); + font-size: 14px; +} + +.section-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 20px; +} + +.search-controls { + margin-bottom: 20px; +} + +.search-group { + display: flex; + gap: 10px; + align-items: center; +} + +.search-group input { + flex: 1; +} + +.search-group select { + flex: 0 0 20%; +} + +.profiles-list { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(350px, 1fr)); + gap: 20px; + margin-bottom: 40px; +} + +.domains-list { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(350px, 1fr)); + gap: 20px; + margin-bottom: 40px; +} + +.domain-card { + background: var(--card-background); + border: 1px solid var(--border-color); + border-radius: 8px; + padding: 20px; + transition: box-shadow 0.2s; +} + +.domain-card:hover { + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); +} + +.profile-card { + background: var(--card-background); + border: 1px solid var(--border-color); + border-radius: 8px; + padding: 20px; + transition: box-shadow 0.2s; +} + +.profile-card:hover { + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); +} + +.domain-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: 15px; +} + +.domain-name { + font-size: 16px; + font-weight: 600; + color: var(--primary-color); + margin-bottom: 5px; +} + +.domain-tags { + display: flex; + gap: 5px; + flex-wrap: wrap; + margin-top: 5px; +} + +.tag { + font-size: 11px; + padding: 2px 6px; + background-color: var(--secondary-color); + color: white; + border-radius: 10px; + font-weight: 500; +} + +.domain-status { + font-size: 12px; + padding: 4px 8px; + border-radius: 12px; + font-weight: 600; + margin-left: auto; +} + +.domain-status.enabled { + background-color: #d4edda; + color: #155724; +} + +.domain-status.disabled { + background-color: #f8d7da; + color: #721c24; +} + +.domain-details { + margin-bottom: 20px; +} + +.detail { + display: flex; + margin-bottom: 8px; + font-size: 14px; +} + +.detail-label { + font-weight: 600; + min-width: 80px; + color: var(--text-secondary); +} + +.detail-value { + color: var(--text-color); +} + +.domain-actions { + display: flex; + gap: 10px; +} + +.profile-header { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 15px; +} + +.profile-name { + font-size: 16px; + font-weight: 600; + color: var(--primary-color); +} + +.profile-details { + margin-bottom: 20px; +} + +.profile-actions { + display: flex; + gap: 10px; +} + +.domain-form-section { + background: var(--card-background); + border: 1px solid var(--border-color); + border-radius: 8px; + padding: 30px; + margin-bottom: 30px; +} + +.profile-form-section { + background: var(--card-background); + border: 1px solid var(--border-color); + border-radius: 8px; + padding: 30px; + margin-bottom: 30px; +} + +.advanced-settings-section { + background: var(--card-background); + border: 1px solid var(--border-color); + border-radius: 8px; + padding: 30px; + margin-bottom: 30px; +} + +.settings-row { + max-width: 600px; +} + +.profile-form { + max-width: 600px; +} + +.domain-form { + max-width: 600px; +} + +.form-group { + margin-bottom: 20px; +} + +.form-row { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 20px; +} + +label { + display: block; + margin-bottom: 6px; + font-weight: 600; + font-size: 14px; +} + +input, select { + width: 100%; + padding: 10px 12px; + background-color: var(--input-background); + color: var(--input-text); + border: 1px solid var(--border-color); + border-radius: 4px; + font-size: 14px; + transition: border-color 0.2s; +} + +input:focus, select:focus { + outline: none; + border-color: var(--primary-color); + box-shadow: 0 0 0 3px rgba(0, 102, 204, 0.1); +} + +input::placeholder { + color: var(--text-secondary); +} + +input:invalid { + border-color: var(--danger-color); +} + +.form-hint { + display: block; + margin-top: 6px; + font-size: 12px; + color: var(--text-secondary); +} + +.password-input { + position: relative; +} + +.toggle-password { + position: absolute; + right: 10px; + top: 50%; + transform: translateY(-50%); + background: none; + border: none; + cursor: pointer; + font-size: 16px; + padding: 5px; +} + +.checkbox-group { + display: flex; + align-items: center; +} + +.checkbox-label { + display: flex; + align-items: center; + gap: 8px; + cursor: pointer; +} + +.checkbox-label input[type="checkbox"] { + width: auto; +} + +.form-actions { + display: flex; + gap: 10px; + justify-content: flex-end; + margin-top: 30px; +} + +.btn { + padding: 10px 20px; + border: none; + border-radius: 4px; + font-size: 14px; + font-weight: 600; + cursor: pointer; + transition: all 0.2s; +} + +.btn-primary { + background-color: var(--primary-color); + color: white; +} + +.btn-primary:hover { + background-color: #0052a3; +} + +.btn-secondary { + background-color: var(--secondary-color); + color: white; +} + +.btn-secondary:hover { + background-color: #5a6268; +} + +.btn-danger { + background-color: var(--danger-color); + color: white; +} + +.btn-danger:hover { + background-color: #c82333; +} + +.empty-state { + text-align: center; + padding: 40px; + color: var(--text-secondary); + grid-column: 1 / -1; +} + +.hidden { + display: none !important; +} + +/* Modal Styles */ +.modal-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.5); + z-index: 1000; + opacity: 0; + transition: opacity 0.3s ease; +} + +.modal-overlay:not(.hidden) { + opacity: 1; +} + +.domain-form-section:not(.hidden), +.profile-form-section:not(.hidden) { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%) scale(0.9); + z-index: 1001; + max-height: 90vh; + overflow-y: auto; + opacity: 0; + transition: all 0.3s ease; + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); +} + +.domain-form-section:not(.hidden), +.profile-form-section:not(.hidden) { + transform: translate(-50%, -50%) scale(1); + opacity: 1; +} + +body.modal-open { + overflow: hidden; +} + +footer { + margin-top: 40px; + padding-top: 20px; + border-top: 1px solid var(--border-color); + text-align: center; + color: var(--text-secondary); + font-size: 12px; +} + +.footer-content { + display: flex; + justify-content: space-between; + align-items: center; +} + +@keyframes slideIn { + from { + transform: translateX(100%); + opacity: 0; + } + to { + transform: translateX(0); + opacity: 1; + } +} + +@keyframes slideOut { + from { + transform: translateX(0); + opacity: 1; + } + to { + transform: translateX(100%); + opacity: 0; + } +} + +@media (max-width: 768px) { + .container { + padding: 15px; + } + + .form-row { + grid-template-columns: 1fr; + gap: 0; + } + + .domains-list { + grid-template-columns: 1fr; + } + + .profiles-list { + grid-template-columns: 1fr; + } + + .footer-content { + flex-direction: column; + gap: 10px; + } +} diff --git a/options.html b/options.html new file mode 100644 index 0000000..d824624 --- /dev/null +++ b/options.html @@ -0,0 +1,248 @@ + + + + + + Proxy Switcher - Options + + + + +

+ +
+
+

Proxy Switcher Proxy Switcher

+

Manage domain-specific proxy settings

+
+ +
+
+
+

Proxy Profiles

+ +
+ +
+ +
+
+ +
+
+

Configured Domains

+ +
+ +
+
+ + +
+
+ +
+ +
+
+ + + + +
+

Advanced Settings

+
+ + + Choose light, dark, or follow your device theme. +
+
+
+

Management

+
+ + + +
+
+
+ +
+ +
+
+ + + + diff --git a/options.js b/options.js new file mode 100644 index 0000000..310ad78 --- /dev/null +++ b/options.js @@ -0,0 +1,940 @@ +class OptionsManager { + constructor() { + this.currentEditDomain = null; + this.currentEditProfile = null; + this.searchQuery = ''; + this.tagFilter = ''; + this.allDomains = {}; // For storing all domains for filtering + this.init(); + } + + // Sanitizer for user data + sanitize(text) { + const div = document.createElement('div'); + div.textContent = text; + return div.innerHTML; + } + + async init() { + await this.loadDomains(); + await this.loadProfiles(); + await this.loadSettings(); + this.setupEventListeners(); + } + + async loadSettings() { + try { + const response = await browser.runtime.sendMessage({ action: 'getConfig' }); + const theme = response.config && response.config.settings && response.config.settings.theme || 'system'; + document.getElementById('theme-select').value = theme; + this.applyTheme(theme); + } catch (error) { + console.error('Failed to load settings:', error); + this.applyTheme('system'); + } + } + + applyTheme(theme) { + document.documentElement.dataset.theme = ['light', 'dark', 'system'].includes(theme) ? theme : 'system'; + } + + async saveTheme(theme) { + const response = await browser.runtime.sendMessage({ action: 'updateSettings', settings: { theme } }); + if (!response.success) throw new Error(response.error || 'Failed to save theme'); + this.applyTheme(theme); + } + + async loadDomains() { + try { + const response = await browser.runtime.sendMessage({ action: 'getConfig' }); + const config = response.config || { domains: {} }; + + this.allDomains = config.domains; + this.updateTagFilter(); + this.renderDomainsList(this.filterDomains()); + } catch (error) { + console.error('Failed to load domains:', error); + this.showError('Failed to load configuration'); + } + } + + renderDomainsList(domains) { + const container = document.getElementById('domains-list'); + container.innerHTML = ''; // Clear the container + + if (Object.keys(domains).length === 0) { + const emptyState = document.createElement('div'); + emptyState.className = 'empty-state'; + emptyState.innerHTML = ` +

No domains configured yet.

+

Click "Add Domain" to get started.

+ `; + container.appendChild(emptyState); + return; + } + + const domainsList = Object.entries(domains) + .sort(([a], [b]) => a.localeCompare(b)) + .map(([domain, config]) => this.createDomainCard(domain, config)); + + domainsList.forEach(card => { + container.appendChild(card); + }); + + // Add event handlers for buttons + document.querySelectorAll('.edit-domain').forEach(btn => { + btn.addEventListener('click', (e) => { + const domain = e.target.dataset.domain; + this.editDomain(domain); + }); + }); + + document.querySelectorAll('.delete-domain').forEach(btn => { + btn.addEventListener('click', (e) => { + const domain = e.target.dataset.domain; + this.deleteDomain(domain); + }); + }); + } + + createDomainCard(domain, config) { + const typeMap = { + http: 'HTTP', + socks: 'SOCKS5' + }; + + const statusClass = config.enabled ? 'enabled' : 'disabled'; + const statusText = config.enabled ? 'Enabled' : 'Disabled'; + + const card = document.createElement('div'); + card.className = 'domain-card'; + + // Header + const header = document.createElement('div'); + header.className = 'domain-header'; + + const headerContent = document.createElement('div'); + + const domainName = document.createElement('h3'); + domainName.className = 'domain-name'; + domainName.textContent = this.sanitize(domain); + + headerContent.appendChild(domainName); + + if (config.tags && config.tags.length) { + const tagsContainer = document.createElement('div'); + tagsContainer.className = 'domain-tags'; + config.tags.forEach(tag => { + const tagSpan = document.createElement('span'); + tagSpan.className = 'tag'; + tagSpan.textContent = this.sanitize(tag); + tagsContainer.appendChild(tagSpan); + }); + headerContent.appendChild(tagsContainer); + } + + header.appendChild(headerContent); + + const status = document.createElement('span'); + status.className = `domain-status ${statusClass}`; + status.textContent = statusText; + header.appendChild(status); + + card.appendChild(header); + + // Details + const details = document.createElement('div'); + details.className = 'domain-details'; + + const typeDetail = document.createElement('div'); + typeDetail.className = 'detail'; + const typeLabel = document.createElement('span'); + typeLabel.className = 'detail-label'; + typeLabel.textContent = 'Type:'; + const typeValue = document.createElement('span'); + typeValue.className = 'detail-value'; + typeValue.textContent = typeMap[config.type] || config.type; + typeDetail.appendChild(typeLabel); + typeDetail.appendChild(typeValue); + details.appendChild(typeDetail); + + const serverDetail = document.createElement('div'); + serverDetail.className = 'detail'; + const serverLabel = document.createElement('span'); + serverLabel.className = 'detail-label'; + serverLabel.textContent = 'Server:'; + const serverValue = document.createElement('span'); + serverValue.className = 'detail-value'; + serverValue.textContent = `${this.sanitize(config.host)}:${config.port}`; + serverDetail.appendChild(serverLabel); + serverDetail.appendChild(serverValue); + details.appendChild(serverDetail); + + if (config.username) { + const usernameDetail = document.createElement('div'); + usernameDetail.className = 'detail'; + const usernameLabel = document.createElement('span'); + usernameLabel.className = 'detail-label'; + usernameLabel.textContent = 'Username:'; + const usernameValue = document.createElement('span'); + usernameValue.className = 'detail-value'; + usernameValue.textContent = this.sanitize(config.username); + usernameDetail.appendChild(usernameLabel); + usernameDetail.appendChild(usernameValue); + details.appendChild(usernameDetail); + } + + card.appendChild(details); + + // Actions + const actions = document.createElement('div'); + actions.className = 'domain-actions'; + + const editBtn = document.createElement('button'); + editBtn.className = 'btn btn-secondary edit-domain'; + editBtn.dataset.domain = domain; + editBtn.textContent = 'Edit'; + actions.appendChild(editBtn); + + const deleteBtn = document.createElement('button'); + deleteBtn.className = 'btn btn-danger delete-domain'; + deleteBtn.dataset.domain = domain; + deleteBtn.textContent = 'Delete'; + actions.appendChild(deleteBtn); + + card.appendChild(actions); + + return card; + } + + showDomainForm(domain = null, config = null) { + this.currentEditDomain = domain; + + const formSection = document.getElementById('domain-form-section'); + const formTitle = document.getElementById('form-title'); + const form = document.getElementById('domain-form'); + const overlay = document.getElementById('modal-overlay'); + + if (domain) { + formTitle.textContent = `Edit ${domain}`; + this.populateForm(config); + } else { + formTitle.textContent = 'Add Domain'; + form.reset(); + } + + // Show modal window + overlay.classList.remove('hidden'); + formSection.classList.remove('hidden'); + document.body.classList.add('modal-open'); + + document.getElementById('domain-input').focus(); + } + + hideDomainForm() { + const formSection = document.getElementById('domain-form-section'); + const overlay = document.getElementById('modal-overlay'); + + // Hide modal window + overlay.classList.add('hidden'); + formSection.classList.add('hidden'); + document.body.classList.remove('modal-open'); + + this.currentEditDomain = null; + const form = document.getElementById('domain-form'); + form.reset(); + } + + populateForm(config) { + document.getElementById('domain-input').value = this.currentEditDomain; + document.getElementById('proxy-type').value = config.type || 'http'; + document.getElementById('proxy-host').value = config.host || ''; + document.getElementById('proxy-port').value = config.port || ''; + document.getElementById('proxy-username').value = config.username || ''; + document.getElementById('proxy-password').value = config.password || ''; + document.getElementById('domain-tags').value = config.tags ? config.tags.join(', ') : ''; + document.getElementById('proxy-enabled').checked = config.enabled !== false; + } + + async saveDomain(event) { + event.preventDefault(); + + const form = event.target; + + // Validation + if (!form.checkValidity()) { + form.reportValidity(); + return; + } + + const domain = document.getElementById('domain-input').value.trim().toLowerCase(); + const tagsInput = document.getElementById('domain-tags').value.trim(); + const domainConfig = { + type: document.getElementById('proxy-type').value, + host: document.getElementById('proxy-host').value.trim(), + port: parseInt(document.getElementById('proxy-port').value, 10), + username: document.getElementById('proxy-username').value.trim() || null, + password: document.getElementById('proxy-password').value || null, + enabled: document.getElementById('proxy-enabled').checked, + tags: tagsInput ? tagsInput.split(',').map(tag => tag.trim()).filter(tag => tag) : [] + }; + + // Additional validation + if (domainConfig.port < 1 || domainConfig.port > 65535) { + this.showError('Port must be between 1 and 65535'); + return; + } + + try { + // If domain name has changed, remove the old domain + if (this.currentEditDomain && this.currentEditDomain !== domain) { + const removeResponse = await browser.runtime.sendMessage({ + action: 'removeDomain', + domain: this.currentEditDomain + }); + if (!removeResponse.success) { + throw new Error(removeResponse.error || 'Failed to remove old domain'); + } + } + + // Use centralized API to update domain + const response = await browser.runtime.sendMessage({ + action: 'updateDomain', + domain: domain, + domainConfig: domainConfig + }); + + if (response.success) { + this.showSuccess(`Domain ${domain} saved successfully`); + this.hideDomainForm(); + await this.loadDomains(); + } else { + throw new Error(response.error || 'Failed to save domain'); + } + + } catch (error) { + console.error('Failed to save domain:', error); + this.showError('Failed to save domain configuration'); + } + } + + async deleteDomain(domain) { + if (!confirm(`Are you sure you want to remove proxy settings for ${domain}?`)) { + return; + } + + try { + // Use centralized API to remove domain + const response = await browser.runtime.sendMessage({ + action: 'removeDomain', + domain: domain + }); + + if (response.success) { + this.showSuccess(`Domain ${domain} removed`); + await this.loadDomains(); + } else { + throw new Error(response.error || 'Failed to delete domain'); + } + + } catch (error) { + console.error('Failed to delete domain:', error); + this.showError('Failed to delete domain'); + } + } + + async editDomain(domain) { + try { + const response = await browser.runtime.sendMessage({ action: 'getConfig' }); + const config = response.config || { domains: {} }; + + if (config.domains[domain]) { + this.showDomainForm(domain, config.domains[domain]); + } + } catch (error) { + console.error('Failed to load domain:', error); + this.showError('Failed to load domain configuration'); + } + } + + // Methods for profiles + async loadProfiles() { + try { + const response = await browser.runtime.sendMessage({ action: 'getProfiles' }); + const profiles = response.profiles || {}; + + this.renderProfilesList(profiles); + this.updateProfileSelect(profiles); + } catch (error) { + console.error('Failed to load profiles:', error); + this.showError('Failed to load profiles'); + } + } + + renderProfilesList(profiles) { + const container = document.getElementById('profiles-list'); + container.innerHTML = ''; // Clear the container + + if (Object.keys(profiles).length === 0) { + const emptyState = document.createElement('div'); + emptyState.className = 'empty-state'; + emptyState.innerHTML = ` +

No profiles configured yet.

+

Click "Add Profile" to create your first profile.

+ `; + container.appendChild(emptyState); + return; + } + + const profilesList = Object.entries(profiles) + .sort(([a], [b]) => a.localeCompare(b)) + .map(([profileName, config]) => this.createProfileCard(profileName, config)); + + profilesList.forEach(card => { + container.appendChild(card); + }); + + // Add event handlers for buttons + document.querySelectorAll('.edit-profile').forEach(btn => { + btn.addEventListener('click', (e) => { + const profileName = e.target.dataset.profile; + this.editProfile(profileName); + }); + }); + + document.querySelectorAll('.delete-profile').forEach(btn => { + btn.addEventListener('click', (e) => { + const profileName = e.target.dataset.profile; + this.deleteProfile(profileName); + }); + }); + } + + createProfileCard(profileName, config) { + const typeMap = { + http: 'HTTP', + socks: 'SOCKS5' + }; + + const card = document.createElement('div'); + card.className = 'profile-card'; + + // Header + const header = document.createElement('div'); + header.className = 'profile-header'; + + const profileNameEl = document.createElement('h3'); + profileNameEl.className = 'profile-name'; + profileNameEl.textContent = this.sanitize(profileName); + + header.appendChild(profileNameEl); + card.appendChild(header); + + // Details + const details = document.createElement('div'); + details.className = 'profile-details'; + + const typeDetail = document.createElement('div'); + typeDetail.className = 'detail'; + const typeLabel = document.createElement('span'); + typeLabel.className = 'detail-label'; + typeLabel.textContent = 'Type:'; + const typeValue = document.createElement('span'); + typeValue.className = 'detail-value'; + typeValue.textContent = typeMap[config.type] || config.type; + typeDetail.appendChild(typeLabel); + typeDetail.appendChild(typeValue); + details.appendChild(typeDetail); + + const serverDetail = document.createElement('div'); + serverDetail.className = 'detail'; + const serverLabel = document.createElement('span'); + serverLabel.className = 'detail-label'; + serverLabel.textContent = 'Server:'; + const serverValue = document.createElement('span'); + serverValue.className = 'detail-value'; + serverValue.textContent = `${this.sanitize(config.host)}:${config.port}`; + serverDetail.appendChild(serverLabel); + serverDetail.appendChild(serverValue); + details.appendChild(serverDetail); + + if (config.username) { + const usernameDetail = document.createElement('div'); + usernameDetail.className = 'detail'; + const usernameLabel = document.createElement('span'); + usernameLabel.className = 'detail-label'; + usernameLabel.textContent = 'Username:'; + const usernameValue = document.createElement('span'); + usernameValue.className = 'detail-value'; + usernameValue.textContent = this.sanitize(config.username); + usernameDetail.appendChild(usernameLabel); + usernameDetail.appendChild(usernameValue); + details.appendChild(usernameDetail); + } + + card.appendChild(details); + + // Actions + const actions = document.createElement('div'); + actions.className = 'profile-actions'; + + const editBtn = document.createElement('button'); + editBtn.className = 'btn btn-secondary edit-profile'; + editBtn.dataset.profile = profileName; + editBtn.textContent = 'Edit'; + actions.appendChild(editBtn); + + const deleteBtn = document.createElement('button'); + deleteBtn.className = 'btn btn-danger delete-profile'; + deleteBtn.dataset.profile = profileName; + deleteBtn.textContent = 'Delete'; + actions.appendChild(deleteBtn); + + card.appendChild(actions); + + return card; + } + + updateProfileSelect(profiles) { + const select = document.getElementById('profile-select'); + const currentValue = select.value; + + // Clear the select, keeping only the default option + select.innerHTML = ''; + + // Add profiles + Object.keys(profiles).sort().forEach(profileName => { + const option = document.createElement('option'); + option.value = profileName; + option.textContent = profileName; + select.appendChild(option); + }); + + // Restore selected value if it still exists + if (currentValue && profiles[currentValue]) { + select.value = currentValue; + } + } + + showProfileForm(profileName = null, config = null) { + this.currentEditProfile = profileName; + + const formSection = document.getElementById('profile-form-section'); + const formTitle = document.getElementById('profile-form-title'); + const form = document.getElementById('profile-form'); + const overlay = document.getElementById('modal-overlay'); + + if (profileName) { + formTitle.textContent = `Edit ${profileName}`; + this.populateProfileForm(config); + } else { + formTitle.textContent = 'Add Profile'; + form.reset(); + } + + // Show modal window + overlay.classList.remove('hidden'); + formSection.classList.remove('hidden'); + document.body.classList.add('modal-open'); + + document.getElementById('profile-name-input').focus(); + } + + hideProfileForm() { + const formSection = document.getElementById('profile-form-section'); + const overlay = document.getElementById('modal-overlay'); + + // Hide modal window + overlay.classList.add('hidden'); + formSection.classList.add('hidden'); + document.body.classList.remove('modal-open'); + + this.currentEditProfile = null; + const form = document.getElementById('profile-form'); + form.reset(); + } + + populateProfileForm(config) { + document.getElementById('profile-name-input').value = this.currentEditProfile; + document.getElementById('profile-proxy-type').value = config.type || 'http'; + document.getElementById('profile-proxy-host').value = config.host || ''; + document.getElementById('profile-proxy-port').value = config.port || ''; + document.getElementById('profile-proxy-username').value = config.username || ''; + document.getElementById('profile-proxy-password').value = config.password || ''; + } + + async saveProfile(event) { + event.preventDefault(); + + const form = event.target; + + // Validation + if (!form.checkValidity()) { + form.reportValidity(); + return; + } + + const profileName = document.getElementById('profile-name-input').value.trim(); + const profileConfig = { + type: document.getElementById('profile-proxy-type').value, + host: document.getElementById('profile-proxy-host').value.trim(), + port: parseInt(document.getElementById('profile-proxy-port').value, 10), + username: document.getElementById('profile-proxy-username').value.trim() || null, + password: document.getElementById('profile-proxy-password').value || null + }; + + // Additional validation + if (profileConfig.port < 1 || profileConfig.port > 65535) { + this.showError('Port must be between 1 and 65535'); + return; + } + + try { + // If profile name has changed, remove the old profile + if (this.currentEditProfile && this.currentEditProfile !== profileName) { + const removeResponse = await browser.runtime.sendMessage({ + action: 'removeProfile', + profileName: this.currentEditProfile + }); + if (!removeResponse.success) { + throw new Error(removeResponse.error || 'Failed to remove old profile'); + } + } + + const response = await browser.runtime.sendMessage({ + action: 'updateProfile', + profileName: profileName, + profileConfig: profileConfig + }); + + if (response.success) { + this.showSuccess(`Profile "${profileName}" saved successfully`); + this.hideProfileForm(); + await this.loadProfiles(); + } else { + throw new Error(response.error || 'Failed to save profile'); + } + + } catch (error) { + console.error('Failed to save profile:', error); + this.showError('Failed to save profile'); + } + } + + async deleteProfile(profileName) { + if (!confirm(`Are you sure you want to delete profile "${profileName}"?`)) { + return; + } + + try { + const response = await browser.runtime.sendMessage({ + action: 'removeProfile', + profileName: profileName + }); + + if (response.success) { + this.showSuccess(`Profile "${profileName}" deleted`); + await this.loadProfiles(); + } else { + throw new Error(response.error || 'Failed to delete profile'); + } + + } catch (error) { + console.error('Failed to delete profile:', error); + this.showError('Failed to delete profile'); + } + } + + async editProfile(profileName) { + try { + const response = await browser.runtime.sendMessage({ action: 'getProfile', profileName }); + const profile = response.profile; + + if (profile) { + this.showProfileForm(profileName, profile); + } + } catch (error) { + console.error('Failed to load profile:', error); + this.showError('Failed to load profile'); + } + } + + // Fill domain form with profile data + fillFormFromProfile(profileName) { + if (!profileName) { + // If empty profile is selected, do nothing + return; + } + + // Get profile data + browser.runtime.sendMessage({ action: 'getProfile', profileName }) + .then(response => { + const profile = response.profile; + if (profile) { + // Fill domain form fields + document.getElementById('proxy-type').value = profile.type || 'http'; + document.getElementById('proxy-host').value = profile.host || ''; + document.getElementById('proxy-port').value = profile.port || ''; + document.getElementById('proxy-username').value = profile.username || ''; + document.getElementById('proxy-password').value = profile.password || ''; + } + }) + .catch(error => { + console.error('Failed to load profile for form:', error); + }); + } + + // Filter domains by search and tags + filterDomains() { + let filtered = { ...this.allDomains }; + + // Search filter + if (this.searchQuery) { + const query = this.searchQuery.toLowerCase(); + filtered = Object.fromEntries( + Object.entries(filtered).filter(([domain]) => + domain.toLowerCase().includes(query) + ) + ); + } + + // Tag filter + if (this.tagFilter) { + filtered = Object.fromEntries( + Object.entries(filtered).filter(([, config]) => + config.tags && config.tags.includes(this.tagFilter) + ) + ); + } + + return filtered; + } + + // Update tag filter + updateTagFilter() { + const tagFilter = document.getElementById('tag-filter'); + const currentValue = tagFilter.value; + + // Collect all unique tags + const allTags = new Set(); + Object.values(this.allDomains).forEach(config => { + if (config.tags) { + config.tags.forEach(tag => allTags.add(tag)); + } + }); + + // Clear and add options + tagFilter.innerHTML = ''; + Array.from(allTags).sort().forEach(tag => { + const option = document.createElement('option'); + option.value = tag; + option.textContent = tag; + tagFilter.appendChild(option); + }); + + // Restore selected value + if (currentValue && allTags.has(currentValue)) { + tagFilter.value = currentValue; + } + } + + // Update domain display when filters change + updateDomainDisplay() { + this.renderDomainsList(this.filterDomains()); + } + + // Methods for bulk deletion + async clearAllDomains() { + if (!confirm('Are you sure you want to delete ALL domain configurations? This action cannot be undone.')) { + return; + } + + try { + const response = await browser.runtime.sendMessage({ action: 'clearAllDomains' }); + if (response.success) { + this.showSuccess('All domains cleared'); + await this.loadDomains(); + } else { + throw new Error(response.error || 'Failed to clear domains'); + } + } catch (error) { + console.error('Failed to clear domains:', error); + this.showError('Failed to clear domains'); + } + } + + async clearAllProfiles() { + if (!confirm('Are you sure you want to delete ALL profile configurations? This action cannot be undone.')) { + return; + } + + try { + const response = await browser.runtime.sendMessage({ action: 'clearAllProfiles' }); + if (response.success) { + this.showSuccess('All profiles cleared'); + await this.loadProfiles(); + } else { + throw new Error(response.error || 'Failed to clear profiles'); + } + } catch (error) { + console.error('Failed to clear profiles:', error); + this.showError('Failed to clear profiles'); + } + } + + async clearEverything() { + if (!confirm('Are you sure you want to delete ALL configurations (domains and profiles)? This action cannot be undone.')) { + return; + } + + try { + const response = await browser.runtime.sendMessage({ action: 'clearEverything' }); + if (response.success) { + this.showSuccess('All configurations cleared'); + await this.loadDomains(); + await this.loadProfiles(); + } else { + throw new Error(response.error || 'Failed to clear everything'); + } + } catch (error) { + console.error('Failed to clear everything:', error); + this.showError('Failed to clear everything'); + } + } + + showMessage(message, type = 'info') { + const messageDiv = document.createElement('div'); + messageDiv.className = `message message-${type}`; + messageDiv.textContent = message; + messageDiv.style.cssText = ` + position: fixed; + top: 20px; + right: 20px; + padding: 12px 20px; + border-radius: 4px; + color: white; + z-index: 1000; + animation: slideIn 0.3s ease; + `; + + if (type === 'success') { + messageDiv.style.backgroundColor = '#28a745'; + } else if (type === 'error') { + messageDiv.style.backgroundColor = '#dc3545'; + } else { + messageDiv.style.backgroundColor = '#17a2b8'; + } + + document.body.appendChild(messageDiv); + + setTimeout(() => { + messageDiv.style.animation = 'slideOut 0.3s ease'; + setTimeout(() => messageDiv.remove(), 300); + }, 3000); + } + + showSuccess(message) { + this.showMessage(message, 'success'); + } + + showError(message) { + this.showMessage(message, 'error'); + } + + setupEventListeners() { + // Modal overlay - close on click + document.getElementById('modal-overlay').addEventListener('click', () => { + // Determine which form is open + const domainForm = document.getElementById('domain-form-section'); + const profileForm = document.getElementById('profile-form-section'); + + if (!domainForm.classList.contains('hidden')) { + this.hideDomainForm(); + } else if (!profileForm.classList.contains('hidden')) { + this.hideProfileForm(); + } + }); + + // Add domain + document.getElementById('add-domain').addEventListener('click', () => { + this.showDomainForm(); + }); + + // Domain form + document.getElementById('domain-form').addEventListener('submit', + (e) => this.saveDomain(e)); + + // Cancel editing + document.getElementById('cancel-form').addEventListener('click', () => { + this.hideDomainForm(); + }); + + // Show/hide password + document.querySelectorAll('.toggle-password').forEach(btn => { + btn.addEventListener('click', (e) => { + const targetId = e.target.dataset.target; + const input = document.getElementById(targetId); + const type = input.type === 'password' ? 'text' : 'password'; + input.type = type; + e.target.textContent = type === 'password' ? '👁' : '👁️‍🗨️'; + }); + }); + + // Profiles + document.getElementById('add-profile').addEventListener('click', () => { + this.showProfileForm(); + }); + + document.getElementById('profile-form').addEventListener('submit', + (e) => this.saveProfile(e)); + + document.getElementById('cancel-profile-form').addEventListener('click', () => { + this.hideProfileForm(); + }); + + // Fill domain form from profile + document.getElementById('profile-select').addEventListener('change', (e) => { + this.fillFormFromProfile(e.target.value); + }); + + // Domain search + document.getElementById('domain-search').addEventListener('input', (e) => { + this.searchQuery = e.target.value.trim(); + this.updateDomainDisplay(); + }); + + // Tag filter + document.getElementById('tag-filter').addEventListener('change', (e) => { + this.tagFilter = e.target.value; + this.updateDomainDisplay(); + }); + + // Control buttons + document.getElementById('clear-domains').addEventListener('click', () => { + this.clearAllDomains(); + }); + + document.getElementById('clear-profiles').addEventListener('click', () => { + this.clearAllProfiles(); + }); + + document.getElementById('clear-all').addEventListener('click', () => { + this.clearEverything(); + }); + + document.getElementById('theme-select').addEventListener('change', async (e) => { + try { + await this.saveTheme(e.target.value); + this.showSuccess('Theme saved'); + } catch (error) { + console.error('Failed to save theme:', error); + this.showError('Failed to save theme'); + } + }); + } +} + +// Initialize on load +document.addEventListener('DOMContentLoaded', () => { + new OptionsManager(); +}); diff --git a/popup.css b/popup.css new file mode 100644 index 0000000..812c1b2 --- /dev/null +++ b/popup.css @@ -0,0 +1,245 @@ +:root { + --primary-color: #0066cc; + --secondary-color: #6c757d; + --background-color: #ffffff; + --border-color: #dee2e6; + --text-color: #212529; + --text-secondary: #6c757d; + --muted-background: #f8f9fa; + --input-background: #ffffff; + --input-text: #212529; +} + +:root[data-theme="dark"] { + color-scheme: dark; + --background-color: #202124; + --border-color: #4a4d52; + --text-color: #f1f3f4; + --text-secondary: #bdc1c6; + --muted-background: #35363a; + --input-background: #303134; + --input-text: #f1f3f4; +} + +@media (prefers-color-scheme: dark) { + :root[data-theme="system"] { + color-scheme: dark; + --background-color: #202124; + --border-color: #4a4d52; + --text-color: #f1f3f4; + --text-secondary: #bdc1c6; + --muted-background: #35363a; + --input-background: #303134; + --input-text: #f1f3f4; + } +} + +select option { + background-color: var(--input-background); + color: var(--input-text); +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; + font-size: 14px; + color: var(--text-color); + min-width: 320px; +} + +.popup-container { + padding: 16px; + background-color: var(--background-color); +} + +.popup-header { + margin-bottom: 20px; + padding-bottom: 16px; + border-bottom: 1px solid var(--border-color); +} + +.popup-header h2 { + font-size: 18px; + margin-bottom: 8px; + color: var(--primary-color); +} + +.domain-display { + font-size: 12px; + color: var(--text-secondary); + font-family: monospace; + background-color: var(--muted-background); + padding: 4px 8px; + border-radius: 4px; + display: inline-block; +} + +.toggle-section { + margin-bottom: 20px; +} + +.toggle-label { + display: flex; + align-items: center; + gap: 10px; + cursor: pointer; +} + +.toggle-slider { + position: relative; + width: 40px; + height: 20px; + background-color: #ccc; + border-radius: 20px; + transition: background-color 0.3s; +} + +.toggle-slider:after { + content: ''; + position: absolute; + width: 16px; + height: 16px; + border-radius: 50%; + background-color: white; + top: 2px; + left: 2px; + transition: transform 0.3s; +} + +input[type="checkbox"] { + display: none; +} + +input[type="checkbox"]:checked + .toggle-slider { + background-color: var(--primary-color); +} + +input[type="checkbox"]:checked + .toggle-slider:after { + transform: translateX(20px); +} + +.toggle-text { + font-weight: 600; +} + +.proxy-form { + margin-top: 20px; +} + +.form-group { + margin-bottom: 16px; +} + +.form-row { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 12px; +} + +label { + display: block; + margin-bottom: 4px; + font-weight: 600; + font-size: 12px; +} + +input, select { + width: 100%; + padding: 8px 10px; + background-color: var(--input-background); + color: var(--input-text); + border: 1px solid var(--border-color); + border-radius: 4px; + font-size: 13px; +} + +input:focus, select:focus { + outline: none; + border-color: var(--primary-color); +} + +input::placeholder { + color: var(--text-secondary); +} + +.password-input { + position: relative; +} + +.toggle-password { + position: absolute; + right: 8px; + top: 50%; + transform: translateY(-50%); + background: none; + border: none; + cursor: pointer; + font-size: 14px; + padding: 2px; +} + +.form-actions { + display: flex; + gap: 10px; + margin-top: 24px; +} + +.btn { + padding: 8px 16px; + border: none; + border-radius: 4px; + font-size: 13px; + font-weight: 600; + cursor: pointer; + flex: 1; +} + +.btn-primary { + background-color: var(--primary-color); + color: white; +} + +.btn-primary:hover { + background-color: #0052a3; +} + +.btn-secondary { + background-color: var(--secondary-color); + color: white; +} + +.btn-secondary:hover { + background-color: #5a6268; +} + +.info-message { + text-align: center; + padding: 20px; + color: var(--text-secondary); + font-size: 12px; +} + +.info-message p { + margin-bottom: 8px; +} + +.popup-footer { + margin-top: 20px; + padding-top: 16px; + border-top: 1px solid var(--border-color); + text-align: center; +} + +.hint { + font-size: 11px; + color: var(--text-secondary); +} + +.hidden { + display: none !important; +} diff --git a/popup.html b/popup.html new file mode 100644 index 0000000..adb86a7 --- /dev/null +++ b/popup.html @@ -0,0 +1,97 @@ + + + + + + Proxy Switcher + + + + + + + + diff --git a/popup.js b/popup.js new file mode 100644 index 0000000..65b9c32 --- /dev/null +++ b/popup.js @@ -0,0 +1,308 @@ +class PopupManager { + constructor() { + this.currentTab = null; + this.currentDomain = null; + this.currentConfig = null; + this.init(); + } + + async init() { + await this.loadCurrentTab(); + await this.loadConfig(); + await this.loadProfiles(); + this.setupUI(); + this.setupEventListeners(); + } + + async loadCurrentTab() { + try { + const tabs = await browser.tabs.query({ active: true, currentWindow: true }); + this.currentTab = tabs[0]; + + if (this.currentTab.url) { + this.currentDomain = this.extractDomain(this.currentTab.url); + document.getElementById('current-domain').textContent = this.currentDomain; + } + } catch (error) { + console.error('Failed to load current tab:', error); + document.getElementById('current-domain').textContent = 'Unknown domain'; + } + } + + extractDomain(url) { + try { + const urlObj = new URL(url); + return urlObj.hostname.replace(/^www\./, ''); + } catch (e) { + return null; + } + } + + async loadConfig() { + try { + const response = await browser.runtime.sendMessage({ action: 'getConfig' }); + const config = response.config || { domains: {} }; + this.applyTheme(config.settings && config.settings.theme); + this.currentConfig = this.currentDomain && config.domains + ? config.domains[this.currentDomain] || null + : null; + } catch (error) { + console.error('Failed to load config:', error); + this.currentConfig = null; + } + } + + applyTheme(theme) { + document.documentElement.dataset.theme = ['light', 'dark', 'system'].includes(theme) ? theme : 'system'; + } + + async loadProfiles() { + try { + const response = await browser.runtime.sendMessage({ action: 'getProfiles' }); + const profiles = response.profiles || {}; + this.updateProfileSelect(profiles); + } catch (error) { + console.error('Failed to load profiles:', error); + } + } + + updateProfileSelect(profiles) { + const select = document.getElementById('popup-profile-select'); + + // Clear select, keeping only default option + select.innerHTML = ''; + + // Add profiles + Object.keys(profiles).sort().forEach(profileName => { + const option = document.createElement('option'); + option.value = profileName; + option.textContent = profileName; + select.appendChild(option); + }); + } + + // Fill form with profile data + fillFormFromProfile(profileName) { + if (!profileName) { + // If empty profile selected, do nothing + return; + } + + // Get profile data + browser.runtime.sendMessage({ action: 'getProfile', profileName }) + .then(response => { + const profile = response.profile; + if (profile) { + // Fill form fields + document.getElementById('popup-proxy-type').value = profile.type || 'http'; + document.getElementById('popup-proxy-host').value = profile.host || ''; + document.getElementById('popup-proxy-port').value = profile.port || ''; + document.getElementById('popup-proxy-username').value = profile.username || ''; + document.getElementById('popup-proxy-password').value = profile.password || ''; + } + }) + .catch(error => { + console.error('Failed to load profile for form:', error); + }); + } + + setupUI() { + const enableCheckbox = document.getElementById('enable-proxy'); + const proxyForm = document.getElementById('proxy-form'); + const noProxyInfo = document.getElementById('no-proxy-info'); + + if (this.currentConfig) { + // Proxy configured for this domain + enableCheckbox.checked = Boolean(this.currentConfig.enabled); + enableCheckbox.disabled = false; + // Show/hide form based on checkbox state + this.updateFormVisibility(enableCheckbox.checked); + noProxyInfo.classList.add('hidden'); + + // Populate form + this.populateForm(); + } else { + // Proxy not configured + enableCheckbox.checked = false; + enableCheckbox.disabled = !this.currentDomain; + proxyForm.classList.add('hidden'); + noProxyInfo.classList.remove('hidden'); + } + } + + updateFormVisibility(showForm) { + const proxyForm = document.getElementById('proxy-form'); + proxyForm.classList.toggle('hidden', !showForm); + } + + populateForm() { + if (!this.currentConfig) return; + + document.getElementById('popup-proxy-type').value = this.currentConfig.type || 'http'; + document.getElementById('popup-proxy-host').value = this.currentConfig.host || ''; + document.getElementById('popup-proxy-port').value = this.currentConfig.port || ''; + document.getElementById('popup-proxy-username').value = this.currentConfig.username || ''; + document.getElementById('popup-proxy-password').value = this.currentConfig.password || ''; + } + + async saveConfig() { + if (!this.currentDomain) return; + + // Collect form data + const domainConfig = { + type: document.getElementById('popup-proxy-type').value, + host: document.getElementById('popup-proxy-host').value.trim(), + port: parseInt(document.getElementById('popup-proxy-port').value, 10), + username: document.getElementById('popup-proxy-username').value.trim() || null, + password: document.getElementById('popup-proxy-password').value || null, + enabled: document.getElementById('enable-proxy').checked + }; + + // Validation + if (!domainConfig.host || !domainConfig.port) { + this.showError('Host and port are required'); + return false; + } + + if (domainConfig.port < 1 || domainConfig.port > 65535) { + this.showError('Port must be between 1 and 65535'); + return false; + } + + try { + // Use centralized API for domain update + const response = await browser.runtime.sendMessage({ + action: 'updateDomain', + domain: this.currentDomain, + domainConfig: domainConfig + }); + + return response.success; + } catch (error) { + console.error('Failed to save config:', error); + this.showError('Failed to save configuration'); + return false; + } + } + + async removeDomainConfig() { + try { + // Use centralized API for domain removal + const response = await browser.runtime.sendMessage({ + action: 'removeDomain', + domain: this.currentDomain + }); + + return response.success; + } catch (error) { + console.error('Failed to remove config:', error); + return false; + } + } + + async toggleProxy(enabled) { + if (!this.currentDomain) return; + + try { + const response = await browser.runtime.sendMessage({ + action: 'toggleProxy', + domain: this.currentDomain, + enabled: enabled + }); + + if (!response.success) { + // If domain not configured, show message + this.showError('Domain not configured. Use "Apply & Reload" to configure proxy first.'); + // Return checkbox to previous state + document.getElementById('enable-proxy').checked = !enabled; + } + } catch (error) { + console.error('Failed to toggle proxy:', error); + this.showError('Failed to toggle proxy'); + // Return checkbox to previous state + document.getElementById('enable-proxy').checked = !enabled; + } + } + + async applyAndReload() { + const success = await this.saveConfig(); + + if (success && this.currentTab) { + // Reload tab + await browser.tabs.reload(this.currentTab.id); + + // Close popup + window.close(); + } + } + + showError(message) { + // Simple error display implementation + const errorDiv = document.createElement('div'); + errorDiv.className = 'error-message'; + errorDiv.textContent = message; + errorDiv.style.cssText = ` + background-color: #f8d7da; + color: #721c24; + padding: 10px; + margin: 10px 0; + border-radius: 4px; + border: 1px solid #f5c6cb; + `; + + const main = document.querySelector('.popup-main'); + main.insertBefore(errorDiv, main.firstChild); + + setTimeout(() => errorDiv.remove(), 3000); + } + + setupEventListeners() { + // Proxy toggle (quick enable/disable) + document.getElementById('enable-proxy').addEventListener('change', async (e) => { + const enabled = e.target.checked; + this.updateFormVisibility(enabled); // Show/hide form + // A new domain has no stored configuration yet; Apply & Reload saves it. + if (this.currentConfig) { + await this.toggleProxy(enabled); + } + }); + + // Apply settings + document.getElementById('apply-proxy').addEventListener('click', () => { + this.applyAndReload(); + }); + + // Open settings + document.getElementById('open-options').addEventListener('click', () => { + browser.runtime.openOptionsPage(); + window.close(); + }); + + // Show/hide password + document.querySelector('.toggle-password').addEventListener('click', (e) => { + const input = document.getElementById('popup-proxy-password'); + const type = input.type === 'password' ? 'text' : 'password'; + input.type = type; + e.target.textContent = type === 'password' ? '👁' : '👁️‍🗨️'; + }); + + // Handle Enter in form + document.querySelectorAll('input').forEach(input => { + input.addEventListener('keypress', (e) => { + if (e.key === 'Enter') { + this.applyAndReload(); + } + }); + }); + + // Fill form from profile + document.getElementById('popup-profile-select').addEventListener('change', (e) => { + this.fillFormFromProfile(e.target.value); + }); + } +} + +// Initialization +document.addEventListener('DOMContentLoaded', () => { + new PopupManager(); +});