From 5b9bf2636798ba80d86db930326c482c51b7582e Mon Sep 17 00:00:00 2001 From: Aleksey Shelementev Date: Thu, 25 Jun 2026 23:21:50 +0500 Subject: [PATCH] fix(vscode): enable clipboard in webview iframe Copy and paste did not work inside the Plannotator VS Code panel because the embedded iframe lacked an `allow` attribute. Nested iframes in a VS Code webview are gated by Permissions Policy, so `navigator.clipboard` reads/writes and paste events were blocked. Grant clipboard-read and clipboard-write to the iframe. Fixes #864 Co-Authored-By: Claude Opus 4.8 (1M context) --- .../src/panel-manager.test.ts | 25 +++++++++++++++++++ apps/vscode-extension/src/panel-manager.ts | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/apps/vscode-extension/src/panel-manager.test.ts b/apps/vscode-extension/src/panel-manager.test.ts index db001a06a..25e36eb08 100644 --- a/apps/vscode-extension/src/panel-manager.test.ts +++ b/apps/vscode-extension/src/panel-manager.test.ts @@ -42,6 +42,31 @@ describe("PanelManager", () => { ); }); + it("grants clipboard permission to the iframe", async () => { + let capturedHtml = ""; + const spy = spyOn(vscode.window, "createWebviewPanel"); + spy.mockImplementation((() => { + let disposeListener: (() => void) | null = null; + return { + webview: { + get html() { return capturedHtml; }, + set html(v: string) { capturedHtml = v; }, + }, + reveal() {}, + dispose() { disposeListener?.(); }, + onDidDispose(listener: () => void) { + disposeListener = listener; + return { dispose() {} }; + }, + } as unknown as vscode.WebviewPanel; + }) as typeof vscode.window.createWebviewPanel); + spies.push(spy); + + await manager.open("http://127.0.0.1:9999/review?id=42"); + + expect(capturedHtml).toContain('allow="clipboard-read; clipboard-write"'); + }); + it("uses asExternalUri resolved URL in iframe and CSP", async () => { const envSpy = spyOn(vscode.env, "asExternalUri"); envSpy.mockImplementation(async (_uri: vscode.Uri) => { diff --git a/apps/vscode-extension/src/panel-manager.ts b/apps/vscode-extension/src/panel-manager.ts index bdd8fc5ee..63a3d9519 100644 --- a/apps/vscode-extension/src/panel-manager.ts +++ b/apps/vscode-extension/src/panel-manager.ts @@ -54,7 +54,7 @@ function getHtml(url: string, origin: string): string { - + ${themeScript}