Skip to content

Commit 67501b9

Browse files
XuechunHouschmidt-sebastianFeiyang1
authored
Issue 2393 - Add environment check to Performance Module (#3424)
* issue #2393, first fix on performance module and remote-config module * added error handler to remote-config and performance modules on indexedDB not supported in some browser situations * issue #2393 fix for analytics module * updateDoc()/deleteDoc() signature fix (#3147) * Transaction/WriteBatch signature fix (#3151) * Take WriteStream offline when IndexedDB is unavailable (#2995) * Do not build firestore lite in build because it breaks regular release build (#3156) * Do not build firestore lite in build because it breaks release build * add release build script * add pre script for build:release (#3161) * Add setLogLevel() (#3154) * Add DocumentReference (#3123) * issue #2393 fix for analytics module * added isSupported method to performance module * added method signature to firebase/index.d.ts * reverted unrelated files in remote-config * Create little-cycles-fold.md * removed isSupported method from performance * wrote tests for requiredApisAvailable * updated isRequiredApiAvailable tests, updated logTrace function to reflect changes of isRequiredApiAvailable * added Promise existence check before every test of requiredApisAvailable * took validateIndexedDBOpenable outside of isRequiredApisAvailable * updated performance constructor test Co-authored-by: Sebastian Schmidt <[email protected]> Co-authored-by: Feiyang <[email protected]>
1 parent 00ac9d2 commit 67501b9

File tree

7 files changed

+70
-17
lines changed

7 files changed

+70
-17
lines changed

.changeset/little-cycles-fold.md

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"firebase": minor
3+
"@firebase/performance": minor
4+
---
5+
6+
Issue 2393 - Add environment check to Performance Module

packages/performance/index.ts

-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import { ERROR_FACTORY, ErrorCode } from './src/utils/errors';
2626
import { FirebasePerformance } from '@firebase/performance-types';
2727
import { Component, ComponentType } from '@firebase/component';
2828
import { FirebaseInstallations } from '@firebase/installations-types';
29-
3029
import { name, version } from './package.json';
3130

3231
const DEFAULT_ENTRY_NAME = '[DEFAULT]';

packages/performance/src/controllers/perf.test.ts

+29-3
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import { Trace } from '../resources/trace';
2222
import { Api, setupApi } from '../services/api_service';
2323
import { FirebaseApp } from '@firebase/app-types';
2424
import * as initializationService from '../services/initialization_service';
25+
import * as FirebaseUtil from '@firebase/util';
2526
import { consoleLogger } from '../utils/console_logger';
2627
import '../../test/setup';
2728

@@ -46,11 +47,36 @@ describe('Firebase Performance Test', () => {
4647
it('does not initialize performance if the required apis are not available', () => {
4748
stub(Api.prototype, 'requiredApisAvailable').returns(false);
4849
stub(initializationService, 'getInitializationPromise');
49-
stub(consoleLogger, 'info');
5050
new PerformanceController(fakeFirebaseApp);
51-
5251
expect(initializationService.getInitializationPromise).not.be.called;
53-
expect(consoleLogger.info).be.called;
52+
});
53+
it('does not initialize performance if validateIndexedDBOpenable return false', async () => {
54+
stub(Api.prototype, 'requiredApisAvailable').returns(true);
55+
const validateStub = stub(
56+
FirebaseUtil,
57+
'validateIndexedDBOpenable'
58+
).resolves(false);
59+
stub(initializationService, 'getInitializationPromise');
60+
new PerformanceController(fakeFirebaseApp);
61+
await validateStub;
62+
expect(initializationService.getInitializationPromise).not.be.called;
63+
});
64+
65+
it('does not initialize performance if validateIndexedDBOpenable throws an error', async () => {
66+
stub(Api.prototype, 'requiredApisAvailable').returns(true);
67+
const validateStub = stub(
68+
FirebaseUtil,
69+
'validateIndexedDBOpenable'
70+
).rejects();
71+
72+
stub(initializationService, 'getInitializationPromise');
73+
stub(consoleLogger, 'info');
74+
new PerformanceController(fakeFirebaseApp);
75+
try {
76+
await validateStub;
77+
expect(initializationService.getInitializationPromise).not.be.called;
78+
expect(consoleLogger.info).be.called;
79+
} catch (ignored) {}
5480
});
5581
});
5682

packages/performance/src/controllers/perf.ts

+15-8
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,25 @@ import { getInitializationPromise } from '../services/initialization_service';
2121
import { Api } from '../services/api_service';
2222
import { FirebaseApp } from '@firebase/app-types';
2323
import { FirebasePerformance } from '@firebase/performance-types';
24-
import { consoleLogger } from '../utils/console_logger';
2524
import { setupTransportService } from '../services/transport_service';
26-
25+
import { validateIndexedDBOpenable } from '@firebase/util';
26+
import { consoleLogger } from '../utils/console_logger';
2727
export class PerformanceController implements FirebasePerformance {
2828
constructor(readonly app: FirebaseApp) {
2929
if (Api.getInstance().requiredApisAvailable()) {
30-
setupTransportService();
31-
getInitializationPromise().then(setupOobResources, setupOobResources);
32-
} else {
33-
consoleLogger.info(
34-
'Firebase Performance cannot start if browser does not support fetch and Promise or cookie is disabled.'
35-
);
30+
validateIndexedDBOpenable()
31+
.then(isAvailable => {
32+
if (isAvailable) {
33+
setupTransportService();
34+
getInitializationPromise().then(
35+
setupOobResources,
36+
setupOobResources
37+
);
38+
}
39+
})
40+
.catch(error => {
41+
consoleLogger.info(`Environment doesn't support IndexedDB: ${error}`);
42+
});
3643
}
3744
}
3845

packages/performance/src/services/api_service.test.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import { stub } from 'sinon';
1919
import { expect } from 'chai';
2020
import { Api, setupApi } from './api_service';
2121
import '../../test/setup';
22-
2322
describe('Firebase Performance > api_service', () => {
2423
const PAGE_URL = 'http://www.test.com/abcd?a=2';
2524
const PERFORMANCE_ENTRY: PerformanceEntry = {
@@ -47,6 +46,7 @@ describe('Firebase Performance > api_service', () => {
4746
]);
4847
// This is to make sure the test page is not changed by changing the href of location object.
4948
mockWindow.location = { ...self.location, href: PAGE_URL };
49+
5050
setupApi(mockWindow);
5151
api = Api.getInstance();
5252
});

packages/performance/src/services/api_service.ts

+18-4
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
*/
1717

1818
import { ERROR_FACTORY, ErrorCode } from '../utils/errors';
19-
19+
import { isIndexedDBAvailable } from '@firebase/util';
20+
import { consoleLogger } from '../utils/console_logger';
2021
declare global {
2122
interface Window {
2223
PerformanceObserver: typeof PerformanceObserver;
@@ -110,10 +111,23 @@ export class Api {
110111
}
111112

112113
requiredApisAvailable(): boolean {
113-
if (fetch && Promise && this.navigator && this.navigator.cookieEnabled) {
114-
return true;
114+
if (
115+
!fetch ||
116+
!Promise ||
117+
!this.navigator ||
118+
!this.navigator.cookieEnabled
119+
) {
120+
consoleLogger.info(
121+
'Firebase Performance cannot start if browser does not support fetch and Promise or cookie is disabled.'
122+
);
123+
return false;
124+
}
125+
126+
if (!isIndexedDBAvailable()) {
127+
consoleLogger.info('IndexedDB is not supported by current browswer');
128+
return false;
115129
}
116-
return false;
130+
return true;
117131
}
118132

119133
setupObserver(

packages/performance/src/services/perf_logger.ts

+1
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ export function logTrace(trace: Trace): void {
114114
if (!Api.getInstance().requiredApisAvailable()) {
115115
return;
116116
}
117+
117118
// Only log the page load auto traces if page is visible.
118119
if (trace.isAuto && getVisibilityState() !== VisibilityState.VISIBLE) {
119120
return;

0 commit comments

Comments
 (0)