|
|
|
|
|
import { initDevTools, setAppConnected } from '@front' |
|
import { Bridge, BridgeEvents } from '@vue-devtools/shared-utils' |
|
|
|
let disconnected = false |
|
let connectCount = 0 |
|
let retryConnectTimer |
|
|
|
initDevTools({ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
connect(cb) { |
|
|
|
injectScript(chrome.runtime.getURL('build/backend.js'), () => { |
|
|
|
let port |
|
|
|
const onMessageHandlers = [] |
|
|
|
function connect() { |
|
try { |
|
clearTimeout(retryConnectTimer) |
|
connectCount++ |
|
port = chrome.runtime.connect({ |
|
name: `${chrome.devtools.inspectedWindow.tabId}`, |
|
}) |
|
disconnected = false |
|
port.onDisconnect.addListener(() => { |
|
disconnected = true |
|
setAppConnected(false) |
|
|
|
|
|
retryConnectTimer = setTimeout(connect, 500) |
|
}) |
|
|
|
if (connectCount > 1) { |
|
onMessageHandlers.forEach(fn => port.onMessage.addListener(fn)) |
|
} |
|
} |
|
catch (e) { |
|
console.error(e) |
|
disconnected = true |
|
setAppConnected(false) |
|
|
|
|
|
retryConnectTimer = setTimeout(connect, 1000) |
|
} |
|
} |
|
connect() |
|
|
|
const bridge = new Bridge({ |
|
listen(fn) { |
|
port.onMessage.addListener(fn) |
|
onMessageHandlers.push(fn) |
|
}, |
|
send(data) { |
|
if (!disconnected) { |
|
|
|
|
|
|
|
port.postMessage(data) |
|
} |
|
}, |
|
}) |
|
|
|
bridge.on(BridgeEvents.TO_FRONT_RECONNECTED, () => { |
|
setAppConnected(true) |
|
}) |
|
|
|
|
|
cb(bridge) |
|
}) |
|
}, |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
onReload(reloadFn) { |
|
chrome.devtools.network.onNavigated.addListener(reloadFn) |
|
}, |
|
}) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function injectScript(scriptName, cb) { |
|
const src = ` |
|
(function() { |
|
var script = document.constructor.prototype.createElement.call(document, 'script'); |
|
script.src = "${scriptName}"; |
|
document.documentElement.appendChild(script); |
|
script.parentNode.removeChild(script); |
|
})() |
|
` |
|
chrome.devtools.inspectedWindow.eval(src, (res, err) => { |
|
if (err) { |
|
console.error(err) |
|
} |
|
cb() |
|
}) |
|
} |
|
|