Skip to content

Commit f162c9e

Browse files
authored
Fix RN frames on Android ... (#875)
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 fb5dc63 commit f162c9e

File tree

3 files changed

+25
-4
lines changed

3 files changed

+25
-4
lines changed

test/vendor/fixtures/captured-errors.js

Lines changed: 16 additions & 1 deletion
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

Lines changed: 7 additions & 1 deletion
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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ TraceKit.computeStackTrace = (function computeStackTraceWrapper() {
390390
function computeStackTraceFromStackProp(ex) {
391391
if (typeof ex.stack === 'undefined' || !ex.stack) return;
392392

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

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

0 commit comments

Comments
 (0)