File tree Expand file tree Collapse file tree
packages/react-devtools-extensions/src Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -24,16 +24,26 @@ let lastDetectionResult;
2424// So instead, the hook will use postMessage() to pass message to us here.
2525// And when this happens, we'll send a message to the "background page".
2626window . addEventListener ( 'message' , function ( evt ) {
27- if (
28- evt . source === window &&
29- evt . data &&
30- evt . data . source === 'react-devtools-detector'
31- ) {
32- lastDetectionResult = {
33- hasDetectedReact : true ,
34- reactBuildType : evt . data . reactBuildType ,
35- } ;
36- chrome . runtime . sendMessage ( lastDetectionResult ) ;
27+ if ( evt . source === window && evt . data ) {
28+ if ( evt . data . source === 'react-devtools-detector' ) {
29+ lastDetectionResult = {
30+ hasDetectedReact : true ,
31+ reactBuildType : evt . data . reactBuildType ,
32+ } ;
33+ chrome . runtime . sendMessage ( lastDetectionResult ) ;
34+ } else if ( evt . data . source === 'react-devtools-inject-backend' ) {
35+ // The backend is injected by the content script to avoid CSP and Trusted Types violations,
36+ // since content scripts can modify the DOM and are not subject to the page's policies.
37+ // The prototype stuff is in case document.createElement has been modified.
38+ const script = document . constructor . prototype . createElement . call (
39+ document ,
40+ 'script' ,
41+ ) ;
42+ script . src = chrome . runtime . getURL ( 'build/backend.js' ) ;
43+ script . charset = 'utf-8' ;
44+ document . documentElement . appendChild ( script ) ;
45+ script . parentNode . removeChild ( script ) ;
46+ }
3747}
3848} ) ;
3949
Original file line number Diff line number Diff line change @@ -4,7 +4,6 @@ import {createElement} from 'react';
44import { unstable_createRoot as createRoot , flushSync } from 'react-dom' ;
55import Bridge from 'react-devtools-shared/src/bridge' ;
66import Store from 'react-devtools-shared/src/devtools/store' ;
7- import inject from './inject' ;
87import {
98createViewElementSource ,
109getBrowserName ,
@@ -135,7 +134,14 @@ function createPanelIfReactLoaded() {
135134
136135// Initialize the backend only once the Store has been initialized.
137136// Otherwise the Store may miss important initial tree op codes.
138- inject ( chrome . runtime . getURL ( 'build/backend.js' ) ) ;
137+ chrome . devtools . inspectedWindow . eval (
138+ `window.postMessage({ source: 'react-devtools-inject-backend' });` ,
139+ function ( response , evalError ) {
140+ if ( evalError ) {
141+ console . log ( evalError ) ;
142+ }
143+ } ,
144+ ) ;
139145
140146const viewElementSourceFunction = createViewElementSource (
141147bridge ,
You can’t perform that action at this time.
0 commit comments