From c33725149cda3a209eb016bd150b6bb45a8f13b1 Mon Sep 17 00:00:00 2001 From: Error Date: Sun, 26 Jul 2026 07:15:12 +0800 Subject: [PATCH] fix: lock artifact messages to iframe source --- .github/workflows/publish.yml | 39 +++++++++++++- dist/browser.d.ts.map | 2 +- dist/browser.js | 18 ++----- dist/browser.js.map | 2 +- package-lock.json | 4 +- package.json | 6 ++- scripts/check-dist.mjs | 27 ++++++++++ scripts/prepare-release.mjs | 95 +++++++++++++++++++++++++++++++++++ src/browser.ts | 20 ++------ tests/browser.test.mjs | 56 +++++++++++++++++++-- 10 files changed, 226 insertions(+), 43 deletions(-) create mode 100644 scripts/check-dist.mjs create mode 100644 scripts/prepare-release.mjs diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 8b23cb0..b638ca8 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -2,6 +2,15 @@ name: Publish package on: workflow_dispatch: + inputs: + release_tag: + description: Existing v-prefixed tag matching package.json + required: true + type: string + source_sha: + description: Exact 40-character main commit SHA to publish + required: true + type: string permissions: contents: read @@ -11,7 +20,17 @@ jobs: npm: runs-on: ubuntu-latest steps: + - name: Require an exact main source + env: + REQUESTED_SOURCE_SHA: ${{ inputs.source_sha }} + run: | + test "$GITHUB_REF" = "refs/heads/main" + test "$REQUESTED_SOURCE_SHA" = "$GITHUB_SHA" + test "$(printf '%s' "$REQUESTED_SOURCE_SHA" | wc -c)" -eq 40 - uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: ${{ inputs.source_sha }} - uses: actions/setup-node@v4 with: node-version: 22 @@ -20,6 +39,24 @@ jobs: scope: '@velaros-ai' - run: npm ci - run: npm run check - - run: npm publish --access restricted + - id: release + name: Build the immutable release bundle + env: + RELEASE_TAG: ${{ inputs.release_tag }} + SOURCE_SHA: ${{ inputs.source_sha }} + run: | + node scripts/prepare-release.mjs \ + --tag "$RELEASE_TAG" \ + --source-sha "$SOURCE_SHA" \ + --out-dir release \ + --require-tag + echo "tarball=$(node -p 'require("./release/release-manifest.json").tarball.fileName')" >> "$GITHUB_OUTPUT" + - uses: actions/upload-artifact@v4 + with: + name: html-artifacts-${{ inputs.release_tag }}-${{ inputs.source_sha }} + path: release/ + if-no-files-found: error + retention-days: 90 + - run: npm publish "release/${{ steps.release.outputs.tarball }}" --access restricted env: NODE_AUTH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/dist/browser.d.ts.map b/dist/browser.d.ts.map index 9f97a7a..cafbe07 100644 --- a/dist/browser.d.ts.map +++ b/dist/browser.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAE/B,KAAK,oBAAoB,EAC1B,MAAM,eAAe,CAAA;AAStB,MAAM,MAAM,0BAA0B,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAA;AAErF,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,0BAA0B,CAAA;IACjC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,0EAA0E;IAC1E,cAAc,CAAC,EAAE,0BAA0B,CAAA;IAC3C,oEAAoE;IACpE,oBAAoB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACxC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IAClD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,IAAI,CAAA;IACpD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAA;CACjD;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAA;IAClC,gGAAgG;IAChG,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAC1C,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,yBAAyB,EAAE,CAAA;IACjD,MAAM,IAAI,yBAAyB,EAAE,CAAA;IACrC,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAA;IAC/F,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAAA;IAC7D,KAAK,IAAI,IAAI,CAAA;IACb,OAAO,IAAI,IAAI,CAAA;CAChB;AA6CD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,wBAA6B,GACrC,sBAAsB,CA2QxB"} \ No newline at end of file +{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,yBAAyB,EAC9B,KAAK,0BAA0B,EAE/B,KAAK,oBAAoB,EAC1B,MAAM,eAAe,CAAA;AAStB,MAAM,MAAM,0BAA0B,GAAG,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAA;AAErF,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,0BAA0B,CAAA;IACjC,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,wDAAwD;IACxD,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iFAAiF;IACjF,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,+CAA+C;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,0EAA0E;IAC1E,cAAc,CAAC,EAAE,0BAA0B,CAAA;IAC3C,oEAAoE;IACpE,oBAAoB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACxC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC9B,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IAClD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,IAAI,CAAA;IACpD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,IAAI,CAAA;CACjD;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAA;IAClC,gGAAgG;IAChG,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAA;IAC1C,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,yBAAyB,EAAE,CAAA;IACjD,MAAM,IAAI,yBAAyB,EAAE,CAAA;IACrC,OAAO,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,oBAAoB,GAAG,IAAI,CAAC,CAAA;IAC/F,WAAW,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,oBAAoB,GAAG,IAAI,CAAA;IAC7D,KAAK,IAAI,IAAI,CAAA;IACb,OAAO,IAAI,IAAI,CAAA;CAChB;AA6CD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,WAAW,EACnB,OAAO,GAAE,wBAA6B,GACrC,sBAAsB,CA6PxB"} \ No newline at end of file diff --git a/dist/browser.js b/dist/browser.js index 59052e8..ed814a0 100644 --- a/dist/browser.js +++ b/dist/browser.js @@ -50,7 +50,6 @@ export function mountHtmlArtifact(target, options = {}) { const maxHeight = Math.max(minHeight, normalizeDimension(options.maxHeight, DEFAULT_HTML_ARTIFACT_MAX_REPORTED_HEIGHT)); const initialHeight = Math.min(maxHeight, Math.max(minHeight, normalizeDimension(options.initialHeight, DEFAULT_HTML_ARTIFACT_HEIGHT))); let bridgeMessages = createBridgeMessages(); - let inboundBridgeTypes = createInboundBridgeTypes(bridgeMessages); const iframe = document.createElement('iframe'); let shellDocument = createShellDocument(bridgeMessages); let state = createHtmlArtifactProtocolStreamState({ @@ -66,15 +65,6 @@ export function mountHtmlArtifact(target, options = {}) { const ready = new Promise((resolve) => { settleReady = resolve; }); - function createInboundBridgeTypes(messages) { - return new Set([ - messages.resize, - messages.sendPrompt, - messages.openLink, - messages.generic, - messages.error, - ]); - } function createShellDocument(messages) { return buildHtmlArtifactShellDocument({ bridgeMessages: messages, @@ -171,9 +161,8 @@ export function mountHtmlArtifact(target, options = {}) { const payload = readMessagePayload(event.data); if (!payload) return; - const sourceMatches = event.source === iframe.contentWindow; - const isPrivateOpaqueMessage = event.origin === 'null' && inboundBridgeTypes.has(payload.type); - if (!sourceMatches && !isPrivateOpaqueMessage) + const frameWindow = iframe.contentWindow; + if (!frameWindow || event.source !== frameWindow) return; if (payload.type === bridgeMessages.resize) { applyReportedHeight(payload); @@ -203,7 +192,7 @@ export function mountHtmlArtifact(target, options = {}) { patchType: readString(payload.patchType) || undefined, }); } - else if (payload.type === HTML_ARTIFACT_WHEEL_MESSAGE_TYPE && sourceMatches) { + else if (payload.type === HTML_ARTIFACT_WHEEL_MESSAGE_TYPE) { const deltaX = Number(payload.deltaX) || 0; const deltaY = Number(payload.deltaY) || 0; if (options.onWheel) { @@ -279,7 +268,6 @@ export function mountHtmlArtifact(target, options = {}) { pendingMessages.length = 0; frameReady = false; bridgeMessages = createBridgeMessages(); - inboundBridgeTypes = createInboundBridgeTypes(bridgeMessages); shellDocument = createShellDocument(bridgeMessages); iframe.style.height = `${initialHeight}px`; iframe.addEventListener('load', handleLoad, { once: true }); diff --git a/dist/browser.js.map b/dist/browser.js.map index 0200cb0..fb730dd 100644 --- a/dist/browser.js.map +++ b/dist/browser.js.map @@ -1 +1 @@ -{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"browser.js","sourceRoot":"","sources":["../src/browser.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 1155228..512fb3f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@velaros-ai/html-artifacts", - "version": "0.1.0", + "version": "0.1.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@velaros-ai/html-artifacts", - "version": "0.1.0", + "version": "0.1.1", "license": "MIT", "devDependencies": { "typescript": "^5.7.0", diff --git a/package.json b/package.json index de58acc..c7f33dd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@velaros-ai/html-artifacts", - "version": "0.1.0", + "version": "0.1.1", "description": "A streaming HTML artifact protocol and sandboxed iframe runtime extracted from VelarOS.", "keywords": [ "ai", @@ -54,7 +54,9 @@ "test": "npm run build && node --test tests/*.test.mjs", "demo": "npm run build && vite demo", "demo:build": "npm run build && vite build demo --outDir ../demo-dist --emptyOutDir", - "check": "npm run typecheck && npm test && npm run demo:build && npm pack --dry-run", + "check:dist": "npm run build && node scripts/check-dist.mjs", + "check": "npm run typecheck && npm test && npm run demo:build && npm run check:dist && npm pack --dry-run", + "release:dry-run": "npm run check && node scripts/prepare-release.mjs --dry-run", "prepack": "npm run build" }, "devDependencies": { diff --git a/scripts/check-dist.mjs b/scripts/check-dist.mjs new file mode 100644 index 0000000..1dd0fe4 --- /dev/null +++ b/scripts/check-dist.mjs @@ -0,0 +1,27 @@ +import { execFileSync } from 'node:child_process' +import { fileURLToPath } from 'node:url' + +const repositoryRoot = fileURLToPath(new URL('..', import.meta.url)) + +execFileSync('git', ['diff', '--exit-code', '--', 'dist'], { + cwd: repositoryRoot, + stdio: 'inherit', +}) + +const untrackedDistFiles = execFileSync( + 'git', + ['ls-files', '--others', '--exclude-standard', '--', 'dist'], + { + cwd: repositoryRoot, + encoding: 'utf8', + } +) + .trim() + .split('\n') + .filter(Boolean) + +if (untrackedDistFiles.length > 0) { + console.error('Generated dist files are not tracked:') + for (const file of untrackedDistFiles) console.error(`- ${file}`) + process.exitCode = 1 +} diff --git a/scripts/prepare-release.mjs b/scripts/prepare-release.mjs new file mode 100644 index 0000000..9110d35 --- /dev/null +++ b/scripts/prepare-release.mjs @@ -0,0 +1,95 @@ +import { execFileSync } from 'node:child_process' +import { createHash } from 'node:crypto' +import { mkdtempSync, mkdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs' +import { tmpdir } from 'node:os' +import { basename, join, resolve } from 'node:path' +import { parseArgs } from 'node:util' +import { fileURLToPath } from 'node:url' + +const repositoryRoot = fileURLToPath(new URL('..', import.meta.url)) +const packageJson = JSON.parse(readFileSync(join(repositoryRoot, 'package.json'), 'utf8')) +const { values } = parseArgs({ + options: { + 'dry-run': { type: 'boolean', default: false }, + 'out-dir': { type: 'string' }, + 'require-tag': { type: 'boolean', default: false }, + 'source-sha': { type: 'string' }, + tag: { type: 'string' }, + }, +}) + +function run(command, args) { + return execFileSync(command, args, { + cwd: repositoryRoot, + encoding: 'utf8', + }).trim() +} + +const sourceSha = run('git', ['rev-parse', 'HEAD']) +if (!/^[0-9a-f]{40}$/.test(sourceSha)) { + throw new Error(`Expected a full source commit SHA, received: ${sourceSha}`) +} +if (values['source-sha'] && values['source-sha'] !== sourceSha) { + throw new Error( + `Requested source SHA ${values['source-sha']} does not match checkout ${sourceSha}` + ) +} + +const expectedTag = `v${packageJson.version}` +const releaseTag = values.tag ?? expectedTag +if (releaseTag !== expectedTag) { + throw new Error(`Release tag ${releaseTag} does not match package version ${expectedTag}`) +} + +if (values['require-tag']) { + const taggedSourceSha = run('git', ['rev-parse', '--verify', `refs/tags/${releaseTag}^{commit}`]) + if (taggedSourceSha !== sourceSha) { + throw new Error( + `Tag ${releaseTag} points to ${taggedSourceSha}, but the release source is ${sourceSha}` + ) + } +} + +const temporaryDirectory = values['dry-run'] + ? mkdtempSync(join(tmpdir(), 'velaros-html-artifacts-release-')) + : null +const outputDirectory = temporaryDirectory ?? resolve(repositoryRoot, values['out-dir'] ?? 'release') +mkdirSync(outputDirectory, { recursive: true }) + +try { + const packResult = JSON.parse( + run('npm', [ + 'pack', + '--json', + '--silent', + '--pack-destination', + outputDirectory, + ]) + ) + if (!Array.isArray(packResult) || packResult.length !== 1 || !packResult[0]?.filename) { + throw new Error('npm pack did not return exactly one package archive') + } + + const archivePath = resolve(outputDirectory, packResult[0].filename) + const archive = readFileSync(archivePath) + const manifest = { + packageName: packageJson.name, + version: packageJson.version, + tag: releaseTag, + sourceSha, + tarball: { + fileName: basename(archivePath), + sizeBytes: archive.byteLength, + sha256: createHash('sha256').update(archive).digest('hex'), + }, + } + const serializedManifest = `${JSON.stringify(manifest, null, 2)}\n` + + if (values['dry-run']) { + process.stdout.write(serializedManifest) + } else { + writeFileSync(join(outputDirectory, 'release-manifest.json'), serializedManifest) + } +} finally { + if (temporaryDirectory) rmSync(temporaryDirectory, { recursive: true, force: true }) +} diff --git a/src/browser.ts b/src/browser.ts index dd28b99..f91f3bf 100644 --- a/src/browser.ts +++ b/src/browser.ts @@ -135,7 +135,6 @@ export function mountHtmlArtifact( Math.max(minHeight, normalizeDimension(options.initialHeight, DEFAULT_HTML_ARTIFACT_HEIGHT)) ) let bridgeMessages = createBridgeMessages() - let inboundBridgeTypes = createInboundBridgeTypes(bridgeMessages) const iframe = document.createElement('iframe') let shellDocument = createShellDocument(bridgeMessages) let state: HtmlArtifactProtocolStreamState = createHtmlArtifactProtocolStreamState({ @@ -153,16 +152,6 @@ export function mountHtmlArtifact( settleReady = resolve }) - function createInboundBridgeTypes(messages: HtmlArtifactBridgeMessages): Set { - return new Set([ - messages.resize, - messages.sendPrompt, - messages.openLink, - messages.generic, - messages.error, - ]) - } - function createShellDocument(messages: HtmlArtifactBridgeMessages): string { return buildHtmlArtifactShellDocument({ bridgeMessages: messages, @@ -262,10 +251,8 @@ export function mountHtmlArtifact( const payload = readMessagePayload(event.data) if (!payload) return - const sourceMatches = event.source === iframe.contentWindow - const isPrivateOpaqueMessage = - event.origin === 'null' && inboundBridgeTypes.has(payload.type) - if (!sourceMatches && !isPrivateOpaqueMessage) return + const frameWindow = iframe.contentWindow + if (!frameWindow || event.source !== frameWindow) return if (payload.type === bridgeMessages.resize) { applyReportedHeight(payload) @@ -289,7 +276,7 @@ export function mountHtmlArtifact( patchId: readString(payload.patchId) || undefined, patchType: readString(payload.patchType) || undefined, }) - } else if (payload.type === HTML_ARTIFACT_WHEEL_MESSAGE_TYPE && sourceMatches) { + } else if (payload.type === HTML_ARTIFACT_WHEEL_MESSAGE_TYPE) { const deltaX = Number(payload.deltaX) || 0 const deltaY = Number(payload.deltaY) || 0 if (options.onWheel) { @@ -368,7 +355,6 @@ export function mountHtmlArtifact( pendingMessages.length = 0 frameReady = false bridgeMessages = createBridgeMessages() - inboundBridgeTypes = createInboundBridgeTypes(bridgeMessages) shellDocument = createShellDocument(bridgeMessages) iframe.style.height = `${initialHeight}px` iframe.addEventListener('load', handleLoad, { once: true }) diff --git a/tests/browser.test.mjs b/tests/browser.test.mjs index 4ac6b5d..405614d 100644 --- a/tests/browser.test.mjs +++ b/tests/browser.test.mjs @@ -148,24 +148,24 @@ describe('browser host', () => { window.dispatch('message', { data: { type: resize, naturalHeight: 999 }, origin: 'null', - source: null, + source: iframe.contentWindow, }) assert.equal(iframe.style.height, '200px') window.dispatch('message', { data: { type: prompt, prompt: 'Continue' }, origin: 'null', - source: null, + source: iframe.contentWindow, }) window.dispatch('message', { data: { type: link, url: 'javascript:alert(1)' }, origin: 'null', - source: null, + source: iframe.contentWindow, }) window.dispatch('message', { data: { type: link, url: 'https://example.com/docs' }, origin: 'null', - source: null, + source: iframe.contentWindow, }) assert.deepEqual(prompts, ['Continue']) assert.deepEqual(links, ['https://example.com/docs']) @@ -210,4 +210,52 @@ describe('browser host', () => { controller.dispose() }) }) + + test('accepts opaque-origin messages only from the mounted iframe contentWindow', async () => { + await withFakeDom(async ({ document, window }) => { + const prompts = [] + const target = new FakeTarget() + const controller = mountHtmlArtifact(target, { + onPrompt: (prompt) => prompts.push(prompt), + }) + const iframe = document.iframe + const prompt = bridgeType(iframe.srcdoc, 'prompt') + assert.ok(prompt) + + iframe.dispatch('load') + + window.dispatch('message', { + data: { type: prompt, prompt: 'trusted opaque frame' }, + origin: 'null', + source: iframe.contentWindow, + }) + assert.deepEqual(prompts, ['trusted opaque frame']) + + window.dispatch('message', { + data: { type: prompt, prompt: 'missing source' }, + origin: 'null', + source: null, + }) + window.dispatch('message', { + data: { type: prompt, prompt: 'forged source' }, + origin: 'null', + source: {}, + }) + window.dispatch('message', { + data: { type: prompt, prompt: 'different frame' }, + origin: 'null', + source: new FakeIframe().contentWindow, + }) + assert.deepEqual(prompts, ['trusted opaque frame']) + + window.dispatch('message', { + data: { type: prompt, prompt: 'trusted non-opaque frame' }, + origin: 'https://example.com', + source: iframe.contentWindow, + }) + assert.deepEqual(prompts, ['trusted opaque frame', 'trusted non-opaque frame']) + + controller.dispose() + }) + }) })