From 49af88991c3a3e79e663e495458fad12d3162894 Mon Sep 17 00:00:00 2001 From: 6h057 <15034695+omarsy@users.noreply.github.com> Date: Fri, 21 Aug 2020 15:31:16 +0200 Subject: [PATCH] Fix DevTools crash when inspecting document.all (#19619) * Add html_all_collection type to correct typeof document.all * process HTMLAllCollection like HTMLElement + fix flow issue * fix lint * move flow fix comment * Make it work with iframes too * optimize how we get html_all_collection type * use once Object.prototype.toString.call --- packages/react-devtools-shared/src/hydration.js | 1 + packages/react-devtools-shared/src/utils.js | 17 +++++++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/react-devtools-shared/src/hydration.js b/packages/react-devtools-shared/src/hydration.js index 23cb0a68fd9b..2815be0f2d22 100644 --- a/packages/react-devtools-shared/src/hydration.js +++ b/packages/react-devtools-shared/src/hydration.js @@ -222,6 +222,7 @@ export function dehydrate( ), ); + case 'html_all_collection': case 'typed_array': case 'iterator': isPathAllowedCheck = isPathAllowed(path); diff --git a/packages/react-devtools-shared/src/utils.js b/packages/react-devtools-shared/src/utils.js index 419aaac0c3dd..87f845105b52 100644 --- a/packages/react-devtools-shared/src/utils.js +++ b/packages/react-devtools-shared/src/utils.js @@ -372,6 +372,7 @@ export type DataType = | 'data_view' | 'date' | 'function' + | 'html_all_collection' | 'html_element' | 'infinity' | 'iterator' @@ -438,14 +439,26 @@ export function getDataType(data: Object): DataType { return 'iterator'; } else if (data.constructor && data.constructor.name === 'RegExp') { return 'regexp'; - } else if (Object.prototype.toString.call(data) === '[object Date]') { - return 'date'; + } else { + const toStringValue = Object.prototype.toString.call(data); + if (toStringValue === '[object Date]') { + return 'date'; + } else if (toStringValue === '[object HTMLAllCollection]') { + return 'html_all_collection'; + } } return 'object'; case 'string': return 'string'; case 'symbol': return 'symbol'; + case 'undefined': + if ( + Object.prototype.toString.call(data) === '[object HTMLAllCollection]' + ) { + return 'html_all_collection'; + } + return 'undefined'; default: return 'unknown'; }