diff --git a/packages/react-devtools-extensions/src/contentScripts/fileFetcher.js b/packages/react-devtools-extensions/src/contentScripts/fileFetcher.js index 198b4f68cd3..78663acc74f 100644 --- a/packages/react-devtools-extensions/src/contentScripts/fileFetcher.js +++ b/packages/react-devtools-extensions/src/contentScripts/fileFetcher.js @@ -23,7 +23,7 @@ function fetchResource(url) { }); }; - fetch(url, {cache: 'force-cache'}).then( + fetch(url, {cache: 'force-cache', signal: AbortSignal.timeout(60000)}).then( response => { if (response.ok) { response diff --git a/packages/react-devtools-extensions/src/main/fetchFileWithCaching.js b/packages/react-devtools-extensions/src/main/fetchFileWithCaching.js index 15028e99094..f8863372ff9 100644 --- a/packages/react-devtools-extensions/src/main/fetchFileWithCaching.js +++ b/packages/react-devtools-extensions/src/main/fetchFileWithCaching.js @@ -78,6 +78,18 @@ const fetchFromNetworkCache = (url, resolve, reject) => { }); }; +const pendingFetchRequests = new Set(); +function pendingFetchRequestsCleanup({payload, source}) { + if (source === 'react-devtools-background') { + switch (payload?.type) { + case 'fetch-file-with-cache-complete': + case 'fetch-file-with-cache-error': + pendingFetchRequests.delete(payload.url); + } + } +} +chrome.runtime.onMessage.addListener(pendingFetchRequestsCleanup); + const fetchFromPage = async (url, resolve, reject) => { debugLog('[main] fetchFromPage()', url); @@ -97,7 +109,11 @@ const fetchFromPage = async (url, resolve, reject) => { } chrome.runtime.onMessage.addListener(onPortMessage); + if (pendingFetchRequests.has(url)) { + return; + } + pendingFetchRequests.add(url); chrome.runtime.sendMessage({ source: 'devtools-page', payload: {