in src/host/messageRouter.ts [29:66]
constructor(webviewWindow: Window) {
webviewWindow.addEventListener('DOMContentLoaded', () => {
this.toolsFrameWindow = (document.getElementById('devtools-frame') as HTMLIFrameElement).contentWindow;
this.toolsFrameWindow?.addEventListener('load', () => {
this.devtoolsActionReceived = true;
});
this.errorMessageDiv = document.getElementById('error-message') as HTMLElement;
});
const extensionMessageCallback = this.onMessageFromChannel.bind(this);
// Both the DevTools iframe and the extension will post messages to the webview
// Listen for messages and forward to correct recipient based on origin
webviewWindow.addEventListener('message', messageEvent => {
const fromExtension = messageEvent.origin.startsWith('vscode-webview://');
if (!fromExtension) {
// Send message from DevTools to Extension
this.onMessageFromFrame(messageEvent.data.method as FrameToolsEvent, messageEvent.data.args as any[]);
// Record that the DevTools has sent a message to prevent error page from loading
this.devtoolsActionReceived = true;
} else if (this.toolsFrameWindow) {
// Send message from Extension to DevTools
parseMessageFromChannel(
messageEvent.data,
extensionMessageCallback,
);
messageEvent.preventDefault();
messageEvent.stopImmediatePropagation();
}
}, true);
// Inform the extension we are ready to receive messages
this.sendReady();
// Set timeout to show error message if devtools has not loaded within 10 seconds
setTimeout(() => this.showLoadingError(), 10000);
}