@@ -15,6 +15,7 @@ import { IExtHostWorkspace } from 'vs/workbench/api/common/extHostWorkspace';
1515import { EditorViewColumn } from 'vs/workbench/api/common/shared/editor' ;
1616import { asWebviewUri , WebviewInitData } from 'vs/workbench/api/common/shared/webview' ;
1717import type * as vscode from 'vscode' ;
18+ import { Cache } from './cache' ;
1819import { ExtHostWebviewsShape , IMainContext , MainContext , MainThreadWebviewsShape , WebviewEditorCapabilities , WebviewPanelHandle , WebviewPanelViewStateData } from './extHost.protocol' ;
1920import { Disposable as VSCodeDisposable } from './extHostTypes' ;
2021
@@ -251,8 +252,18 @@ export class ExtHostWebviews implements ExtHostWebviewsShape {
251252
252253 private readonly _proxy : MainThreadWebviewsShape ;
253254 private readonly _webviewPanels = new Map < WebviewPanelHandle , ExtHostWebviewEditor > ( ) ;
254- private readonly _serializers = new Map < string , { readonly serializer : vscode . WebviewPanelSerializer , readonly extension : IExtensionDescription } > ( ) ;
255- private readonly _editorProviders = new Map < string , { readonly provider : vscode . WebviewCustomEditorProvider , readonly extension : IExtensionDescription } > ( ) ;
255+
256+ private readonly _serializers = new Map < string , {
257+ readonly serializer : vscode . WebviewPanelSerializer ;
258+ readonly extension : IExtensionDescription ;
259+ } > ( ) ;
260+
261+ private readonly _editorProviders = new Map < string , {
262+ readonly provider : vscode . WebviewCustomEditorProvider ;
263+ readonly extension : IExtensionDescription ;
264+ } > ( ) ;
265+
266+ private readonly _edits = new Cache < unknown > ( 'edits' ) ;
256267
257268 constructor (
258269 mainContext : IMainContext ,
@@ -312,11 +323,14 @@ export class ExtHostWebviews implements ExtHostWebviewsShape {
312323 if ( this . _editorProviders . has ( viewType ) ) {
313324 throw new Error ( `Editor provider for '${ viewType } ' already registered` ) ;
314325 }
315-
316326 this . _editorProviders . set ( viewType , { extension, provider, } ) ;
327+
317328 this . _proxy . $registerEditorProvider ( { id : extension . identifier , location : extension . extensionLocation } , viewType , options || { } , this . getCapabilites ( provider ) ) ;
329+
330+ // Hook up events
318331 provider ?. editingDelegate ?. onEdit ( ( { edit, resource } ) => {
319- this . _proxy . $onEdit ( resource , viewType , edit ) ;
332+ const id = this . _edits . add ( [ edit ] ) ;
333+ this . _proxy . $onEdit ( resource , viewType , id ) ;
320334 } ) ;
321335
322336 return new VSCodeDisposable ( ( ) => {
@@ -426,14 +440,32 @@ export class ExtHostWebviews implements ExtHostWebviewsShape {
426440 await provider . resolveWebviewEditor ( revivedResource , revivedPanel ) ;
427441 }
428442
429- $undoEdits ( resource : UriComponents , viewType : string , edits : readonly any [ ] ) : void {
443+ $undoEdits ( resourceComponents : UriComponents , viewType : string , editIds : readonly number [ ] ) : void {
430444 const provider = this . getEditorProvider ( viewType ) ;
431- provider ?. editingDelegate ?. undoEdits ( URI . revive ( resource ) , edits ) ;
445+ if ( ! provider ?. editingDelegate ) {
446+ return ;
447+ }
448+
449+ const resource = URI . revive ( resourceComponents ) ;
450+ const edits = editIds . map ( id => this . _edits . get ( id , 0 ) ) ;
451+ provider . editingDelegate . undoEdits ( resource , edits ) ;
432452 }
433453
434- $applyEdits ( resource : UriComponents , viewType : string , edits : readonly any [ ] ) : void {
454+ $applyEdits ( resourceComponents : UriComponents , viewType : string , editIds : readonly number [ ] ) : void {
435455 const provider = this . getEditorProvider ( viewType ) ;
436- provider ?. editingDelegate ?. applyEdits ( URI . revive ( resource ) , edits ) ;
456+ if ( ! provider ?. editingDelegate ) {
457+ return ;
458+ }
459+
460+ const resource = URI . revive ( resourceComponents ) ;
461+ const edits = editIds . map ( id => this . _edits . get ( id , 0 ) ) ;
462+ provider . editingDelegate . applyEdits ( resource , edits ) ;
463+ }
464+
465+ $disposeEdits ( editIds : readonly number [ ] ) : void {
466+ for ( const edit of editIds ) {
467+ this . _edits . delete ( edit ) ;
468+ }
437469 }
438470
439471 async $onSave ( resource : UriComponents , viewType : string ) : Promise < void > {
0 commit comments