Skip to content

Commit b0ee098

Browse files
committed
Remove Numeric Fallback of Symbols
This was already defeating the XSS issue that Symbols was meant to protect against. So you were already supposed to use a polyfill for security. We rely on real Symbol.for in Flight for Server Components so those require real symbols anyway. We also don't really support IE without additional polyfills anyway.
1 parent 4035157 commit b0ee098

File tree

3 files changed

+21
-62
lines changed

3 files changed

+21
-62
lines changed

packages/shared/ReactSymbols.js

Lines changed: 20 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -11,50 +11,27 @@
1111
// When adding new symbols to this file,
1212
// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'
1313

14-
// The Symbol used to tag the ReactElement-like types. If there is no native Symbol
15-
// nor polyfill, then a plain number is used for performance.
16-
export let REACT_ELEMENT_TYPE = 0xeac7;
17-
export let REACT_PORTAL_TYPE = 0xeaca;
18-
export let REACT_FRAGMENT_TYPE = 0xeacb;
19-
export let REACT_STRICT_MODE_TYPE = 0xeacc;
20-
export let REACT_PROFILER_TYPE = 0xead2;
21-
export let REACT_PROVIDER_TYPE = 0xeacd;
22-
export let REACT_CONTEXT_TYPE = 0xeace;
23-
export let REACT_FORWARD_REF_TYPE = 0xead0;
24-
export let REACT_SUSPENSE_TYPE = 0xead1;
25-
export let REACT_SUSPENSE_LIST_TYPE = 0xead8;
26-
export let REACT_MEMO_TYPE = 0xead3;
27-
export let REACT_LAZY_TYPE = 0xead4;
28-
export let REACT_SCOPE_TYPE = 0xead7;
29-
export let REACT_DEBUG_TRACING_MODE_TYPE = 0xeae1;
30-
export let REACT_OFFSCREEN_TYPE = 0xeae2;
31-
export let REACT_LEGACY_HIDDEN_TYPE = 0xeae3;
32-
export let REACT_CACHE_TYPE = 0xeae4;
33-
export let REACT_TRACING_MARKER_TYPE = 0xeae5;
14+
// The Symbol used to tag the ReactElement-like types.
15+
export let REACT_ELEMENT_TYPE = Symbol.for('react.element');
16+
export let REACT_PORTAL_TYPE = Symbol.for('react.portal');
17+
export let REACT_FRAGMENT_TYPE = Symbol.for('react.fragment');
18+
export let REACT_STRICT_MODE_TYPE = Symbol.for('react.strict_mode');
19+
export let REACT_PROFILER_TYPE = Symbol.for('react.profiler');
20+
export let REACT_PROVIDER_TYPE = Symbol.for('react.provider');
21+
export let REACT_CONTEXT_TYPE = Symbol.for('react.context');
22+
export let REACT_FORWARD_REF_TYPE = Symbol.for('react.forward_ref');
23+
export let REACT_SUSPENSE_TYPE = Symbol.for('react.suspense');
24+
export let REACT_SUSPENSE_LIST_TYPE = Symbol.for('react.suspense_list');
25+
export let REACT_MEMO_TYPE = Symbol.for('react.memo');
26+
export let REACT_LAZY_TYPE = Symbol.for('react.lazy');
27+
export let REACT_SCOPE_TYPE = Symbol.for('react.scope');
28+
export let REACT_DEBUG_TRACING_MODE_TYPE = Symbol.for('react.debug_trace_mode');
29+
export let REACT_OFFSCREEN_TYPE = Symbol.for('react.offscreen');
30+
export let REACT_LEGACY_HIDDEN_TYPE = Symbol.for('react.legacy_hidden');
31+
export let REACT_CACHE_TYPE = Symbol.for('react.cache');
32+
export let REACT_TRACING_MARKER_TYPE = Symbol.for('react.tracing_marker');
3433

35-
if (typeof Symbol === 'function' && Symbol.for) {
36-
const symbolFor = Symbol.for;
37-
REACT_ELEMENT_TYPE = symbolFor('react.element');
38-
REACT_PORTAL_TYPE = symbolFor('react.portal');
39-
REACT_FRAGMENT_TYPE = symbolFor('react.fragment');
40-
REACT_STRICT_MODE_TYPE = symbolFor('react.strict_mode');
41-
REACT_PROFILER_TYPE = symbolFor('react.profiler');
42-
REACT_PROVIDER_TYPE = symbolFor('react.provider');
43-
REACT_CONTEXT_TYPE = symbolFor('react.context');
44-
REACT_FORWARD_REF_TYPE = symbolFor('react.forward_ref');
45-
REACT_SUSPENSE_TYPE = symbolFor('react.suspense');
46-
REACT_SUSPENSE_LIST_TYPE = symbolFor('react.suspense_list');
47-
REACT_MEMO_TYPE = symbolFor('react.memo');
48-
REACT_LAZY_TYPE = symbolFor('react.lazy');
49-
REACT_SCOPE_TYPE = symbolFor('react.scope');
50-
REACT_DEBUG_TRACING_MODE_TYPE = symbolFor('react.debug_trace_mode');
51-
REACT_OFFSCREEN_TYPE = symbolFor('react.offscreen');
52-
REACT_LEGACY_HIDDEN_TYPE = symbolFor('react.legacy_hidden');
53-
REACT_CACHE_TYPE = symbolFor('react.cache');
54-
REACT_TRACING_MARKER_TYPE = symbolFor('react.tracing_marker');
55-
}
56-
57-
const MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;
34+
const MAYBE_ITERATOR_SYMBOL = Symbol.iterator;
5835
const FAUX_ITERATOR_SYMBOL = '@@iterator';
5936

6037
export function getIteratorFn(maybeIterable: ?any): ?() => ?Iterator<*> {

packages/shared/__tests__/ReactSymbols-test.internal.js

Lines changed: 0 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,4 @@ describe('ReactSymbols', () => {
2626
it('Symbol values should be unique', () => {
2727
expectToBeUnique(Object.entries(require('shared/ReactSymbols')));
2828
});
29-
30-
it('numeric values should be unique', () => {
31-
const originalSymbolFor = global.Symbol.for;
32-
global.Symbol.for = null;
33-
try {
34-
const entries = Object.entries(require('shared/ReactSymbols')).filter(
35-
// REACT_ASYNC_MODE_TYPE and REACT_CONCURRENT_MODE_TYPE have the same numeric value
36-
// for legacy backwards compatibility
37-
([key]) => key !== 'REACT_ASYNC_MODE_TYPE',
38-
);
39-
expectToBeUnique(entries);
40-
} finally {
41-
global.Symbol.for = originalSymbolFor;
42-
}
43-
});
4429
});

packages/shared/isValidElementType.js

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,10 +31,7 @@ import {
3131
enableTransitionTracing,
3232
} from './ReactFeatureFlags';
3333

34-
let REACT_MODULE_REFERENCE: number | Symbol = 0;
35-
if (typeof Symbol === 'function') {
36-
REACT_MODULE_REFERENCE = Symbol.for('react.module.reference');
37-
}
34+
let REACT_MODULE_REFERENCE: Symbol = Symbol.for('react.module.reference');
3835

3936
export default function isValidElementType(type: mixed) {
4037
if (typeof type === 'string' || typeof type === 'function') {

0 commit comments

Comments
 (0)