@theia/core 1.43.1 → 1.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (320) hide show
  1. package/README.md +6 -6
  2. package/i18n/nls.cs.json +10 -3
  3. package/i18n/nls.de.json +10 -3
  4. package/i18n/nls.es.json +10 -3
  5. package/i18n/nls.fr.json +10 -3
  6. package/i18n/nls.hu.json +10 -3
  7. package/i18n/nls.it.json +10 -3
  8. package/i18n/nls.ja.json +10 -3
  9. package/i18n/nls.json +10 -3
  10. package/i18n/nls.pl.json +10 -3
  11. package/i18n/nls.pt-br.json +10 -3
  12. package/i18n/nls.pt-pt.json +10 -3
  13. package/i18n/nls.ru.json +10 -3
  14. package/i18n/nls.zh-cn.json +10 -3
  15. package/lib/browser/common-frontend-contribution.d.ts +10 -0
  16. package/lib/browser/common-frontend-contribution.d.ts.map +1 -1
  17. package/lib/browser/common-frontend-contribution.js +68 -10
  18. package/lib/browser/common-frontend-contribution.js.map +1 -1
  19. package/lib/browser/connection-status-service.d.ts +2 -2
  20. package/lib/browser/connection-status-service.d.ts.map +1 -1
  21. package/lib/browser/connection-status-service.js +3 -3
  22. package/lib/browser/connection-status-service.js.map +1 -1
  23. package/lib/browser/connection-status-service.spec.js +6 -6
  24. package/lib/browser/connection-status-service.spec.js.map +1 -1
  25. package/lib/browser/core-preferences.d.ts.map +1 -1
  26. package/lib/browser/core-preferences.js +16 -0
  27. package/lib/browser/core-preferences.js.map +1 -1
  28. package/lib/browser/dialogs.d.ts +0 -1
  29. package/lib/browser/dialogs.d.ts.map +1 -1
  30. package/lib/browser/dialogs.js +1 -34
  31. package/lib/browser/dialogs.js.map +1 -1
  32. package/lib/browser/frontend-application-module.d.ts.map +1 -1
  33. package/lib/browser/frontend-application-module.js +4 -0
  34. package/lib/browser/frontend-application-module.js.map +1 -1
  35. package/lib/browser/icon-theme-contribution.d.ts +1 -0
  36. package/lib/browser/icon-theme-contribution.d.ts.map +1 -1
  37. package/lib/browser/icon-theme-contribution.js +1 -0
  38. package/lib/browser/icon-theme-contribution.js.map +1 -1
  39. package/lib/browser/icon-theme-service.d.ts +1 -0
  40. package/lib/browser/icon-theme-service.d.ts.map +1 -1
  41. package/lib/browser/icon-theme-service.js.map +1 -1
  42. package/lib/browser/language-icon-provider.d.ts +15 -0
  43. package/lib/browser/language-icon-provider.d.ts.map +1 -0
  44. package/lib/browser/language-icon-provider.js +74 -0
  45. package/lib/browser/language-icon-provider.js.map +1 -0
  46. package/lib/browser/language-service.d.ts +22 -0
  47. package/lib/browser/language-service.d.ts.map +1 -1
  48. package/lib/browser/language-service.js +28 -0
  49. package/lib/browser/language-service.js.map +1 -1
  50. package/lib/browser/messaging/connection-source.d.ts +9 -0
  51. package/lib/browser/messaging/connection-source.d.ts.map +1 -0
  52. package/lib/browser/messaging/connection-source.js +20 -0
  53. package/lib/browser/messaging/connection-source.js.map +1 -0
  54. package/lib/browser/messaging/frontend-id-provider.d.ts +13 -0
  55. package/lib/browser/messaging/frontend-id-provider.d.ts.map +1 -0
  56. package/lib/browser/messaging/frontend-id-provider.js +40 -0
  57. package/lib/browser/messaging/frontend-id-provider.js.map +1 -0
  58. package/lib/browser/messaging/messaging-frontend-module.d.ts.map +1 -1
  59. package/lib/browser/messaging/messaging-frontend-module.js +18 -1
  60. package/lib/browser/messaging/messaging-frontend-module.js.map +1 -1
  61. package/lib/browser/messaging/service-connection-provider.d.ts +48 -0
  62. package/lib/browser/messaging/service-connection-provider.d.ts.map +1 -0
  63. package/lib/browser/messaging/service-connection-provider.js +115 -0
  64. package/lib/browser/messaging/service-connection-provider.js.map +1 -0
  65. package/lib/browser/messaging/ws-connection-provider.d.ts +7 -38
  66. package/lib/browser/messaging/ws-connection-provider.d.ts.map +1 -1
  67. package/lib/browser/messaging/ws-connection-provider.js +17 -121
  68. package/lib/browser/messaging/ws-connection-provider.js.map +1 -1
  69. package/lib/browser/messaging/ws-connection-source.d.ts +41 -0
  70. package/lib/browser/messaging/ws-connection-source.d.ts.map +1 -0
  71. package/lib/browser/messaging/ws-connection-source.js +210 -0
  72. package/lib/browser/messaging/ws-connection-source.js.map +1 -0
  73. package/lib/browser/preload/i18n-preload-contribution.js +1 -1
  74. package/lib/browser/preload/i18n-preload-contribution.js.map +1 -1
  75. package/lib/browser/shell/application-shell.js +1 -1
  76. package/lib/browser/shell/application-shell.js.map +1 -1
  77. package/lib/browser/tree/tree-compression/compressed-tree-widget.d.ts +1 -0
  78. package/lib/browser/tree/tree-compression/compressed-tree-widget.d.ts.map +1 -1
  79. package/lib/browser/tree/tree-compression/compressed-tree-widget.js +5 -0
  80. package/lib/browser/tree/tree-compression/compressed-tree-widget.js.map +1 -1
  81. package/lib/browser/tree/tree-widget.d.ts +6 -0
  82. package/lib/browser/tree/tree-widget.d.ts.map +1 -1
  83. package/lib/browser/tree/tree-widget.js +21 -11
  84. package/lib/browser/tree/tree-widget.js.map +1 -1
  85. package/lib/browser/user-working-directory-provider.d.ts +8 -1
  86. package/lib/browser/user-working-directory-provider.d.ts.map +1 -1
  87. package/lib/browser/user-working-directory-provider.js +22 -1
  88. package/lib/browser/user-working-directory-provider.js.map +1 -1
  89. package/lib/browser/window/default-secondary-window-service.d.ts +3 -0
  90. package/lib/browser/window/default-secondary-window-service.d.ts.map +1 -1
  91. package/lib/browser/window/default-secondary-window-service.js +55 -1
  92. package/lib/browser/window/default-secondary-window-service.js.map +1 -1
  93. package/lib/common/contribution-filter/contribution-filter.d.ts +9 -0
  94. package/lib/common/contribution-filter/contribution-filter.d.ts.map +1 -1
  95. package/lib/common/event.js +1 -1
  96. package/lib/common/event.js.map +1 -1
  97. package/lib/common/message-rpc/channel.d.ts.map +1 -1
  98. package/lib/common/message-rpc/channel.js +7 -1
  99. package/lib/common/message-rpc/channel.js.map +1 -1
  100. package/lib/common/message-rpc/message-buffer.d.ts +2 -0
  101. package/lib/common/message-rpc/message-buffer.d.ts.map +1 -1
  102. package/lib/common/message-rpc/message-buffer.js +4 -0
  103. package/lib/common/message-rpc/message-buffer.js.map +1 -1
  104. package/lib/common/message-rpc/uint8-array-message-buffer.d.ts +1 -0
  105. package/lib/common/message-rpc/uint8-array-message-buffer.d.ts.map +1 -1
  106. package/lib/common/message-rpc/uint8-array-message-buffer.js +6 -0
  107. package/lib/common/message-rpc/uint8-array-message-buffer.js.map +1 -1
  108. package/lib/common/messaging/connection-management.d.ts +25 -0
  109. package/lib/common/messaging/connection-management.d.ts.map +1 -0
  110. package/lib/common/messaging/connection-management.js +38 -0
  111. package/lib/common/messaging/connection-management.js.map +1 -0
  112. package/lib/common/messaging/handler.d.ts +1 -0
  113. package/lib/common/messaging/handler.d.ts.map +1 -1
  114. package/lib/common/messaging/handler.js +2 -1
  115. package/lib/common/messaging/handler.js.map +1 -1
  116. package/lib/common/messaging/socket-write-buffer.d.ts +11 -0
  117. package/lib/common/messaging/socket-write-buffer.d.ts.map +1 -0
  118. package/lib/common/messaging/socket-write-buffer.js +50 -0
  119. package/lib/common/messaging/socket-write-buffer.js.map +1 -0
  120. package/lib/common/messaging/web-socket-channel.d.ts +7 -35
  121. package/lib/common/messaging/web-socket-channel.d.ts.map +1 -1
  122. package/lib/common/messaging/web-socket-channel.js +20 -9
  123. package/lib/common/messaging/web-socket-channel.js.map +1 -1
  124. package/lib/common/nls.js +12 -1
  125. package/lib/common/nls.js.map +1 -1
  126. package/lib/electron-browser/messaging/electron-frontend-id-provider.d.ts +5 -0
  127. package/lib/electron-browser/messaging/electron-frontend-id-provider.d.ts.map +1 -0
  128. package/lib/{electron-node/token/electron-token-messaging-contribution.js → electron-browser/messaging/electron-frontend-id-provider.js} +9 -28
  129. package/lib/electron-browser/messaging/electron-frontend-id-provider.js.map +1 -0
  130. package/lib/electron-browser/messaging/electron-ipc-connection-source.d.ts +24 -0
  131. package/lib/electron-browser/messaging/electron-ipc-connection-source.d.ts.map +1 -0
  132. package/lib/electron-browser/messaging/{electron-ipc-connection-provider.js → electron-ipc-connection-source.js} +19 -19
  133. package/lib/electron-browser/messaging/electron-ipc-connection-source.js.map +1 -0
  134. package/lib/electron-browser/messaging/electron-local-ws-connection-source.d.ts +7 -0
  135. package/lib/electron-browser/messaging/electron-local-ws-connection-source.d.ts.map +1 -0
  136. package/lib/electron-browser/messaging/{electron-local-ws-connection-provider.js → electron-local-ws-connection-source.js} +7 -7
  137. package/lib/electron-browser/messaging/electron-local-ws-connection-source.js.map +1 -0
  138. package/lib/electron-browser/messaging/electron-messaging-frontend-module.d.ts.map +1 -1
  139. package/lib/electron-browser/messaging/electron-messaging-frontend-module.js +45 -13
  140. package/lib/electron-browser/messaging/electron-messaging-frontend-module.js.map +1 -1
  141. package/lib/electron-browser/messaging/electron-ws-connection-source.d.ts +12 -0
  142. package/lib/electron-browser/messaging/electron-ws-connection-source.d.ts.map +1 -0
  143. package/lib/electron-browser/messaging/{electron-ws-connection-provider.js → electron-ws-connection-source.js} +14 -21
  144. package/lib/electron-browser/messaging/electron-ws-connection-source.js.map +1 -0
  145. package/lib/electron-browser/preload.d.ts.map +1 -1
  146. package/lib/electron-browser/preload.js +11 -0
  147. package/lib/electron-browser/preload.js.map +1 -1
  148. package/lib/electron-browser/window/electron-secondary-window-service.d.ts +1 -1
  149. package/lib/electron-browser/window/electron-secondary-window-service.d.ts.map +1 -1
  150. package/lib/electron-browser/window/electron-window-module.js +2 -2
  151. package/lib/electron-browser/window/electron-window-module.js.map +1 -1
  152. package/lib/electron-browser/window/electron-window-preferences.js +1 -1
  153. package/lib/electron-browser/window/electron-window-preferences.js.map +1 -1
  154. package/lib/electron-browser/window/electron-window-service.d.ts +4 -0
  155. package/lib/electron-browser/window/electron-window-service.d.ts.map +1 -1
  156. package/lib/electron-browser/window/electron-window-service.js +13 -0
  157. package/lib/electron-browser/window/electron-window-service.js.map +1 -1
  158. package/lib/electron-common/electron-api.d.ts +7 -0
  159. package/lib/electron-common/electron-api.d.ts.map +1 -1
  160. package/lib/electron-common/electron-api.js +3 -1
  161. package/lib/electron-common/electron-api.js.map +1 -1
  162. package/lib/electron-main/electron-api-main.d.ts +1 -0
  163. package/lib/electron-main/electron-api-main.d.ts.map +1 -1
  164. package/lib/electron-main/electron-api-main.js +15 -0
  165. package/lib/electron-main/electron-api-main.js.map +1 -1
  166. package/lib/electron-main/electron-main-application-module.js +5 -5
  167. package/lib/electron-main/electron-main-application-module.js.map +1 -1
  168. package/lib/electron-main/electron-main-application.d.ts +9 -13
  169. package/lib/electron-main/electron-main-application.d.ts.map +1 -1
  170. package/lib/electron-main/electron-main-application.js +60 -28
  171. package/lib/electron-main/electron-main-application.js.map +1 -1
  172. package/lib/electron-main/messaging/electron-connection-handler.d.ts.map +1 -0
  173. package/lib/electron-main/messaging/electron-connection-handler.js.map +1 -0
  174. package/lib/electron-main/messaging/electron-messaging-contribution.d.ts +13 -22
  175. package/lib/electron-main/messaging/electron-messaging-contribution.d.ts.map +1 -1
  176. package/lib/electron-main/messaging/electron-messaging-contribution.js +39 -39
  177. package/lib/electron-main/messaging/electron-messaging-contribution.js.map +1 -1
  178. package/lib/electron-main/messaging/electron-messaging-service.d.ts.map +1 -1
  179. package/lib/electron-main/messaging/electron-messaging-service.js.map +1 -1
  180. package/lib/electron-main/theia-electron-window.d.ts +2 -2
  181. package/lib/electron-main/theia-electron-window.d.ts.map +1 -1
  182. package/lib/electron-main/theia-electron-window.js +3 -2
  183. package/lib/electron-main/theia-electron-window.js.map +1 -1
  184. package/lib/node/backend-application.d.ts +2 -0
  185. package/lib/node/backend-application.d.ts.map +1 -1
  186. package/lib/node/backend-application.js +11 -9
  187. package/lib/node/backend-application.js.map +1 -1
  188. package/lib/node/cli.d.ts +1 -1
  189. package/lib/node/cli.d.ts.map +1 -1
  190. package/lib/node/cli.js +9 -5
  191. package/lib/node/cli.js.map +1 -1
  192. package/lib/node/cli.spec.js +3 -3
  193. package/lib/node/cli.spec.js.map +1 -1
  194. package/lib/node/env-variables/env-variables-server.d.ts +3 -0
  195. package/lib/node/env-variables/env-variables-server.d.ts.map +1 -1
  196. package/lib/node/env-variables/env-variables-server.js +25 -1
  197. package/lib/node/env-variables/env-variables-server.js.map +1 -1
  198. package/lib/node/i18n/localization-server.d.ts +1 -1
  199. package/lib/node/i18n/localization-server.d.ts.map +1 -1
  200. package/lib/node/messaging/default-messaging-service.d.ts +29 -0
  201. package/lib/node/messaging/default-messaging-service.d.ts.map +1 -0
  202. package/lib/node/messaging/default-messaging-service.js +140 -0
  203. package/lib/node/messaging/default-messaging-service.js.map +1 -0
  204. package/lib/node/messaging/frontend-connection-service.d.ts +7 -0
  205. package/lib/node/messaging/frontend-connection-service.d.ts.map +1 -0
  206. package/lib/node/messaging/frontend-connection-service.js +19 -0
  207. package/lib/node/messaging/frontend-connection-service.js.map +1 -0
  208. package/lib/node/messaging/ipc-protocol.js +1 -1
  209. package/lib/node/messaging/ipc-protocol.js.map +1 -1
  210. package/lib/node/messaging/messaging-backend-module.d.ts.map +1 -1
  211. package/lib/node/messaging/messaging-backend-module.js +23 -9
  212. package/lib/node/messaging/messaging-backend-module.js.map +1 -1
  213. package/lib/node/messaging/messaging-service.d.ts +2 -3
  214. package/lib/node/messaging/messaging-service.d.ts.map +1 -1
  215. package/lib/node/messaging/test/test-web-socket-channel.d.ts +3 -3
  216. package/lib/node/messaging/test/test-web-socket-channel.d.ts.map +1 -1
  217. package/lib/node/messaging/test/test-web-socket-channel.js +38 -24
  218. package/lib/node/messaging/test/test-web-socket-channel.js.map +1 -1
  219. package/lib/node/messaging/websocket-endpoint.d.ts +21 -0
  220. package/lib/node/messaging/websocket-endpoint.d.ts.map +1 -0
  221. package/lib/node/messaging/websocket-endpoint.js +89 -0
  222. package/lib/node/messaging/websocket-endpoint.js.map +1 -0
  223. package/lib/node/messaging/websocket-frontend-connection-service.d.ts +30 -0
  224. package/lib/node/messaging/websocket-frontend-connection-service.d.ts.map +1 -0
  225. package/lib/node/messaging/websocket-frontend-connection-service.js +173 -0
  226. package/lib/node/messaging/websocket-frontend-connection-service.js.map +1 -0
  227. package/package.json +6 -6
  228. package/src/browser/common-frontend-contribution.ts +70 -9
  229. package/src/browser/connection-status-service.spec.ts +6 -6
  230. package/src/browser/connection-status-service.ts +2 -2
  231. package/src/browser/core-preferences.ts +16 -0
  232. package/src/browser/dialogs.ts +0 -34
  233. package/src/browser/frontend-application-module.ts +4 -0
  234. package/src/browser/icon-theme-contribution.ts +1 -0
  235. package/src/browser/icon-theme-service.ts +1 -0
  236. package/src/browser/language-icon-provider.ts +55 -0
  237. package/src/browser/language-service.ts +34 -0
  238. package/src/browser/messaging/connection-source.ts +26 -0
  239. package/src/browser/messaging/frontend-id-provider.ts +37 -0
  240. package/src/browser/messaging/messaging-frontend-module.ts +20 -2
  241. package/src/browser/messaging/service-connection-provider.ts +126 -0
  242. package/src/browser/messaging/ws-connection-provider.ts +16 -141
  243. package/src/browser/messaging/ws-connection-source.ts +210 -0
  244. package/src/browser/preload/i18n-preload-contribution.ts +1 -1
  245. package/src/browser/shell/application-shell.ts +1 -1
  246. package/src/browser/style/index.css +1 -0
  247. package/src/browser/style/os.css +87 -0
  248. package/src/browser/tree/tree-compression/compressed-tree-widget.tsx +27 -7
  249. package/src/browser/tree/tree-widget.tsx +21 -10
  250. package/src/browser/user-working-directory-provider.ts +32 -3
  251. package/src/browser/window/default-secondary-window-service.ts +54 -1
  252. package/src/common/contribution-filter/contribution-filter.ts +9 -0
  253. package/src/common/event.ts +1 -1
  254. package/src/common/i18n/nls.metadata.json +7695 -7220
  255. package/src/common/message-rpc/channel.ts +5 -1
  256. package/src/common/message-rpc/message-buffer.ts +6 -0
  257. package/src/common/message-rpc/uint8-array-message-buffer.ts +7 -0
  258. package/src/common/messaging/connection-management.ts +43 -0
  259. package/src/common/messaging/handler.ts +2 -0
  260. package/src/common/messaging/socket-write-buffer.ts +52 -0
  261. package/src/common/messaging/web-socket-channel.ts +28 -45
  262. package/src/common/nls.ts +12 -1
  263. package/src/electron-browser/messaging/electron-frontend-id-provider.ts +25 -0
  264. package/src/electron-browser/messaging/{electron-ipc-connection-provider.ts → electron-ipc-connection-source.ts} +17 -13
  265. package/src/electron-browser/messaging/{electron-local-ws-connection-provider.ts → electron-local-ws-connection-source.ts} +2 -2
  266. package/src/electron-browser/messaging/electron-messaging-frontend-module.ts +49 -12
  267. package/src/electron-browser/messaging/{electron-ws-connection-provider.ts → electron-ws-connection-source.ts} +6 -17
  268. package/src/electron-browser/preload.ts +16 -1
  269. package/src/electron-browser/window/electron-secondary-window-service.ts +1 -1
  270. package/src/electron-browser/window/electron-window-module.ts +1 -1
  271. package/src/electron-browser/window/electron-window-preferences.ts +1 -1
  272. package/src/electron-browser/window/electron-window-service.ts +11 -0
  273. package/src/electron-common/electron-api.ts +8 -0
  274. package/src/electron-main/electron-api-main.ts +20 -1
  275. package/src/electron-main/electron-main-application-module.ts +5 -5
  276. package/src/electron-main/electron-main-application.ts +72 -44
  277. package/src/electron-main/messaging/electron-messaging-contribution.ts +45 -43
  278. package/src/electron-main/messaging/electron-messaging-service.ts +1 -0
  279. package/src/electron-main/theia-electron-window.ts +4 -3
  280. package/src/node/backend-application.ts +14 -11
  281. package/src/node/cli.spec.ts +3 -3
  282. package/src/node/cli.ts +9 -5
  283. package/src/node/env-variables/env-variables-server.ts +21 -1
  284. package/src/node/i18n/localization-server.ts +1 -1
  285. package/src/node/messaging/default-messaging-service.ts +129 -0
  286. package/src/node/messaging/frontend-connection-service.ts +24 -0
  287. package/src/node/messaging/ipc-protocol.ts +1 -1
  288. package/src/node/messaging/messaging-backend-module.ts +25 -10
  289. package/src/node/messaging/messaging-service.ts +3 -3
  290. package/src/node/messaging/test/test-web-socket-channel.ts +32 -27
  291. package/src/node/messaging/websocket-endpoint.ts +79 -0
  292. package/src/node/messaging/websocket-frontend-connection-service.ts +171 -0
  293. package/lib/common/messaging/abstract-connection-provider.d.ts +0 -45
  294. package/lib/common/messaging/abstract-connection-provider.d.ts.map +0 -1
  295. package/lib/common/messaging/abstract-connection-provider.js +0 -93
  296. package/lib/common/messaging/abstract-connection-provider.js.map +0 -1
  297. package/lib/electron-browser/messaging/electron-ipc-connection-provider.d.ts +0 -19
  298. package/lib/electron-browser/messaging/electron-ipc-connection-provider.d.ts.map +0 -1
  299. package/lib/electron-browser/messaging/electron-ipc-connection-provider.js.map +0 -1
  300. package/lib/electron-browser/messaging/electron-local-ws-connection-provider.d.ts +0 -7
  301. package/lib/electron-browser/messaging/electron-local-ws-connection-provider.d.ts.map +0 -1
  302. package/lib/electron-browser/messaging/electron-local-ws-connection-provider.js.map +0 -1
  303. package/lib/electron-browser/messaging/electron-ws-connection-provider.d.ts +0 -17
  304. package/lib/electron-browser/messaging/electron-ws-connection-provider.d.ts.map +0 -1
  305. package/lib/electron-browser/messaging/electron-ws-connection-provider.js.map +0 -1
  306. package/lib/electron-common/messaging/electron-connection-handler.d.ts.map +0 -1
  307. package/lib/electron-common/messaging/electron-connection-handler.js.map +0 -1
  308. package/lib/electron-node/token/electron-token-messaging-contribution.d.ts +0 -16
  309. package/lib/electron-node/token/electron-token-messaging-contribution.d.ts.map +0 -1
  310. package/lib/electron-node/token/electron-token-messaging-contribution.js.map +0 -1
  311. package/lib/node/messaging/messaging-contribution.d.ts +0 -44
  312. package/lib/node/messaging/messaging-contribution.d.ts.map +0 -1
  313. package/lib/node/messaging/messaging-contribution.js +0 -210
  314. package/lib/node/messaging/messaging-contribution.js.map +0 -1
  315. package/src/common/messaging/abstract-connection-provider.ts +0 -115
  316. package/src/electron-node/token/electron-token-messaging-contribution.ts +0 -41
  317. package/src/node/messaging/messaging-contribution.ts +0 -197
  318. /package/lib/{electron-common → electron-main}/messaging/electron-connection-handler.d.ts +0 -0
  319. /package/lib/{electron-common → electron-main}/messaging/electron-connection-handler.js +0 -0
  320. /package/src/{electron-common → electron-main}/messaging/electron-connection-handler.ts +0 -0
