diff --git a/manifest.firefox.json b/manifest.firefox.json index a780e8e..8396c0b 100644 --- a/manifest.firefox.json +++ b/manifest.firefox.json @@ -25,6 +25,7 @@ "https://chatgpt.com/*", "https://chat.openai.com/*", "https://copilot.microsoft.com/*", + "https://grok.com/*", "https://grok.x.ai/*", "https://x.com/i/grok*", "https://gemini.google.com/*", @@ -53,6 +54,36 @@ "https://chatgpt.com/*", "https://chat.openai.com/*", "https://copilot.microsoft.com/*", + "https://grok.com/*", + "https://grok.x.ai/*", + "https://x.com/i/grok*", + "https://gemini.google.com/*", + "https://www.perplexity.ai/*", + "https://copilot.microsoft.com/*", + "https://chat.deepseek.com/*", + "https://huggingface.co/chat/*", + "https://poe.com/*", + "https://github.com/*", + "https://gitlab.com/*", + "https://www.reddit.com/*", + "https://old.reddit.com/*", + "https://stackoverflow.com/*", + "https://pastebin.com/*", + "http://localhost/*", + "http://127.0.0.1/*" + ], + "js": ["src/content/early-hook.js"], + "run_at": "document_start", + "world": "MAIN", + "all_frames": true + }, + { + "matches": [ + "https://claude.ai/*", + "https://chatgpt.com/*", + "https://chat.openai.com/*", + "https://copilot.microsoft.com/*", + "https://grok.com/*", "https://grok.x.ai/*", "https://x.com/i/grok*", "https://gemini.google.com/*", @@ -114,7 +145,7 @@ ], "web_accessible_resources": [ { - "resources": ["src/content/content.js", "src/content/early-hook.js", "src/lib/document-scanner.js"], + "resources": ["src/content/content.js", "src/lib/document-scanner.js"], "matches": [""] } ] diff --git a/manifest.json b/manifest.json index 172b26e..f6b01c3 100644 --- a/manifest.json +++ b/manifest.json @@ -15,6 +15,7 @@ "https://chatgpt.com/*", "https://chat.openai.com/*", "https://copilot.microsoft.com/*", + "https://grok.com/*", "https://grok.x.ai/*", "https://x.com/i/grok*", "https://gemini.google.com/*", @@ -43,6 +44,36 @@ "https://chatgpt.com/*", "https://chat.openai.com/*", "https://copilot.microsoft.com/*", + "https://grok.com/*", + "https://grok.x.ai/*", + "https://x.com/i/grok*", + "https://gemini.google.com/*", + "https://www.perplexity.ai/*", + "https://copilot.microsoft.com/*", + "https://chat.deepseek.com/*", + "https://huggingface.co/chat/*", + "https://poe.com/*", + "https://github.com/*", + "https://gitlab.com/*", + "https://www.reddit.com/*", + "https://old.reddit.com/*", + "https://stackoverflow.com/*", + "https://pastebin.com/*", + "http://localhost/*", + "http://127.0.0.1/*" + ], + "js": ["src/content/early-hook.js"], + "run_at": "document_start", + "world": "MAIN", + "all_frames": true + }, + { + "matches": [ + "https://claude.ai/*", + "https://chatgpt.com/*", + "https://chat.openai.com/*", + "https://copilot.microsoft.com/*", + "https://grok.com/*", "https://grok.x.ai/*", "https://x.com/i/grok*", "https://gemini.google.com/*", @@ -102,7 +133,7 @@ ], "web_accessible_resources": [ { - "resources": ["src/content/content.js", "src/content/early-hook.js", "src/lib/document-scanner.js"], + "resources": ["src/content/content.js", "src/lib/document-scanner.js"], "matches": [""] } ] diff --git a/src/content/content.js b/src/content/content.js index 93ae82e..4e69f94 100644 --- a/src/content/content.js +++ b/src/content/content.js @@ -789,7 +789,9 @@ // Fetch Interception — scans ALL POST requests with a body. // Service-agnostic: doesn't depend on URL patterns. // ============================================================ - const originalFetch = window.fetch; + // Use the real fetch captured by early-hook.js (before React stored its reference), + // or fall back to whatever window.fetch is now if early-hook.js didn't run. + const originalFetch = window.__ssOriginalFetch || window.fetch; // URLs to never touch (static assets, analytics, etc.) const SKIP_URL_PATTERNS = [ @@ -805,7 +807,7 @@ return SKIP_URL_PATTERNS.some(p => p.test(url)); } - window.fetch = async function (url, options) { + window.__ssInterceptFetch = async function (url, options) { if (!settings.enabled || !hasSubstitutions()) { return originalFetch.call(this, url, options); } @@ -869,6 +871,16 @@ return originalFetch.call(this, url, options); }; + // Activate the fetch hook. If early-hook.js ran first (world: MAIN, document_start), + // it already replaced window.fetch with a wrapper that forwards to __ssInterceptFetch + // once __ssReady is true — this catches React/Next.js fetch references stored before + // content.js loaded. Otherwise fall back to replacing window.fetch directly. + if (window.__ssOriginalFetch) { + window.__ssReady = true; + } else { + window.fetch = window.__ssInterceptFetch; + } + // ============================================================ // XMLHttpRequest Interception — same aggressive approach // ============================================================