From d02d93712ed6a5eda885ceb5116cdc9192b478f2 Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Thu, 18 Apr 2019 16:02:08 +0100 Subject: [PATCH] Assert removal happens in the right order --- src/backend/renderer.js | 8 ++++---- src/devtools/store.js | 13 ++++++++++--- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/backend/renderer.js b/src/backend/renderer.js index 7aa8b1555a..870ceece79 100644 --- a/src/backend/renderer.js +++ b/src/backend/renderer.js @@ -752,13 +752,13 @@ export function attach( nextOperation[1] = id; endNextOperation(false); } else if (!shouldFilterFiber(fiber)) { - // Non-root fibers are deleted during the commit phase. - // They are deleted in the child-first order. However - // DevTools currently expects deletions to be parent-first. - // This is why we unshift deletions rather tha beginNextOperation(2); nextOperation[0] = TREE_OPERATION_REMOVE; nextOperation[1] = id; + // Non-root fibers are deleted during the commit phase. + // They are deleted in the parent-first order. However + // DevTools currently expects deletions to be child-first. + // This is why we prepend the delete operation to the queue. endNextOperation(true); } fiberToIDMap.delete(primaryFiber); diff --git a/src/devtools/store.js b/src/devtools/store.js index 99ba142fca..1e37ffcc1e 100644 --- a/src/devtools/store.js +++ b/src/devtools/store.js @@ -760,8 +760,7 @@ export default class Store extends EventEmitter { this._idToElement.delete(id); - parentElement = ((this._idToElement.get(parentID): any): Element); - if (parentElement == null) { + if (parentID === 0) { if (__DEBUG__) { debug('Remove', `fiber ${id} root`); } @@ -775,7 +774,15 @@ export default class Store extends EventEmitter { if (__DEBUG__) { debug('Remove', `fiber ${id} from parent ${parentID}`); } - + parentElement = ((this._idToElement.get(parentID): any): Element); + if (parentElement === undefined) { + throw new Error( + 'Fiber ' + + id + + ' was removed after its parent. ' + + 'This is a bug in React DevTools.' + ); + } parentElement.children = parentElement.children.filter( childID => childID !== id );