Merge pull request #1387 from dereli/fix/localize-reset

Race condition in LocalizeManager
This commit is contained in:
Joren Broekema 2021-06-01 17:56:51 +02:00 committed by GitHub
commit 61d6c5fa33
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 37 additions and 2 deletions

View file

@ -0,0 +1,5 @@
---
'@lion/localize': patch
---
Fix localize race condition where data was being added while namespace loader promise was no longer in cache.

View file

@ -340,8 +340,14 @@ export class LocalizeManager {
* @param {Object} obj.default * @param {Object} obj.default
*/ */
obj => { obj => {
const data = isLocalizeESModule(obj) ? obj.default : obj; // add data only if we have the promise in cache
this.addData(locale, namespace, data); if (
this.__namespaceLoaderPromisesCache[locale] &&
this.__namespaceLoaderPromisesCache[locale][namespace] === loaderPromise
) {
const data = isLocalizeESModule(obj) ? obj.default : obj;
this.addData(locale, namespace, data);
}
}, },
); );
} }

View file

@ -58,6 +58,30 @@ describe('LocalizeManager', () => {
expect(document.documentElement.lang).to.equal('en-GB'); expect(document.documentElement.lang).to.equal('en-GB');
}); });
it('empties storage after reset() is invoked', async () => {
manager = new LocalizeManager();
let deferredResolve;
manager.loadNamespace({
generic: () =>
new Promise(resolve => {
deferredResolve = () => resolve({ greeting: 'Hello!' });
}),
});
const { loadingComplete } = manager;
manager.reset();
expect(getProtectedMembers(manager).storage).to.be.empty;
// @ts-ignore
deferredResolve();
await loadingComplete;
// storage still needs to be empty after promise is fulfilled.
expect(getProtectedMembers(manager).storage).to.be.empty;
});
it('has teardown() method removing all side effects', () => { it('has teardown() method removing all side effects', () => {
manager = new LocalizeManager(); manager = new LocalizeManager();
const disconnectObserverSpy = sinon.spy( const disconnectObserverSpy = sinon.spy(