@theia/core 1.74.0-next.9 → 1.74.1

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 (252) hide show
  1. package/README.md +10 -10
  2. package/i18n/nls.cs.json +143 -16
  3. package/i18n/nls.de.json +143 -16
  4. package/i18n/nls.es.json +143 -16
  5. package/i18n/nls.fr.json +143 -16
  6. package/i18n/nls.hu.json +143 -16
  7. package/i18n/nls.it.json +143 -16
  8. package/i18n/nls.ja.json +143 -16
  9. package/i18n/nls.json +143 -16
  10. package/i18n/nls.ko.json +143 -16
  11. package/i18n/nls.pl.json +143 -16
  12. package/i18n/nls.pt-br.json +143 -16
  13. package/i18n/nls.ru.json +143 -16
  14. package/i18n/nls.tr.json +143 -16
  15. package/i18n/nls.zh-cn.json +143 -16
  16. package/i18n/nls.zh-tw.json +143 -16
  17. package/lib/browser/browser-clipboard-service.d.ts +3 -0
  18. package/lib/browser/browser-clipboard-service.d.ts.map +1 -1
  19. package/lib/browser/browser-clipboard-service.js +8 -1
  20. package/lib/browser/browser-clipboard-service.js.map +1 -1
  21. package/lib/browser/catalog.json +505 -46
  22. package/lib/browser/clipboard-service.d.ts +11 -0
  23. package/lib/browser/clipboard-service.d.ts.map +1 -1
  24. package/lib/browser/clipboard-service.js.map +1 -1
  25. package/lib/browser/common-frontend-contribution.d.ts +3 -0
  26. package/lib/browser/common-frontend-contribution.d.ts.map +1 -1
  27. package/lib/browser/common-frontend-contribution.js +22 -10
  28. package/lib/browser/common-frontend-contribution.js.map +1 -1
  29. package/lib/browser/common-frontend-contribution.spec.d.ts +2 -0
  30. package/lib/browser/common-frontend-contribution.spec.d.ts.map +1 -0
  31. package/lib/browser/common-frontend-contribution.spec.js +71 -0
  32. package/lib/browser/common-frontend-contribution.spec.js.map +1 -0
  33. package/lib/browser/frontend-application-contribution.d.ts +1 -1
  34. package/lib/browser/frontend-application-module.d.ts +2 -2
  35. package/lib/browser/frontend-application-module.d.ts.map +1 -1
  36. package/lib/browser/frontend-application-module.js +13 -2
  37. package/lib/browser/frontend-application-module.js.map +1 -1
  38. package/lib/browser/frontend-application.d.ts.map +1 -1
  39. package/lib/browser/frontend-application.js +12 -2
  40. package/lib/browser/frontend-application.js.map +1 -1
  41. package/lib/browser/index.d.ts +1 -0
  42. package/lib/browser/index.d.ts.map +1 -1
  43. package/lib/browser/index.js +1 -0
  44. package/lib/browser/index.js.map +1 -1
  45. package/lib/browser/keybinding.d.ts.map +1 -1
  46. package/lib/browser/keybinding.js +12 -7
  47. package/lib/browser/keybinding.js.map +1 -1
  48. package/lib/browser/perspective-service.d.ts +173 -0
  49. package/lib/browser/perspective-service.d.ts.map +1 -0
  50. package/lib/browser/perspective-service.js +484 -0
  51. package/lib/browser/perspective-service.js.map +1 -0
  52. package/lib/browser/perspective-service.spec.d.ts +2 -0
  53. package/lib/browser/perspective-service.spec.d.ts.map +1 -0
  54. package/lib/browser/perspective-service.spec.js +1806 -0
  55. package/lib/browser/perspective-service.spec.js.map +1 -0
  56. package/lib/browser/preferences/preference-contribution.d.ts.map +1 -1
  57. package/lib/browser/preferences/preference-contribution.js +9 -1
  58. package/lib/browser/preferences/preference-contribution.js.map +1 -1
  59. package/lib/browser/preferences/preference-service.spec.js +63 -0
  60. package/lib/browser/preferences/preference-service.spec.js.map +1 -1
  61. package/lib/browser/shell/application-shell.d.ts +7 -0
  62. package/lib/browser/shell/application-shell.d.ts.map +1 -1
  63. package/lib/browser/shell/application-shell.js +38 -28
  64. package/lib/browser/shell/application-shell.js.map +1 -1
  65. package/lib/browser/shell/shell-layout-restorer.d.ts +9 -0
  66. package/lib/browser/shell/shell-layout-restorer.d.ts.map +1 -1
  67. package/lib/browser/shell/shell-layout-restorer.js +124 -14
  68. package/lib/browser/shell/shell-layout-restorer.js.map +1 -1
  69. package/lib/browser/shell/shell-layout-restorer.spec.d.ts +2 -0
  70. package/lib/browser/shell/shell-layout-restorer.spec.d.ts.map +1 -0
  71. package/lib/browser/shell/shell-layout-restorer.spec.js +539 -0
  72. package/lib/browser/shell/shell-layout-restorer.spec.js.map +1 -0
  73. package/lib/browser/shell/view-contribution.d.ts +2 -0
  74. package/lib/browser/shell/view-contribution.d.ts.map +1 -1
  75. package/lib/browser/shell/view-contribution.js +5 -1
  76. package/lib/browser/shell/view-contribution.js.map +1 -1
  77. package/lib/browser/status-bar/status-bar.d.ts +2 -0
  78. package/lib/browser/status-bar/status-bar.d.ts.map +1 -1
  79. package/lib/browser/status-bar/status-bar.js +11 -3
  80. package/lib/browser/status-bar/status-bar.js.map +1 -1
  81. package/lib/browser/tree/tree-consistency.spec.js +103 -0
  82. package/lib/browser/tree/tree-consistency.spec.js.map +1 -1
  83. package/lib/browser/tree/tree-widget.d.ts +7 -33
  84. package/lib/browser/tree/tree-widget.d.ts.map +1 -1
  85. package/lib/browser/tree/tree-widget.js +7 -54
  86. package/lib/browser/tree/tree-widget.js.map +1 -1
  87. package/lib/browser/tree/tree.d.ts.map +1 -1
  88. package/lib/browser/tree/tree.js +6 -0
  89. package/lib/browser/tree/tree.js.map +1 -1
  90. package/lib/browser/widgets/index.d.ts +1 -0
  91. package/lib/browser/widgets/index.d.ts.map +1 -1
  92. package/lib/browser/widgets/index.js +1 -0
  93. package/lib/browser/widgets/index.js.map +1 -1
  94. package/lib/browser/widgets/select-component.d.ts +15 -2
  95. package/lib/browser/widgets/select-component.d.ts.map +1 -1
  96. package/lib/browser/widgets/select-component.js +86 -24
  97. package/lib/browser/widgets/select-component.js.map +1 -1
  98. package/lib/browser/widgets/tab-bar-tracker.d.ts +23 -0
  99. package/lib/browser/widgets/tab-bar-tracker.d.ts.map +1 -0
  100. package/lib/browser/widgets/tab-bar-tracker.js +65 -0
  101. package/lib/browser/widgets/tab-bar-tracker.js.map +1 -0
  102. package/lib/browser/widgets/tab-bar-tracker.spec.d.ts +2 -0
  103. package/lib/browser/widgets/tab-bar-tracker.spec.d.ts.map +1 -0
  104. package/lib/browser/widgets/tab-bar-tracker.spec.js +109 -0
  105. package/lib/browser/widgets/tab-bar-tracker.spec.js.map +1 -0
  106. package/lib/browser/window/default-secondary-window-service.d.ts +2 -0
  107. package/lib/browser/window/default-secondary-window-service.d.ts.map +1 -1
  108. package/lib/browser/window/default-secondary-window-service.js +8 -2
  109. package/lib/browser/window/default-secondary-window-service.js.map +1 -1
  110. package/lib/browser/window/default-window-service.d.ts +19 -0
  111. package/lib/browser/window/default-window-service.d.ts.map +1 -1
  112. package/lib/browser/window/default-window-service.js +34 -5
  113. package/lib/browser/window/default-window-service.js.map +1 -1
  114. package/lib/browser/window/default-window-service.spec.js +22 -0
  115. package/lib/browser/window/default-window-service.spec.js.map +1 -1
  116. package/lib/browser/window/secondary-window-service.d.ts +7 -0
  117. package/lib/browser/window/secondary-window-service.d.ts.map +1 -1
  118. package/lib/browser/window/window-service.d.ts +1 -1
  119. package/lib/browser-only/messaging/frontend-only-service-connection-provider.d.ts +13 -2
  120. package/lib/browser-only/messaging/frontend-only-service-connection-provider.d.ts.map +1 -1
  121. package/lib/browser-only/messaging/frontend-only-service-connection-provider.js +31 -3
  122. package/lib/browser-only/messaging/frontend-only-service-connection-provider.js.map +1 -1
  123. package/lib/common/preferences/index.d.ts +1 -0
  124. package/lib/common/preferences/index.d.ts.map +1 -1
  125. package/lib/common/preferences/index.js +1 -0
  126. package/lib/common/preferences/index.js.map +1 -1
  127. package/lib/common/preferences/preference-provider.d.ts +15 -0
  128. package/lib/common/preferences/preference-provider.d.ts.map +1 -1
  129. package/lib/common/preferences/preference-provider.js +21 -1
  130. package/lib/common/preferences/preference-provider.js.map +1 -1
  131. package/lib/common/preferences/preference-provider.spec.js +17 -0
  132. package/lib/common/preferences/preference-provider.spec.js.map +1 -1
  133. package/lib/common/preferences/preference-scope.d.ts +6 -1
  134. package/lib/common/preferences/preference-scope.d.ts.map +1 -1
  135. package/lib/common/preferences/preference-scope.js +5 -0
  136. package/lib/common/preferences/preference-scope.js.map +1 -1
  137. package/lib/common/preferences/preference-scope.spec.js +5 -3
  138. package/lib/common/preferences/preference-scope.spec.js.map +1 -1
  139. package/lib/common/preferences/preference-service.d.ts +19 -0
  140. package/lib/common/preferences/preference-service.d.ts.map +1 -1
  141. package/lib/common/preferences/preference-service.js +34 -5
  142. package/lib/common/preferences/preference-service.js.map +1 -1
  143. package/lib/common/preferences/session-preference-provider.d.ts +17 -0
  144. package/lib/common/preferences/session-preference-provider.d.ts.map +1 -0
  145. package/lib/common/preferences/session-preference-provider.js +77 -0
  146. package/lib/common/preferences/session-preference-provider.js.map +1 -0
  147. package/lib/common/preferences/session-preference-provider.spec.d.ts +2 -0
  148. package/lib/common/preferences/session-preference-provider.spec.d.ts.map +1 -0
  149. package/lib/common/preferences/session-preference-provider.spec.js +71 -0
  150. package/lib/common/preferences/session-preference-provider.spec.js.map +1 -0
  151. package/lib/electron-browser/electron-clipboard-service.d.ts +3 -0
  152. package/lib/electron-browser/electron-clipboard-service.d.ts.map +1 -1
  153. package/lib/electron-browser/electron-clipboard-service.js +6 -0
  154. package/lib/electron-browser/electron-clipboard-service.js.map +1 -1
  155. package/lib/electron-browser/menu/electron-menu-contribution.js +1 -1
  156. package/lib/electron-browser/menu/electron-menu-contribution.js.map +1 -1
  157. package/lib/electron-browser/preload.d.ts.map +1 -1
  158. package/lib/electron-browser/preload.js +2 -1
  159. package/lib/electron-browser/preload.js.map +1 -1
  160. package/lib/electron-browser/window/electron-secondary-window-service.js +1 -1
  161. package/lib/electron-browser/window/electron-secondary-window-service.js.map +1 -1
  162. package/lib/electron-browser/window/electron-window-service.js +3 -3
  163. package/lib/electron-browser/window/electron-window-service.js.map +1 -1
  164. package/lib/electron-common/electron-api.d.ts +2 -0
  165. package/lib/electron-common/electron-api.d.ts.map +1 -1
  166. package/lib/electron-common/electron-api.js +2 -1
  167. package/lib/electron-common/electron-api.js.map +1 -1
  168. package/lib/electron-main/electron-api-main.d.ts.map +1 -1
  169. package/lib/electron-main/electron-api-main.js +43 -0
  170. package/lib/electron-main/electron-api-main.js.map +1 -1
  171. package/lib/electron-main/electron-main-application.d.ts.map +1 -1
  172. package/lib/electron-main/electron-main-application.js +3 -0
  173. package/lib/electron-main/electron-main-application.js.map +1 -1
  174. package/lib/electron-node/hosting/electron-backend-hosting-module.d.ts.map +1 -1
  175. package/lib/electron-node/hosting/electron-backend-hosting-module.js +7 -0
  176. package/lib/electron-node/hosting/electron-backend-hosting-module.js.map +1 -1
  177. package/lib/electron-node/hosting/electron-backend-hosting-module.spec.d.ts +2 -0
  178. package/lib/electron-node/hosting/electron-backend-hosting-module.spec.d.ts.map +1 -0
  179. package/lib/electron-node/hosting/electron-backend-hosting-module.spec.js +39 -0
  180. package/lib/electron-node/hosting/electron-backend-hosting-module.spec.js.map +1 -0
  181. package/lib/node/hosting/backend-hosting-module.d.ts.map +1 -1
  182. package/lib/node/hosting/backend-hosting-module.js +4 -1
  183. package/lib/node/hosting/backend-hosting-module.js.map +1 -1
  184. package/lib/node/hosting/browser-connection-token.d.ts +29 -1
  185. package/lib/node/hosting/browser-connection-token.d.ts.map +1 -1
  186. package/lib/node/hosting/browser-connection-token.js +25 -1
  187. package/lib/node/hosting/browser-connection-token.js.map +1 -1
  188. package/lib/node/hosting/browser-connection-token.spec.js +70 -0
  189. package/lib/node/hosting/browser-connection-token.spec.js.map +1 -1
  190. package/lib/node/index.d.ts +1 -0
  191. package/lib/node/index.d.ts.map +1 -1
  192. package/lib/node/index.js +3 -1
  193. package/lib/node/index.js.map +1 -1
  194. package/package.json +11 -11
  195. package/src/browser/browser-clipboard-service.ts +7 -1
  196. package/src/browser/clipboard-service.ts +11 -0
  197. package/src/browser/common-frontend-contribution.spec.ts +84 -0
  198. package/src/browser/common-frontend-contribution.ts +22 -10
  199. package/src/browser/frontend-application-contribution.ts +1 -1
  200. package/src/browser/frontend-application-module.ts +15 -3
  201. package/src/browser/frontend-application.ts +12 -4
  202. package/src/browser/index.ts +1 -0
  203. package/src/browser/keybinding.ts +12 -7
  204. package/src/browser/perspective-service.spec.ts +2270 -0
  205. package/src/browser/perspective-service.ts +625 -0
  206. package/src/browser/preferences/preference-contribution.ts +9 -1
  207. package/src/browser/preferences/preference-service.spec.ts +72 -0
  208. package/src/browser/shell/application-shell.ts +41 -26
  209. package/src/browser/shell/shell-layout-restorer.spec.ts +746 -0
  210. package/src/browser/shell/shell-layout-restorer.ts +134 -13
  211. package/src/browser/shell/view-contribution.ts +6 -1
  212. package/src/browser/status-bar/status-bar.tsx +13 -3
  213. package/src/browser/style/select-component.css +16 -0
  214. package/src/browser/style/sidepanel.css +5 -0
  215. package/src/browser/style/status-bar.css +1 -1
  216. package/src/browser/tree/tree-consistency.spec.ts +119 -0
  217. package/src/browser/tree/tree-widget.tsx +12 -78
  218. package/src/browser/tree/tree.ts +6 -0
  219. package/src/browser/widgets/index.ts +1 -0
  220. package/src/browser/widgets/select-component.tsx +90 -24
  221. package/src/browser/widgets/tab-bar-tracker.spec.ts +121 -0
  222. package/src/browser/widgets/tab-bar-tracker.ts +68 -0
  223. package/src/browser/window/default-secondary-window-service.ts +8 -2
  224. package/src/browser/window/default-window-service.spec.ts +22 -0
  225. package/src/browser/window/default-window-service.ts +37 -5
  226. package/src/browser/window/secondary-window-service.ts +7 -0
  227. package/src/browser/window/window-service.ts +1 -1
  228. package/src/browser-only/messaging/frontend-only-service-connection-provider.ts +32 -3
  229. package/src/common/i18n/nls.metadata.json +4149 -888
  230. package/src/common/preferences/index.ts +1 -0
  231. package/src/common/preferences/preference-provider.spec.ts +17 -0
  232. package/src/common/preferences/preference-provider.ts +22 -1
  233. package/src/common/preferences/preference-scope.spec.ts +5 -3
  234. package/src/common/preferences/preference-scope.ts +6 -1
  235. package/src/common/preferences/preference-service.ts +39 -5
  236. package/src/common/preferences/session-preference-provider.spec.ts +78 -0
  237. package/src/common/preferences/session-preference-provider.ts +69 -0
  238. package/src/electron-browser/electron-clipboard-service.ts +5 -0
  239. package/src/electron-browser/menu/electron-menu-contribution.ts +1 -1
  240. package/src/electron-browser/menu/electron-menu-style.css +3 -1
  241. package/src/electron-browser/preload.ts +5 -2
  242. package/src/electron-browser/window/electron-secondary-window-service.ts +1 -1
  243. package/src/electron-browser/window/electron-window-service.ts +3 -3
  244. package/src/electron-common/electron-api.ts +4 -0
  245. package/src/electron-main/electron-api-main.ts +56 -3
  246. package/src/electron-main/electron-main-application.ts +3 -0
  247. package/src/electron-node/hosting/electron-backend-hosting-module.spec.ts +42 -0
  248. package/src/electron-node/hosting/electron-backend-hosting-module.ts +8 -0
  249. package/src/node/hosting/backend-hosting-module.ts +5 -2
  250. package/src/node/hosting/browser-connection-token.spec.ts +92 -0
  251. package/src/node/hosting/browser-connection-token.ts +45 -1
  252. package/src/node/index.ts +1 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAgBA,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,SAAS,CAAC;AACxB,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,OAAO,CAAC;AACtB,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AAgBA,cAAc,uBAAuB,CAAC;AACtC,cAAc,kBAAkB,CAAC;AACjC,cAAc,SAAS,CAAC;AACxB,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,OAAO,CAAC;AACtB,cAAc,mBAAmB,CAAC;AAClC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,oCAAoC,CAAC"}
