diff --git a/src/sql/workbench/contrib/notebook/browser/notebookActions.ts b/src/sql/workbench/contrib/notebook/browser/notebookActions.ts index 8157125136..789b5e58de 100644 --- a/src/sql/workbench/contrib/notebook/browser/notebookActions.ts +++ b/src/sql/workbench/contrib/notebook/browser/notebookActions.ts @@ -106,7 +106,6 @@ export class TrustedAction extends ToggleableAction { // Constants private static readonly trustedLabel = localize('trustLabel', "Trusted"); private static readonly notTrustedLabel = localize('untrustLabel', "Not Trusted"); - private static readonly alreadyTrustedMsg = localize('alreadyTrustedMsg', "Notebook is already trusted."); private static readonly baseClass = 'notebook-button'; private static readonly trustedCssClass = 'icon-trusted'; private static readonly notTrustedCssClass = 'icon-notTrusted'; @@ -114,8 +113,7 @@ export class TrustedAction extends ToggleableAction { // Properties constructor( - id: string, - @INotificationService private _notificationService: INotificationService + id: string ) { super(id, { baseClass: TrustedAction.baseClass, @@ -138,14 +136,8 @@ export class TrustedAction extends ToggleableAction { let self = this; return new Promise((resolve, reject) => { try { - if (self.trusted) { - const actions: INotificationActions = { primary: [] }; - self._notificationService.notify({ severity: Severity.Info, message: TrustedAction.alreadyTrustedMsg, actions }); - } - else { - self.trusted = !self.trusted; - context.model.trustedMode = self.trusted; - } + self.trusted = !self.trusted; + context.model.trustedMode = self.trusted; resolve(true); } catch (e) { reject(e); diff --git a/src/sql/workbench/contrib/notebook/test/browser/notebookActions.test.ts b/src/sql/workbench/contrib/notebook/test/browser/notebookActions.test.ts index 10b0b787bb..4ccd8286f8 100644 --- a/src/sql/workbench/contrib/notebook/test/browser/notebookActions.test.ts +++ b/src/sql/workbench/contrib/notebook/test/browser/notebookActions.test.ts @@ -64,7 +64,7 @@ suite('Notebook Actions', function (): void { let mockNotification = TypeMoq.Mock.ofType(TestNotificationService); mockNotification.setup(n => n.notify(TypeMoq.It.isAny())); - let action = new TrustedAction('TestId', mockNotification.object); + let action = new TrustedAction('TestId'); assert.strictEqual(action.trusted, false, 'Should not be trusted by default'); // Normal use case @@ -77,10 +77,10 @@ suite('Notebook Actions', function (): void { assert.ok(result, 'Trusted Action should succeed'); assert.strictEqual(action.trusted, true, 'Should be trusted after toggling trusted state'); - // Should stay trusted when trying to toggle again + // Should toggle trusted to false on subsequent action result = await action.run(contextStub); assert.ok(result, 'Trusted Action should succeed again'); - assert.strictEqual(action.trusted, true, 'Should stay trusted when trying to toggle trusted to false'); + assert.strictEqual(action.trusted, false, 'Should toggle trusted to false'); }); test('Run All Cells Action', async function (): Promise { diff --git a/src/sql/workbench/services/notebook/browser/notebookServiceImpl.ts b/src/sql/workbench/services/notebook/browser/notebookServiceImpl.ts index 17706ee80f..a73a420dbd 100644 --- a/src/sql/workbench/services/notebook/browser/notebookServiceImpl.ts +++ b/src/sql/workbench/services/notebook/browser/notebookServiceImpl.ts @@ -115,6 +115,7 @@ export class NotebookService extends Disposable implements INotebookService { private _themeParticipant: IDisposable; private _overrideEditorThemeSetting: boolean; private _trustedCacheQueue: URI[] = []; + private _unTrustedCacheQueue: URI[] = []; private _updateTrustCacheScheduler: RunOnceScheduler; constructor( @@ -589,8 +590,12 @@ export class NotebookService extends Disposable implements INotebookService { if (changeType === NotebookChangeType.Saved && firstIndex(this._trustedCacheQueue, uri => uri.toString() === notebookUriString) < 0) { // Only save if it's trusted let notebook = find(this.listNotebookEditors(), n => n.id === notebookUriString); - if (notebook && notebook.model.trustedMode) { - this._trustedCacheQueue.push(notebookUri); + if (notebook && notebook.model) { + if (notebook.model.trustedMode) { + this._trustedCacheQueue.push(notebookUri); + } else { + this._unTrustedCacheQueue.push(notebookUri); + } this._updateTrustCacheScheduler.schedule(); } } @@ -625,7 +630,19 @@ export class NotebookService extends Disposable implements INotebookService { }; } } - + this._trustedNotebooksMemento.saveMemento(); + } + if (this._unTrustedCacheQueue.length > 0) { + // Copy out all items from the cache + let items = this._unTrustedCacheQueue; + this._unTrustedCacheQueue = []; + let trustedCache = this.trustedNotebooksMemento.trustedNotebooksCache; + //Remove the trusted intry from the cache + for (let i = 0; i < items.length; i++) { + if (trustedCache[items[i].toString()]) { + trustedCache[items[i].toString()] = null; + } + } this._trustedNotebooksMemento.saveMemento(); } } catch (err) {