Skip to content

Commit

Permalink
Moved backend injection to the content script (#16752)
Browse files Browse the repository at this point in the history
* Moved backend injection logic to content script

* Moved backend injection logic to content script

* Moved injection logic to content script

* Formatting changes

* remove ability to inject arbitrary scripts

* Removed done(), added some comments explaining the change

* Lint fixes

* Moved inline comment.

* Deleted inject() script since it was no longer being used
  • Loading branch information
Brian Vaughn committed Sep 11, 2019
2 parents 3a49dff + efa780d commit 8f03109
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 36 deletions.
24 changes: 0 additions & 24 deletions packages/react-devtools-extensions/src/inject.js

This file was deleted.

30 changes: 20 additions & 10 deletions packages/react-devtools-extensions/src/injectGlobalHook.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,16 +24,26 @@ let lastDetectionResult;
// So instead, the hook will use postMessage() to pass message to us here.
// And when this happens, we'll send a message to the "background page".
window.addEventListener('message', function(evt) {
if (
evt.source === window &&
evt.data &&
evt.data.source === 'react-devtools-detector'
) {
lastDetectionResult = {
hasDetectedReact: true,
reactBuildType: evt.data.reactBuildType,
};
chrome.runtime.sendMessage(lastDetectionResult);
if (evt.source === window && evt.data) {
if (evt.data.source === 'react-devtools-detector') {
lastDetectionResult = {
hasDetectedReact: true,
reactBuildType: evt.data.reactBuildType,
};
chrome.runtime.sendMessage(lastDetectionResult);
} else if (evt.data.source === 'react-devtools-inject-backend') {
// The backend is injected by the content script to avoid CSP and Trusted Types violations,
// since content scripts can modify the DOM and are not subject to the page's policies.
// The prototype stuff is in case document.createElement has been modified.
const script = document.constructor.prototype.createElement.call(
document,
'script',
);
script.src = chrome.runtime.getURL('build/backend.js');
script.charset = 'utf-8';
document.documentElement.appendChild(script);
script.parentNode.removeChild(script);
}
}
});

Expand Down
10 changes: 8 additions & 2 deletions packages/react-devtools-extensions/src/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import {createElement} from 'react';
import {unstable_createRoot as createRoot, flushSync} from 'react-dom';
import Bridge from 'react-devtools-shared/src/bridge';
import Store from 'react-devtools-shared/src/devtools/store';
import inject from './inject';
import {
createViewElementSource,
getBrowserName,
Expand Down Expand Up @@ -135,7 +134,14 @@ function createPanelIfReactLoaded() {

// Initialize the backend only once the Store has been initialized.
// Otherwise the Store may miss important initial tree op codes.
inject(chrome.runtime.getURL('build/backend.js'));
chrome.devtools.inspectedWindow.eval(
`window.postMessage({ source: 'react-devtools-inject-backend' });`,
function(response, evalError) {
if (evalError) {
console.log(evalError);
}
},
);

const viewElementSourceFunction = createViewElementSource(
bridge,
Expand Down

0 comments on commit 8f03109

Please sign in to comment.