Skip to content

Commit 57b10f7

Browse files
rubennortefacebook-github-bot
authored andcommitted
Allow setting a custom performance logger in XMLHttpRequest
Summary: Changelog: [Added] Added custom method `setPerformanceLogger` to `XMLHttpRequest` Reviewed By: lunaleaps Differential Revision: D23129945 fbshipit-source-id: 7a295945eee2b2f81dc0a46f764ffb1d9b14af15
1 parent b90f4d9 commit 57b10f7

File tree

2 files changed

+69
-3
lines changed

2 files changed

+69
-3
lines changed

Libraries/Network/XMLHttpRequest.js

+14-3
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,11 @@
1010

1111
'use strict';
1212

13+
import type {IPerformanceLogger} from '../Utilities/createPerformanceLogger';
14+
1315
const BlobManager = require('../Blob/BlobManager');
1416
const EventTarget = require('event-target-shim');
15-
const GlobalPerformanceLogger = require('react-native/Libraries/Utilities/GlobalPerformanceLogger');
17+
const GlobalPerformanceLogger = require('../Utilities/GlobalPerformanceLogger');
1618
const RCTNetworking = require('./RCTNetworking');
1719

1820
const base64 = require('base64-js');
@@ -141,6 +143,7 @@ class XMLHttpRequest extends (EventTarget(...XHR_EVENTS): any) {
141143
_timedOut: boolean = false;
142144
_trackingName: string = 'unknown';
143145
_incrementalEvents: boolean = false;
146+
_performanceLogger: IPerformanceLogger = GlobalPerformanceLogger;
144147

145148
static setInterceptor(interceptor: ?XHRInterceptor) {
146149
XMLHttpRequest._interceptor = interceptor;
@@ -302,7 +305,7 @@ class XMLHttpRequest extends (EventTarget(...XHR_EVENTS): any) {
302305
): void {
303306
if (requestId === this._requestId) {
304307
this._perfKey != null &&
305-
GlobalPerformanceLogger.stopTimespan(this._perfKey);
308+
this._performanceLogger.stopTimespan(this._perfKey);
306309
this.status = status;
307310
this.setResponseHeaders(responseHeaders);
308311
this.setReadyState(this.HEADERS_RECEIVED);
@@ -447,6 +450,14 @@ class XMLHttpRequest extends (EventTarget(...XHR_EVENTS): any) {
447450
return this;
448451
}
449452

453+
/**
454+
* Custom extension for setting a custom performance logger
455+
*/
456+
setPerformanceLogger(performanceLogger: IPerformanceLogger): XMLHttpRequest {
457+
this._performanceLogger = performanceLogger;
458+
return this;
459+
}
460+
450461
open(method: string, url: string, async: ?boolean): void {
451462
/* Other optional arguments are not supported yet */
452463
if (this.readyState !== this.UNSENT) {
@@ -519,7 +530,7 @@ class XMLHttpRequest extends (EventTarget(...XHR_EVENTS): any) {
519530
const friendlyName =
520531
this._trackingName !== 'unknown' ? this._trackingName : this._url;
521532
this._perfKey = 'network_XMLHttpRequest_' + String(friendlyName);
522-
GlobalPerformanceLogger.startTimespan(this._perfKey);
533+
this._performanceLogger.startTimespan(this._perfKey);
523534
invariant(
524535
this._method,
525536
'XMLHttpRequest method needs to be defined (%s).',

Libraries/Network/__tests__/XMLHttpRequest-test.js

+55
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,13 @@
99
*/
1010

1111
'use strict';
12+
1213
jest.unmock('../../Utilities/Platform');
14+
jest.mock('../../Utilities/GlobalPerformanceLogger');
15+
1316
const Platform = require('../../Utilities/Platform');
17+
const GlobalPerformanceLogger = require('../../Utilities/GlobalPerformanceLogger');
18+
const createPerformanceLogger = require('../../Utilities/createPerformanceLogger');
1419
let requestId = 1;
1520

1621
function setRequestId(id) {
@@ -71,6 +76,8 @@ describe('XMLHttpRequest', function() {
7176
xhr.addEventListener('load', handleLoad);
7277
xhr.addEventListener('loadend', handleLoadEnd);
7378
xhr.addEventListener('readystatechange', handleReadyStateChange);
79+
80+
jest.clearAllMocks();
7481
});
7582

7683
afterEach(() => {
@@ -238,4 +245,52 @@ describe('XMLHttpRequest', function() {
238245
'Content-Type: text/plain; charset=utf-8\r\n' + 'Content-Length: 32',
239246
);
240247
});
248+
249+
it('should log to GlobalPerformanceLogger if a custom performance logger is not set', () => {
250+
xhr.open('GET', 'blabla');
251+
xhr.send();
252+
253+
expect(GlobalPerformanceLogger.startTimespan).toHaveBeenCalledWith(
254+
'network_XMLHttpRequest_blabla',
255+
);
256+
expect(GlobalPerformanceLogger.stopTimespan).not.toHaveBeenCalled();
257+
258+
setRequestId(8);
259+
xhr.__didReceiveResponse(requestId, 200, {
260+
'Content-Type': 'text/plain; charset=utf-8',
261+
'Content-Length': '32',
262+
});
263+
264+
expect(GlobalPerformanceLogger.stopTimespan).toHaveBeenCalledWith(
265+
'network_XMLHttpRequest_blabla',
266+
);
267+
});
268+
269+
it('should log to a custom performance logger if set', () => {
270+
const performanceLogger = createPerformanceLogger();
271+
jest.spyOn(performanceLogger, 'startTimespan');
272+
jest.spyOn(performanceLogger, 'stopTimespan');
273+
274+
xhr.setPerformanceLogger(performanceLogger);
275+
276+
xhr.open('GET', 'blabla');
277+
xhr.send();
278+
279+
expect(performanceLogger.startTimespan).toHaveBeenCalledWith(
280+
'network_XMLHttpRequest_blabla',
281+
);
282+
expect(GlobalPerformanceLogger.startTimespan).not.toHaveBeenCalled();
283+
expect(performanceLogger.stopTimespan).not.toHaveBeenCalled();
284+
285+
setRequestId(9);
286+
xhr.__didReceiveResponse(requestId, 200, {
287+
'Content-Type': 'text/plain; charset=utf-8',
288+
'Content-Length': '32',
289+
});
290+
291+
expect(performanceLogger.stopTimespan).toHaveBeenCalledWith(
292+
'network_XMLHttpRequest_blabla',
293+
);
294+
expect(GlobalPerformanceLogger.stopTimespan).not.toHaveBeenCalled();
295+
});
241296
});

0 commit comments

Comments
 (0)