Skip to content

Commit 360981f

Browse files
authored
fix: Error in web context when window.indexedDB API is available but protected (#2039)
1 parent 3bf55f6 commit 360981f

File tree

5 files changed

+44
-25
lines changed

5 files changed

+44
-25
lines changed

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/IndexedDBStorageController.js

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,33 @@
66
import { createStore, del, set, get, clear, keys } from 'idb-keyval';
77

88
if (typeof window !== 'undefined' && window.indexedDB) {
9-
const ParseStore = createStore('parseDB', 'parseStore');
9+
try {
10+
const ParseStore = createStore('parseDB', 'parseStore');
1011

11-
const IndexedDBStorageController = {
12-
async: 1,
13-
getItemAsync(path: string) {
14-
return get(path, ParseStore);
15-
},
16-
setItemAsync(path: string, value: string) {
17-
return set(path, value, ParseStore);
18-
},
19-
removeItemAsync(path: string) {
20-
return del(path, ParseStore);
21-
},
22-
getAllKeysAsync() {
23-
return keys(ParseStore);
24-
},
25-
clear() {
26-
return clear(ParseStore);
27-
},
28-
};
12+
const IndexedDBStorageController = {
13+
async: 1,
14+
getItemAsync(path: string) {
15+
return get(path, ParseStore);
16+
},
17+
setItemAsync(path: string, value: string) {
18+
return set(path, value, ParseStore);
19+
},
20+
removeItemAsync(path: string) {
21+
return del(path, ParseStore);
22+
},
23+
getAllKeysAsync() {
24+
return keys(ParseStore);
25+
},
26+
clear() {
27+
return clear(ParseStore);
28+
},
29+
};
2930

30-
module.exports = IndexedDBStorageController;
31+
module.exports = IndexedDBStorageController;
32+
} catch (_) {
33+
// IndexedDB not accessible
34+
module.exports = undefined;
35+
}
3136
} else {
3237
// IndexedDB not supported
3338
module.exports = undefined;

src/Parse.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import decode from './decode';
22
import encode from './encode';
33
import CryptoController from './CryptoController';
44
import EventuallyQueue from './EventuallyQueue';
5+
import IndexedDBStorageController from './IndexedDBStorageController';
56
import InstallationController from './InstallationController';
67
import * as ParseOp from './ParseOp';
78
import RESTController from './RESTController';
@@ -183,6 +184,10 @@ const Parse: ParseType = {
183184

184185
Parse.LiveQuery = new LiveQuery();
185186
CoreManager.setIfNeeded('LiveQuery', Parse.LiveQuery);
187+
188+
if (process.env.PARSE_BUILD === 'browser') {
189+
Parse.IndexedDB = CoreManager.setIfNeeded('IndexedDBStorageController', IndexedDBStorageController);
190+
}
186191
},
187192

188193
/**
@@ -428,10 +433,6 @@ const Parse: ParseType = {
428433
},
429434
};
430435

431-
if (process.env.PARSE_BUILD === 'browser') {
432-
Parse.IndexedDB = require('./IndexedDBStorageController');
433-
}
434-
435436
CoreManager.setCryptoController(CryptoController);
436437
CoreManager.setInstallationController(InstallationController);
437438
CoreManager.setRESTController(RESTController);

src/__tests__/Parse-test.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,7 @@ describe('Parse module', () => {
237237
expect(Parse.IndexedDB).toBeUndefined();
238238
process.env.PARSE_BUILD = 'browser';
239239
const ParseInstance = require('../Parse');
240+
ParseInstance.initialize('test', 'test');
240241
expect(ParseInstance.IndexedDB).toBeDefined();
241242
CoreManager.setStorageController(ParseInstance.IndexedDB);
242243
const currentStorage = CoreManager.getStorageController();

src/__tests__/Storage-test.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ global.indexedDB = mockIndexedDB;
1212
jest.mock('idb-keyval', () => {
1313
return mockIndexedDB;
1414
});
15+
const idbKeyVal = require('idb-keyval');
1516

1617
const BrowserStorageController = require('../StorageController.browser');
1718

@@ -204,6 +205,17 @@ describe('IndexDB StorageController', () => {
204205
expect(dbController).toBeUndefined();
205206
global.indexedDB = mockIndexedDB;
206207
});
208+
209+
it('handle indexedDB is not accessible', async () => {
210+
jest.isolateModules(() => {
211+
global.indexedDB = mockIndexedDB;
212+
jest.spyOn(idbKeyVal, 'createStore')
213+
.mockImplementationOnce(() => { throw new Error('Protected'); });
214+
const dbController = require('../IndexedDBStorageController');
215+
expect(dbController).toBeUndefined();
216+
expect(idbKeyVal.createStore).toHaveBeenCalled();
217+
});
218+
});
207219
});
208220

209221
const DefaultStorageController = require('../StorageController.default');

0 commit comments

Comments
 (0)