@@ -0,0 +1,30 @@
1
+ /// <reference types="node" />
2
+ import { Channel, WriteBuffer } from '../../common/message-rpc';
3
+ import { MessagingService } from './messaging-service';
4
+ import { Socket } from 'socket.io';
5
+ import { ConnectionHandlers } from './default-messaging-service';
6
+ import { FrontendConnectionService } from './frontend-connection-service';
7
+ import { AbstractChannel } from '../../common/message-rpc/channel';
8
+ import { WebsocketEndpoint } from './websocket-endpoint';
9
+ export declare class WebsocketFrontendConnectionService implements FrontendConnectionService {
10
+ protected readonly websocketServer: WebsocketEndpoint;
11
+ protected readonly wsHandlers: ConnectionHandlers<unknown>;
12
+ protected readonly connectionsByFrontend: Map<string, ReconnectableSocketChannel>;
13
+ protected readonly closeTimeouts: Map<string, NodeJS.Timeout>;
14
+ protected readonly channelsMarkedForClose: Set<string>;
15
+ registerConnectionHandler(spec: string, callback: (params: MessagingService.PathParams, channel: Channel) => void): void;
16
+ protected handleConnection(socket: Socket, channelCreatedHandler: (channel: Channel) => void): Promise<void>;
17
+ protected closeConnection(frontEndId: string, reason: string): void;
18
+ protected createConnection(socket: Socket, frontEndId: string): Channel;
19
+ markForClose(channelId: string): void;
20
+ }
21
+ declare class ReconnectableSocketChannel extends AbstractChannel {
22
+ private socket;
23
+ private socketBuffer;
24
+ private disposables;
25
+ connect(socket: Socket): void;
26
+ disconnect(): void;
27
+ getWriteBuffer(): WriteBuffer;
28
+ }
29
+ export {};
30
+ //# sourceMappingURL=websocket-frontend-connection-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-frontend-connection-service.d.ts","sourceRoot":"","sources":["../../../src/node/messaging/websocket-frontend-connection-service.ts"],"names":[],"mappings":";AAeA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAGnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAIzD,qBACa,kCAAmC,YAAW,yBAAyB;IAGhF,SAAS,CAAC,QAAQ,CAAC,eAAe,EAAE,iBAAiB,CAAC;IAEtD,SAAS,CAAC,QAAQ,CAAC,UAAU,8BAA4B;IACzD,SAAS,CAAC,QAAQ,CAAC,qBAAqB,0CAAiD;IACzF,SAAS,CAAC,QAAQ,CAAC,aAAa,8BAAqC;IACrE,SAAS,CAAC,QAAQ,CAAC,sBAAsB,cAAqB;IAE9D,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,gBAAgB,CAAC,UAAU,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI;cAIxG,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAiClH,SAAS,CAAC,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI;IAcnE,SAAS,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO;IA2BvE,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI;CAGxC;AAED,cAAM,0BAA2B,SAAQ,eAAe;IACpD,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,WAAW,CAA8B;IAEjD,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAyB7B,UAAU,IAAI,IAAI;IAKT,cAAc,IAAI,WAAW;CAWzC"}
@@ -0,0 +1,173 @@
1
+ "use strict";
2
+ // *****************************************************************************
3
+ // Copyright (C) 2023 STMicroelectronics and others.
4
+ //
5
+ // This program and the accompanying materials are made available under the
6
+ // terms of the Eclipse Public License v. 2.0 which is available at
7
+ // http://www.eclipse.org/legal/epl-2.0.
8
+ //
9
+ // This Source Code may also be made available under the following Secondary
10
+ // Licenses when the conditions for such availability set forth in the Eclipse
11
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
12
+ // with the GNU Classpath Exception which is available at
13
+ // https://www.gnu.org/software/classpath/license.html.
14
+ //
15
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
17
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
18
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
19
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
20
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
21
+ };
22
+ var __metadata = (this && this.__metadata) || function (k, v) {
23
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.WebsocketFrontendConnectionService = void 0;
27
+ const inversify_1 = require("inversify");
28
+ const default_messaging_service_1 = require("./default-messaging-service");
29
+ const socket_write_buffer_1 = require("../../common/messaging/socket-write-buffer");
30
+ const channel_1 = require("../../common/message-rpc/channel");
31
+ const uint8_array_message_buffer_1 = require("../../common/message-rpc/uint8-array-message-buffer");
32
+ const backend_application_config_provider_1 = require("../backend-application-config-provider");
33
+ const websocket_endpoint_1 = require("./websocket-endpoint");
34
+ const connection_management_1 = require("../../common/messaging/connection-management");
35
+ const common_1 = require("../../common");
36
+ let WebsocketFrontendConnectionService = class WebsocketFrontendConnectionService {
37
+ constructor() {
38
+ this.wsHandlers = new default_messaging_service_1.ConnectionHandlers();
39
+ this.connectionsByFrontend = new Map();
40
+ this.closeTimeouts = new Map();
41
+ this.channelsMarkedForClose = new Set();
42
+ }
43
+ registerConnectionHandler(spec, callback) {
44
+ this.websocketServer.registerConnectionHandler(spec, (params, socket) => this.handleConnection(socket, channel => callback(params, channel)));
45
+ }
46
+ async handleConnection(socket, channelCreatedHandler) {
47
+ // eslint-disable-next-line prefer-const
48
+ let reconnectListener;
49
+ const initialConnectListener = (frontEndId) => {
50
+ socket.off(connection_management_1.ConnectionManagementMessages.INITIAL_CONNECT, initialConnectListener);
51
+ socket.off(connection_management_1.ConnectionManagementMessages.RECONNECT, reconnectListener);
52
+ if (this.connectionsByFrontend.has(frontEndId)) {
53
+ this.closeConnection(frontEndId, 'reconnecting same front end');
54
+ }
55
+ channelCreatedHandler(this.createConnection(socket, frontEndId));
56
+ socket.emit(connection_management_1.ConnectionManagementMessages.INITIAL_CONNECT);
57
+ };
58
+ reconnectListener = (frontEndId) => {
59
+ socket.off(connection_management_1.ConnectionManagementMessages.INITIAL_CONNECT, initialConnectListener);
60
+ socket.off(connection_management_1.ConnectionManagementMessages.RECONNECT, reconnectListener);
61
+ const channel = this.connectionsByFrontend.get(frontEndId);
62
+ if (channel) {
63
+ console.info(`Reconnecting to front end ${frontEndId}`);
64
+ socket.emit(connection_management_1.ConnectionManagementMessages.RECONNECT, true);
65
+ channel.connect(socket);
66
+ const pendingTimeout = this.closeTimeouts.get(frontEndId);
67
+ clearTimeout(pendingTimeout);
68
+ this.closeTimeouts.delete(frontEndId);
69
+ }
70
+ else {
71
+ console.info(`Reconnecting failed for ${frontEndId}`);
72
+ socket.emit(connection_management_1.ConnectionManagementMessages.RECONNECT, false);
73
+ }
74
+ };
75
+ socket.on(connection_management_1.ConnectionManagementMessages.INITIAL_CONNECT, initialConnectListener);
76
+ socket.on(connection_management_1.ConnectionManagementMessages.RECONNECT, reconnectListener);
77
+ }
78
+ closeConnection(frontEndId, reason) {
79
+ console.info(`closing connection for ${frontEndId}`);
80
+ const connection = this.connectionsByFrontend.get(frontEndId); // not called when no connection is present
81
+ this.connectionsByFrontend.delete(frontEndId);
82
+ const pendingTimeout = this.closeTimeouts.get(frontEndId);
83
+ clearTimeout(pendingTimeout);
84
+ this.closeTimeouts.delete(frontEndId);
85
+ connection.onCloseEmitter.fire({ reason });
86
+ connection.close();
87
+ }
88
+ createConnection(socket, frontEndId) {
89
+ console.info(`creating connection for ${frontEndId}`);
90
+ const channel = new ReconnectableSocketChannel();
91
+ channel.connect(socket);
92
+ socket.on('disconnect', evt => {
93
+ console.info('socked closed');
94
+ channel.disconnect();
95
+ const timeout = backend_application_config_provider_1.BackendApplicationConfigProvider.get().frontendConnectionTimeout;
96
+ const isMarkedForClose = this.channelsMarkedForClose.delete(frontEndId);
97
+ if (timeout === 0 || isMarkedForClose) {
98
+ this.closeConnection(frontEndId, evt);
99
+ }
100
+ else if (timeout > 0) {
101
+ console.info(`setting close timeout for id ${frontEndId} to ${timeout}`);
102
+ const handle = setTimeout(() => {
103
+ this.closeConnection(frontEndId, evt);
104
+ }, timeout);
105
+ this.closeTimeouts.set(frontEndId, handle);
106
+ }
107
+ else {
108
+ // timeout < 0: never close the back end
109
+ }
110
+ });
111
+ this.connectionsByFrontend.set(frontEndId, channel);
112
+ return channel;
113
+ }
114
+ markForClose(channelId) {
115
+ this.channelsMarkedForClose.add(channelId);
116
+ }
117
+ };
118
+ __decorate([
119
+ (0, inversify_1.inject)(websocket_endpoint_1.WebsocketEndpoint),
120
+ __metadata("design:type", websocket_endpoint_1.WebsocketEndpoint)
121
+ ], WebsocketFrontendConnectionService.prototype, "websocketServer", void 0);
122
+ WebsocketFrontendConnectionService = __decorate([
123
+ (0, inversify_1.injectable)()
124
+ ], WebsocketFrontendConnectionService);
125
+ exports.WebsocketFrontendConnectionService = WebsocketFrontendConnectionService;
126
+ class ReconnectableSocketChannel extends channel_1.AbstractChannel {
127
+ constructor() {
128
+ super(...arguments);
129
+ this.socketBuffer = new socket_write_buffer_1.SocketWriteBuffer();
130
+ this.disposables = new common_1.DisposableCollection();
131
+ }
132
+ connect(socket) {
133
+ this.disposables = new common_1.DisposableCollection();
134
+ this.socket = socket;
135
+ const errorHandler = (err) => {
136
+ this.onErrorEmitter.fire(err);
137
+ };
138
+ this.disposables.push(common_1.Disposable.create(() => {
139
+ socket.off('error', errorHandler);
140
+ }));
141
+ socket.on('error', errorHandler);
142
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
143
+ const dataListener = (data) => {
144
+ // In the browser context socketIO receives binary messages as ArrayBuffers.
145
+ // So we have to convert them to a Uint8Array before delegating the message to the read buffer.
146
+ const buffer = data instanceof ArrayBuffer ? new Uint8Array(data) : data;
147
+ this.onMessageEmitter.fire(() => new uint8_array_message_buffer_1.Uint8ArrayReadBuffer(buffer));
148
+ };
149
+ this.disposables.push(common_1.Disposable.create(() => {
150
+ socket.off('message', dataListener);
151
+ }));
152
+ socket.on('message', dataListener);
153
+ this.socketBuffer.flush(socket);
154
+ }
155
+ disconnect() {
156
+ this.disposables.dispose();
157
+ this.socket = undefined;
158
+ }
159
+ getWriteBuffer() {
160
+ const writeBuffer = new uint8_array_message_buffer_1.Uint8ArrayWriteBuffer();
161
+ writeBuffer.onCommit(data => {
162
+ var _a;
163
+ if ((_a = this.socket) === null || _a === void 0 ? void 0 : _a.connected) {
164
+ this.socket.send(data);
165
+ }
166
+ else {
167
+ this.socketBuffer.buffer(data);
168
+ }
169
+ });
170
+ return writeBuffer;
171
+ }
172
+ }
173
+ //# sourceMappingURL=websocket-frontend-connection-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"websocket-frontend-connection-service.js","sourceRoot":"","sources":["../../../src/node/messaging/websocket-frontend-connection-service.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@theia/core",
3
- "version": "1.43.1",
3
+ "version": "1.45.0",
4
4
  "description": "Theia is a cloud & desktop IDE framework implemented in TypeScript.",
5
5
  "main": "lib/common/index.js",
6
6
  "typings": "lib/common/index.d.ts",
@@ -16,8 +16,8 @@
16
16
  "@phosphor/signaling": "1",
17
17
  "@phosphor/virtualdom": "1",
18
18
  "@phosphor/widgets": "1",
19
- "@theia/application-package": "1.43.1",
20
- "@theia/request": "1.43.1",
19
+ "@theia/application-package": "1.45.0",
20
+ "@theia/request": "1.45.0",
21
21
  "@types/body-parser": "^1.16.4",
22
22
  "@types/cookie": "^0.3.3",
23
23
  "@types/dompurify": "^2.2.2",
@@ -200,12 +200,12 @@
200
200
  "watch": "theiaext watch"
201
201
  },