package/lib/node/index.js CHANGED
@@ -15,7 +15,7 @@
15
15
  // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
16
16
  // *****************************************************************************
17
17
  Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.BackendRequestAllowedContribution = exports.FileSystemLocking = void 0;
18
+ exports.HttpConnectionValidator = exports.BackendRequestAllowedContribution = exports.FileSystemLocking = void 0;
19
19
  const tslib_1 = require("tslib");
20
20
  tslib_1.__exportStar(require("./backend-application"), exports);
21
21
  tslib_1.__exportStar(require("./backend-global"), exports);
@@ -28,4 +28,6 @@ var filesystem_locking_1 = require("./filesystem-locking");
28
28
  Object.defineProperty(exports, "FileSystemLocking", { enumerable: true, get: function () { return filesystem_locking_1.FileSystemLocking; } });
29
29
  var backend_request_facade_1 = require("./request/backend-request-facade");
30
30
  Object.defineProperty(exports, "BackendRequestAllowedContribution", { enumerable: true, get: function () { return backend_request_facade_1.BackendRequestAllowedContribution; } });
31
+ var browser_connection_token_1 = require("./hosting/browser-connection-token");
32
+ Object.defineProperty(exports, "HttpConnectionValidator", { enumerable: true, get: function () { return browser_connection_token_1.HttpConnectionValidator; } });
31
33
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;AAEhF,gEAAsC;AACtC,2DAAiC;AACjC,kDAAwB;AACxB,6DAAmC;AACnC,sDAA4B;AAC5B,gDAAsB;AACtB,4DAAkC;AAClC,2DAAyD;AAAhD,uHAAA,iBAAiB,OAAA;AAC1B,2EAAqF;AAA5E,2IAAA,iCAAiC,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;AAEhF,gEAAsC;AACtC,2DAAiC;AACjC,kDAAwB;AACxB,6DAAmC;AACnC,sDAA4B;AAC5B,gDAAsB;AACtB,4DAAkC;AAClC,2DAAyD;AAAhD,uHAAA,iBAAiB,OAAA;AAC1B,2EAAqF;AAA5E,2IAAA,iCAAiC,OAAA;AAC1C,+EAA6E;AAApE,mIAAA,uBAAuB,OAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@theia/core",
3
- "version": "1.74.0-next.9+f24bc8b12",
3
+ "version": "1.74.1",
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",
@@ -17,8 +17,8 @@
17
17
  "@lumino/virtualdom": "^2.0.4",
