/* global chrome */
import setExtensionIconAndPopup from './setExtensionIconAndPopup';
import {executeScriptInMainWorld} from './executeScript';
import {EXTENSION_CONTAINED_VERSIONS} from '../utils';
export function handleReactDevToolsHookMessage(message, sender) {
const {payload} = message;
switch (payload?.type) {
case 'react-renderer-attached': {
setExtensionIconAndPopup(payload.reactBuildType, sender.tab.id);
break;
}
}
}
export function handleBackendManagerMessage(message, sender) {
const {payload} = message;
switch (payload?.type) {
case 'require-backends': {
payload.versions.forEach(version => {
if (EXTENSION_CONTAINED_VERSIONS.includes(version)) {
executeScriptInMainWorld({
target: {tabId: sender.tab.id},
files: [`/build/react_devtools_backend_${version}.js`],
});
}
});
break;
}
}
}
export function handleDevToolsPageMessage(message) {
const {payload} = message;
switch (payload?.type) {
// Proxy this message from DevTools page to content script via chrome.tabs.sendMessage
case 'fetch-file-with-cache': {
const {
payload: {tabId, url},
} = message;
if (!tabId) {
throw new Error("Couldn't fetch file sources: tabId not specified");
}
if (!url) {
throw new Error("Couldn't fetch file sources: url not specified");
}
chrome.tabs.sendMessage(tabId, {
source: 'devtools-page',
payload: {
type: 'fetch-file-with-cache',
url,
},
});
break;
}
case 'inject-backend-manager': {
const {
payload: {tabId},
} = message;
if (!tabId) {
throw new Error("Couldn't inject backend manager: tabId not specified");
}
executeScriptInMainWorld({
target: {tabId},
files: ['/build/backendManager.js'],
});
break;
}
}
}
export function handleFetchResourceContentScriptMessage(message) {
const {payload} = message;
switch (payload?.type) {
case 'fetch-file-with-cache-complete':
case 'fetch-file-with-cache-error':
// Forward the result of fetch-in-page requests back to the DevTools page.
// We switch the source here because of inconsistency between Firefox and Chrome
// In Chromium this message will be propagated from content script to DevTools page
// For Firefox, only background script will get this message, so we need to forward it to DevTools page
chrome.runtime.sendMessage({
source: 'react-devtools-background',
payload,
});
break;
}
}