202
202
  "devDependencies": {
203
- "@theia/ext-scripts": "1.43.1",
204
- "@theia/re-exports": "1.43.1",
203
+ "@theia/ext-scripts": "1.45.0",
204
+ "@theia/re-exports": "1.45.0",
205
205
  "minimist": "^1.2.0"
206
206
  },
207
207
  "nyc": {
208
208
  "extends": "../../configs/nyc.json"
209
209
  },
210
- "gitHead": "df48285b7d3340e0109e89ffdb0f437ba6710378"
210
+ "gitHead": "2b20a60a0f9b54b19838a0f71760989a19622495"
211
211
  }
@@ -57,7 +57,7 @@ import { QuickInputService, QuickPickItem, QuickPickItemOrSeparator, QuickPickSe
57
57
  import { AsyncLocalizationProvider } from '../common/i18n/localization';
58
58
  import { nls } from '../common/nls';
59
59
  import { CurrentWidgetCommandAdapter } from './shell/current-widget-command-adapter';
60
- import { ConfirmDialog, confirmExitWithOrWithoutSaving, Dialog } from './dialogs';
60
+ import { ConfirmDialog, confirmExit, ConfirmSaveDialog, Dialog } from './dialogs';
61
61
  import { WindowService } from './window/window-service';
62
62
  import { FrontendApplicationConfigProvider } from './frontend-application-config-provider';
63
63
  import { DecorationStyle } from './decoration-style';
@@ -360,6 +360,10 @@ export const supportPaste = browser.isNative || (!browser.isChrome && document.q
360
360
 
361
361
  export const RECENT_COMMANDS_STORAGE_KEY = 'commands';
362
362
 
363
+ export const CLASSNAME_OS_MAC = 'mac';
364
+ export const CLASSNAME_OS_WINDOWS = 'windows';
365
+ export const CLASSNAME_OS_LINUX = 'linux';
366
+
363
367
  @injectable()
364
368
  export class CommonFrontendContribution implements FrontendApplicationContribution, MenuContribution, CommandContribution, KeybindingContribution, ColorContribution {
365
369
 
@@ -452,6 +456,7 @@ export class CommonFrontendContribution implements FrontendApplicationContributi
452
456
  this.initResourceContextKeys();
453
457
  this.registerCtrlWHandling();
454
458
 
459
+ this.setOsClass();
455
460
  this.updateStyles();
456
461
  this.preferences.ready.then(() => this.setSashProperties());
457
462
  this.preferences.onPreferenceChanged(e => this.handlePreferenceChange(e, app));
@@ -480,6 +485,16 @@ export class CommonFrontendContribution implements FrontendApplicationContributi
480
485
  });
481
486
  }
