Skip to content

Commit 958b787

Browse files
committed
Avoid eagerly detecting whether component is error boundary and separate the concepts between forced error states and console errors
With this approach, we can get rid of the warning dialog
1 parent 36827a4 commit 958b787

File tree

13 files changed

+113
-189
lines changed

13 files changed

+113
-189
lines changed

packages/react-devtools-shared/src/__tests__/__snapshots__/profilingCache-test.js.snap

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -719,7 +719,6 @@ Object {
719719
0,
720720
1,
721721
0,
722-
0,
723722
4,
724723
2,
725724
12000,
@@ -730,7 +729,6 @@ Object {
730729
2,
731730
2,
732731
3,
733-
0,
734732
4,
735733
4,
736734
0,
@@ -741,7 +739,6 @@ Object {
741739
2,
742740
2,
743741
4,
744-
0,
745742
4,
746743
5,
747744
1000,
@@ -752,7 +749,6 @@ Object {
752749
2,
753750
2,
754751
0,
755-
0,
756752
4,
757753
6,
758754
1000,
@@ -776,7 +772,6 @@ Object {
776772
2,
777773
1,
778774
2,
779-
0,
780775
4,
781776
7,
782777
2000,
@@ -1183,7 +1178,6 @@ Object {
11831178
0,
11841179
1,
11851180
0,
1186-
0,
11871181
4,
11881182
2,
11891183
11000,
@@ -1194,7 +1188,6 @@ Object {
11941188
2,
11951189
2,
11961190
3,
1197-
0,
11981191
4,
11991192
4,
12001193
0,
@@ -1205,7 +1198,6 @@ Object {
12051198
2,
12061199
2,
12071200
0,
1208-
0,
12091201
4,
12101202
5,
12111203
1000,
@@ -1229,7 +1221,6 @@ Object {
12291221
2,
12301222
1,
12311223
2,
1232-
0,
12331224
4,
12341225
6,
12351226
1000,
@@ -1265,7 +1256,6 @@ Object {
12651256
2,
12661257
1,
12671258
2,
1268-
0,
12691259
4,
12701260
7,
12711261
2000,
@@ -1465,7 +1455,6 @@ Object {
14651455
2,
14661456
1,
14671457
2,
1468-
0,
14691458
4,
14701459
12,
14711460
2000,
@@ -1658,7 +1647,6 @@ Object {
16581647
0,
16591648
1,
16601649
0,
1661-
0,
16621650
4,
16631651
14,
16641652
11000,
@@ -1669,7 +1657,6 @@ Object {
16691657
14,
16701658
2,
16711659
3,
1672-
0,
16731660
4,
16741661
16,
16751662
0,
@@ -1680,7 +1667,6 @@ Object {
16801667
14,
16811668
2,
16821669
0,
1683-
0,
16841670
4,
16851671
17,
16861672
1000,
@@ -2050,7 +2036,6 @@ Object {
20502036
2,
20512037
1,
20522038
2,
2053-
0,
20542039
4,
20552040
12,
20562041
2000,
@@ -2288,7 +2273,6 @@ Object {
22882273
0,
22892274
1,
22902275
0,
2291-
0,
22922276
4,
22932277
14,
22942278
11000,
@@ -2299,7 +2283,6 @@ Object {
22992283
14,
23002284
2,
23012285
3,
2302-
0,
23032286
4,
23042287
16,
23052288
0,
@@ -2310,7 +2293,6 @@ Object {
23102293
14,
23112294
2,
23122295
0,
2313-
0,
23142296
4,
23152297
17,
23162298
1000,
@@ -2490,7 +2472,6 @@ Object {
24902472
0,
24912473
1,
24922474
0,
2493-
0,
24942475
4,
24952476
2,
24962477
0,
@@ -2987,7 +2968,6 @@ Object {
29872968
0,
29882969
1,
29892970
0,
2990-
0,
29912971
4,
29922972
2,
29932973
0,
@@ -2998,7 +2978,6 @@ Object {
29982978
0,
29992979
2,
30002980
0,
3001-
0,
30022981
4,
30032982
3,
30042983
0,
@@ -4197,7 +4176,6 @@ Object {
41974176
0,
41984177
1,
41994178
0,
4200-
0,
42014179
4,
42024180
2,
42034181
0,
@@ -4208,7 +4186,6 @@ Object {
42084186
2,
42094187
2,
42104188
0,
4211-
0,
42124189
4,
42134190
3,
42144191
0,
@@ -4219,7 +4196,6 @@ Object {
42194196
2,
42204197
3,
42214198
0,
4222-
0,
42234199
4,
42244200
4,
42254201
0,
@@ -4230,7 +4206,6 @@ Object {
42304206
4,
42314207
4,
42324208
0,
4233-
0,
42344209
4,
42354210
5,
42364211
0,
@@ -4241,7 +4216,6 @@ Object {
42414216
2,
42424217
5,
42434218
0,
4244-
0,
42454219
4,
42464220
6,
42474221
0,
@@ -4252,7 +4226,6 @@ Object {
42524226
6,
42534227
4,
42544228
0,
4255-
0,
42564229
4,
42574230
7,
42584231
0,

packages/react-devtools-shared/src/__tests__/inspectedElement-test.js

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2405,6 +2405,14 @@ describe('InspectedElement', () => {
24052405
);
24062406

24072407
const errorBoundaryID = ((store.getElementIDAtIndex(0): any): number);
2408+
const inspect = index => {
2409+
// HACK: Recreate TestRenderer instance so we can inspect different
2410+
// elements
2411+
testRendererInstance = TestRenderer.create(null, {
2412+
unstable_isConcurrent: true,
2413+
});
2414+
return inspectElementAtIndex(index);
2415+
};
24082416
const toggleError = async forceError => {
24092417
await withErrorsOrWarningsIgnored(['ErrorBoundary'], async () => {
24102418
await utils.actAsync(() => {
@@ -2421,21 +2429,38 @@ describe('InspectedElement', () => {
24212429
});
24222430
};
24232431

2424-
let inspectedElement = await inspectElementAtIndex(1);
2432+
// Inspect <ErrorBoundary /> and see that we cannot toggle error state
2433+
// on error boundary itself
2434+
let inspectedElement = await inspect(0);
2435+
expect(inspectedElement.canToggleError).toBe(false);
2436+
expect(inspectedElement.errorBoundaryID).toBe(null);
2437+
2438+
// Inspect <Example />
2439+
inspectedElement = await inspect(1);
24252440
expect(inspectedElement.canToggleError).toBe(true);
24262441
expect(inspectedElement.isErrored).toBe(false);
2442+
expect(inspectedElement.errorBoundaryID).toBe(errorBoundaryID);
24272443

2444+
// now force error state on <Example />
24282445
await toggleError(true);
24292446

2430-
inspectedElement = await inspectElementAtIndex(0);
2447+
// we are in error state now, <Example /> won't show up
2448+
expect(store.getElementIDAtIndex(1)).toBe(null);
2449+
2450+
// Inpsect <ErrorBoundary /> to toggle off the error state
2451+
inspectedElement = await inspect(0);
24312452
expect(inspectedElement.canToggleError).toBe(true);
24322453
expect(inspectedElement.isErrored).toBe(true);
2454+
// its error boundary ID is itself because it's caught the error
2455+
expect(inspectedElement.errorBoundaryID).toBe(errorBoundaryID);
24332456

24342457
await toggleError(false);
24352458

2436-
inspectedElement = await inspectElementAtIndex(0);
2459+
// We can now inspect <Example /> with ability to toggle again
2460+
inspectedElement = await inspect(1);
24372461
expect(inspectedElement.canToggleError).toBe(true);
24382462
expect(inspectedElement.isErrored).toBe(false);
2463+
expect(inspectedElement.errorBoundaryID).toBe(errorBoundaryID);
24392464
});
24402465
});
24412466
});

packages/react-devtools-shared/src/__tests__/store-test.js

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -976,41 +976,6 @@ describe('Store', () => {
976976
`);
977977
});
978978

979-
it('should detect if element is an error boundary', async () => {
980-
class ErrorBoundary extends React.Component {
981-
state = {hasError: false};
982-
static getDerivedStateFromError(error) {
983-
return {hasError: true};
984-
}
985-
render() {
986-
return this.props.children;
987-
}
988-
}
989-
class ClassComponent extends React.Component {
990-
render() {
991-
return null;
992-
}
993-
}
994-
const FunctionalComponent = () => null;
995-
996-
const App = () => (
997-
<React.Fragment>
998-
<ErrorBoundary>
999-
<ClassComponent />
1000-
<FunctionalComponent />
1001-
</ErrorBoundary>
1002-
</React.Fragment>
1003-
);
1004-
1005-
const container = document.createElement('div');
1006-
1007-
act(() => ReactDOM.render(<App />, container));
1008-
1009-
expect(store.getElementAtIndex(1).isErrorBoundary).toBe(true);
1010-
expect(store.getElementAtIndex(2).isErrorBoundary).toBe(false);
1011-
expect(store.getElementAtIndex(3).isErrorBoundary).toBe(false);
1012-
});
1013-
1014979
describe('Lazy', () => {
1015980
async function fakeImport(result) {
1016981
return {default: result};

packages/react-devtools-shared/src/backend/legacy/renderer.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -407,8 +407,6 @@ export function attach(
407407
pushOperation(ownerID);
408408
pushOperation(displayNameStringID);
409409
pushOperation(keyStringID);
410-
// isErrorBoundary not supported in legacy renderer
411-
pushOperation(0);
412410
}
413411
}
414412

@@ -805,6 +803,7 @@ export function attach(
805803
// Toggle error boundary did not exist in legacy versions
806804
canToggleError: false,
807805
isErrored: false,
806+
errorBoundaryID: null,
808807

809808
// Suspense did not exist in legacy versions
810809
canToggleSuspense: false,

0 commit comments

Comments
 (0)