@@ -9,8 +9,15 @@ import { WindowMessageReader, WindowMessageWriter } from "@gitpod/gitpod-protoco
9
9
import { JsonRpcProxyFactory } from '@gitpod/gitpod-protocol/lib/messaging/proxy-factory' ;
10
10
import { createMessageConnection } from 'vscode-jsonrpc/lib/main' ;
11
11
import { ConsoleLogger } from 'vscode-ws-jsonrpc' ;
12
+ import { isSaaSServerGreaterThan } from '../ide/gitpod-server-compatibility' ;
12
13
import { startUrl } from './urls' ;
13
14
15
+ let openDesktopLinkSupported = false ;
16
+ // TODO(ak) remove after 15.09.2022
17
+ isSaaSServerGreaterThan ( "main.4275" ) . then ( r =>
18
+ openDesktopLinkSupported = r
19
+ )
20
+
14
21
const serverOrigin = startUrl . url . origin ;
15
22
const relocateListener = ( event : MessageEvent ) => {
16
23
if ( event . origin === serverOrigin && event . data . type == 'relocate' && event . data . url ) {
@@ -36,6 +43,7 @@ export function load({ gitpodService }: {
36
43
frame : HTMLIFrameElement
37
44
sessionId : Promise < string >
38
45
setState : ( state : object ) => void
46
+ openDesktopLink : ( link : string ) => void
39
47
} > {
40
48
return new Promise ( resolve => {
41
49
const frame = document . createElement ( 'iframe' ) ;
@@ -56,7 +64,27 @@ export function load({ gitpodService }: {
56
64
const setState = ( state : object ) => {
57
65
frameWindow . postMessage ( { type : 'setState' , state } , serverOrigin ) ;
58
66
}
59
- resolve ( { frame, sessionId, setState } ) ;
67
+ const openDesktopLink = ( link : string ) => {
68
+ if ( openDesktopLinkSupported ) {
69
+ frameWindow . postMessage ( { type : '$openDesktopLink' , link } , serverOrigin ) ;
70
+ } else {
71
+ let redirect = false ;
72
+ try {
73
+ const desktopLink = new URL ( link ) ;
74
+ redirect = desktopLink . protocol !== "http:" && desktopLink . protocol !== "https:" ;
75
+ } catch ( e ) {
76
+ console . error ( "invalid desktop link:" , e ) ;
77
+ }
78
+ // redirect only if points to desktop application
79
+ // don't navigate browser to another page
80
+ if ( redirect ) {
81
+ window . location . href = link ;
82
+ } else {
83
+ window . open ( link , "_blank" , "noopener" ) ;
84
+ }
85
+ }
86
+ }
87
+ resolve ( { frame, sessionId, setState, openDesktopLink } ) ;
60
88
} ;
61
89
} ) ;
62
90
}
0 commit comments