11// this script is called when the VueDevtools panel is activated.
22
3- import { initDevTools } from 'src/devtools'
3+ import { initDevTools , registerFrame } from 'src/devtools'
44import Bridge from 'src/bridge'
55
66initDevTools ( {
7-
87 /**
98 * Inject backend, connect to background, and send back the bridge.
109 *
1110 * @param {Function } cb
1211 */
1312
14- connect ( cb ) {
15- // 1. inject backend code into page
16- injectScript ( chrome . runtime . getURL ( 'build/backend.js' ) , ( ) => {
17- // 2. connect to background to setup proxy
18- const port = chrome . runtime . connect ( {
19- name : '' + chrome . devtools . inspectedWindow . tabId
20- } )
21- let disconnected = false
22- port . onDisconnect . addListener ( ( ) => {
23- disconnected = true
24- } )
25-
26- const bridge = new Bridge ( {
27- listen ( fn ) {
28- port . onMessage . addListener ( fn )
29- } ,
30- send ( data ) {
31- if ( ! disconnected ) {
32- port . postMessage ( data )
33- }
34- }
35- } )
36- // 3. send a proxy API to the panel
37- cb ( bridge )
38- } )
13+ connect ( cb ) {
14+ cb ( )
3915 } ,
4016
4117 /**
@@ -44,20 +20,37 @@ initDevTools({
4420 * @param {Function } reloadFn
4521 */
4622
47- onReload ( reloadFn ) {
23+ onReload ( reloadFn ) {
4824 chrome . devtools . network . onNavigated . addListener ( reloadFn )
4925 }
5026} )
5127
28+
29+ function handleRes ( res ) {
30+ if ( res . type === 'document' ) {
31+ createPortForSubFrame ( res . url )
32+ }
33+ }
34+
35+ // Search for iframes...
36+ // ...on devtool panel load
37+ chrome . devtools . inspectedWindow . getResources ( function ( res ) {
38+ res . map ( handleRes )
39+ } )
40+ // ...when they are added to the page afterwards
41+ chrome . devtools . inspectedWindow . onResourceAdded . addListener ( handleRes )
42+
43+
5244/**
5345 * Inject a globally evaluated script, in the same context with the actual
5446 * user app.
5547 *
5648 * @param {String } scriptName
49+ * @param {String } [frameURL]
5750 * @param {Function } cb
5851 */
5952
60- function injectScript ( scriptName , cb ) {
53+ function injectScriptInFrame ( scriptName , frameURL , cb ) {
6154 const src = `
6255 (function() {
6356 var script = document.constructor.prototype.createElement.call(document, 'script');
@@ -66,10 +59,41 @@ function injectScript (scriptName, cb) {
6659 script.parentNode.removeChild(script);
6760 })()
6861 `
69- chrome . devtools . inspectedWindow . eval ( src , function ( res , err ) {
62+ chrome . devtools . inspectedWindow . eval ( src , { frameURL : frameURL } , function ( res , err ) {
7063 if ( err ) {
7164 console . log ( err )
7265 }
7366 cb ( )
7467 } )
7568}
69+
70+ function createPortForSubFrame ( frameURL ) {
71+ console . log ( 'Frame added:' , frameURL )
72+ // 1. inject backend code into frame
73+ injectScriptInFrame ( chrome . runtime . getURL ( 'build/backend.js' ) , frameURL , ( ) => {
74+ // 2. connect to background to setup proxy
75+ const port = chrome . runtime . connect ( {
76+ name : '' + chrome . devtools . inspectedWindow . tabId + '#' + frameURL ,
77+ } )
78+ let disconnected = false
79+ port . onDisconnect . addListener ( ( ) => {
80+ disconnected = true
81+ } )
82+
83+ const bridge = new Bridge ( {
84+ listen ( fn ) {
85+ port . onMessage . addListener ( fn )
86+ } ,
87+ send ( data ) {
88+ if ( ! disconnected ) {
89+ port . postMessage ( data )
90+ }
91+ }
92+ } , port . name )
93+ // 3. send the new frame along with the proxy API to the panel
94+ registerFrame ( {
95+ url : frameURL ,
96+ bridge : bridge
97+ } )
98+ } )
99+ }
0 commit comments