18
18
  "@lumino/widgets": "2.7.5",
19
19
  "@parcel/watcher": "^2.5.6",
20
- "@theia/application-package": "1.74.0-next.9+f24bc8b12",
21
- "@theia/request": "1.74.0-next.9+f24bc8b12",
20
+ "@theia/application-package": "1.74.1",
21
+ "@theia/request": "1.74.1",
22
22
  "@types/body-parser": "^1.19.6",
23
23
  "@types/express": "^4.17.25",
24
24
  "@types/fs-extra": "^4.0.15",
@@ -35,7 +35,7 @@
35
35
  "async-mutex": "^0.4.1",
36
36
  "body-parser": "^1.20.5",
37
37
  "cookie": "^1.1.1",
38
- "dompurify": "^3.4.7",
38
+ "dompurify": "^3.4.11",
39
39
  "drivelist": "^12.0.2",
40
40
  "express": "^4.22.2",
41
41
  "fast-json-stable-stringify": "^2.1.0",
@@ -51,10 +51,10 @@
51
51
  "keytar": "7.9.0",
52
52
  "lodash.debounce": "^4.0.8",
53
53
  "lodash.throttle": "^4.1.1",
54
- "markdown-it": "^14.2.0",
54
+ "markdown-it": "^14.3.0",
55
55
  "markdown-it-anchor": "^9.2.0",
