constructor()

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);
    }