提交 93ec7113 编写于 作者: J Johannes Rieken

don't bind notebook document to a provider/extension, do then when calling...

don't bind notebook document to a provider/extension, do then when calling backup, fixes https://github.com/microsoft/vscode/issues/117035
上级 7e7a71d7
......@@ -1807,7 +1807,7 @@ export interface ExtHostNotebookShape {
$cancelNotebookKernelFromProvider(handle: number, uri: UriComponents, kernelId: string, cellHandle: number | undefined): Promise<void>;
$saveNotebook(viewType: string, uri: UriComponents, token: CancellationToken): Promise<boolean>;
$saveNotebookAs(viewType: string, uri: UriComponents, target: UriComponents, token: CancellationToken): Promise<boolean>;
$backup(viewType: string, uri: UriComponents, cancellation: CancellationToken): Promise<string | undefined>;
$backup(viewType: string, uri: UriComponents, cancellation: CancellationToken): Promise<string>;
$acceptDisplayOrder(displayOrder: INotebookDisplayOrder): void;
$acceptNotebookActiveKernelChange(event: { uri: UriComponents, providerHandle: number | undefined, kernelFriendlyId: string | undefined }): void;
$onDidReceiveMessage(editorId: string, rendererId: string | undefined, message: unknown): void;
......
......@@ -5,7 +5,7 @@
import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation';
import { Emitter, Event } from 'vs/base/common/event';
import { Disposable, DisposableStore } from 'vs/base/common/lifecycle';
import { Disposable, DisposableStore, IDisposable } from 'vs/base/common/lifecycle';
import { URI, UriComponents } from 'vs/base/common/uri';
import * as UUID from 'vs/base/common/uuid';
import { IExtensionDescription } from 'vs/platform/extensions/common/extensions';
......@@ -25,6 +25,7 @@ import { ExtHostNotebookEditor } from './extHostNotebookEditor';
import { IdGenerator } from 'vs/base/common/idGenerator';
import { IRelativePattern } from 'vs/base/common/glob';
import { assertIsDefined } from 'vs/base/common/types';
import { hash } from 'vs/base/common/hash';
class ExtHostWebviewCommWrapper extends Disposable {
private readonly _onDidReceiveDocumentMessage = new Emitter<any>();
......@@ -320,14 +321,14 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN
}
this._notebookContentProviders.set(viewType, { extension, provider });
const listeners: vscode.Disposable[] = [];
listeners.push(provider.onDidChangeNotebookContentOptions
? provider.onDidChangeNotebookContentOptions(() => {
this._proxy.$updateNotebookProviderOptions(viewType, provider.options);
})
: Disposable.None);
let listener: IDisposable | undefined;
if (provider.onDidChangeNotebookContentOptions) {
listener = provider.onDidChangeNotebookContentOptions(() => {
this._proxy.$updateNotebookProviderOptions(viewType, provider.options);
});
}
const viewOptionsFilenamePattern = options?.viewOptions?.filenamePattern
.map(pattern => typeConverters.NotebookExclusiveDocumentPattern.from(pattern))
......@@ -344,7 +345,7 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN
});
return new extHostTypes.Disposable(() => {
listeners.forEach(d => d.dispose());
listener?.dispose();
this._notebookContentProviders.delete(viewType);
this._proxy.$unregisterNotebookProvider(viewType);
});
......@@ -523,17 +524,25 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN
return false;
}
async $backup(viewType: string, uri: UriComponents, cancellation: CancellationToken): Promise<string | undefined> {
private _backupIdPool: number = 0;
async $backup(viewType: string, uri: UriComponents, cancellation: CancellationToken): Promise<string> {
const document = this._documents.get(URI.revive(uri));
const provider = this._notebookContentProviders.get(viewType);
if (document && provider && provider.provider.backupNotebook) {
const backup = await provider.provider.backupNotebook(document.notebookDocument, { destination: document.getNewBackupUri() }, cancellation);
document.updateBackup(backup);
return backup.id;
if (!document) {
throw new Error(`CANNOT find notebook document for ${uri}`);
}
if (!provider) {
throw new Error(`CANNOT find provider for ${viewType}`);
}
const storagePath = this._extensionStoragePaths.workspaceValue(provider.extension) ?? this._extensionStoragePaths.globalValue(provider.extension);
const fileName = String(hash([document.uri.toString(), this._backupIdPool++]));
const backupUri = URI.joinPath(storagePath, fileName);
return;
const backup = await provider.provider.backupNotebook(document.notebookDocument, { destination: backupUri }, cancellation);
document.updateBackup(backup);
return backup.id;
}
$acceptDisplayOrder(displayOrder: INotebookDisplayOrder): void {
......@@ -705,8 +714,6 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN
for (const modelData of delta.addedDocuments) {
const uri = URI.revive(modelData.uri);
const viewType = modelData.viewType;
const entry = this._notebookContentProviders.get(viewType);
const storageRoot = entry && (this._extensionStoragePaths.workspaceValue(entry.extension) ?? this._extensionStoragePaths.globalValue(entry.extension));
if (this._documents.has(uri)) {
throw new Error(`adding EXISTING notebook ${uri}`);
......@@ -737,7 +744,6 @@ export class ExtHostNotebookController implements ExtHostNotebookShape, ExtHostN
modelData.contentOptions,
modelData.metadata ? typeConverters.NotebookDocumentMetadata.to(modelData.metadata) : new extHostTypes.NotebookDocumentMetadata(),
uri,
storageRoot
);
document.acceptModelChanged({
......
......@@ -4,10 +4,8 @@
*--------------------------------------------------------------------------------------------*/
import { Emitter, Event } from 'vs/base/common/event';
import { hash } from 'vs/base/common/hash';
import { Disposable, DisposableStore, dispose } from 'vs/base/common/lifecycle';
import { Schemas } from 'vs/base/common/network';
import { joinPath } from 'vs/base/common/resources';
import { URI } from 'vs/base/common/uri';
import { CellKind, INotebookDocumentPropertiesChangeData, MainThreadNotebookShape } from 'vs/workbench/api/common/extHost.protocol';
import { ExtHostDocumentsAndEditors, IExtHostModelAddedData } from 'vs/workbench/api/common/extHostDocumentsAndEditors';
......@@ -124,10 +122,6 @@ export interface INotebookEventEmitter {
emitCellMetadataChange(event: vscode.NotebookCellMetadataChangeEvent): void;
}
function hashPath(resource: URI): string {
const str = resource.scheme === Schemas.file || resource.scheme === Schemas.untitled ? resource.fsPath : resource.toString();
return hash(str) + '';
}
export class ExtHostNotebookDocument extends Disposable {
......@@ -139,11 +133,10 @@ export class ExtHostNotebookDocument extends Disposable {
private _cellDisposableMapping = new Map<number, DisposableStore>();
private _notebook: vscode.NotebookDocument | undefined;
private _versionId = 0;
private _isDirty = false;
private _backupCounter = 1;
private _versionId: number = 0;
private _isDirty: boolean = false;
private _backup?: vscode.NotebookDocumentBackup;
private _disposed = false;
private _disposed: boolean = false;
constructor(
private readonly _proxy: MainThreadNotebookShape,
......@@ -152,8 +145,7 @@ export class ExtHostNotebookDocument extends Disposable {
private readonly _viewType: string,
private readonly _contentOptions: vscode.NotebookDocumentContentOptions,
private _metadata: extHostTypes.NotebookDocumentMetadata,
public readonly uri: URI,
private readonly _storagePath: URI | undefined
readonly uri: URI,
) {
super();
}
......@@ -185,14 +177,6 @@ export class ExtHostNotebookDocument extends Disposable {
return this._notebook;
}
getNewBackupUri(): URI {
if (!this._storagePath) {
throw new Error('Backup requires a valid storage path');
}
const fileName = hashPath(this.uri) + (this._backupCounter++);
return joinPath(this._storagePath, fileName);
}
updateBackup(backup: vscode.NotebookDocumentBackup): void {
this._backup?.delete();
this._backup = backup;
......
......@@ -27,7 +27,7 @@ export interface IMainNotebookController {
onDidReceiveMessage(editorId: string, rendererType: string | undefined, message: any): void;
save(uri: URI, token: CancellationToken): Promise<boolean>;
saveAs(uri: URI, target: URI, token: CancellationToken): Promise<boolean>;
backup(uri: URI, token: CancellationToken): Promise<string | undefined>;
backup(uri: URI, token: CancellationToken): Promise<string>;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册