44 *--------------------------------------------------------------------------------------------*/
55
66import { Emitter , Event } from 'vs/base/common/event' ;
7- import { Disposable , DisposableStore , IDisposable } from 'vs/base/common/lifecycle' ;
7+ import { Disposable } from 'vs/base/common/lifecycle' ;
88import { URI , UriComponents } from 'vs/base/common/uri' ;
99import { generateUuid } from 'vs/base/common/uuid' ;
1010import * as modes from 'vs/editor/common/modes' ;
@@ -93,6 +93,7 @@ export class ExtHostWebview implements vscode.Webview {
9393}
9494
9595export class ExtHostWebviewEditor extends Disposable implements vscode . WebviewPanel {
96+
9697 private readonly _handle : WebviewPanelHandle ;
9798 private readonly _proxy : MainThreadWebviewsShape ;
9899 private readonly _viewType : string ;
@@ -112,6 +113,7 @@ export class ExtHostWebviewEditor extends Disposable implements vscode.WebviewPa
112113
113114 readonly _onDidChangeViewStateEmitter = this . _register ( new Emitter < vscode . WebviewPanelOnDidChangeViewStateEvent > ( ) ) ;
114115 public readonly onDidChangeViewState : Event < vscode . WebviewPanelOnDidChangeViewStateEvent > = this . _onDidChangeViewStateEmitter . event ;
116+ _capabilities : vscode . WebviewEditorCapabilities ;
115117
116118 constructor (
117119 handle : WebviewPanelHandle ,
@@ -233,8 +235,17 @@ export class ExtHostWebviewEditor extends Disposable implements vscode.WebviewPa
233235 } ) ;
234236 }
235237
236- _addDisposable ( disposable : IDisposable ) {
237- this . _register ( disposable ) ;
238+ _setCapabilities ( capabilities : vscode . WebviewEditorCapabilities ) {
239+ this . _capabilities = capabilities ;
240+ if ( capabilities . editingCapability ) {
241+ this . _register ( capabilities . editingCapability . onEdit ( edit => {
242+ this . _proxy . $onEdit ( this . _handle , JSON . stringify ( edit ) ) ;
243+ } ) ) ;
244+ }
245+ }
246+
247+ _undoEdits ( edits : string [ ] ) : void {
248+ this . _capabilities . editingCapability ?. undoEdits ( edits ) ;
238249 }
239250
240251 private assertNotDisposed ( ) {
@@ -402,10 +413,6 @@ export class ExtHostWebviews implements ExtHostWebviewsShape {
402413 await serializer . deserializeWebviewPanel ( revivedPanel , state ) ;
403414 }
404415
405- private getWebviewPanel ( handle : WebviewPanelHandle ) : ExtHostWebviewEditor | undefined {
406- return this . _webviewPanels . get ( handle ) ;
407- }
408-
409416 async $resolveWebviewEditor (
410417 resource : UriComponents ,
411418 handle : WebviewPanelHandle ,
@@ -424,19 +431,19 @@ export class ExtHostWebviews implements ExtHostWebviewsShape {
424431 const revivedPanel = new ExtHostWebviewEditor ( handle , this . _proxy , viewType , title , typeof position === 'number' && position >= 0 ? typeConverters . ViewColumn . to ( position ) : undefined , options , webview ) ;
425432 this . _webviewPanels . set ( handle , revivedPanel ) ;
426433 const capabilities = await provider . resolveWebviewEditor ( { resource : URI . revive ( resource ) } , revivedPanel ) ;
427- revivedPanel . _addDisposable ( this . hookupCapabilities ( handle , capabilities ) ) ;
434+ revivedPanel . _setCapabilities ( capabilities ) ;
428435 }
429436
430- private hookupCapabilities ( handle : WebviewPanelHandle , capabilities : vscode . WebviewEditorCapabilities ) : IDisposable {
431- const disposables = new DisposableStore ( ) ;
432-
433- if ( capabilities . editingCapability ) {
434- disposables . add ( capabilities . editingCapability . onEdit ( edit => {
435- this . _proxy . $onEdit ( handle , JSON . stringify ( edit ) ) ;
436- } ) ) ;
437+ $undoEdits ( handle : WebviewPanelHandle , edits : string [ ] ) : void {
438+ const panel = this . getWebviewPanel ( handle ) ;
439+ if ( ! panel ) {
440+ return ;
437441 }
442+ panel . _undoEdits ( edits ) ;
443+ }
438444
439- return disposables ;
445+ private getWebviewPanel ( handle : WebviewPanelHandle ) : ExtHostWebviewEditor | undefined {
446+ return this . _webviewPanels . get ( handle ) ;
440447 }
441448}
442449
0 commit comments