From b64171bd0bde0c19d3c407f56325db1f71cc3473 Mon Sep 17 00:00:00 2001 From: Benjamin Pasero Date: Tue, 3 Nov 2020 09:54:46 +0100 Subject: [PATCH] storage - introduce onDidChangeTarget event --- .../multicursor/test/multicursor.test.ts | 1 + src/vs/platform/storage/common/storage.ts | 23 +++++++++++++ .../test/common/storageService.test.ts | 32 +++++++++++++++++-- 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/src/vs/editor/contrib/multicursor/test/multicursor.test.ts b/src/vs/editor/contrib/multicursor/test/multicursor.test.ts index 7b0f0f4ed7d..249fb5736e7 100644 --- a/src/vs/editor/contrib/multicursor/test/multicursor.test.ts +++ b/src/vs/editor/contrib/multicursor/test/multicursor.test.ts @@ -62,6 +62,7 @@ suite('Multicursor selection', () => { serviceCollection.set(IStorageService, { _serviceBrand: undefined, onDidChangeStorage: Event.None, + onDidChangeTarget: Event.None, onWillSaveState: Event.None, get: (key: string) => queryState[key], getBoolean: (key: string) => !!queryState[key], diff --git a/src/vs/platform/storage/common/storage.ts b/src/vs/platform/storage/common/storage.ts index b74e70fb774..3dbb39c41f5 100644 --- a/src/vs/platform/storage/common/storage.ts +++ b/src/vs/platform/storage/common/storage.ts @@ -32,6 +32,11 @@ export interface IStorageService { */ readonly onDidChangeStorage: Event; + /** + * Emitted whenever target of a storage entry changes. + */ + readonly onDidChangeTarget: Event; + /** * Emitted when the storage is about to persist. This is the right time * to persist data to ensure it is stored before the application shuts @@ -173,6 +178,10 @@ export interface IStorageChangeEvent { readonly scope: StorageScope; } +export interface IStorageTargetChangeEvent { + readonly scope: StorageScope; +} + export abstract class AbstractStorageService extends Disposable implements IStorageService { declare readonly _serviceBrand: undefined; @@ -180,9 +189,23 @@ export abstract class AbstractStorageService extends Disposable implements IStor protected readonly _onDidChangeStorage = this._register(new Emitter()); readonly onDidChangeStorage = this._onDidChangeStorage.event; + protected readonly _onDidChangeTarget = this._register(new Emitter()); + readonly onDidChangeTarget = this._onDidChangeTarget.event; + protected readonly _onWillSaveState = this._register(new Emitter()); readonly onWillSaveState = this._onWillSaveState.event; + constructor() { + super(); + + // Detect changes to `TARGET_KEY` to emit as event + this._register(this.onDidChangeStorage(e => { + if (e.key === TARGET_KEY) { + this._onDidChangeTarget.fire({ scope: e.scope }); + } + })); + } + store2(key: string, value: string | boolean | number | undefined | null, scope: StorageScope, target: StorageTarget): void { // We remove the key for undefined/null values diff --git a/src/vs/platform/storage/test/common/storageService.test.ts b/src/vs/platform/storage/test/common/storageService.test.ts index 155a13a6d2a..1b2049e6242 100644 --- a/src/vs/platform/storage/test/common/storageService.test.ts +++ b/src/vs/platform/storage/test/common/storageService.test.ts @@ -3,8 +3,8 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { strictEqual, ok } from 'assert'; -import { StorageScope, InMemoryStorageService, StorageTarget } from 'vs/platform/storage/common/storage'; +import { strictEqual, ok, equal } from 'assert'; +import { StorageScope, InMemoryStorageService, StorageTarget, IStorageChangeEvent, IStorageTargetChangeEvent } from 'vs/platform/storage/common/storage'; suite('StorageService', function () { @@ -19,6 +19,9 @@ suite('StorageService', function () { function storeData(scope: StorageScope): void { const storage = new InMemoryStorageService(); + let storageEvents: IStorageChangeEvent[] = []; + storage.onDidChangeStorage(e => storageEvents.push(e)); + strictEqual(storage.get('test.get', scope, 'foobar'), 'foobar'); strictEqual(storage.get('test.get', scope, ''), ''); strictEqual(storage.getNumber('test.getNumber', scope, 5), 5); @@ -28,9 +31,16 @@ suite('StorageService', function () { storage.store('test.get', 'foobar', scope); strictEqual(storage.get('test.get', scope, (undefined)!), 'foobar'); + let storageEvent = storageEvents.find(e => e.key === 'test.get'); + equal(storageEvent?.scope, scope); + equal(storageEvent?.key, 'test.get'); + storageEvents = []; storage.store('test.get', '', scope); strictEqual(storage.get('test.get', scope, (undefined)!), ''); + storageEvent = storageEvents.find(e => e.key === 'test.get'); + equal(storageEvent!.scope, scope); + equal(storageEvent!.key, 'test.get'); storage.store('test.getNumber', 5, scope); strictEqual(storage.getNumber('test.getNumber', scope, (undefined)!), 5); @@ -60,16 +70,25 @@ suite('StorageService', function () { function removeData(scope: StorageScope): void { const storage = new InMemoryStorageService(); + let storageEvents: IStorageChangeEvent[] = []; + storage.onDidChangeStorage(e => storageEvents.push(e)); + storage.store('test.remove', 'foobar', scope); strictEqual('foobar', storage.get('test.remove', scope, (undefined)!)); storage.remove('test.remove', scope); ok(!storage.get('test.remove', scope, (undefined)!)); + let storageEvent = storageEvents.find(e => e.key === 'test.remove'); + equal(storageEvent?.scope, scope); + equal(storageEvent?.key, 'test.remove'); } test('Keys (in-memory)', () => { const storage = new InMemoryStorageService(); + let storageTargetEvent: IStorageTargetChangeEvent | undefined = undefined; + storage.onDidChangeTarget(e => storageTargetEvent = e); + // Empty for (const scope of [StorageScope.WORKSPACE, StorageScope.GLOBAL]) { for (const target of [StorageTarget.MACHINE, StorageTarget.USER]) { @@ -80,8 +99,11 @@ suite('StorageService', function () { // Add values for (const scope of [StorageScope.WORKSPACE, StorageScope.GLOBAL]) { for (const target of [StorageTarget.MACHINE, StorageTarget.USER]) { + storageTargetEvent = Object.create(null); + storage.store2('test.target1', 'value1', scope, target); strictEqual(storage.keys(scope, target).length, 1); + equal(storageTargetEvent?.scope, scope); storage.store2('test.target1', 'otherValue1', scope, target); strictEqual(storage.keys(scope, target).length, 1); @@ -101,8 +123,11 @@ suite('StorageService', function () { storage.store2('test.target4', 'value1', scope, target); strictEqual(storage.keys(scope, target).length, keysLength + 1); + storageTargetEvent = Object.create(null); + storage.remove('test.target4', scope); strictEqual(storage.keys(scope, target).length, keysLength); + equal(storageTargetEvent?.scope, scope); } } @@ -125,8 +150,11 @@ suite('StorageService', function () { storage.store2('test.target1', 'value1', scope, target); strictEqual(storage.keys(scope, target).length, 1); + storageTargetEvent = Object.create(null); + storage.store2('test.target1', undefined, scope, target); strictEqual(storage.keys(scope, target).length, 0); + equal(storageTargetEvent?.scope, scope); storage.store2('test.target1', '', scope, target); strictEqual(storage.keys(scope, target).length, 1);