mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
16eccf304e
Summary: We still include this info in real reports. We also still print the root tag when the app starts. This just removes the redbox "extra data" logging to console. It's noisy, especially on smaller apps in open source that only have one root tag and always empty props. Reviewed By: cpojer Differential Revision: D17226903 fbshipit-source-id: a702daaf3a02600fbe9038c46d294c3392953239
139 lines
4.2 KiB
JavaScript
139 lines
4.2 KiB
JavaScript
/**
|
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*
|
|
* @format
|
|
* @flow
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
const RCTDeviceEventEmitter = require('../EventEmitter/RCTDeviceEventEmitter');
|
|
const infoLog = require('../Utilities/infoLog');
|
|
|
|
import type EmitterSubscription from '../vendor/emitter/EmitterSubscription';
|
|
import NativeBugReporting from './NativeBugReporting';
|
|
import NativeRedBox from '../NativeModules/specs/NativeRedBox';
|
|
|
|
type ExtraData = {[key: string]: string};
|
|
type SourceCallback = () => string;
|
|
type DebugData = {extras: ExtraData, files: ExtraData};
|
|
|
|
function defaultExtras() {
|
|
BugReporting.addFileSource('react_hierarchy.txt', () =>
|
|
require('./dumpReactTree')(),
|
|
);
|
|
}
|
|
|
|
/**
|
|
* A simple class for collecting bug report data. Components can add sources that will be queried when a bug report
|
|
* is created via `collectExtraData`. For example, a list component might add a source that provides the list of rows
|
|
* that are currently visible on screen. Components should also remember to call `remove()` on the object that is
|
|
* returned by `addSource` when they are unmounted.
|
|
*/
|
|
class BugReporting {
|
|
static _extraSources: Map<string, SourceCallback> = new Map();
|
|
static _fileSources: Map<string, SourceCallback> = new Map();
|
|
static _subscription: ?EmitterSubscription = null;
|
|
static _redboxSubscription: ?EmitterSubscription = null;
|
|
|
|
static _maybeInit() {
|
|
if (!BugReporting._subscription) {
|
|
BugReporting._subscription = RCTDeviceEventEmitter.addListener(
|
|
'collectBugExtraData',
|
|
BugReporting.collectExtraData,
|
|
null,
|
|
);
|
|
defaultExtras();
|
|
}
|
|
|
|
if (!BugReporting._redboxSubscription) {
|
|
BugReporting._redboxSubscription = RCTDeviceEventEmitter.addListener(
|
|
'collectRedBoxExtraData',
|
|
BugReporting.collectExtraData,
|
|
null,
|
|
);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Maps a string key to a simple callback that should return a string payload to be attached
|
|
* to a bug report. Source callbacks are called when `collectExtraData` is called.
|
|
*
|
|
* Returns an object to remove the source when the component unmounts.
|
|
*
|
|
* Conflicts trample with a warning.
|
|
*/
|
|
static addSource(
|
|
key: string,
|
|
callback: SourceCallback,
|
|
): {remove: () => void} {
|
|
return this._addSource(key, callback, BugReporting._extraSources);
|
|
}
|
|
|
|
/**
|
|
* Maps a string key to a simple callback that should return a string payload to be attached
|
|
* to a bug report. Source callbacks are called when `collectExtraData` is called.
|
|
*
|
|
* Returns an object to remove the source when the component unmounts.
|
|
*
|
|
* Conflicts trample with a warning.
|
|
*/
|
|
static addFileSource(
|
|
key: string,
|
|
callback: SourceCallback,
|
|
): {remove: () => void} {
|
|
return this._addSource(key, callback, BugReporting._fileSources);
|
|
}
|
|
|
|
static _addSource(
|
|
key: string,
|
|
callback: SourceCallback,
|
|
source: Map<string, SourceCallback>,
|
|
): {remove: () => void} {
|
|
BugReporting._maybeInit();
|
|
if (source.has(key)) {
|
|
console.warn(
|
|
`BugReporting.add* called multiple times for same key '${key}'`,
|
|
);
|
|
}
|
|
source.set(key, callback);
|
|
return {
|
|
remove: () => {
|
|
source.delete(key);
|
|
},
|
|
};
|
|
}
|
|
|
|
/**
|
|
* This can be called from a native bug reporting flow, or from JS code.
|
|
*
|
|
* If available, this will call `NativeModules.BugReporting.setExtraData(extraData)`
|
|
* after collecting `extraData`.
|
|
*/
|
|
static collectExtraData(): DebugData {
|
|
const extraData: ExtraData = {};
|
|
for (const [key, callback] of BugReporting._extraSources) {
|
|
extraData[key] = callback();
|
|
}
|
|
const fileData: ExtraData = {};
|
|
for (const [key, callback] of BugReporting._fileSources) {
|
|
fileData[key] = callback();
|
|
}
|
|
|
|
if (NativeBugReporting != null && NativeBugReporting.setExtraData != null) {
|
|
NativeBugReporting.setExtraData(extraData, fileData);
|
|
}
|
|
|
|
if (NativeRedBox != null && NativeRedBox.setExtraData != null) {
|
|
NativeRedBox.setExtraData(extraData, 'From BugReporting.js');
|
|
}
|
|
|
|
return {extras: extraData, files: fileData};
|
|
}
|
|
}
|
|
|
|
module.exports = BugReporting;
|