56
56
  "markdown-it-emoji": "^3.0.0",
57
- "msgpackr": "^1.11.12",
57
+ "msgpackr": "^1.12.1",
58
58
  "p-debounce": "^2.1.0",
59
59
  "perfect-scrollbar": "1.5.5",
60
60
  "react-tooltip": "^4.5.1",
@@ -69,7 +69,7 @@
69
69
  "vscode-languageserver-protocol": "3.17.5",
70
70
  "vscode-uri": "3.0.8",
71
71
  "ws": "^8.21.0",
72
- "yargs": "^17.7.2"
72
+ "yargs": "^17.7.3"
73
73
  },
74
74
  "peerDependencies": {
75
75
  "@theia/electron": "*",
@@ -218,9 +218,9 @@
218
218
  "watch": "theiaext watch"
219
219
  },
220
220
  "devDependencies": {
221
- "@theia/ext-scripts": "1.73.0",
222
- "@theia/re-exports": "1.73.0",
223
- "@types/react": "^18.3.28",
221
+ "@theia/ext-scripts": "1.74.1",
222
+ "@theia/re-exports": "1.74.1",
223
+ "@types/react": "^18.3.31",
224
224
  "@types/react-dom": "^18.3.7",
225
225
  "minimist": "^1.2.8",
226
226
  "nodejs-file-downloader": "4.13.0",
@@ -230,5 +230,5 @@
230
230
  "nyc": {
231
231
  "extends": "../../configs/nyc.json"
232
232
  },
233
- "gitHead": "f24bc8b12e11ee4b054527565df3648c363b7f86"
233
+ "gitHead": "eb2ffacbac2d76cfb8c0d2dd682d340db746a1b2"
234
234
  }
