mirror of
https://github.com/microsoft/vscode.git
synced 2026-09-17 17:00:01 +01:00
storage - introduce onDidChangeTarget event
This commit is contained in:
@@ -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],
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user