mirror of
https://github.com/facebook/react.git
synced 2026-02-24 12:43:00 +00:00
80 lines
1.7 KiB
JavaScript
80 lines
1.7 KiB
JavaScript
/* global chrome */
|
|
|
|
'use strict';
|
|
|
|
let backendDisconnected: boolean = false;
|
|
let backendInitialized: boolean = false;
|
|
|
|
function sayHelloToBackend() {
|
|
window.postMessage(
|
|
{
|
|
source: 'react-devtools-content-script',
|
|
hello: true,
|
|
},
|
|
'*',
|
|
);
|
|
}
|
|
|
|
function handleMessageFromDevtools(message) {
|
|
window.postMessage(
|
|
{
|
|
source: 'react-devtools-content-script',
|
|
payload: message,
|
|
},
|
|
'*',
|
|
);
|
|
}
|
|
|
|
function handleMessageFromPage(evt) {
|
|
if (
|
|
evt.source === window &&
|
|
evt.data &&
|
|
evt.data.source === 'react-devtools-bridge'
|
|
) {
|
|
backendInitialized = true;
|
|
|
|
port.postMessage(evt.data.payload);
|
|
}
|
|
}
|
|
|
|
function handleDisconnect() {
|
|
backendDisconnected = true;
|
|
|
|
window.removeEventListener('message', handleMessageFromPage);
|
|
|
|
window.postMessage(
|
|
{
|
|
source: 'react-devtools-content-script',
|
|
payload: {
|
|
type: 'event',
|
|
event: 'shutdown',
|
|
},
|
|
},
|
|
'*',
|
|
);
|
|
}
|
|
|
|
// proxy from main page to devtools (via the background page)
|
|
const port = chrome.runtime.connect({
|
|
name: 'content-script',
|
|
});
|
|
port.onMessage.addListener(handleMessageFromDevtools);
|
|
port.onDisconnect.addListener(handleDisconnect);
|
|
|
|
window.addEventListener('message', handleMessageFromPage);
|
|
|
|
sayHelloToBackend();
|
|
|
|
// The backend waits to install the global hook until notified by the content script.
|
|
// In the event of a page reload, the content script might be loaded before the backend is injected.
|
|
// Because of this we need to poll the backend until it has been initialized.
|
|
if (!backendInitialized) {
|
|
const intervalID = setInterval(() => {
|
|
if (backendInitialized || backendDisconnected) {
|
|
clearInterval(intervalID);
|
|
} else {
|
|
sayHelloToBackend();
|
|
}
|
|
}, 500);
|
|
}
|