@@ -5,17 +5,10 @@ import { ChatPanelProvider } from "@/webviews/chat/chatPanelProvider";
55
66import { createMockLogger , MockCoderApi } from "../../../mocks/testHelpers" ;
77
8- import type { CoderApi } from "@/api/coderApi" ;
9-
10- type WindowMock = typeof vscode . window & {
11- activeColorTheme : { kind : number } ;
12- __fireDidChangeActiveColorTheme : ( e : unknown ) => void ;
8+ const windowMock = vscode . window as typeof vscode . window & {
9+ __setActiveColorThemeKind : ( kind : number ) => void ;
1310} ;
1411
15- function setMockTheme ( kind : number ) : void {
16- ( vscode . window as WindowMock ) . activeColorTheme = { kind } ;
17- }
18-
1912interface Harness {
2013 provider : ChatPanelProvider ;
2114 postMessage : ReturnType < typeof vi . fn > ;
@@ -27,10 +20,7 @@ function createHarness(): Harness {
2720 const client = new MockCoderApi ( ) ;
2821 client . setCredentials ( "https://coder.example.com" , "test-token" ) ;
2922
30- const provider = new ChatPanelProvider (
31- client as unknown as CoderApi ,
32- createMockLogger ( ) ,
33- ) ;
23+ const provider = new ChatPanelProvider ( client , createMockLogger ( ) ) ;
3424
3525 let handler : ( ( msg : unknown ) => void ) | null = null ;
3626
@@ -89,7 +79,7 @@ function findPostedMessage(
8979describe ( "ChatPanelProvider" , ( ) => {
9080 beforeEach ( ( ) => {
9181 vi . resetAllMocks ( ) ;
92- setMockTheme ( vscode . ColorThemeKind . Dark ) ;
82+ windowMock . __setActiveColorThemeKind ( vscode . ColorThemeKind . Dark ) ;
9383 } ) ;
9484
9585 describe ( "theme sync" , ( ) => {
@@ -99,7 +89,7 @@ describe("ChatPanelProvider", () => {
9989 [ vscode . ColorThemeKind . HighContrast , "dark" ] ,
10090 [ vscode . ColorThemeKind . HighContrastLight , "light" ] ,
10191 ] ) ( "maps ColorThemeKind %i to %s on chat-ready" , ( kind , expected ) => {
102- setMockTheme ( kind ) ;
92+ windowMock . __setActiveColorThemeKind ( kind ) ;
10393 const { sendFromWebview, postMessage } = createHarness ( ) ;
10494
10595 sendFromWebview ( { type : "coder:chat-ready" } ) ;
@@ -124,10 +114,7 @@ describe("ChatPanelProvider", () => {
124114 const { postMessage } = createHarness ( ) ;
125115 postMessage . mockClear ( ) ;
126116
127- setMockTheme ( vscode . ColorThemeKind . Light ) ;
128- ( vscode . window as WindowMock ) . __fireDidChangeActiveColorTheme ( {
129- kind : vscode . ColorThemeKind . Light ,
130- } ) ;
117+ windowMock . __setActiveColorThemeKind ( vscode . ColorThemeKind . Light ) ;
131118
132119 expect ( postMessage ) . toHaveBeenCalledWith ( {
133120 type : "coder:set-theme" ,
@@ -172,6 +159,17 @@ describe("ChatPanelProvider", () => {
172159
173160 expect ( vscode . env . openExternal ) . not . toHaveBeenCalled ( ) ;
174161 } ) ;
162+
163+ it ( "blocks cross-origin navigate URLs" , ( ) => {
164+ const { sendFromWebview } = createHarness ( ) ;
165+
166+ sendFromWebview ( {
167+ type : "coder:navigate" ,
168+ payload : { url : "https://evil.com/steal" } ,
169+ } ) ;
170+
171+ expect ( vscode . env . openExternal ) . not . toHaveBeenCalled ( ) ;
172+ } ) ;
175173 } ) ;
176174
177175 describe ( "openChat" , ( ) => {
0 commit comments