482
487
 
488
+ protected setOsClass(): void {
489
+ if (isOSX) {
490
+ document.body.classList.add(CLASSNAME_OS_MAC);
491
+ } else if (isWindows) {
492
+ document.body.classList.add(CLASSNAME_OS_WINDOWS);
493
+ } else {
494
+ document.body.classList.add(CLASSNAME_OS_LINUX);
495
+ }
496
+ }
497
+
483
498
  protected updateStyles(): void {
484
499
  document.body.classList.remove('theia-editor-highlightModifiedTabs');
485
500
  if (this.preferences['workbench.editor.highlightModifiedTabs']) {
@@ -1185,22 +1200,60 @@ export class CommonFrontendContribution implements FrontendApplicationContributi
1185
1200
  action: async () => {
1186
1201
  const captionsToSave = this.unsavedTabsCaptions();
1187
1202
  const untitledCaptionsToSave = this.unsavedUntitledTabsCaptions();
1188
- const result = await confirmExitWithOrWithoutSaving(captionsToSave, async () => {
1203
+ const shouldExit = await this.confirmExitWithOrWithoutSaving(captionsToSave, async () => {
1189
1204
  await this.saveDirty(untitledCaptionsToSave);
1190
1205
  await this.shell.saveAll();
1191
1206
  });
1192
- if (this.shell.canSaveAll()) {
1193
- this.shouldPreventClose = true;
1194
- return false;
1195
- } else {
1196
- this.shouldPreventClose = false;
1197
- return result;
1198
- }
1207
+ const allSavedOrDoNotSave = (
1208
+ shouldExit === true && untitledCaptionsToSave.length === 0 // Should save and cancel if any captions failed to save
1209
+ ) || shouldExit === false; // Do not save
1210
+
1211
+ this.shouldPreventClose = !allSavedOrDoNotSave;
1212
+ return allSavedOrDoNotSave;
1199
1213
 
1200
1214
  }
1201
1215
  };
1202
1216
  }
1203
1217
  }
1218
+ // Asks the user to confirm whether they want to exit with or without saving the changes
1219
+ private async confirmExitWithOrWithoutSaving(captionsToSave: string[], performSave: () => Promise<void>): Promise<boolean | undefined> {
1220
+ const div: HTMLElement = document.createElement('div');
1221
+ div.innerText = nls.localizeByDefault("Your changes will be lost if you don't save them.");
1222
+
1223
+ let result;
1224
+ if (captionsToSave.length > 0) {
1225
+ const span = document.createElement('span');
1226
+ span.appendChild(document.createElement('br'));
1227
+ captionsToSave.forEach(cap => {
1228
+ const b = document.createElement('b');
1229
+ b.innerText = cap;
1230
+ span.appendChild(b);
1231
+ span.appendChild(document.createElement('br'));
1232
+ });
1233
+ span.appendChild(document.createElement('br'));
1234
+ div.appendChild(span);
1235
+ result = await new ConfirmSaveDialog({
1236
+ title: nls.localizeByDefault('Do you want to save the changes to the following {0} files?', captionsToSave.length),
1237
+ msg: div,
1238
+ dontSave: nls.localizeByDefault("Don't Save"),
1239
+ save: nls.localizeByDefault('Save All'),
1240
+ cancel: Dialog.CANCEL
1241
+ }).open();
1242
+
1243
+ if (result) {
1244
+ await performSave();
1245
+ }
1246
+ } else {
1247
+ // fallback if not passed with an empty caption-list.
1248
+ result = confirmExit();
1249
+ }
1250
+ if (result !== undefined) {
1251
+ return result === true;
1252
+ } else {
1253
+ return undefined;
1254
+ };
1255
+
1256
+ }
1204
1257
  protected unsavedTabsCaptions(): string[] {
1205
1258
  return this.shell.widgets
1206
1259
  .filter(widget => this.saveResourceService.canSave(widget))
@@ -1221,11 +1274,19 @@ export class CommonFrontendContribution implements FrontendApplicationContributi
1221
1274
  this.windowService.reload();
1222
1275
  }
1223
1276
  }
