From ccecde76d1ffc7beee5c3e80987990ea233b4ceb Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Fri, 19 Apr 2019 00:29:08 +0100 Subject: [PATCH] Harden assertions --- src/backend/renderer.js | 13 +++++-------- src/devtools/store.js | 19 ++++++++++++++++++- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/backend/renderer.js b/src/backend/renderer.js index 71c10da392..3c08c9adcd 100644 --- a/src/backend/renderer.js +++ b/src/backend/renderer.js @@ -239,15 +239,12 @@ export function attach( parentFiber == null ? null : getDataForFiber(parentFiber); const parentFiberDisplayName = (parentFiberData && parentFiberData.displayName) || 'null'; + // NOTE: calling getFiberID or getPrimaryFiber is unsafe here + // because it will put them in the map. For now, we'll omit them. + // TODO: better debugging story for this. console.log( - `[renderer] %c${name} %c${getFiberID( - getPrimaryFiber(fiber) - )}:${fiberDisplayName} %c${ - parentFiber - ? getFiberID(getPrimaryFiber(parentFiber)) + - ':' + - parentFiberDisplayName - : '' + `[renderer] %c${name} %c${fiberDisplayName} %c${ + parentFiber ? parentFiberDisplayName : '' }`, 'color: red; font-weight: bold;', 'color: blue;', diff --git a/src/devtools/store.js b/src/devtools/store.js index e6cb334166..1010f5c56e 100644 --- a/src/devtools/store.js +++ b/src/devtools/store.js @@ -711,9 +711,17 @@ export default class Store extends EventEmitter { element = ((this._idToElement.get(id): any): Element); parentID = element.parentID; - weightDelta = -element.weight; + if (element.children.length > 0) { + throw new Error( + 'Fiber ' + + id + + ' was removed before its children. ' + + 'This is a bug in React DevTools.' + ); + } + this._idToElement.delete(id); if (parentID === 0) { @@ -769,7 +777,16 @@ export default class Store extends EventEmitter { } element = ((this._idToElement.get(id): any): Element); + const prevChildren = element.children; element.children = Array.from(children); + if (element.children.length !== prevChildren.length) { + throw new Error( + 'Fiber ' + + id + + ' received a different number of children on reorder. ' + + 'This is a bug in React DevTools.' + ); + } if (!element.isCollapsed) { const prevWeight = element.weight;