diff --git a/src/sql/workbench/contrib/notebook/test/browser/cellToolbarActions.test.ts b/src/sql/workbench/contrib/notebook/test/browser/cellToolbarActions.test.ts index 40b1069024..a6e55ad2fd 100644 --- a/src/sql/workbench/contrib/notebook/test/browser/cellToolbarActions.test.ts +++ b/src/sql/workbench/contrib/notebook/test/browser/cellToolbarActions.test.ts @@ -117,6 +117,7 @@ suite('CellToolbarActions', function (): void { undefined, undefined, undefined, + undefined, ); instantiationService.stub(INotificationService, new TestNotificationService()); instantiationService.stub(INotebookService, notebookService); diff --git a/src/sql/workbench/contrib/notebook/test/browser/markdownTextTransformer.test.ts b/src/sql/workbench/contrib/notebook/test/browser/markdownTextTransformer.test.ts index 4628893cf6..8c6a481abc 100644 --- a/src/sql/workbench/contrib/notebook/test/browser/markdownTextTransformer.test.ts +++ b/src/sql/workbench/contrib/notebook/test/browser/markdownTextTransformer.test.ts @@ -71,6 +71,7 @@ suite('MarkdownTextTransformer', () => { undefined, undefined, undefined, + undefined, ); mockNotebookService = TypeMoq.Mock.ofInstance(notebookService); diff --git a/src/sql/workbench/contrib/notebook/test/browser/notebookEditor.test.ts b/src/sql/workbench/contrib/notebook/test/browser/notebookEditor.test.ts index daabe70867..e5b288b915 100644 --- a/src/sql/workbench/contrib/notebook/test/browser/notebookEditor.test.ts +++ b/src/sql/workbench/contrib/notebook/test/browser/notebookEditor.test.ts @@ -701,6 +701,7 @@ function setupServices(arg: { workbenchThemeService?: WorkbenchThemeService, ins undefined, undefined, undefined, + undefined, ); instantiationService.stub(INotebookService, notebookService); diff --git a/src/sql/workbench/contrib/notebook/test/browser/notebookService.test.ts b/src/sql/workbench/contrib/notebook/test/browser/notebookService.test.ts index 2e2d66756e..9a457fd532 100644 --- a/src/sql/workbench/contrib/notebook/test/browser/notebookService.test.ts +++ b/src/sql/workbench/contrib/notebook/test/browser/notebookService.test.ts @@ -33,6 +33,8 @@ import { IProductService } from 'vs/platform/product/common/productService'; import { IEditorService } from 'vs/workbench/services/editor/common/editorService'; import { IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService'; import { IUntitledTextEditorService } from 'vs/workbench/services/untitled/common/untitledTextEditorService'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; +import { TestConfigurationService } from 'sql/platform/connection/test/common/testConfigurationService'; /** * class to mock azdata.nb.ServerManager object @@ -120,6 +122,7 @@ suite.skip('NotebookService:', function (): void { didInstallExtensionEmitter: Emitter, uninstallExtensionEmitter: Emitter, didUninstallExtensionEmitter: Emitter; + let configurationService: IConfigurationService; setup(() => { testNo++; @@ -143,6 +146,7 @@ suite.skip('NotebookService:', function (): void { didInstallExtensionEmitter = new Emitter(); uninstallExtensionEmitter = new Emitter(); didUninstallExtensionEmitter = new Emitter(); + configurationService = new TestConfigurationService(); instantiationService.stub(IExtensionManagementService, ExtensionManagementService); instantiationService.stub(IExtensionManagementService, 'onInstallExtension', installExtensionEmitter.event); @@ -159,7 +163,7 @@ suite.skip('NotebookService:', function (): void { notebookService = new NotebookService(lifecycleService, storageService, extensionServiceMock.object, extensionManagementService, instantiationService, fileService, logServiceMock.object, queryManagementService, contextService, productService, - editorService, untitledTextEditorService, editorGroupsService); + editorService, untitledTextEditorService, editorGroupsService, configurationService); sandbox = sinon.sandbox.create(); }); @@ -457,7 +461,7 @@ suite.skip('NotebookService:', function (): void { }; errorHandler.setUnexpectedErrorHandler(onUnexpectedErrorVerifier); // The following call throws an exception internally with queryManagementService parameter being undefined. - new NotebookService(lifecycleService, storageService, extensionService, extensionManagementService, instantiationService, fileService, logService, /* queryManagementService */ undefined, contextService, productService, editorService, untitledTextEditorService, editorGroupsService); + new NotebookService(lifecycleService, storageService, extensionService, extensionManagementService, instantiationService, fileService, logService, /* queryManagementService */ undefined, contextService, productService, editorService, untitledTextEditorService, editorGroupsService, configurationService); await unexpectedErrorPromise; assert.strictEqual(unexpectedErrorCalled, true, `onUnexpectedError must be have been raised when queryManagementService is undefined when calling NotebookService constructor`); }); diff --git a/src/sql/workbench/contrib/notebook/test/electron-browser/notebookEditorModel.test.ts b/src/sql/workbench/contrib/notebook/test/electron-browser/notebookEditorModel.test.ts index a283e886f8..41c690f810 100644 --- a/src/sql/workbench/contrib/notebook/test/electron-browser/notebookEditorModel.test.ts +++ b/src/sql/workbench/contrib/notebook/test/electron-browser/notebookEditorModel.test.ts @@ -121,6 +121,7 @@ suite('Notebook Editor Model', function (): void { undefined, undefined, undefined, + undefined, ); let mockNotebookService = TypeMoq.Mock.ofInstance(notebookService); diff --git a/src/sql/workbench/services/notebook/browser/notebookServiceImpl.ts b/src/sql/workbench/services/notebook/browser/notebookServiceImpl.ts index 029f62532d..ea2ff4cb8d 100644 --- a/src/sql/workbench/services/notebook/browser/notebookServiceImpl.ts +++ b/src/sql/workbench/services/notebook/browser/notebookServiceImpl.ts @@ -51,6 +51,7 @@ import { IEditorInput, IEditorPane } from 'vs/workbench/common/editor'; import { isINotebookInput } from 'sql/workbench/services/notebook/browser/interface'; import { INotebookShowOptions } from 'sql/workbench/api/common/sqlExtHost.protocol'; import { NotebookLanguage } from 'sql/workbench/common/constants'; +import { IConfigurationService } from 'vs/platform/configuration/common/configuration'; const languageAssociationRegistry = Registry.as(LanguageAssociationExtensions.LanguageAssociations); @@ -140,7 +141,8 @@ export class NotebookService extends Disposable implements INotebookService { @IProductService private readonly productService: IProductService, @IEditorService private _editorService: IEditorService, @IUntitledTextEditorService private _untitledEditorService: IUntitledTextEditorService, - @IEditorGroupsService private _editorGroupService: IEditorGroupsService + @IEditorGroupsService private _editorGroupService: IEditorGroupsService, + @IConfigurationService private _configurationService: IConfigurationService ) { super(); this._providersMemento = new Memento('notebookProviders', this._storageService); @@ -581,11 +583,21 @@ export class NotebookService extends Disposable implements INotebookService { if (notebookUri.scheme === Schemas.untitled) { return true; } + const trustedBooksConfigKey = 'notebook.trustedBooks'; let cacheInfo = this.trustedNotebooksMemento.trustedNotebooksCache[notebookUri.toString()]; if (!cacheInfo) { - // This notebook was never trusted - return false; + // Check if the notebook belongs to a book that's trusted + // and is not part of untrusted queue. + let trustedBookDirectories: string[] = !this._unTrustedCacheQueue.find(n => n === notebookUri) ? this._configurationService?.getValue(trustedBooksConfigKey) ?? [] : []; + if (trustedBookDirectories.find(b => notebookUri.fsPath.indexOf(b) > -1)) { + return true; + // note: we're ignoring the dirty check below since that's needed only when + // someone trusts notebook after it's loaded and this check is during the load time + } else { + // This notebook was never trusted + return false; + } } // This was trusted. If it's not dirty (e.g. if we're not working on our cached copy) // then should verify it's not been modified on disk since that invalidates trust relationship diff --git a/src/sql/workbench/test/electron-browser/api/mainThreadNotebook.test.ts b/src/sql/workbench/test/electron-browser/api/mainThreadNotebook.test.ts index 72889683a1..4bd16a484e 100644 --- a/src/sql/workbench/test/electron-browser/api/mainThreadNotebook.test.ts +++ b/src/sql/workbench/test/electron-browser/api/mainThreadNotebook.test.ts @@ -50,6 +50,7 @@ suite('MainThreadNotebook Tests', () => { undefined, undefined, undefined, + undefined, ); mockNotebookService = TypeMoq.Mock.ofInstance(notebookService); notebookUri = URI.parse('file:/user/default/my.ipynb');