@@ -47,6 +47,7 @@ import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editor
47
47
import { IWorkbenchEnvironmentService } from 'vs/workbench/services/environment/common/environmentService' ;
48
48
import { FromWebviewMessage , IAckOutputHeight , IClickedDataUrlMessage , ICodeBlockHighlightRequest , IContentWidgetTopRequest , IControllerPreload , ICreationContent , ICreationRequestMessage , IFindMatch , IMarkupCellInitialization , RendererMetadata , ToWebviewMessage } from './webviewMessages' ;
49
49
import { compressOutputItemStreams } from 'vs/workbench/contrib/notebook/browser/view/renderers/stdOutErrorPreProcessor' ;
50
+ import { DeferredPromise } from 'vs/base/common/async' ;
50
51
51
52
export interface ICachedInset < K extends ICommonCellInfo > {
52
53
outputId : string ;
@@ -110,10 +111,14 @@ export class BackLayerWebView<T extends ICommonCellInfo> extends Disposable {
110
111
private readonly _onMessage = this . _register ( new Emitter < INotebookWebviewMessage > ( ) ) ;
111
112
private readonly _preloadsCache = new Set < string > ( ) ;
112
113
public readonly onMessage : Event < INotebookWebviewMessage > = this . _onMessage . event ;
113
- private _initialized ?: Promise < void > ;
114
114
private _disposed = false ;
115
115
private _currentKernel ?: INotebookKernel ;
116
116
117
+ private _initialized ?: DeferredPromise < void > ;
118
+ private _webviewPreloadInitialized ?: DeferredPromise < void > ;
119
+ private firstInit = true ;
120
+ private initializeMarkupPromise ?: { readonly requestId : string ; readonly p : DeferredPromise < void > ; readonly isFirstInit : boolean } ;
121
+
117
122
private readonly nonce = UUID . generateUuid ( ) ;
118
123
119
124
constructor (
@@ -452,11 +457,9 @@ export class BackLayerWebView<T extends ICommonCellInfo> extends Disposable {
452
457
}
453
458
454
459
let coreDependencies = '' ;
455
- let resolveFunc : ( ) => void ;
456
460
457
- this . _initialized = new Promise < void > ( ( resolve ) => {
458
- resolveFunc = resolve ;
459
- } ) ;
461
+ this . _initialized = new DeferredPromise ( ) ;
462
+ this . _webviewPreloadInitialized = new DeferredPromise ( ) ;
460
463
461
464
if ( ! isWeb ) {
462
465
const loaderUri = FileAccess . asFileUri ( 'vs/loader.js' , require ) ;
@@ -469,7 +472,7 @@ export class BackLayerWebView<T extends ICommonCellInfo> extends Disposable {
469
472
</script>` ;
470
473
const htmlContent = this . generateContent ( coreDependencies , baseUrl . toString ( ) ) ;
471
474
this . _initialize ( htmlContent ) ;
472
- resolveFunc ! ( ) ;
475
+ this . _initialized . complete ( ) ;
473
476
} else {
474
477
const loaderUri = FileAccess . asBrowserUri ( 'vs/loader.js' , require ) ;
475
478
@@ -493,16 +496,16 @@ var requirejs = (function() {
493
496
494
497
const htmlContent = this . generateContent ( coreDependencies , baseUrl . toString ( ) ) ;
495
498
this . _initialize ( htmlContent ) ;
496
- resolveFunc ! ( ) ;
499
+ this . _initialized ! . complete ( ) ;
497
500
} , error => {
498
501
// the fetch request is rejected
499
502
const htmlContent = this . generateContent ( coreDependencies , baseUrl . toString ( ) ) ;
500
503
this . _initialize ( htmlContent ) ;
501
- resolveFunc ! ( ) ;
504
+ this . _initialized ! . complete ( ) ;
502
505
} ) ;
503
506
}
504
507
505
- await this . _initialized ;
508
+ await this . _initialized . p ;
506
509
}
507
510
508
511
private getNotebookBaseUri ( ) {
@@ -590,9 +593,17 @@ var requirejs = (function() {
590
593
591
594
switch ( data . type ) {
592
595
case 'initialized' : {
596
+ this . _webviewPreloadInitialized ?. complete ( ) ;
593
597
this . initializeWebViewState ( ) ;
594
598
break ;
595
599
}
600
+ case 'initializedMarkup' : {
601
+ if ( this . initializeMarkupPromise ?. requestId === data . requestId ) {
602
+ this . initializeMarkupPromise ?. p . complete ( ) ;
603
+ this . initializeMarkupPromise = undefined ;
604
+ }
605
+ break ;
606
+ }
596
607
case 'dimension' : {
597
608
for ( const update of data . updates ) {
598
609
const height = update . height ;
@@ -932,8 +943,6 @@ var requirejs = (function() {
932
943
] ;
933
944
}
934
945
935
- private firstInit = true ;
936
-
937
946
private initializeWebViewState ( ) {
938
947
this . _preloadsCache . clear ( ) ;
939
948
if ( this . _currentKernel ) {
@@ -944,9 +953,9 @@ var requirejs = (function() {
944
953
this . _sendMessageToWebview ( { ...inset . cachedCreation , initiallyHidden : this . hiddenInsetMapping . has ( output ) } ) ;
945
954
}
946
955
947
- if ( this . firstInit ) {
956
+ if ( this . initializeMarkupPromise ?. isFirstInit ) {
948
957
// On first run the contents have already been initialized so we don't need to init them again
949
- this . firstInit = false ;
958
+ // no op
950
959
} else {
951
960
const mdCells = [ ...this . markupPreviewMapping . values ( ) ] ;
952
961
this . markupPreviewMapping . clear ( ) ;
@@ -1160,15 +1169,16 @@ var requirejs = (function() {
1160
1169
return ;
1161
1170
}
1162
1171
1163
- // TODO: use proper handler
1164
- const p = new Promise < void > ( resolve => {
1165
- const sub = this . webview ?. onMessage ( e => {
1166
- if ( e . message . type === 'initializedMarkup' ) {
1167
- resolve ( ) ;
1168
- sub ?. dispose ( ) ;
1169
- }
1170
- } ) ;
1171
- } ) ;
1172
+ this . initializeMarkupPromise ?. p . complete ( ) ;
1173
+ const requestId = UUID . generateUuid ( ) ;
1174
+ this . initializeMarkupPromise = { p : new DeferredPromise ( ) , requestId, isFirstInit : this . firstInit } ;
1175
+
1176
+ if ( this . _webviewPreloadInitialized ) {
1177
+ // wait for webview preload script module to be loaded
1178
+ await this . _webviewPreloadInitialized . p ;
1179
+ }
1180
+
1181
+ this . firstInit = false ;
1172
1182
1173
1183
for ( const cell of cells ) {
1174
1184
this . markupPreviewMapping . set ( cell . cellId , cell ) ;
@@ -1177,9 +1187,10 @@ var requirejs = (function() {
1177
1187
this . _sendMessageToWebview ( {
1178
1188
type : 'initializeMarkup' ,
1179
1189
cells,
1190
+ requestId,
1180
1191
} ) ;
1181
1192
1182
- await p ;
1193
+ return this . initializeMarkupPromise . p . p ;
1183
1194
}
1184
1195
1185
1196
/**
0 commit comments