Skip to content

Commit 0a0e6a3

Browse files
committed
Fix RN frames on Android ...
1. Don't treat presence of "native" string everywhere as meaning "native code" 2. Properly parse when not protocol / only leading forward slash fixes #731
1 parent b8d9670 commit 0a0e6a3

File tree

3 files changed

+25
-4
lines changed

3 files changed

+25
-4
lines changed

test/vendor/fixtures/captured-errors.js

+16-1
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ CapturedExceptions.PHANTOMJS_1_19 = {
340340
" at http://path/to/file.js:4287"
341341
};
342342

343-
CapturedExceptions.FIREFOX_50_RESOURCE_URL= {
343+
CapturedExceptions.FIREFOX_50_RESOURCE_URL = {
344344
stack: 'render@resource://path/data/content/bundle.js:5529:16\n' +
345345
'dispatchEvent@resource://path/data/content/vendor.bundle.js:18:23028\n' +
346346
'wrapped@resource://path/data/content/bundle.js:7270:25',
@@ -351,4 +351,19 @@ CapturedExceptions.FIREFOX_50_RESOURCE_URL= {
351351
name: 'TypeError'
352352
};
353353

354+
CapturedExceptions.ANDROID_REACT_NATIVE = {
355+
message: 'Error: test',
356+
name: 'Error',
357+
stack: 'Error: test\n' +
358+
'at render(/home/username/sample-workspace/sampleapp.collect.react/src/components/GpsMonitorScene.js:78:24)\n' +
359+
'at _renderValidatedComponentWithoutOwnerOrContext(/home/username/sample-workspace/sampleapp.collect.react/node_modules/react-native/Libraries/Renderer/src/renderers/shared/stack/reconciler/ReactCompositeComponent.js:1050:29)\n' +
360+
'at _renderValidatedComponent(/home/username/sample-workspace/sampleapp.collect.react/node_modules/react-native/Libraries/Renderer/src/renderers/shared/stack/reconciler/ReactCompositeComponent.js:1075:15)\n' +
361+
'at renderedElement(/home/username/sample-workspace/sampleapp.collect.react/node_modules/react-native/Libraries/Renderer/src/renderers/shared/stack/reconciler/ReactCompositeComponent.js:484:29)\n' +
362+
'at _currentElement(/home/username/sample-workspace/sampleapp.collect.react/node_modules/react-native/Libraries/Renderer/src/renderers/shared/stack/reconciler/ReactCompositeComponent.js:346:40)\n' +
363+
'at child(/home/username/sample-workspace/sampleapp.collect.react/node_modules/react-native/Libraries/Renderer/src/renderers/shared/stack/reconciler/ReactReconciler.js:68:25)\n' +
364+
'at children(/home/username/sample-workspace/sampleapp.collect.react/node_modules/react-native/Libraries/Renderer/src/renderers/shared/stack/reconciler/ReactMultiChild.js:264:10)\n' +
365+
'at this(/home/username/sample-workspace/sampleapp.collect.react/node_modules/react-native/Libraries/Renderer/src/renderers/native/ReactNativeBaseComponent.js:74:41)\n'
366+
367+
};
368+
354369
module.exports = CapturedExceptions;

test/vendor/tracekit-parser.test.js

+7-1
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,12 @@ describe('TraceKit', function () {
216216
assert.deepEqual(stackFrames.stack.length, 3);
217217
assert.deepEqual(stackFrames.stack[0], { url: 'resource://path/data/content/bundle.js', func: 'render', args: [], line: 5529, column: 16 });
218218
});
219-
219+
it('should parse React Native errors on Android', function () {
220+
var stackFrames = TraceKit.computeStackTrace(CapturedExceptions.ANDROID_REACT_NATIVE);
221+
assert.ok(stackFrames);
222+
assert.deepEqual(stackFrames.stack.length, 8);
223+
assert.deepEqual(stackFrames.stack[0], { url: '/home/username/sample-workspace/sampleapp.collect.react/src/components/GpsMonitorScene.js', func: 'render', args: [], line: 78, column: 24 });
224+
assert.deepEqual(stackFrames.stack[7], { url: '/home/username/sample-workspace/sampleapp.collect.react/node_modules/react-native/Libraries/Renderer/src/renderers/native/ReactNativeBaseComponent.js', func: 'this', args: [], line: 74, column: 41 });
225+
});
220226
});
221227
});

vendor/TraceKit/tracekit.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() {
385385
function computeStackTraceFromStackProp(ex) {
386386
if (typeof ex.stack === 'undefined' || !ex.stack) return;
387387

388-
var chrome = /^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|<anonymous>).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,
388+
var chrome = /^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|<anonymous>|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,
389389
gecko = /^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|resource|\[native).*?)(?::(\d+))?(?::(\d+))?\s*$/i,
390390
winjs = /^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i,
391391
lines = ex.stack.split('\n'),
@@ -396,7 +396,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() {
396396

397397
for (var i = 0, j = lines.length; i < j; ++i) {
398398
if ((parts = chrome.exec(lines[i]))) {
399-
var isNative = parts[2] && parts[2].indexOf('native') !== -1;
399+
var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line
400400
element = {
401401
'url': !isNative ? parts[2] : null,
402402
'func': parts[1] || UNKNOWN_FUNCTION,

0 commit comments

Comments
 (0)