@@ -17,6 +17,7 @@
17
17
  import { injectable, inject } from 'inversify';
18
18
  import { isFirefox } from './browser';
19
19
  import { ClipboardService } from './clipboard-service';
20
+ import { Emitter, Event } from '../common/event';
20
21
  import { ILogger } from '../common/logger';
21
22
  import { MessageService } from '../common/message-service';
22
23
  import { nls } from '../common/nls';
@@ -41,6 +42,9 @@ export class BrowserClipboardService implements ClipboardService {
41
42
  @inject(ILogger)
42
43
  protected readonly logger: ILogger;
43
44
 
45
+ protected readonly onDidWriteTextEmitter = new Emitter<string>();
46
+ readonly onDidWriteText: Event<string> = this.onDidWriteTextEmitter.event;
47
+
44
48
  async readText(): Promise<string> {
45
49
  let permission;
46
50
  try {
@@ -82,6 +86,7 @@ export class BrowserClipboardService implements ClipboardService {
82
86
  // in FireFox, Clipboard API isn't gated with the permissions
83
87
  try {
84
88
  await this.getClipboardAPI().writeText(value);
89
+ this.onDidWriteTextEmitter.fire(value);
85
90
  return;
86
91
  } catch (e2) {
87
92
  this.logger.error('Failed writing to the clipboard.', e2);
@@ -103,7 +108,8 @@ export class BrowserClipboardService implements ClipboardService {
103
108
  ));
104
109
  return;
105
110
  }
106
- return this.getClipboardAPI().writeText(value);
111
+ await this.getClipboardAPI().writeText(value);
112
+ this.onDidWriteTextEmitter.fire(value);
107
113
  }
108
114
 
109
115
  protected async queryPermission(name: string): Promise<PermissionStatus> {
@@ -14,10 +14,21 @@
14
14
  // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
15
  // *****************************************************************************
16
16
 
17
+ import { Event } from '../common/event';
17
18
  import { MaybePromise } from '../common/types';
18
19
 
19
20
  export const ClipboardService = Symbol('ClipboardService');
21
+ /**
22
+ * Access to the system clipboard. Reading may require a user permission prompt in browsers.
23
+ */
20
24
  export interface ClipboardService {
25
+ /** Returns the clipboard text, or an empty string if it cannot be read. */
21
26
  readText(): MaybePromise<string>;
27
+ /** Writes the given text to the clipboard. */
22
28
  writeText(value: string): MaybePromise<void>;
29
+ /**
30
+ * Emitted with the written text after {@link writeText} updated the clipboard.
31
+ * Such writes dispatch no DOM `copy` event, so this is the only way to observe them.
32
+ */
33
+ readonly onDidWriteText?: Event<string>;
23
34
  }
@@ -0,0 +1,84 @@
1
+ // *****************************************************************************
2
+ // Copyright (C) 2026 Safi Seid-Ahmad, K2view 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 { enableJSDOM } from './test/jsdom';
18
+ let disableJSDOM = enableJSDOM();
19
+
20
+ import { FrontendApplicationConfigProvider } from './frontend-application-config-provider';
21
+ FrontendApplicationConfigProvider.set({});
22
+
23
+ // jsdom does not implement queryCommandSupported, which common-frontend-contribution
24
+ // evaluates at module load to determine cut/copy/paste support.
25
+ document.queryCommandSupported = () => false;
26
+
27
+ import * as chai from 'chai';
28
+ import { Emitter } from '../common/event';
29
+ // Initialize the common barrel before common-frontend-contribution: its import graph contains
30
+ // cycles through the barrel (e.g. shell/tab-bar-toolbar) that leave injection tokens undefined
31
+ // when the contribution module itself is the entry point.
32
+ import '../common';
33
+ import { CLASSNAME_OS_LINUX, CLASSNAME_OS_MAC, CLASSNAME_OS_WINDOWS, CommonFrontendContribution } from './common-frontend-contribution';
34
+ import { SecondaryWindowService } from './window/secondary-window-service';
35
+
36
+ disableJSDOM();
37
+
38
+ const expect = chai.expect;
39
+ const OS_CLASSNAMES = [CLASSNAME_OS_MAC, CLASSNAME_OS_WINDOWS, CLASSNAME_OS_LINUX];
40
+
41
+ describe('CommonFrontendContribution', () => {
42
+
43
+ before(() => {
44
+ disableJSDOM = enableJSDOM();
45
+ document.queryCommandSupported = () => false;
46
+ });
47
+
48
+ after(() => {
49
+ disableJSDOM();
50
+ });
51
+
52
+ describe('setOsClass', () => {
53
+
54
+ let onWindowLoadedEmitter: Emitter<Window>;
55
+ let contribution: CommonFrontendContribution;
56
+
57
+ beforeEach(() => {
58
+ document.body.classList.remove(...OS_CLASSNAMES);
59
+ onWindowLoadedEmitter = new Emitter<Window>();
60
+ // Bypass the constructor: setOsClass only uses the secondary window service,
61
+ // and this keeps the test independent of the constructor's parameter list.
62
+ contribution = Object.create(CommonFrontendContribution.prototype);
63
+ /* eslint-disable-next-line @typescript-eslint/no-explicit-any */
64
+ (contribution as any).secondaryWindowService = <Partial<SecondaryWindowService>>{
65
+ onWindowLoaded: onWindowLoadedEmitter.event
66
+ };
67
+ });
68
+
69
+ it('adds the OS class to the main window body', () => {
70
+ contribution['setOsClass']();
71
+ expect(OS_CLASSNAMES.filter(c => document.body.classList.contains(c))).to.have.lengthOf(1);
72
+ });
73
+
74
+ it('adds the OS class to a secondary window body once its document is loaded', () => {
75
+ contribution['setOsClass']();
76
+ const osClass = OS_CLASSNAMES.find(c => document.body.classList.contains(c))!;
77
+
78
+ const body = document.createElement('body');
79
+ const win = <Partial<Window>>{ document: <Partial<Document>>{ body } };
80
+ onWindowLoadedEmitter.fire(win as Window);
81
+ expect(body.classList.contains(osClass), 'class must be added to the loaded window').to.be.true;
82
+ });
83
+ });
84
+ });
@@ -34,7 +34,6 @@ import { OpenerService, open } from '../browser/opener-service';
34
34
  import { ApplicationShell } from './shell/application-shell';
35
35
  import { SHELL_TABBAR_CONTEXT_CLOSE, SHELL_TABBAR_CONTEXT_COPY, SHELL_TABBAR_CONTEXT_PIN, SHELL_TABBAR_CONTEXT_SPLIT } from './shell/tab-bars';
36
36
  import { AboutDialog } from './about-dialog';
37
- import * as browser from './browser';
38
37
  import URI from '../common/uri';
39
38
  import { ContextKey, ContextKeyService } from './context-key-service';
40
39
  import { OS, isOSX, isWindows, EOL } from '../common/os';
@@ -62,6 +61,7 @@ import { nls } from '../common/nls';
62
61
  import { CurrentWidgetCommandAdapter } from './shell/current-widget-command-adapter';
63
62
  import { ConfirmDialog, confirmExit, ConfirmSaveDialog, Dialog } from './dialogs';
64
63
  import { WindowService } from './window/window-service';
64
+ import { SecondaryWindowService } from './window/secondary-window-service';
65
65
  import { FrontendApplicationConfigProvider } from './frontend-application-config-provider';
66
66
  import { DecorationStyle } from './decoration-style';
67
67
  import { codicon, isPinned, Title, togglePinned, Widget } from './widgets';
@@ -75,10 +75,12 @@ import { timeout } from '../common/promise-util';
75
75
 
76
76
  export const supportCut = environment.electron.is() || document.queryCommandSupported('cut');
77
77
  export const supportCopy = environment.electron.is() || document.queryCommandSupported('copy');
78
- // Chrome incorrectly returns true for document.queryCommandSupported('paste')
79
- // when the paste feature is available but the calling script has insufficient
80
- // privileges to actually perform the action
81
- export const supportPaste = environment.electron.is() || (!browser.isChrome && document.queryCommandSupported('paste'));
78
+ // Browsers block programmatic paste (document.execCommand('paste') is a no-op and
79
+ // document.queryCommandSupported('paste') returns false), so supportPaste is effectively
80
+ // electron-only. Keeping it false in browsers is intentional: the ctrlcmd+v keybinding stays
81
+ // unregistered, so native paste events reach widget-level listeners (e.g. the navigator), and
82
+ // menu paste is handled by dedicated handlers using the async clipboard API.
83
+ export const supportPaste = environment.electron.is() || document.queryCommandSupported('paste');
82
84
 
83
85
  export const RECENT_COMMANDS_STORAGE_KEY = 'commands';
84
86
 
@@ -146,6 +148,9 @@ export class CommonFrontendContribution implements FrontendApplicationContributi
146
148
  @inject(WindowService)
147
149
  protected readonly windowService: WindowService;
148
150
 
151
+ @inject(SecondaryWindowService)
152
+ protected readonly secondaryWindowService: SecondaryWindowService;
153
+
149
154
  @inject(UserWorkingDirectoryProvider)
150
155
  protected readonly workingDirProvider: UserWorkingDirectoryProvider;
151
156
 
@@ -217,12 +222,20 @@ export class CommonFrontendContribution implements FrontendApplicationContributi
217
222
  }
218
223
 
219
224
  protected setOsClass(): void {
225
+ const osClass = this.getOsClass();
226
+ document.body.classList.add(osClass);
227
+ // The OS class selects the platform-specific font stacks in os.css. Secondary windows
228
+ // have their own document, so apply it there as well.
229
+ this.secondaryWindowService.onWindowLoaded(win => win.document.body.classList.add(osClass));
230
+ }
231
+
232
+ protected getOsClass(): string {
220
233
  if (isOSX) {
221
- document.body.classList.add(CLASSNAME_OS_MAC);
234
+ return CLASSNAME_OS_MAC;
222
235
  } else if (isWindows) {
223
- document.body.classList.add(CLASSNAME_OS_WINDOWS);
236
+ return CLASSNAME_OS_WINDOWS;
224
237
  } else {
225
- document.body.classList.add(CLASSNAME_OS_LINUX);
238
+ return CLASSNAME_OS_LINUX;
226
239
  }
227
240
  }
228
241
 
@@ -680,7 +693,6 @@ export class CommonFrontendContribution implements FrontendApplicationContributi
680
693
  }
681
694
  });
