55
66import { CancellationToken } from 'vs/base/common/cancellation' ;
77import { Emitter , Event } from 'vs/base/common/event' ;
8- import { Disposable } from 'vs/base/common/lifecycle' ;
8+ import { Disposable , DisposableStore } from 'vs/base/common/lifecycle' ;
99import { URI , UriComponents } from 'vs/base/common/uri' ;
1010import { generateUuid } from 'vs/base/common/uuid' ;
1111import * as modes from 'vs/editor/common/modes' ;
@@ -248,25 +248,31 @@ export class ExtHostWebviewEditor extends Disposable implements vscode.WebviewPa
248248
249249class CustomDocument extends Disposable implements vscode . CustomDocument {
250250
251- public static create ( proxy : MainThreadWebviewsShape , viewType : string , uri : vscode . Uri ) {
252- return Object . seal ( new CustomDocument ( proxy , viewType , uri ) ) ;
251+ public static create (
252+ viewType : string ,
253+ uri : vscode . Uri ,
254+ editingDelegate : vscode . CustomEditorEditingDelegate | undefined
255+ ) {
256+ return Object . seal ( new CustomDocument ( viewType , uri , editingDelegate ) ) ;
253257 }
254258
255259 // Explicitly initialize all properties as we seal the object after creation!
256260
257261 readonly #_edits = new Cache < unknown > ( 'edits' ) ;
258262
259- readonly #proxy: MainThreadWebviewsShape ;
260263 readonly #viewType: string ;
261264 readonly #uri: vscode . Uri ;
265+ readonly #editingDelegate: vscode . CustomEditorEditingDelegate | undefined ;
262266
263- #capabilities: vscode . CustomEditorCapabilities | undefined = undefined ;
264-
265- private constructor ( proxy : MainThreadWebviewsShape , viewType : string , uri : vscode . Uri ) {
267+ private constructor (
268+ viewType : string ,
269+ uri : vscode . Uri ,
270+ editingDelegate : vscode . CustomEditorEditingDelegate | undefined ,
271+ ) {
266272 super ( ) ;
267- this . #proxy = proxy ;
268273 this . #viewType = viewType ;
269274 this . #uri = uri ;
275+ this . #editingDelegate = editingDelegate ;
270276 }
271277
272278 dispose ( ) {
@@ -289,47 +295,35 @@ class CustomDocument extends Disposable implements vscode.CustomDocument {
289295
290296 //#region Internal
291297
292- /** @internal */ _setCapabilities ( capabilities : vscode . CustomEditorCapabilities ) {
293- if ( this . #capabilities) {
294- throw new Error ( 'Capabilities already provided' ) ;
295- }
296-
297- this . #capabilities = capabilities ;
298- capabilities . editing ?. onDidEdit ( edit => {
299- const id = this . #_edits. add ( [ edit ] ) ;
300- this . #proxy. $onDidEdit ( this . uri , this . viewType , id ) ;
301- } ) ;
302- }
303-
304298 /** @internal */ async _revert ( changes : { undoneEdits : number [ ] , redoneEdits : number [ ] } ) {
305- const editing = this . getEditingCapability ( ) ;
299+ const editing = this . getEditingDelegate ( ) ;
306300 const undoneEdits = changes . undoneEdits . map ( id => this . #_edits. get ( id , 0 ) ) ;
307301 const appliedEdits = changes . redoneEdits . map ( id => this . #_edits. get ( id , 0 ) ) ;
308- return editing . revert ( { undoneEdits, appliedEdits } ) ;
302+ return editing . revert ( this , { undoneEdits, appliedEdits } ) ;
309303 }
310304
311305 /** @internal */ _undo ( editId : number ) {
312- const editing = this . getEditingCapability ( ) ;
306+ const editing = this . getEditingDelegate ( ) ;
313307 const edit = this . #_edits. get ( editId , 0 ) ;
314- return editing . undoEdits ( [ edit ] ) ;
308+ return editing . undoEdits ( this , [ edit ] ) ;
315309 }
316310
317311 /** @internal */ _redo ( editId : number ) {
318- const editing = this . getEditingCapability ( ) ;
312+ const editing = this . getEditingDelegate ( ) ;
319313 const edit = this . #_edits. get ( editId , 0 ) ;
320- return editing . applyEdits ( [ edit ] ) ;
314+ return editing . applyEdits ( this , [ edit ] ) ;
321315 }
322316
323317 /** @internal */ _save ( cancellation : CancellationToken ) {
324- return this . getEditingCapability ( ) . save ( cancellation ) ;
318+ return this . getEditingDelegate ( ) . save ( this , cancellation ) ;
325319 }
326320
327321 /** @internal */ _saveAs ( target : vscode . Uri ) {
328- return this . getEditingCapability ( ) . saveAs ( target ) ;
322+ return this . getEditingDelegate ( ) . saveAs ( this , target ) ;
329323 }
330324
331325 /** @internal */ _backup ( cancellation : CancellationToken ) {
332- return this . getEditingCapability ( ) . backup ( cancellation ) ;
326+ return this . getEditingDelegate ( ) . backup ( this , cancellation ) ;
333327 }
334328
335329 /** @internal */ _disposeEdits ( editIds : number [ ] ) {
@@ -338,13 +332,17 @@ class CustomDocument extends Disposable implements vscode.CustomDocument {
338332 }
339333 }
340334
335+ /** @internal */ _pushEdit ( edit : unknown ) : number {
336+ return this . #_edits. add ( [ edit ] ) ;
337+ }
338+
341339 //#endregion
342340
343- private getEditingCapability ( ) : vscode . CustomEditorEditingCapability {
344- if ( ! this . #capabilities ?. editing ) {
341+ private getEditingDelegate ( ) : vscode . CustomEditorEditingDelegate {
342+ if ( ! this . #editingDelegate ) {
345343 throw new Error ( 'Document is not editable' ) ;
346344 }
347- return this . #capabilities . editing ;
345+ return this . #editingDelegate ;
348346 }
349347}
350348
@@ -487,17 +485,24 @@ export class ExtHostWebviews implements ExtHostWebviewsShape {
487485 provider : vscode . CustomEditorProvider | vscode . CustomTextEditorProvider ,
488486 options : vscode . WebviewPanelOptions | undefined = { }
489487 ) : vscode . Disposable {
490- let disposable : vscode . Disposable ;
488+ const disposables = new DisposableStore ( ) ;
491489 if ( 'resolveCustomTextEditor' in provider ) {
492- disposable = this . _editorProviders . addTextProvider ( viewType , extension , provider ) ;
490+ disposables . add ( this . _editorProviders . addTextProvider ( viewType , extension , provider ) ) ;
493491 this . _proxy . $registerTextEditorProvider ( toExtensionData ( extension ) , viewType , options ) ;
494492 } else {
495- disposable = this . _editorProviders . addCustomProvider ( viewType , extension , provider ) ;
493+ disposables . add ( this . _editorProviders . addCustomProvider ( viewType , extension , provider ) ) ;
496494 this . _proxy . $registerCustomEditorProvider ( toExtensionData ( extension ) , viewType , options ) ;
495+ if ( provider . editingDelegate ) {
496+ disposables . add ( provider . editingDelegate . onDidEdit ( e => {
497+ const document = e . document ;
498+ const editId = ( document as CustomDocument ) . _pushEdit ( e . edit ) ;
499+ this . _proxy . $onDidEdit ( document . uri , document . viewType , editId , e . label ) ;
500+ } ) ) ;
501+ }
497502 }
498503
499504 return VSCodeDisposable . from (
500- disposable ,
505+ disposables ,
501506 new VSCodeDisposable ( ( ) => {
502507 this . _proxy . $unregisterEditorProvider ( viewType ) ;
503508 } ) ) ;
@@ -592,12 +597,11 @@ export class ExtHostWebviews implements ExtHostWebviewsShape {
592597 }
593598
594599 const revivedResource = URI . revive ( resource ) ;
595- const document = CustomDocument . create ( this . _proxy , viewType , revivedResource ) ;
596- const capabilities = await entry . provider . resolveCustomDocument ( document ) ;
597- document . _setCapabilities ( capabilities ) ;
600+ const document = CustomDocument . create ( viewType , revivedResource , entry . provider . editingDelegate ) ;
601+ await entry . provider . resolveCustomDocument ( document ) ;
598602 this . _documents . add ( document ) ;
599603 return {
600- editable : ! ! capabilities . editing
604+ editable : ! ! entry . provider . editingDelegate ,
601605 } ;
602606 }
603607
0 commit comments