Skip to content

Commit 26d9554

Browse files
author
Brian Chen
authored
Exclude iOS Safari < 10.0 and Android < 4.4 when checking isAvailable() to enable persistence (#1703)
1 parent acaa10b commit 26d9554

File tree

2 files changed

+48
-1
lines changed

2 files changed

+48
-1
lines changed

packages/firestore/src/local/simple_db.ts

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,10 +162,20 @@ export class SimpleDb {
162162
// ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML,
163163
// like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0';
164164

165+
// iOS Safari: Disable for users running iOS version < 10.
166+
const iOSVersion = SimpleDb.getIOSVersion(ua);
167+
const isUnsupportedIOS = 0 < iOSVersion && iOSVersion < 10;
168+
169+
// Android browser: Disable for userse running version < 4.5.
170+
const androidVersion = SimpleDb.getAndroidVersion(ua);
171+
const isUnsupportedAndroid = 0 < androidVersion && androidVersion < 4.5;
172+
165173
if (
166174
ua.indexOf('MSIE ') > 0 ||
167175
ua.indexOf('Trident/') > 0 ||
168-
ua.indexOf('Edge/') > 0
176+
ua.indexOf('Edge/') > 0 ||
177+
isUnsupportedIOS ||
178+
isUnsupportedAndroid
169179
) {
170180
return false;
171181
} else {
@@ -181,6 +191,27 @@ export class SimpleDb {
181191
return txn.store<KeyType, ValueType>(store);
182192
}
183193

194+
// visible for testing
195+
/** Parse User Agent to determine iOS version. Returns -1 if not found. */
196+
static getIOSVersion(ua: string): number {
197+
const iOSVersionRegex = ua.match(/i(?:phone|pad|pod) os ([\d_]+)/i);
198+
const version = iOSVersionRegex ? iOSVersionRegex[1].split('_')[0] : '-1';
199+
return Number(version);
200+
}
201+
202+
// visible for testing
203+
/** Parse User Agent to determine Android version. Returns -1 if not found. */
204+
static getAndroidVersion(ua: string): number {
205+
const androidVersionRegex = ua.match(/Android ([\d.]+)/i);
206+
const version = androidVersionRegex
207+
? androidVersionRegex[1]
208+
.split('.')
209+
.slice(0, 2)
210+
.join('.')
211+
: '-1';
212+
return Number(version);
213+
}
214+
184215
constructor(private db: IDBDatabase) {}
185216

186217
runTransaction<T>(

packages/firestore/test/unit/local/simple_db.test.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,22 @@ describe('SimpleDb', () => {
121121

122122
after(() => SimpleDb.delete(dbName));
123123

124+
it('regex test', () => {
125+
const iPhoneSafariAgent =
126+
'Mozilla/5.0 (iPhone; CPU iPhone OS 10_14_4 like Mac OS X)' +
127+
' AppleWebKit/600.1.4 (KHTML, like Gecko) Version/8.0 Mobile/12B411' +
128+
' Safari/600.1.4';
129+
const iPadSafariAgent =
130+
'Mozilla/5.0 (iPad; CPU iPad OS 9_0 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko)' +
131+
' Version/9.0 Mobile/13A344 Safari/601';
132+
const androidAgent =
133+
'Mozilla/5.0 (Linux; U; Android 2.2.1; fr-fr; Desire HD Build/FRG83D)' +
134+
' AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1';
135+
expect(SimpleDb.getIOSVersion(iPhoneSafariAgent)).to.equal(10);
136+
expect(SimpleDb.getIOSVersion(iPadSafariAgent)).to.equal(9);
137+
expect(SimpleDb.getAndroidVersion(androidAgent)).to.equal(2.2);
138+
});
139+
124140
it('can get', async () => {
125141
await runTransaction(store => {
126142
return store

0 commit comments

Comments
 (0)