storage - introduce onDidChangeTarget event

This commit is contained in:
Benjamin Pasero
2020-11-03 09:54:46 +01:00
parent 6a242516e4
commit b64171bd0b
3 changed files with 54 additions and 2 deletions
@@ -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],
+23
View File
@@ -32,6 +32,11 @@ export interface IStorageService {
*/
readonly onDidChangeStorage: Event<IStorageChangeEvent>;
/**
* Emitted whenever target of a storage entry changes.
*/
readonly onDidChangeTarget: Event<IStorageTargetChangeEvent>;
/**
* 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<IStorageChangeEvent>());
readonly onDidChangeStorage = this._onDidChangeStorage.event;
protected readonly _onDidChangeTarget = this._register(new Emitter<IStorageTargetChangeEvent>());
readonly onDidChangeTarget = this._onDidChangeTarget.event;
protected readonly _onWillSaveState = this._register(new Emitter<IWillSaveStateEvent>());
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
@@ -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);