Merge pull request #1427 from GNS3/bugfix/1269

Fix console launch on Firefox
This commit is contained in:
Jeremy Grossmann 2023-01-31 17:27:37 +05:45 committed by GitHub
commit 7e172e30ba
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -1,4 +1,5 @@
import { Component, Input } from '@angular/core'; import { Component, Input } from '@angular/core';
import { DeviceDetectorService } from 'ngx-device-detector';
import { Node } from '../../../../../cartography/models/node'; import { Node } from '../../../../../cartography/models/node';
import { Server } from '../../../../../models/server'; import { Server } from '../../../../../models/server';
import { NodeService } from '../../../../../services/node.service'; import { NodeService } from '../../../../../services/node.service';
@ -12,7 +13,7 @@ export class ConsoleDeviceActionBrowserComponent {
@Input() server: Server; @Input() server: Server;
@Input() node: Node; @Input() node: Node;
constructor(private toasterService: ToasterService, private nodeService: NodeService) {} constructor(private toasterService: ToasterService, private nodeService: NodeService, private deviceService: DeviceDetectorService) {}
openConsole() { openConsole() {
this.nodeService.getNode(this.server, this.node).subscribe((node: Node) => { this.nodeService.getNode(this.server, this.node).subscribe((node: Node) => {
@ -21,6 +22,31 @@ export class ConsoleDeviceActionBrowserComponent {
}); });
} }
createHiddenIframe(target: Element, uri: string) {
const iframe = document.createElement("iframe");
iframe.src = uri;
iframe.id = "hiddenIframe";
iframe.style.display = "none";
target.appendChild(iframe);
return iframe;
}
openUriUsingFirefox(uri: string) {
var iframe = (document.querySelector("#hiddenIframe") as HTMLIFrameElement);
if (!iframe) {
iframe = this.createHiddenIframe(document.body, "about:blank");
}
try {
iframe.contentWindow.location.href = uri;
} catch (e) {
if (e.name === "NS_ERROR_UNKNOWN_PROTOCOL") {
this.toasterService.error('Protocol handler does not exist');
}
}
}
startConsole() { startConsole() {
if (this.node.status !== 'started') { if (this.node.status !== 'started') {
this.toasterService.error('This node must be started before a console can be opened'); this.toasterService.error('This node must be started before a console can be opened');
@ -33,22 +59,28 @@ export class ConsoleDeviceActionBrowserComponent {
this.node.console_host = this.server.host; this.node.console_host = this.server.host;
} }
const device = this.deviceService.getDeviceInfo();
try { try {
var uri;
if (this.node.console_type === 'telnet') { if (this.node.console_type === 'telnet') {
location.assign( uri = `gns3+telnet://${this.node.console_host}:${this.node.console}?name=${this.node.name}&project_id=${this.node.project_id}&node_id=${this.node.node_id}`;
`gns3+telnet://${this.node.console_host}:${this.node.console}?name=${this.node.name}&project_id=${this.node.project_id}&node_id=${this.node.node_id}`
);
} else if (this.node.console_type === 'vnc') { } else if (this.node.console_type === 'vnc') {
location.assign( uri = `gns3+vnc://${this.node.console_host}:${this.node.console}?name=${this.node.name}&project_id=${this.node.project_id}&node_id=${this.node.node_id}`;
`gns3+vnc://${this.node.console_host}:${this.node.console}?name=${this.node.name}&project_id=${this.node.project_id}&node_id=${this.node.node_id}`
);
} else if (this.node.console_type.startsWith('spice')) { } else if (this.node.console_type.startsWith('spice')) {
location.assign( uri = `gns3+spice://${this.node.console_host}:${this.node.console}?name=${this.node.name}&project_id=${this.node.project_id}&node_id=${this.node.node_id}`
`gns3+spice://${this.node.console_host}:${this.node.console}?name=${this.node.name}&project_id=${this.node.project_id}&node_id=${this.node.node_id}`
);
} else { } else {
this.toasterService.error('Supported console types are: telnet, vnc, spice and spice+agent.'); this.toasterService.error('Supported console types are: telnet, vnc, spice and spice+agent.');
} }
if (device.browser === "Firefox") {
// Use a hidden iframe otherwise Firefox will disconnect
// from the GNS3 controller websocket if we use location.assign()
this.openUriUsingFirefox(uri);
} else {
location.assign(uri);
}
} catch (e) { } catch (e) {
this.toasterService.error(e); this.toasterService.error(e);
} }