682
695
  commandRegistry.registerCommand(CommonCommands.TOGGLE_BOTTOM_PANEL, {
683
- isEnabled: () => this.shell.getWidgets('bottom').length > 0,
684
696
  execute: () => {
685
697
  if (this.shell.isExpanded('bottom')) {
686
698
  this.shell.collapsePanel('bottom');
@@ -1393,7 +1405,7 @@ export class CommonFrontendContribution implements FrontendApplicationContributi
1393
1405
  // list.focusBackground, list.focusForeground, list.inactiveFocusBackground, list.filterMatchBorder,
1394
1406
  // list.dropBackground, listFilterWidget.outline, listFilterWidget.noMatchesOutline
1395
1407
  // list.invalidItemForeground => tree node needs an respective class
1396
- { id: 'list.activeSelectionBackground', defaults: { dark: '#094771', light: '#0074E8', hcLight: Color.transparent('#0F4A85', 0.1) }, description: 'List/Tree background color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.' },
1408
+ { id: 'list.activeSelectionBackground', defaults: { dark: '#094771', light: '#E8E8E8', hcLight: Color.transparent('#0F4A85', 0.1) }, description: 'List/Tree background color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.' },
1397
1409
  { id: 'list.activeSelectionForeground', defaults: { dark: '#FFF', light: '#FFF' }, description: 'List/Tree foreground color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.' },
1398
1410
  { id: 'list.inactiveSelectionBackground', defaults: { dark: '#37373D', light: '#E4E6F1', hcLight: Color.transparent('#0F4A85', 0.1) }, description: 'List/Tree background color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.' },
1399
1411
  { id: 'list.inactiveSelectionForeground', description: 'List/Tree foreground color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.' },
@@ -52,7 +52,7 @@ export interface FrontendApplicationContribution {
52
52
  /**
53
53
  * Called when an application is stopped or unloaded.
54
54
  *
55
- * Note that this is implemented using `window.beforeunload` which doesn't allow any asynchronous code anymore.
55
+ * Note that this is implemented using `window.pagehide` which doesn't allow any asynchronous code anymore.
56
56
  * I.e. this is the last tick.
57
57
  */
58
58
  onStop?(app: FrontendApplication): void;
@@ -14,12 +14,14 @@
14
14
  // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
15
  // *****************************************************************************
16
16
 
17
+ // Import Lumino rules first because some conflict with Theia's styles.
18
+ // This ensures Theia rules with equal specificity take precedence (see GH-17872).
19
+ import '@lumino/widgets/style/index.css';
20
+ import 'perfect-scrollbar/css/perfect-scrollbar.css';
17
21
  import '../../src/browser/style/index.css';
18
22
  import '../../src/browser/style/materialcolors.css';
19
- import '@lumino/widgets/style/index.css';
20
23
  import 'font-awesome/css/font-awesome.min.css';
21
24
  import 'file-icons-js/css/style.css';
22
- import 'perfect-scrollbar/css/perfect-scrollbar.css';
23
25
  import '@vscode/codicons/dist/codicon.css';
24
26
 
25
27
  import { ContainerModule } from 'inversify';
@@ -51,7 +53,7 @@ import {
51
53
  SidePanelHandler, SidePanelHandlerFactory,
52
54
  SidebarMenuWidget, SidebarTopMenuWidgetFactory,
53
55
  SplitPositionHandler, DockPanelRendererFactory, ApplicationShellLayoutMigration, ApplicationShellLayoutMigrationError, SidebarBottomMenuWidgetFactory,
54
- ShellLayoutTransformer
56
+ ShellLayoutTransformer, WidgetAreaResolver
55
57
  } from './shell';
56
58
  import { LabelParser } from './label-parser';
57
59
  import { LabelProvider, LabelProviderContribution, DefaultUriLabelProviderContribution } from './label-provider';
@@ -146,6 +148,7 @@ import { WidgetStatusBarContribution, WidgetStatusBarService } from './widget-st
146
148
  import { SymbolIconColorContribution } from './symbol-icon-color-contribution';
147
149
  import { CorePreferences, bindCorePreferences } from '../common/core-preferences';
148
150
  import { bindBadgeDecoration } from './badges';
151
+ import { PerspectiveContribution, PerspectiveService, PerspectiveServiceImpl, PerspectiveServiceInternal, WidgetAreaResolverImpl } from './perspective-service';
149
152
 
150
153
  export { bindResourceProvider, bindMessageService, bindPreferenceService };
151
154
 
@@ -483,6 +486,15 @@ export const frontendApplicationModule = new ContainerModule((bind, _unbind, _is
483
486
  bind(DomInputUndoRedoHandler).toSelf().inSingletonScope();
484
487
  bind(UndoRedoHandler).toService(DomInputUndoRedoHandler);
485
488
 
489
+ bind(WidgetAreaResolverImpl).toSelf().inSingletonScope();
490
+ bind(WidgetAreaResolver).toService(WidgetAreaResolverImpl);
491
+ bind(PerspectiveServiceImpl).toSelf().inSingletonScope();
492
+ bind(PerspectiveService).toService(PerspectiveServiceImpl);
493
+ bind(PerspectiveServiceInternal).toService(PerspectiveServiceImpl);
494
+ bind(FrontendApplicationContribution).toService(PerspectiveServiceImpl);
495
+ bind(CommandContribution).toService(PerspectiveServiceImpl);
496
+ bindRootContributionProvider(bind, PerspectiveContribution);
497
+
486
498
  bind(WidgetStatusBarService).toSelf().inSingletonScope();
487
499
  bind(FrontendApplicationContribution).toService(WidgetStatusBarService);
488
500
  bindRootContributionProvider(bind, WidgetStatusBarContribution);
@@ -237,8 +237,12 @@ export class FrontendApplication {
237
237
  protected async createDefaultLayout(): Promise<void> {
238
238
  for (const contribution of this.contributions.getContributions()) {
239
239
  if (contribution.initializeLayout) {
240
- await this.measureContribution(contribution, 'initializeLayout',
241
- () => contribution.initializeLayout!(this));
240
+ try {
241
+ await this.measureContribution(contribution, 'initializeLayout',
242
+ () => contribution.initializeLayout!(this));
243
+ } catch (error) {
244
+ this.logger.error('Could not initialize the layout of contribution', error);
245
+ }
242
246
  }
243
247
  }
244
248
  }
@@ -246,8 +250,12 @@ export class FrontendApplication {
246
250
  protected async fireOnDidInitializeLayout(): Promise<void> {
247
251
  for (const contribution of this.contributions.getContributions()) {
248
252
  if (contribution.onDidInitializeLayout) {
249
- await this.measureContribution(contribution, 'onDidInitializeLayout',
250
- () => contribution.onDidInitializeLayout!(this));
253
+ try {
254
+ await this.measureContribution(contribution, 'onDidInitializeLayout',
255
+ () => contribution.onDidInitializeLayout!(this));
256
+ } catch (error) {
257
+ this.logger.error('Could not notify contribution of layout initialization', error);
258
+ }
251
259
  }
252
260
  }
253
261
  }
@@ -55,3 +55,4 @@ export * from './markdown-rendering/markdown-renderer';
55
55
  export * from './markdown-rendering/markdown';
56
56
  export * from './markdown-rendering/markdown-link-handler';
57
57
  export * from './components';
58
+ export * from './perspective-service';
@@ -610,11 +610,10 @@ export class KeybindingRegistry {
610
610
  }
611
611
 
612
612
  registerEventListeners(win: Window): Disposable {
613
- /* vvv HOTFIX begin vvv
614
- *
615
- * This is a hotfix against issues eclipse/theia#6459 and gitpod-io/gitpod#875 .
616
- * It should be reverted after Theia was updated to the newer Monaco.
617
- */
613
+ // IME composition tracking for the textarea-based editor input path,
614
+ // where compositionstart/compositionend bubble through the DOM.
615
+ // (For the native EditContext path, these events never reach the DOM;
616
+ // the keydown handler below uses additional checks for that case.)
618
617
  let inComposition = false;
619
618
  const compositionStart = () => {
620
619
  inComposition = true;
@@ -627,9 +626,15 @@ export class KeybindingRegistry {
627
626
  win.document.addEventListener('compositionend', compositionEnd);
628
627
 
629
628
  const keydown = (event: KeyboardEvent) => {
630
- if (inComposition !== true) {
631
- this.run(event);
629
+ // Skip IME-related keydowns. `inComposition` covers the textarea input path;
630
+ // `isComposing` and `keyCode === 229` cover the native EditContext path where
631
+ // composition events don't reach the DOM. The keyCode check catches keys that
632
+ // finalize a composition (e.g. arrow keys) where isComposing is already false.
633
+ // eslint-disable-next-line deprecation/deprecation
634
+ if (inComposition || event.isComposing || event.keyCode === 229) {
635
+ return;
632
636
  }
637
+ this.run(event);
633
638
  };
634
639
  win.document.addEventListener('keydown', keydown, true);
635
640