From 207fece665ed12ac93094ff59a5623dae0c7e6bd Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 25 Oct 2021 15:23:23 -0700 Subject: [PATCH] Revert "Remove Jupyter specific loader special case (#126939)" This reverts commit efe0678e96ab93353e11f1656ece4433c6b42e9b. Fixes #132557 --- .../browser/diff/notebookTextDiffEditor.ts | 4 +- .../notebook/browser/notebookEditorWidget.ts | 2 +- .../view/renderers/backLayerWebView.ts | 81 +++++++++++++++++-- 3 files changed, 76 insertions(+), 11 deletions(-) diff --git a/src/vs/workbench/contrib/notebook/browser/diff/notebookTextDiffEditor.ts b/src/vs/workbench/contrib/notebook/browser/diff/notebookTextDiffEditor.ts index 00b2d8ae6a6..de1e6d09378 100644 --- a/src/vs/workbench/contrib/notebook/browser/diff/notebookTextDiffEditor.ts +++ b/src/vs/workbench/contrib/notebook/browser/diff/notebookTextDiffEditor.ts @@ -382,7 +382,7 @@ export class NotebookTextDiffEditor extends EditorPane implements INotebookTextD this._modifiedWebview = this.instantiationService.createInstance(BackLayerWebView, this, id, resource, this._notebookOptions.computeDiffWebviewOptions(), undefined) as BackLayerWebView; // attach the webview container to the DOM tree first this._list.rowsContainer.insertAdjacentElement('afterbegin', this._modifiedWebview.element); - this._modifiedWebview.createWebview(); + await this._modifiedWebview.createWebview(); this._modifiedWebview.element.style.width = `calc(50% - 16px)`; this._modifiedWebview.element.style.left = `calc(50%)`; } @@ -395,7 +395,7 @@ export class NotebookTextDiffEditor extends EditorPane implements INotebookTextD this._originalWebview = this.instantiationService.createInstance(BackLayerWebView, this, id, resource, this._notebookOptions.computeDiffWebviewOptions(), undefined) as BackLayerWebView; // attach the webview container to the DOM tree first this._list.rowsContainer.insertAdjacentElement('afterbegin', this._originalWebview.element); - this._originalWebview.createWebview(); + await this._originalWebview.createWebview(); this._originalWebview.element.style.width = `calc(50% - 16px)`; this._originalWebview.element.style.left = `16px`; } diff --git a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts index eb385f21990..541d222cf73 100644 --- a/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts +++ b/src/vs/workbench/contrib/notebook/browser/notebookEditorWidget.ts @@ -1233,7 +1233,7 @@ export class NotebookEditorWidget extends Disposable implements INotebookEditorD throw new Error('Notebook output webview object is not created successfully.'); } - this._webview.createWebview(); + await this._webview.createWebview(); if (!this._webview.webview) { throw new Error('Notebook output webview element was not created successfully.'); } diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts index 20e6b09984f..aa02e5fb680 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts @@ -10,8 +10,8 @@ import { VSBuffer } from 'vs/base/common/buffer'; import { Emitter, Event } from 'vs/base/common/event'; import { Disposable } from 'vs/base/common/lifecycle'; import { getExtensionForMimeType } from 'vs/base/common/mime'; -import { Schemas } from 'vs/base/common/network'; -import { isMacintosh } from 'vs/base/common/platform'; +import { FileAccess, Schemas } from 'vs/base/common/network'; +import { isMacintosh, isWeb } from 'vs/base/common/platform'; import { dirname, joinPath } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import * as UUID from 'vs/base/common/uuid'; @@ -96,6 +96,7 @@ export class BackLayerWebView extends Disposable { private readonly _onMessage = this._register(new Emitter()); private readonly _preloadsCache = new Set(); public readonly onMessage: Event = this._onMessage.event; + private _initalized?: Promise; private _disposed = false; private _currentKernel?: INotebookKernel; @@ -215,7 +216,7 @@ export class BackLayerWebView extends Disposable { }; } - private generateContent(baseUrl: string) { + private generateContent(coreDependencies: string, baseUrl: string) { const renderersData = this.getRendererData(); const preloadScript = preloadsScriptStr( this.options, @@ -356,8 +357,13 @@ export class BackLayerWebView extends Disposable { + + ${coreDependencies} +
+
- `; } @@ -402,11 +408,70 @@ export class BackLayerWebView extends Disposable { return !!this.webview; } - createWebview(): void { + async createWebview(): Promise { const baseUrl = this.asWebviewUri(dirname(this.documentUri), undefined); - const htmlContent = this.generateContent(baseUrl.toString()); - this._initialize(htmlContent); - return; + + // Python notebooks assume that requirejs is a global. + // For all other notebooks, they need to provide their own loader. + if (!this.documentUri.path.toLowerCase().endsWith('.ipynb')) { + const htmlContent = this.generateContent('', baseUrl.toString()); + this._initialize(htmlContent); + return; + } + + let coreDependencies = ''; + let resolveFunc: () => void; + + this._initalized = new Promise((resolve, reject) => { + resolveFunc = resolve; + }); + + + if (!isWeb) { + const loaderUri = FileAccess.asFileUri('vs/loader.js', require); + const loader = this.asWebviewUri(loaderUri, undefined); + + coreDependencies = ``; + const htmlContent = this.generateContent(coreDependencies, baseUrl.toString()); + this._initialize(htmlContent); + resolveFunc!(); + } else { + const loaderUri = FileAccess.asBrowserUri('vs/loader.js', require); + + fetch(loaderUri.toString(true)).then(async response => { + if (response.status !== 200) { + throw new Error(response.statusText); + } + + const loaderJs = await response.text(); + + coreDependencies = ` + + +`; + + const htmlContent = this.generateContent(coreDependencies, baseUrl.toString()); + this._initialize(htmlContent); + resolveFunc!(); + }, error => { + // the fetch request is rejected + const htmlContent = this.generateContent(coreDependencies, baseUrl.toString()); + this._initialize(htmlContent); + resolveFunc!(); + }); + } + + await this._initalized; } private _initialize(content: string) { -- GitLab