1277
+ /**
1278
+ * saves any dirty widget in toSave
1279
+ * side effect - will pop all widgets from toSave that was saved
1280
+ * @param toSave
1281
+ */
1224
1282
  protected async saveDirty(toSave: Widget[]): Promise<void> {
1225
1283
  for (const widget of toSave) {
1226
1284
  const saveable = Saveable.get(widget);
1227
1285
  if (saveable?.dirty) {
1228
1286
  await this.saveResourceService.save(widget);
1287
+ if (!this.saveResourceService.canSave(widget)) {
1288
+ toSave.pop();
1289
+ }
1229
1290
  }
1230
1291
  }
1231
1292
  }
@@ -33,8 +33,8 @@ import { MockConnectionStatusService } from './test/mock-connection-status-servi
33
33
  import * as sinon from 'sinon';
34
34
 
35
35
  import { Container } from 'inversify';
36
- import { WebSocketConnectionProvider } from './messaging/ws-connection-provider';
37
36
  import { ILogger, Emitter, Loggable } from '../common';
37
+ import { WebSocketConnectionSource } from './messaging/ws-connection-source';
38
38
 
39
39
  disableJSDOM();
40
40
 
@@ -101,7 +101,7 @@ describe('frontend-connection-status', function (): void {
101
101
  let timer: sinon.SinonFakeTimers;
102
102
  let pingSpy: sinon.SinonSpy;
103
103
  beforeEach(() => {
104
- const mockWebSocketConnectionProvider = sinon.createStubInstance(WebSocketConnectionProvider);
104
+ const mockWebSocketConnectionSource = sinon.createStubInstance(WebSocketConnectionSource);
105
105
  const mockPingService: PingService = <PingService>{
106
106
  ping(): Promise<void> {
107
107
  return Promise.resolve(undefined);
@@ -118,11 +118,11 @@ describe('frontend-connection-status', function (): void {
118
118
  testContainer.bind(PingService).toConstantValue(mockPingService);
119
119
  testContainer.bind(ILogger).toConstantValue(mockILogger);
120
120
  testContainer.bind(ConnectionStatusOptions).toConstantValue({ offlineTimeout: OFFLINE_TIMEOUT });
121
- testContainer.bind(WebSocketConnectionProvider).toConstantValue(mockWebSocketConnectionProvider);
121
+ testContainer.bind(WebSocketConnectionSource).toConstantValue(mockWebSocketConnectionSource);
122
122
 
123
- sinon.stub(mockWebSocketConnectionProvider, 'onSocketDidOpen').value(mockSocketOpenedEmitter.event);
124
- sinon.stub(mockWebSocketConnectionProvider, 'onSocketDidClose').value(mockSocketClosedEmitter.event);
125
- sinon.stub(mockWebSocketConnectionProvider, 'onIncomingMessageActivity').value(mockIncomingMessageActivityEmitter.event);
123
+ sinon.stub(mockWebSocketConnectionSource, 'onSocketDidOpen').value(mockSocketOpenedEmitter.event);
124
+ sinon.stub(mockWebSocketConnectionSource, 'onSocketDidClose').value(mockSocketClosedEmitter.event);
125
+ sinon.stub(mockWebSocketConnectionSource, 'onIncomingMessageActivity').value(mockIncomingMessageActivityEmitter.event);
126
126
 
127
127
  timer = sinon.useFakeTimers();
128
128
 
@@ -19,8 +19,8 @@ import { ILogger } from '../common/logger';
19
19
  import { Event, Emitter } from '../common/event';
20
20
  import { DefaultFrontendApplicationContribution } from './frontend-application-contribution';
21
21
  import { StatusBar, StatusBarAlignment } from './status-bar/status-bar';
22
- import { WebSocketConnectionProvider } from './messaging/ws-connection-provider';
23
22
  import { Disposable, DisposableCollection, nls } from '../common';
23
+ import { WebSocketConnectionSource } from './messaging/ws-connection-source';
24
24
 
25
25
  /**
26
26
  * Service for listening on backend connection changes.
@@ -119,7 +119,7 @@ export class FrontendConnectionStatusService extends AbstractConnectionStatusSer
119
119
 
120
120
  private scheduledPing: number | undefined;
121
121
 
122
- @inject(WebSocketConnectionProvider) protected readonly wsConnectionProvider: WebSocketConnectionProvider;
122
+ @inject(WebSocketConnectionSource) protected readonly wsConnectionProvider: WebSocketConnectionSource;
123
123
  @inject(PingService) protected readonly pingService: PingService;
124
124
 
125
125
  @postConstruct()
@@ -119,6 +119,22 @@ export const corePreferenceSchema: PreferenceSchema = {
119
119
  scope: 'application',
120
120
  markdownDescription: nls.localizeByDefault('Separator used by {0}.', '`#window.title#`')
121
121
  },
122
+ 'window.secondaryWindowPlacement': {
123
+ type: 'string',
124
+ enum: ['originalSize', 'halfWidth', 'fullSize'],
125
+ enumDescriptions: [
126
+ nls.localize('theia/core/secondaryWindow/originalSize', 'The position and size of the extracted widget will be the same as the original widget.'),
127
+ nls.localize('theia/core/secondaryWindow/halfWidth', 'The position and size of the extracted widget will be half the width of the running Theia application.'),
128
+ nls.localize('theia/core/secondaryWindow/fullSize', 'The position and size of the extracted widget will be the same as the running Theia application.'),
129
+ ],
130
+ default: 'originalSize',
131
+ description: nls.localize('theia/core/secondaryWindow/description', 'Sets the initial position and size of the extracted secondary window.'),
132
+ },
133
+ 'window.secondaryWindowAlwaysOnTop': {
134
+ type: 'boolean',
135
+ default: false,
136
+ description: nls.localize('theia/core/secondaryWindow/alwaysOnTop', 'When enabled, the secondary window stays above all other windows, including those of different applications.'),
137
+ },
122
138
  'http.proxy': {
123
139
  type: 'string',
124
140
  pattern: '^https?://([^:]*(:[^@]*)?@)?([^:]+|\\[[:0-9a-fA-F]+\\])(:\\d+)?/?$|^$',
@@ -458,40 +458,6 @@ export class ConfirmSaveDialog extends AbstractDialog<boolean | undefined> {
458
458
 
459
459
  }
460
460
 
461
- // Asks the user to confirm whether they want to exit with or without saving the changes
462
- export async function confirmExitWithOrWithoutSaving(captionsToSave: string[], performSave: () => Promise<void>): Promise<boolean> {
463
- const div: HTMLElement = document.createElement('div');
464
- div.innerText = nls.localizeByDefault("Your changes will be lost if you don't save them.");
465
-
466
- if (captionsToSave.length > 0) {
467
- const span = document.createElement('span');
468
- span.appendChild(document.createElement('br'));
469
- captionsToSave.forEach(cap => {
470
- const b = document.createElement('b');
471
- b.innerText = cap;
472
- span.appendChild(b);
473
- span.appendChild(document.createElement('br'));
474
- });
475
- span.appendChild(document.createElement('br'));
476
- div.appendChild(span);
477
- const result = await new ConfirmSaveDialog({
478
- title: nls.localizeByDefault('Do you want to save the changes to the following {0} files?', captionsToSave.length),
479
- msg: div,
480
- dontSave: nls.localizeByDefault("Don't Save"),
481
- save: nls.localizeByDefault('Save All'),
482
- cancel: Dialog.CANCEL
483
- }).open();
484
-
485
- if (result) {
486
- await performSave();
487
- }
488
- return result !== undefined;
489
- } else {
490
- // fallback if not passed with an empty caption-list.
491
- return confirmExit();
492
- }
493
-
494
- }
495
461
  @injectable()
496
462
  export class SingleTextInputDialogProps extends DialogProps {
497
463
  readonly confirmButtonLabel?: string;
@@ -138,6 +138,7 @@ import { StylingParticipant, StylingService } from './styling-service';
138
138
  import { bindCommonStylingParticipants } from './common-styling-participants';
139
139
  import { HoverService } from './hover-service';
140
140
  import { AdditionalViewsMenuWidget, AdditionalViewsMenuWidgetFactory } from './shell/additional-views-menu-widget';
141
+ import { LanguageIconLabelProvider } from './language-icon-provider';
141
142
 
142
143
  export { bindResourceProvider, bindMessageService, bindPreferenceService };
143
144
 
@@ -150,6 +151,8 @@ export const frontendApplicationModule = new ContainerModule((bind, _unbind, _is
150
151
  bind(IconThemeContribution).toService(DefaultFileIconThemeContribution);
151
152
  bind(IconThemeApplicationContribution).toSelf().inSingletonScope();
152
153
  bind(FrontendApplicationContribution).toService(IconThemeApplicationContribution);
154
+ bind(LanguageIconLabelProvider).toSelf().inSingletonScope();
155
+ bind(LabelProviderContribution).toService(LanguageIconLabelProvider);
153
156
 
154
157
  bind(ColorRegistry).toSelf().inSingletonScope();
155
158
  bindContributionProvider(bind, ColorContribution);
@@ -442,6 +445,7 @@ export const frontendApplicationModule = new ContainerModule((bind, _unbind, _is
442
445
 
443
446
  bind(SaveResourceService).toSelf().inSingletonScope();
444
447
  bind(UserWorkingDirectoryProvider).toSelf().inSingletonScope();
448
+ bind(FrontendApplicationContribution).toService(UserWorkingDirectoryProvider);
445
449
 
446
450
  bind(HoverService).toSelf().inSingletonScope();
447
451
 
@@ -50,6 +50,7 @@ export class DefaultFileIconThemeContribution implements IconTheme, IconThemeCon
50
50
  readonly label = 'File Icons (Theia)';
51
51
  readonly hasFileIcons = true;
52
52
  readonly hasFolderIcons = true;
53
+ readonly showLanguageModeIcons = true;
53
54
 
54
55
  registerIconThemes(iconThemes: IconThemeService): MaybePromise<void> {
55
56
  iconThemes.register(this);
@@ -31,6 +31,7 @@ export interface IconThemeDefinition {
31
31
  readonly hasFileIcons?: boolean;
32
32
  readonly hasFolderIcons?: boolean;
33
33
  readonly hidesExplorerArrows?: boolean;
34
+ readonly showLanguageModeIcons?: boolean;
34
35
  }
35
36
 
36
37
  export interface IconTheme extends IconThemeDefinition {
@@ -0,0 +1,55 @@
1
+ // *****************************************************************************
2
+ // Copyright (C) 2023 EclipseSource and others.
3
+ //
4
+ // This program and the accompanying materials are made available under the
5
+ // terms of the Eclipse Public License v. 2.0 which is available at
6
+ // http://www.eclipse.org/legal/epl-2.0.
7
+ //
8
+ // This Source Code may also be made available under the following Secondary
9
+ // Licenses when the conditions for such availability set forth in the Eclipse
10
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
+ // with the GNU Classpath Exception which is available at
12
+ // https://www.gnu.org/software/classpath/license.html.
13
+ //
14
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
+ // *****************************************************************************
16
+
17
+ import { inject, injectable, postConstruct } from 'inversify';
18
+ import { Emitter, Event } from '../common';
19
+ import { IconThemeService } from './icon-theme-service';
20
+ import { DidChangeLabelEvent, LabelProviderContribution } from './label-provider';
21
+ import { LanguageService } from './language-service';
22
+
23
+ @injectable()
24
+ export class LanguageIconLabelProvider implements LabelProviderContribution {
25
+ @inject(IconThemeService) protected readonly iconThemeService: IconThemeService;
26
+ @inject(LanguageService) protected readonly languageService: LanguageService;
27
+
28
+ protected readonly onDidChangeEmitter = new Emitter<DidChangeLabelEvent>();
29
+
30
+ @postConstruct()
31
+ protected init(): void {
32
+ this.languageService.onDidChangeIcon(() => this.fireDidChange());
33
+ }
34
+
35
+ canHandle(element: object): number {
36
+ const current = this.iconThemeService.getDefinition(this.iconThemeService.current);
37
+ return current?.showLanguageModeIcons === true && this.languageService.getIcon(element) ? Number.MAX_SAFE_INTEGER : 0;
38
+ }
39
+
40
+ getIcon(element: object): string | undefined {
41
+ const language = this.languageService.detectLanguage(element);
42
+ return this.languageService.getIcon(language!.id);
43
+ }
44
+
45
+ get onDidChange(): Event<DidChangeLabelEvent> {
46
+ return this.onDidChangeEmitter.event;
47
+ }
48
+
49
+ protected fireDidChange(): void {
50
+ this.onDidChangeEmitter.fire({
51
+ affects: element => this.canHandle(element) > 0
52
+ });
53
+ }
54
+
55
+ }