Fix extension context detection in runtime providers

Replace window.sendRuntimeMessage existence check with URL-based detection.
The sendRuntimeMessage function exists in both extension and non-extension
contexts (e.g., downloaded HTML artifacts), causing incorrect behavior.

Changes:
- Add window.__isExtensionContext() helper to RuntimeMessageBridge that checks:
  - chrome-extension:// URLs (Chrome)
  - moz-extension:// URLs (Firefox)
  - about:srcdoc (sandbox iframes)
- Update all runtime providers to use __isExtensionContext() instead:
  - FileDownloadRuntimeProvider: Correctly falls back to browser download
  - ConsoleRuntimeProvider: Only sends messages in extension context
  - ArtifactsRuntimeProvider: Properly detects offline/read-only mode

This fixes the issue where downloaded HTML artifacts incorrectly try to
communicate with the extension when opened from disk.
This commit is contained in:
Mario Zechner
2025-10-11 18:39:45 +02:00
parent 46c1da9826
commit b5648eaabd
4 changed files with 23 additions and 9 deletions

View File

@@ -28,6 +28,13 @@ export class RuntimeMessageBridge {
// Returns stringified function that uses window.parent.postMessage
return `
window.__completionCallbacks = [];
// Check if we're in an extension context by examining the URL
window.__isExtensionContext = () => {
const url = window.location.href;
return url.startsWith('chrome-extension://') ||
url.startsWith('moz-extension://') ||
url === 'about:srcdoc';
};
window.sendRuntimeMessage = async (message) => {
const messageId = 'msg_' + Date.now() + '_' + Math.random().toString(36).substring(2, 9);
@@ -68,6 +75,13 @@ window.onCompleted = (callback) => {
// Returns stringified function that uses chrome.runtime.sendMessage
return `
window.__completionCallbacks = [];
// Check if we're in an extension context by examining the URL
window.__isExtensionContext = () => {
const url = window.location.href;
return url.startsWith('chrome-extension://') ||
url.startsWith('moz-extension://') ||
url === 'about:srcdoc';
};
window.sendRuntimeMessage = async (message) => {
return await chrome.runtime.sendMessage({
...message,