@theia/core 1.75.0-next.4 → 1.75.0-next.43

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 (290) hide show
  1. package/README.md +21 -18
  2. package/lib/browser/about-dialog.js +6 -35
  3. package/lib/browser/about-dialog.js.map +1 -1
  4. package/lib/browser/authentication-service.js +1 -1
  5. package/lib/browser/authentication-service.js.map +1 -1
  6. package/lib/browser/breadcrumbs/breadcrumb-renderer.js +2 -22
  7. package/lib/browser/breadcrumbs/breadcrumb-renderer.js.map +1 -1
  8. package/lib/browser/breadcrumbs/breadcrumbs-renderer.js +2 -17
  9. package/lib/browser/breadcrumbs/breadcrumbs-renderer.js.map +1 -1
  10. package/lib/browser/browser-clipboard-service.js +1 -0
  11. package/lib/browser/browser-clipboard-service.js.map +1 -1
  12. package/lib/browser/catalog.json +142 -37
  13. package/lib/browser/common-frontend-contribution.d.ts +3 -0
  14. package/lib/browser/common-frontend-contribution.d.ts.map +1 -1
  15. package/lib/browser/common-frontend-contribution.js +15 -3
  16. package/lib/browser/common-frontend-contribution.js.map +1 -1
  17. package/lib/browser/common-frontend-contribution.spec.d.ts +2 -0
  18. package/lib/browser/common-frontend-contribution.spec.d.ts.map +1 -0
  19. package/lib/browser/common-frontend-contribution.spec.js +71 -0
  20. package/lib/browser/common-frontend-contribution.spec.js.map +1 -0
  21. package/lib/browser/components/card.js +4 -10
  22. package/lib/browser/components/card.js.map +1 -1
  23. package/lib/browser/connection-status-service.d.ts +1 -0
  24. package/lib/browser/connection-status-service.d.ts.map +1 -1
  25. package/lib/browser/connection-status-service.js +7 -0
  26. package/lib/browser/connection-status-service.js.map +1 -1
  27. package/lib/browser/dialogs/react-dialog.js +2 -17
  28. package/lib/browser/dialogs/react-dialog.js.map +1 -1
  29. package/lib/browser/dialogs/react-dialog.spec.js +3 -3
  30. package/lib/browser/dialogs/react-dialog.spec.js.map +1 -1
  31. package/lib/browser/frontend-application-contribution.d.ts +1 -1
  32. package/lib/browser/frontend-application-state.js +1 -0
  33. package/lib/browser/frontend-application-state.js.map +1 -1
  34. package/lib/browser/icon-theme-service.d.ts +5 -3
  35. package/lib/browser/icon-theme-service.d.ts.map +1 -1
  36. package/lib/browser/icon-theme-service.js +7 -1
  37. package/lib/browser/icon-theme-service.js.map +1 -1
  38. package/lib/browser/keyboard/browser-keyboard-layout-provider.js +1 -0
  39. package/lib/browser/keyboard/browser-keyboard-layout-provider.js.map +1 -1
  40. package/lib/browser/markdown-rendering/markdown-link-handler.d.ts +11 -0
  41. package/lib/browser/markdown-rendering/markdown-link-handler.d.ts.map +1 -1
  42. package/lib/browser/markdown-rendering/markdown-link-handler.js +23 -1
  43. package/lib/browser/markdown-rendering/markdown-link-handler.js.map +1 -1
  44. package/lib/browser/markdown-rendering/markdown-renderer.d.ts +11 -0
  45. package/lib/browser/markdown-rendering/markdown-renderer.d.ts.map +1 -1
  46. package/lib/browser/markdown-rendering/markdown-renderer.js +41 -0
  47. package/lib/browser/markdown-rendering/markdown-renderer.js.map +1 -1
  48. package/lib/browser/markdown-rendering/markdown-renderer.spec.d.ts +2 -0
  49. package/lib/browser/markdown-rendering/markdown-renderer.spec.d.ts.map +1 -0
  50. package/lib/browser/markdown-rendering/markdown-renderer.spec.js +79 -0
  51. package/lib/browser/markdown-rendering/markdown-renderer.spec.js.map +1 -0
  52. package/lib/browser/markdown-rendering/markdown.js +6 -5
  53. package/lib/browser/markdown-rendering/markdown.js.map +1 -1
  54. package/lib/browser/markdown-rendering/markdown.spec.js +16 -16
  55. package/lib/browser/markdown-rendering/markdown.spec.js.map +1 -1
  56. package/lib/browser/messaging/ws-connection-source.d.ts.map +1 -1
  57. package/lib/browser/messaging/ws-connection-source.js +3 -0
  58. package/lib/browser/messaging/ws-connection-source.js.map +1 -1
  59. package/lib/browser/open-with-service.d.ts +2 -1
  60. package/lib/browser/open-with-service.d.ts.map +1 -1
  61. package/lib/browser/open-with-service.js +6 -1
  62. package/lib/browser/open-with-service.js.map +1 -1
  63. package/lib/browser/performance/frontend-stopwatch.d.ts +2 -1
  64. package/lib/browser/performance/frontend-stopwatch.d.ts.map +1 -1
  65. package/lib/browser/performance/frontend-stopwatch.js +6 -1
  66. package/lib/browser/performance/frontend-stopwatch.js.map +1 -1
  67. package/lib/browser/perspective-service.js +1 -1
  68. package/lib/browser/perspective-service.js.map +1 -1
  69. package/lib/browser/preferences/preference-proxy.spec.js +3 -0
  70. package/lib/browser/preferences/preference-proxy.spec.js.map +1 -1
  71. package/lib/browser/preferences/preference-service.spec.js +3 -0
  72. package/lib/browser/preferences/preference-service.spec.js.map +1 -1
  73. package/lib/browser/preferences/preference-validation-service.js +1 -1
  74. package/lib/browser/preferences/preference-validation-service.js.map +1 -1
  75. package/lib/browser/saveable-service.d.ts +2 -1
  76. package/lib/browser/saveable-service.d.ts.map +1 -1
  77. package/lib/browser/saveable-service.js +6 -1
  78. package/lib/browser/saveable-service.js.map +1 -1
  79. package/lib/browser/shell/application-shell.js +3 -3
  80. package/lib/browser/shell/application-shell.js.map +1 -1
  81. package/lib/browser/shell/application-shell.spec.d.ts +2 -0
  82. package/lib/browser/shell/application-shell.spec.d.ts.map +1 -0
  83. package/lib/browser/shell/application-shell.spec.js +57 -0
  84. package/lib/browser/shell/application-shell.spec.js.map +1 -0
  85. package/lib/browser/shell/shell-layout-restorer.d.ts +1 -1
  86. package/lib/browser/shell/shell-layout-restorer.d.ts.map +1 -1
  87. package/lib/browser/shell/shell-layout-restorer.js +5 -4
  88. package/lib/browser/shell/shell-layout-restorer.js.map +1 -1
  89. package/lib/browser/shell/sidebar-menu-widget.js +6 -7
  90. package/lib/browser/shell/sidebar-menu-widget.js.map +1 -1
  91. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.d.ts.map +1 -1
  92. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.js +4 -22
  93. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.js.map +1 -1
  94. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.d.ts +2 -1
  95. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.d.ts.map +1 -1
  96. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.js +6 -1
  97. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.js.map +1 -1
  98. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.js +8 -10
  99. package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.js.map +1 -1
  100. package/lib/browser/shell/tab-bar-toolbar/tab-toolbar-item.js +2 -20
  101. package/lib/browser/shell/tab-bar-toolbar/tab-toolbar-item.js.map +1 -1
  102. package/lib/browser/source-tree/source-tree-widget.js +3 -18
  103. package/lib/browser/source-tree/source-tree-widget.js.map +1 -1
  104. package/lib/browser/status-bar/status-bar-view-model.d.ts +2 -1
  105. package/lib/browser/status-bar/status-bar-view-model.d.ts.map +1 -1
  106. package/lib/browser/status-bar/status-bar-view-model.js +6 -1
  107. package/lib/browser/status-bar/status-bar-view-model.js.map +1 -1
  108. package/lib/browser/status-bar/status-bar.js +10 -11
  109. package/lib/browser/status-bar/status-bar.js.map +1 -1
  110. package/lib/browser/storage-service.d.ts +1 -1
  111. package/lib/browser/storage-service.d.ts.map +1 -1
  112. package/lib/browser/storage-service.js +1 -0
  113. package/lib/browser/storage-service.js.map +1 -1
  114. package/lib/browser/tooltip-service.js +5 -5
  115. package/lib/browser/tooltip-service.js.map +1 -1
  116. package/lib/browser/tree/search-box.js +9 -16
  117. package/lib/browser/tree/search-box.js.map +1 -1
  118. package/lib/browser/tree/tree-compression/compressed-tree-widget.js +7 -9
  119. package/lib/browser/tree/tree-compression/compressed-tree-widget.js.map +1 -1
  120. package/lib/browser/tree/tree-consistency.spec.js +103 -0
  121. package/lib/browser/tree/tree-consistency.spec.js.map +1 -1
  122. package/lib/browser/tree/tree-model.d.ts.map +1 -1
  123. package/lib/browser/tree/tree-model.js +1 -0
  124. package/lib/browser/tree/tree-model.js.map +1 -1
  125. package/lib/browser/tree/tree-view-welcome-widget.js +8 -30
  126. package/lib/browser/tree/tree-view-welcome-widget.js.map +1 -1
  127. package/lib/browser/tree/tree-widget.js +30 -42
  128. package/lib/browser/tree/tree-widget.js.map +1 -1
  129. package/lib/browser/tree/tree.d.ts.map +1 -1
  130. package/lib/browser/tree/tree.js +6 -0
  131. package/lib/browser/tree/tree.js.map +1 -1
  132. package/lib/browser/widget-manager.js +1 -0
  133. package/lib/browser/widget-manager.js.map +1 -1
  134. package/lib/browser/widgets/alert-message.js +4 -8
  135. package/lib/browser/widgets/alert-message.js.map +1 -1
  136. package/lib/browser/widgets/react-renderer.js +5 -4
  137. package/lib/browser/widgets/react-renderer.js.map +1 -1
  138. package/lib/browser/widgets/react-widget.js +5 -4
  139. package/lib/browser/widgets/react-widget.js.map +1 -1
  140. package/lib/browser/widgets/select-component.d.ts +15 -2
  141. package/lib/browser/widgets/select-component.d.ts.map +1 -1
  142. package/lib/browser/widgets/select-component.js +58 -31
  143. package/lib/browser/widgets/select-component.js.map +1 -1
  144. package/lib/browser/window/default-secondary-window-service.d.ts +4 -1
  145. package/lib/browser/window/default-secondary-window-service.d.ts.map +1 -1
  146. package/lib/browser/window/default-secondary-window-service.js +17 -6
  147. package/lib/browser/window/default-secondary-window-service.js.map +1 -1
  148. package/lib/browser/window/default-window-service.d.ts +19 -0
  149. package/lib/browser/window/default-window-service.d.ts.map +1 -1
  150. package/lib/browser/window/default-window-service.js +34 -5
  151. package/lib/browser/window/default-window-service.js.map +1 -1
  152. package/lib/browser/window/default-window-service.spec.js +22 -0
  153. package/lib/browser/window/default-window-service.spec.js.map +1 -1
  154. package/lib/browser/window/secondary-window-service.d.ts +7 -0
  155. package/lib/browser/window/secondary-window-service.d.ts.map +1 -1
  156. package/lib/browser/window/window-service.d.ts +1 -1
  157. package/lib/browser-only/frontend-only-application-module.d.ts.map +1 -1
  158. package/lib/browser-only/frontend-only-application-module.js +25 -1
  159. package/lib/browser-only/frontend-only-application-module.js.map +1 -1
  160. package/lib/common/command.d.ts +37 -0
  161. package/lib/common/command.d.ts.map +1 -1
  162. package/lib/common/command.js +74 -4
  163. package/lib/common/command.js.map +1 -1
  164. package/lib/common/command.spec.js +109 -0
  165. package/lib/common/command.spec.js.map +1 -1
  166. package/lib/common/message-service-protocol.d.ts +2 -0
  167. package/lib/common/message-service-protocol.d.ts.map +1 -1
  168. package/lib/common/message-service-protocol.js +8 -2
  169. package/lib/common/message-service-protocol.js.map +1 -1
  170. package/lib/common/performance/stopwatch.js +1 -0
  171. package/lib/common/performance/stopwatch.js.map +1 -1
  172. package/lib/common/preferences/preference-schema-service.d.ts +2 -0
  173. package/lib/common/preferences/preference-schema-service.d.ts.map +1 -1
  174. package/lib/common/preferences/preference-schema-service.js +11 -5
  175. package/lib/common/preferences/preference-schema-service.js.map +1 -1
  176. package/lib/common/preferences/preference-service.d.ts +2 -0
  177. package/lib/common/preferences/preference-service.d.ts.map +1 -1
  178. package/lib/common/preferences/preference-service.js +7 -1
  179. package/lib/common/preferences/preference-service.js.map +1 -1
  180. package/lib/electron-browser/menu/electron-menu-contribution.js +1 -1
  181. package/lib/electron-browser/menu/electron-menu-contribution.js.map +1 -1
  182. package/lib/electron-browser/window/electron-secondary-window-service.js +1 -1
  183. package/lib/electron-browser/window/electron-secondary-window-service.js.map +1 -1
  184. package/lib/electron-browser/window/electron-window-service.js +3 -3
  185. package/lib/electron-browser/window/electron-window-service.js.map +1 -1
  186. package/lib/electron-browser/window/window-zoom-action-bar.js +6 -11
  187. package/lib/electron-browser/window/window-zoom-action-bar.js.map +1 -1
  188. package/lib/node/backend-application.js +5 -5
  189. package/lib/node/backend-application.js.map +1 -1
  190. package/lib/node/backend-application.spec.js +6 -3
  191. package/lib/node/backend-application.spec.js.map +1 -1
  192. package/lib/node/console-logger-server.d.ts.map +1 -1
  193. package/lib/node/console-logger-server.js +2 -0
  194. package/lib/node/console-logger-server.js.map +1 -1
  195. package/lib/node/env-variables/env-variables-server.d.ts +2 -0
  196. package/lib/node/env-variables/env-variables-server.d.ts.map +1 -1
  197. package/lib/node/env-variables/env-variables-server.js +7 -1
  198. package/lib/node/env-variables/env-variables-server.js.map +1 -1
  199. package/lib/node/hosting/browser-connection-token.d.ts +2 -0
  200. package/lib/node/hosting/browser-connection-token.d.ts.map +1 -1
  201. package/lib/node/hosting/browser-connection-token.js +14 -1
  202. package/lib/node/hosting/browser-connection-token.js.map +1 -1
  203. package/lib/node/hosting/browser-connection-token.spec.js +25 -2
  204. package/lib/node/hosting/browser-connection-token.spec.js.map +1 -1
  205. package/lib/node/key-store-server.d.ts +2 -0
  206. package/lib/node/key-store-server.d.ts.map +1 -1
  207. package/lib/node/key-store-server.js +6 -1
  208. package/lib/node/key-store-server.js.map +1 -1
  209. package/lib/node/logger-cli-contribution.d.ts.map +1 -1
  210. package/lib/node/logger-cli-contribution.js.map +1 -1
  211. package/lib/node/messaging/default-messaging-service.js +1 -1
  212. package/lib/node/messaging/default-messaging-service.js.map +1 -1
  213. package/lib/node/messaging/ipc-connection-provider.js +1 -0
  214. package/lib/node/messaging/ipc-connection-provider.js.map +1 -1
  215. package/lib/node/messaging/websocket-endpoint.js +1 -1
  216. package/lib/node/messaging/websocket-endpoint.js.map +1 -1
  217. package/lib/node/messaging/websocket-frontend-connection-service.d.ts +2 -1
  218. package/lib/node/messaging/websocket-frontend-connection-service.d.ts.map +1 -1
  219. package/lib/node/messaging/websocket-frontend-connection-service.js +11 -6
  220. package/lib/node/messaging/websocket-frontend-connection-service.js.map +1 -1
  221. package/lib/node/setting-service.js +1 -0
  222. package/lib/node/setting-service.js.map +1 -1
  223. package/package.json +30 -27
  224. package/shared/react/jsx-dev-runtime/index.d.ts +1 -0
  225. package/shared/react/jsx-dev-runtime/index.js +1 -0
  226. package/shared/react/jsx-runtime/index.d.ts +1 -0
  227. package/shared/react/jsx-runtime/index.js +1 -0
  228. package/shared/react-dom/server/index.d.ts +1 -0
  229. package/shared/react-dom/server/index.js +1 -0
  230. package/src/browser/authentication-service.ts +1 -1
  231. package/src/browser/browser-clipboard-service.ts +2 -2
  232. package/src/browser/common-frontend-contribution.spec.ts +84 -0
  233. package/src/browser/common-frontend-contribution.ts +15 -3
  234. package/src/browser/connection-status-service.ts +7 -3
  235. package/src/browser/frontend-application-contribution.ts +1 -1
  236. package/src/browser/frontend-application-state.ts +2 -2
  237. package/src/browser/icon-theme-service.ts +6 -2
  238. package/src/browser/keyboard/browser-keyboard-layout-provider.ts +2 -2
  239. package/src/browser/markdown-rendering/markdown-link-handler.ts +23 -1
  240. package/src/browser/markdown-rendering/markdown-renderer.spec.ts +88 -0
  241. package/src/browser/markdown-rendering/markdown-renderer.ts +43 -0
  242. package/src/browser/messaging/ws-connection-source.ts +4 -0
  243. package/src/browser/open-with-service.ts +6 -3
  244. package/src/browser/performance/frontend-stopwatch.ts +6 -3
  245. package/src/browser/perspective-service.ts +1 -1
  246. package/src/browser/preferences/preference-proxy.spec.ts +3 -0
  247. package/src/browser/preferences/preference-service.spec.ts +3 -0
  248. package/src/browser/preferences/preference-validation-service.ts +1 -1
  249. package/src/browser/saveable-service.ts +5 -2
  250. package/src/browser/shell/application-shell.spec.ts +62 -0
  251. package/src/browser/shell/application-shell.ts +4 -4
  252. package/src/browser/shell/shell-layout-restorer.ts +6 -5
  253. package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.tsx +3 -2
  254. package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.ts +5 -2
  255. package/src/browser/status-bar/status-bar-view-model.ts +7 -3
  256. package/src/browser/storage-service.ts +4 -2
  257. package/src/browser/tree/tree-consistency.spec.ts +119 -0
  258. package/src/browser/tree/tree-model.ts +4 -2
  259. package/src/browser/tree/tree.ts +6 -0
  260. package/src/browser/widget-manager.ts +1 -1
  261. package/src/browser/widgets/select-component.tsx +49 -12
  262. package/src/browser/window/default-secondary-window-service.ts +17 -8
  263. package/src/browser/window/default-window-service.spec.ts +22 -0
  264. package/src/browser/window/default-window-service.ts +37 -5
  265. package/src/browser/window/secondary-window-service.ts +7 -0
  266. package/src/browser/window/window-service.ts +1 -1
  267. package/src/browser-only/frontend-only-application-module.ts +25 -1
  268. package/src/common/command.spec.ts +125 -0
  269. package/src/common/command.ts +77 -4
  270. package/src/common/i18n/nls.metadata.json +3933 -1186
  271. package/src/common/message-service-protocol.ts +7 -3
  272. package/src/common/performance/stopwatch.ts +2 -2
  273. package/src/common/preferences/preference-schema-service.ts +9 -5
  274. package/src/common/preferences/preference-service.ts +6 -2
  275. package/src/electron-browser/menu/electron-menu-contribution.ts +1 -1
  276. package/src/electron-browser/window/electron-secondary-window-service.ts +1 -1
  277. package/src/electron-browser/window/electron-window-service.ts +3 -3
  278. package/src/node/backend-application.spec.ts +6 -3
  279. package/src/node/backend-application.ts +5 -5
  280. package/src/node/console-logger-server.ts +3 -0
  281. package/src/node/env-variables/env-variables-server.ts +6 -2
  282. package/src/node/hosting/browser-connection-token.spec.ts +30 -3
  283. package/src/node/hosting/browser-connection-token.ts +13 -2
  284. package/src/node/key-store-server.ts +6 -3
  285. package/src/node/logger-cli-contribution.ts +3 -0
  286. package/src/node/messaging/default-messaging-service.ts +1 -1
  287. package/src/node/messaging/ipc-connection-provider.ts +2 -2
  288. package/src/node/messaging/websocket-endpoint.ts +1 -1
  289. package/src/node/messaging/websocket-frontend-connection-service.ts +11 -8
  290. package/src/node/setting-service.ts +2 -2
@@ -14,7 +14,7 @@
14
14
  // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
15
  // *****************************************************************************
16
16
 
17
- import { inject, injectable, optional, postConstruct } from 'inversify';
17
+ import { inject, injectable, optional, postConstruct, named } from 'inversify';
18
18
  import { ILogger } from '../common/logger';
19
19
  import { Event, Emitter } from '../common/event';
20
20
  import { DefaultFrontendApplicationContribution } from './frontend-application-contribution';
@@ -82,7 +82,7 @@ export abstract class AbstractConnectionStatusService implements ConnectionStatu
82
82
 
83
83
  protected connectionStatus: ConnectionStatus = ConnectionStatus.ONLINE;
84
84
 
85
- @inject(ILogger)
85
+ @inject(ILogger) @named('core:AbstractConnectionStatusService')
86
86
  protected logger: ILogger;
87
87
 
88
88
  constructor(@inject(ConnectionStatusOptions) @optional() protected readonly options: ConnectionStatusOptions = ConnectionStatusOptions.DEFAULT) { }
@@ -122,6 +122,9 @@ export class FrontendConnectionStatusService extends AbstractConnectionStatusSer
122
122
  @inject(WebSocketConnectionSource) protected readonly wsConnectionProvider: WebSocketConnectionSource;
123
123
  @inject(PingService) protected readonly pingService: PingService;
124
124
 
125
+ @inject(ILogger) @named('core:FrontendConnectionStatusService')
126
+ protected override readonly logger: ILogger;
127
+
125
128
  @postConstruct()
126
129
  protected init(): void {
127
130
  this.wsConnectionProvider.onSocketDidOpen(() => {
@@ -177,7 +180,8 @@ export class ApplicationConnectionStatusContribution extends DefaultFrontendAppl
177
180
  constructor(
178
181
  @inject(ConnectionStatusService) protected readonly connectionStatusService: ConnectionStatusService,
179
182
  @inject(StatusBar) protected readonly statusBar: StatusBar,
180
- @inject(ILogger) protected readonly logger: ILogger
183
+ @inject(ILogger) @named('core:ApplicationConnectionStatusContribution')
184
+ protected readonly logger: ILogger
181
185
  ) {
182
186
  super();
183
187
  this.connectionStatusService.onStatusChange(state => this.onStateChange(state));
@@ -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,7 +14,7 @@
14
14
  // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
15
  // *****************************************************************************
16
16
 
17
- import { injectable, inject } from 'inversify';
17
+ import { injectable, inject, named } from 'inversify';
18
18
  import { Emitter, Event } from '../common/event';
19
19
  import { Deferred } from '../common/promise-util';
20
20
  import { ILogger } from '../common/logger';
@@ -25,7 +25,7 @@ export { FrontendApplicationState };
25
25
  @injectable()
26
26
  export class FrontendApplicationStateService {
27
27
 
28
- @inject(ILogger)
28
+ @inject(ILogger) @named('core:FrontendApplicationStateService')
29
29
  protected readonly logger: ILogger;
30
30
 
31
31
  private _state: FrontendApplicationState = 'init';
@@ -14,7 +14,7 @@
14
14
  // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
15
  // *****************************************************************************
16
16
 
17
- import { injectable, inject, postConstruct } from 'inversify';
17
+ import { injectable, inject, postConstruct, named } from 'inversify';
18
18
  import { Emitter } from '../common/event';
19
19
  import { Disposable, DisposableCollection } from '../common/disposable';
20
20
  import { LabelProviderContribution, DidChangeLabelEvent } from './label-provider';
@@ -22,6 +22,7 @@ import { FrontendApplicationConfigProvider } from './frontend-application-config
22
22
  import debounce = require('lodash.debounce');
23
23
  import { PreferenceSchemaService } from '../common/preferences/preference-schema';
24
24
  import { PreferenceService } from '../common/preferences';
25
+ import { ILogger } from '../common';
25
26
 
26
27
  const ICON_THEME_PREFERENCE_KEY = 'workbench.iconTheme';
27
28
 
@@ -100,6 +101,9 @@ export class IconThemeService {
100
101
  @inject(PreferenceService) protected readonly preferences: PreferenceService;
101
102
  @inject(PreferenceSchemaService) protected readonly schemaProvider: PreferenceSchemaService;
102
103
 
104
+ @inject(ILogger) @named('core:IconThemeService')
105
+ protected readonly logger: ILogger;
106
+
103
107
  protected readonly onDidChangeCurrentEmitter = new Emitter<string>();
104
108
  readonly onDidChangeCurrent = this.onDidChangeCurrentEmitter.event;
105
109
 
@@ -124,7 +128,7 @@ export class IconThemeService {
124
128
 
125
129
  register(iconTheme: IconTheme): Disposable {
126
130
  if (this._iconThemes.has(iconTheme.id)) {
127
- console.warn(new Error(`Icon theme '${iconTheme.id}' has already been registered, skipping.`));
131
+ this.logger.warn(new Error(`Icon theme '${iconTheme.id}' has already been registered, skipping.`));
128
132
  return Disposable.NULL;
129
133
  }
130
134
  this._iconThemes.set(iconTheme.id, iconTheme);
@@ -14,7 +14,7 @@
14
14
  // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
15
  // *****************************************************************************
16
16
 
17
- import { injectable, postConstruct, inject } from 'inversify';
17
+ import { injectable, postConstruct, inject, named } from 'inversify';
18
18
  import { isOSX } from '../../common/os';
19
19
  import { Emitter, Event } from '../../common/event';
20
20
  import { ILogger } from '../../common/logger';
@@ -29,7 +29,7 @@ export type KeyboardLayoutSource = 'navigator.keyboard' | 'user-choice' | 'press
29
29
  @injectable()
30
30
  export class BrowserKeyboardLayoutProvider implements KeyboardLayoutProvider, KeyboardLayoutChangeNotifier, KeyValidator {
31
31
 
32
- @inject(ILogger)
32
+ @inject(ILogger) @named('core:BrowserKeyboardLayoutProvider')
33
33
  protected readonly logger: ILogger;
34
34
 
35
35
  @inject(LocalStorageService)
@@ -19,6 +19,19 @@ import { MarkdownString } from '../../common/markdown-rendering/markdown-string'
19
19
  import URI from '../../common/uri';
20
20
  import { open, OpenerService } from '../opener-service';
21
21
 
22
+ /**
23
+ * Marks an element whose markdown links are already routed through an {@link OpenerService}.
24
+ *
25
+ * Renderers that install their own link handling declare it with {@link markMarkdownLinksWired},
26
+ * so that {@link wireMarkdownLinkHandler} does not add a second handler and open every link twice.
27
+ */
28
+ export const MARKDOWN_LINKS_WIRED_ATTRIBUTE = 'data-theia-markdown-links-wired';
29
+
30
+ /** Declares that the element's markdown links are already routed through an {@link OpenerService}. */
31
+ export function markMarkdownLinksWired(root: HTMLElement): void {
32
+ root.setAttribute(MARKDOWN_LINKS_WIRED_ATTRIBUTE, 'true');
33
+ }
34
+
22
35
  /**
23
36
  * Wires up anchor clicks inside a rendered markdown element so that they are routed
24
37
  * through the {@link OpenerService} instead of relying on default browser navigation.
@@ -27,6 +40,8 @@ import { open, OpenerService } from '../opener-service';
27
40
  * Also sets the `title` attribute on each anchor to its `href` (when no title is set)
28
41
  * so users can hover to see the link target.
29
42
  *
43
+ * Does nothing if the element's links are already wired, see {@link markMarkdownLinksWired}.
44
+ *
30
45
  * @returns a {@link Disposable} that removes the click listener.
31
46
  */
32
47
  export function wireMarkdownLinkHandler(
@@ -34,6 +49,10 @@ export function wireMarkdownLinkHandler(
34
49
  source: MarkdownString,
35
50
  openerService: OpenerService
36
51
  ): Disposable {
52
+ if (root.hasAttribute(MARKDOWN_LINKS_WIRED_ATTRIBUTE)) {
53
+ return Disposable.NULL;
54
+ }
55
+ markMarkdownLinksWired(root);
37
56
  for (const anchor of root.querySelectorAll('a')) {
38
57
  const href = anchor.getAttribute('href');
39
58
  if (href && !anchor.hasAttribute('title')) {
@@ -57,5 +76,8 @@ export function wireMarkdownLinkHandler(
57
76
  }
58
77
  };
59
78
  root.addEventListener('click', handleClick);
60
- return Disposable.create(() => root.removeEventListener('click', handleClick));
79
+ return Disposable.create(() => {
80
+ root.removeEventListener('click', handleClick);
81
+ root.removeAttribute(MARKDOWN_LINKS_WIRED_ATTRIBUTE);
82
+ });
61
83
  }
@@ -0,0 +1,88 @@
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
+ const disableJSDOM = enableJSDOM();
19
+
20
+ import { Container } from 'inversify';
21
+ import { expect } from 'chai';
22
+ import { CommandService } from '../../common';
23
+ import { MarkdownStringImpl } from '../../common/markdown-rendering/markdown-string';
24
+ import { LabelParser } from '../label-parser';
25
+ import { MarkdownRenderer, MarkdownRendererImpl } from './markdown-renderer';
26
+
27
+ disableJSDOM();
28
+
29
+ describe('MarkdownRendererImpl', () => {
30
+ let restoreJSDOM: () => void;
31
+ let renderer: MarkdownRenderer;
32
+
33
+ before(() => {
34
+ restoreJSDOM = enableJSDOM();
35
+ const container = new Container();
36
+ container.bind(LabelParser).toSelf().inSingletonScope();
37
+ container.bind(CommandService).toConstantValue({
38
+ executeCommand: <T>(): Promise<T | undefined> => Promise.resolve(undefined)
39
+ });
40
+ container.bind(MarkdownRendererImpl).toSelf().inSingletonScope();
41
+ container.bind(MarkdownRenderer).toService(MarkdownRendererImpl);
42
+ renderer = container.get<MarkdownRenderer>(MarkdownRenderer);
43
+ });
44
+
45
+ after(() => {
46
+ restoreJSDOM();
47
+ });
48
+
49
+ function renderImage(markdown: string): HTMLImageElement {
50
+ const { element } = renderer.render(new MarkdownStringImpl(markdown));
51
+ const image = element.querySelector('img');
52
+ expect(image, `image rendered for '${markdown}'`).to.not.be.null;
53
+ return image!;
54
+ }
55
+
56
+ it('applies the width and height of an image sizing suffix', () => {
57
+ const image = renderImage('![Jane](https://avatars.example.com/u/1|width=20,height=20)');
58
+ expect(image.getAttribute('src')).to.equal('https://avatars.example.com/u/1');
59
+ expect(image.getAttribute('width')).to.equal('20');
60
+ expect(image.getAttribute('height')).to.equal('20');
61
+ });
62
+
63
+ it('applies a suffix that sets only one dimension', () => {
64
+ const image = renderImage('![Jane](https://avatars.example.com/u/1|width=20)');
65
+ expect(image.getAttribute('src')).to.equal('https://avatars.example.com/u/1');
66
+ expect(image.getAttribute('width')).to.equal('20');
67
+ expect(image.hasAttribute('height')).to.be.false;
68
+ });
69
+
70
+ // markdown-it percent-encodes the link destination, so a pipe it keeps shows up as `%7C`.
71
+ it('keeps a literal pipe that is not a well-formed sizing suffix', () => {
72
+ const image = renderImage('![Jane](https://avatars.example.com/u/1|v=2)');
73
+ expect(image.getAttribute('src')).to.equal('https://avatars.example.com/u/1%7Cv=2');
74
+ expect(image.hasAttribute('width')).to.be.false;
75
+ });
76
+
77
+ it('ignores a non-numeric dimension', () => {
78
+ const image = renderImage('![Jane](https://avatars.example.com/u/1|width=20px)');
79
+ expect(image.getAttribute('src')).to.equal('https://avatars.example.com/u/1%7Cwidth=20px');
80
+ expect(image.hasAttribute('width')).to.be.false;
81
+ });
82
+
83
+ it('renders an image without a suffix unchanged', () => {
84
+ const image = renderImage('![Jane](https://avatars.example.com/u/1)');
85
+ expect(image.getAttribute('src')).to.equal('https://avatars.example.com/u/1');
86
+ expect(image.hasAttribute('width')).to.be.false;
87
+ });
88
+ });
@@ -101,5 +101,48 @@ export class MarkdownRendererImpl implements MarkdownRenderer {
101
101
  return `<i class="${codicon(chunk.name)} ${chunk.animation ? `fa-${chunk.animation}` : ''} icon-inline"></i>`;
102
102
  }).join('');
103
103
  };
104
+
105
+ // Support VS Code's `![alt](src|width=W,height=H)` image sizing syntax, which markdown-it
106
+ // would otherwise fold into the `src` attribute, yielding a broken image.
107
+ const renderImage = this.markdownIt.renderer.rules.image;
108
+ this.markdownIt.renderer.rules.image = (tokens, idx, options, env, self) => {
109
+ const token = tokens[idx];
110
+ const srcIndex = token.attrIndex('src');
111
+ if (srcIndex >= 0 && token.attrs) {
112
+ const src = token.attrs[srcIndex][1];
113
+ // markdown-it percent-encodes the link destination, so the separator may have
114
+ // become `%7C` by the time the token reaches the renderer.
115
+ const separator = /(?:\||%7c)(?![\s\S]*(?:\||%7c))/i.exec(src);
116
+ if (separator) {
117
+ const dimensions = this.parseImageDimensions(src.substring(separator.index + separator[0].length));
118
+ if (dimensions) {
119
+ token.attrs[srcIndex][1] = src.substring(0, separator.index);
120
+ for (const [name, value] of Object.entries(dimensions)) {
121
+ token.attrSet(name, value);
122
+ }
123
+ }
124
+ }
125
+ }
126
+ return renderImage ? renderImage(tokens, idx, options, env, self) : self.renderToken(tokens, idx, options);
127
+ };
128
+ }
129
+
130
+ /**
131
+ * Parses the `width=W,height=H` parameter list of an image's sizing suffix.
132
+ *
133
+ * @returns the recognized dimensions, or `undefined` if the suffix is not a well-formed
134
+ * parameter list — in which case it is left as part of the `src`, since it may be a literal
135
+ * `|` in the URL.
136
+ */
137
+ protected parseImageDimensions(params: string): { width?: string, height?: string } | undefined {
138
+ const dimensions: { width?: string, height?: string } = {};
139
+ for (const param of params.split(',')) {
140
+ const match = /^\s*(width|height)\s*=\s*(\d+)\s*$/.exec(param);
141
+ if (!match) {
142
+ return undefined;
143
+ }
144
+ dimensions[match[1] as 'width' | 'height'] = match[2];
145
+ }
146
+ return Object.keys(dimensions).length > 0 ? dimensions : undefined;
104
147
  }
105
148
  }
@@ -14,6 +14,10 @@
14
14
  // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
15
  // *****************************************************************************
16
16
 
17
+ // Manages the socket the frontend logger's RPC rides on, so logging through an ILogger here
18
+ // would be circular.
19
+ /* eslint-disable @theia/named-logger-check */
20
+
17
21
  import { Emitter, Event } from '../../common/event';
18
22
  import { ConnectionSource } from './connection-source';
19
23
  import { Socket, io } from 'socket.io-client';
@@ -14,14 +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 { inject, injectable } from 'inversify';
17
+ import { inject, injectable, named } from 'inversify';
18
18
  import { Disposable } from '../common/disposable';
19
19
  import { nls } from '../common/nls';
20
20
  import { MaybePromise } from '../common/types';
21
21
  import { URI } from '../common/uri';
22
22
  import { QuickInputService, QuickPickItem, QuickPickItemOrSeparator } from './quick-input';
23
23
  import { getDefaultHandler } from './opener-service';
24
- import { PreferenceService, PreferenceScope } from '../common';
24
+ import { PreferenceService, PreferenceScope, ILogger } from '../common';
25
25
 
26
26
  export interface OpenWithHandler {
27
27
  /**
@@ -74,11 +74,14 @@ export class OpenWithService {
74
74
  @inject(PreferenceService)
75
75
  protected readonly preferenceService: PreferenceService;
76
76
 
77
+ @inject(ILogger) @named('core:OpenWithService')
78
+ protected readonly logger: ILogger;
79
+
77
80
  protected readonly handlers: OpenWithHandler[] = [];
78
81
 
79
82
  registerHandler(handler: OpenWithHandler): Disposable {
80
83
  if (this.handlers.some(h => h.id === handler.id)) {
81
- console.warn('Duplicate OpenWithHandler registration: ' + handler.id);
84
+ this.logger.warn('Duplicate OpenWithHandler registration: ' + handler.id);
82
85
  return Disposable.NULL;
83
86
  }
84
87
  this.handlers.push(handler);
@@ -14,12 +14,15 @@
14
14
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
15
  *******************************************************************************/
16
16
 
17
- import { injectable } from 'inversify';
18
- import { Measurement, MeasurementOptions, Stopwatch } from '../../common';
17
+ import { injectable, inject, named } from 'inversify';
18
+ import { Measurement, MeasurementOptions, Stopwatch, ILogger } from '../../common';
19
19
 
20
20
  @injectable()
21
21
  export class FrontendStopwatch extends Stopwatch {
22
22
 
23
+ @inject(ILogger) @named('core:FrontendStopwatch')
24
+ protected override readonly logger: ILogger;
25
+
23
26
  constructor() {
24
27
  super({
25
28
  owner: 'frontend page',
@@ -51,7 +54,7 @@ export class FrontendStopwatch extends Stopwatch {
51
54
  duration = entries[0].duration ?? Number.NaN;
52
55
  startTime = entries[0].startTime ?? Number.NaN;
53
56
  } catch (e) {
54
- console.warn(e);
57
+ this.logger.warn(e);
55
58
  duration = Number.NaN;
56
59
  startTime = Number.NaN;
57
60
  }
@@ -196,7 +196,7 @@ export class PerspectiveServiceImpl implements FrontendApplicationContribution,
196
196
  @inject(QuickInputService) @optional()
197
197
  protected readonly quickInputService: QuickInputService | undefined;
198
198
 
199
- @inject(ILogger) @named('core:PerspectiveService')
199
+ @inject(ILogger) @named('core:PerspectiveServiceImpl')
200
200
  protected readonly logger: ILogger;
201
201
 
202
202
  @inject(WidgetAreaResolver)
@@ -28,6 +28,8 @@ import { PreferenceScope } from '../../common/preferences/preference-scope';
28
28
  import { FrontendApplicationConfigProvider } from '../frontend-application-config-provider';
29
29
  import { PreferenceProxyOptions, PreferenceProxy, PreferenceChangeEvent, createPreferenceProxy } from '../../common/preferences/preference-proxy';
30
30
  import { PreferenceProxyFactory } from '../../common/preferences/injectable-preference-proxy';
31
+ import { ILogger } from '../../common/logger';
32
+ import { MockLogger } from '../../common/test/mock-logger';
31
33
 
32
34
  disableJSDOM();
33
35
 
@@ -47,6 +49,7 @@ function createTestContainer(): Container {
47
49
  const result = new Container();
48
50
  bindPreferenceService(result.bind.bind(result));
49
51
  bindMockPreferenceProviders(result.bind.bind(result), result.unbind.bind(result));
52
+ result.bind(ILogger).to(MockLogger);
50
53
  return result;
51
54
  }
52
55
 
@@ -28,6 +28,8 @@ import { FrontendApplicationConfigProvider } from '../frontend-application-confi
28
28
  import { bindMockPreferenceProviders, MockPreferenceProvider } from './test';
29
29
  import { PreferenceChangeEvent, createPreferenceProxy } from '../../common/preferences/preference-proxy';
30
30
  import { bindPreferenceService } from '../frontend-application-bindings';
31
+ import { ILogger } from '../../common/logger';
32
+ import { MockLogger } from '../../common/test/mock-logger';
31
33
 
32
34
  disableJSDOM();
33
35
 
@@ -43,6 +45,7 @@ function createTestContainer(): Container {
43
45
  const result = new Container();
44
46
  bindPreferenceService(result.bind.bind(result));
45
47
  bindMockPreferenceProviders(result.bind.bind(result), result.unbind.bind(result));
48
+ result.bind(ILogger).to(MockLogger);
46
49
  return result;
47
50
  }
48
51
 
@@ -175,7 +175,7 @@ export class PreferenceValidationService {
175
175
  const configuredDefault = this.getDefaultFromSchema(schema);
176
176
  return this.validateOneOf(key, configuredDefault, { ...schema, default: undefined });
177
177
  }
178
- console.log(`While validating ${key}, failed to find a valid value or default value. Using configured value ${value}.`);
178
+ this.logger.info(`While validating ${key}, failed to find a valid value or default value. Using configured value ${value}.`);
179
179
  return value;
180
180
  }
181
181
 
@@ -16,7 +16,7 @@
16
16
 
17
17
  import type { ApplicationShell } from './shell';
18
18
  import { inject, injectable, named } from 'inversify';
19
- import { ContributionProvider, UNTITLED_SCHEME, URI, Disposable, DisposableCollection, Emitter, Event } from '../common';
19
+ import { ContributionProvider, UNTITLED_SCHEME, URI, Disposable, DisposableCollection, Emitter, Event, ILogger } from '../common';
20
20
  import { Navigatable, NavigatableWidget } from './navigatable-types';
21
21
  import { AutoSaveMode, Saveable, SaveableSource, SaveableWidget, SaveOptions, SaveReason, setDirty, close, PostCreationSaveableWidget, ShouldSaveDialog } from './saveable';
22
22
  import { waitForClosed, Widget } from './widgets';
@@ -53,6 +53,9 @@ export class SaveableService implements FrontendApplicationContribution {
53
53
  @inject(WindowFocusService)
54
54
  protected readonly windowFocusService: WindowFocusService;
55
55
 
56
+ @inject(ILogger) @named('core:SaveableService')
57
+ protected readonly logger: ILogger;
58
+
56
59
  protected saveThrottles = new Map<Widget, AutoSaveThrottle>();
57
60
  protected saveMode: AutoSaveMode = 'off';
58
61
  protected saveDelay = 1000;
@@ -284,7 +287,7 @@ export class SaveableService implements FrontendApplicationContribution {
284
287
  }
285
288
  const saveable = Saveable.get(widget);
286
289
  if (!saveable) {
287
- console.warn('Saveable.get returned undefined on a known saveable widget. This is unexpected.');
290
+ this.logger.warn('Saveable.get returned undefined on a known saveable widget. This is unexpected.');
288
291
  }
289
292
  // Enter branch if saveable absent since we cannot check autosaveability more definitely.
290
293
  if (this.autoSave !== 'off' && (!saveable || this.shouldAutoSave(widget, saveable))) {
@@ -0,0 +1,62 @@
1
+ // *****************************************************************************
2
+ // Copyright (C) 2026 Alec Timison.
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
+ const disableJSDOM = enableJSDOM();
19
+
20
+ import { expect } from 'chai';
21
+ import { Widget } from '@theia/core/shared/@lumino/widgets';
22
+ import * as sinon from 'sinon';
23
+ import { DisposableCollection } from '../../common/disposable';
24
+ import { ApplicationShell } from './application-shell';
25
+ disableJSDOM();
26
+
27
+ describe('ApplicationShell', () => {
28
+ let toTearDown: () => void;
29
+
30
+ beforeEach(() => {
31
+ toTearDown = enableJSDOM();
32
+ });
33
+
34
+ afterEach(() => {
35
+ sinon.restore();
36
+ toTearDown();
37
+ });
38
+
39
+ it('cancels the previous activation check', () => {
40
+ const shell = Object.create(ApplicationShell.prototype) as ApplicationShell;
41
+ Object.assign(shell, {
42
+ toDisposeOnActivationCheck: new DisposableCollection(),
43
+ logger: { warn: sinon.stub() }
44
+ });
45
+ const assertActivated = (shell as unknown as { assertActivated(widget: Widget): void }).assertActivated.bind(shell);
46
+ const firstWidget = new Widget();
47
+ const secondWidget = new Widget();
48
+ const request = {} as ReturnType<typeof window.setTimeout>;
49
+ sinon.stub(globalThis, 'setTimeout').returns(request);
50
+ sinon.stub(window, 'setTimeout').returns(request);
51
+ const clearTimeout = sinon.stub(window, 'clearTimeout');
52
+ window.cancelAnimationFrame = sinon.stub();
53
+
54
+ assertActivated(firstWidget);
55
+ assertActivated(secondWidget);
56
+
57
+ expect(clearTimeout.callCount).to.equal(1);
58
+ expect(clearTimeout.firstCall.args[0]).to.equal(request);
59
+ firstWidget.dispose();
60
+ secondWidget.dispose();
61
+ });
62
+ });
@@ -1438,7 +1438,7 @@ export class ApplicationShell extends Widget {
1438
1438
  this.toDisposeOnActivationCheck.push(Disposable.create(() => widget.disposed.disconnect(onDispose)));
1439
1439
 
1440
1440
  let start = 0;
1441
- const step: FrameRequestCallback = () => {
1441
+ const step = (): void => {
1442
1442
  const activeElement = widget.node.ownerDocument.activeElement;
1443
1443
  if (activeElement && widget.node.contains(activeElement)) {
1444
1444
  return;
@@ -1449,13 +1449,13 @@ export class ApplicationShell extends Widget {
1449
1449
  }
1450
1450
  const delta = now - start;
1451
1451
  if (delta < this.activationTimeout) {
1452
- request = setTimeout(step, 0);
1452
+ request = window.setTimeout(step, 0);
1453
1453
  } else {
1454
1454
  this.logger.warn(`Widget was activated, but did not accept focus after ${this.activationTimeout}ms: ${widget.id}`);
1455
1455
  }
1456
1456
  };
1457
- let request = setTimeout(step, 0);
1458
- this.toDisposeOnActivationCheck.push(Disposable.create(() => window.cancelAnimationFrame(request)));
1457
+ let request = window.setTimeout(step, 0);
1458
+ this.toDisposeOnActivationCheck.push(Disposable.create(() => window.clearTimeout(request)));
1459
1459
  }
1460
1460
 
1461
1461
  /**
@@ -154,7 +154,8 @@ export class ShellLayoutRestorer implements CommandContribution {
154
154
 
155
155
  constructor(
156
156
  @inject(WidgetManager) protected widgetManager: WidgetManager,
157
- @inject(ILogger) protected logger: ILogger,
157
+ @inject(ILogger) @named('core:ShellLayoutRestorer')
158
+ protected readonly logger: ILogger,
158
159
  @inject(StorageService) protected storageService: StorageService) { }
159
160
 
160
161
  registerCommands(commands: CommandRegistry): void {
@@ -374,18 +375,18 @@ export class ShellLayoutRestorer implements CommandContribution {
374
375
  }
375
376
  if (layoutVersion !== applicationShellLayoutVersion) {
376
377
  if (layoutVersion < applicationShellLayoutVersion) {
377
- console.warn(`Layout version ${layoutVersion} is behind current layout version ${applicationShellLayoutVersion}, trying to migrate...`);
378
+ this.logger.warn(`Layout version ${layoutVersion} is behind current layout version ${applicationShellLayoutVersion}, trying to migrate...`);
378
379
  } else {
379
- console.warn(`Layout version ${layoutVersion} is ahead current layout version ${applicationShellLayoutVersion}, trying to load anyway...`);
380
+ this.logger.warn(`Layout version ${layoutVersion} is ahead current layout version ${applicationShellLayoutVersion}, trying to load anyway...`);
380
381
  }
381
- console.info(`Please use '${RESET_LAYOUT.label}' command if the layout looks bogus.`);
382
+ this.logger.info(`Please use '${RESET_LAYOUT.label}' command if the layout looks bogus.`);
382
383
  }
383
384
 
384
385
  const migrations = this.migrations.getContributions()
385
386
  .filter(m => m.layoutVersion > layoutVersion && m.layoutVersion <= applicationShellLayoutVersion)
386
387
  .sort((m, m2) => m.layoutVersion - m2.layoutVersion);
387
388
  if (migrations.length) {
388
- console.info(`Found ${migrations.length} migrations from layout version ${layoutVersion} to version ${applicationShellLayoutVersion}, migrating...`);
389
+ this.logger.info(`Found ${migrations.length} migrations from layout version ${layoutVersion} to version ${applicationShellLayoutVersion}, migrating...`);
389
390
  }
390
391
 
391
392
  const context = { layout, layoutVersion, migrations };
@@ -96,8 +96,9 @@ abstract class AbstractToolbarMenuWrapper {
96
96
  const icon = this.icon || 'ellipsis';
97
97
  const contextMatcher: ContextMatcher = this.contextKeyService;
98
98
  const className = `${icon} ${ACTION_ITEM}`;
99
+ const itemClassName = TabBarToolbar.Styles.TAB_BAR_TOOLBAR_ITEM + ' enabled menu' + (this.isToggled(widget) ? ' toggled' : '');
99
100
  if (CompoundMenuNode.is(this.menuNode) && !this.menuNode.isEmpty(this.effectiveMenuPath, this.contextKeyService, widget.node, widget)) {
100
- return <div key={this.id} className={TabBarToolbar.Styles.TAB_BAR_TOOLBAR_ITEM + ' enabled menu'}>
101
+ return <div key={this.id} className={itemClassName}>
101
102
  <div id={this.id} className={className}
102
103
  title={this.tooltip || this.text}
103
104
  onClick={e => this.executeCommand(widget, e)}
@@ -107,7 +108,7 @@ abstract class AbstractToolbarMenuWrapper {
107
108
  </div>
108
109
  </div>;
109
110
  } else {
110
- return <div key={this.id} className={TabBarToolbar.Styles.TAB_BAR_TOOLBAR_ITEM + ' enabled menu'}>
111
+ return <div key={this.id} className={itemClassName}>
111
112
  <div id={this.id} className={className}
112
113
  title={this.tooltip || this.text}
113
114
  onClick={e => this.executeCommand(widget, e)}
@@ -17,7 +17,7 @@
17
17
  import debounce = require('lodash.debounce');
18
18
  import { inject, injectable, named } from 'inversify';
19
19
  // eslint-disable-next-line max-len
20
- import { CommandRegistry, ContributionProvider, Disposable, DisposableCollection, Emitter, Event, MenuModelRegistry, MenuPath } from '../../../common';
20
+ import { CommandRegistry, ContributionProvider, Disposable, DisposableCollection, Emitter, Event, MenuModelRegistry, MenuPath, ILogger } from '../../../common';
21
21
  import { ContextKeyService } from '../../context-key-service';
22
22
  import { FrontendApplicationContribution } from '../../frontend-application-contribution';
23
23
  import { Widget } from '../../widgets';
@@ -68,6 +68,9 @@ export class TabBarToolbarRegistry implements FrontendApplicationContribution {
68
68
  @inject(ContributionProvider) @named(TabBarToolbarContribution)
69
69
  protected readonly contributionProvider: ContributionProvider<TabBarToolbarContribution>;
70
70
 
71
+ @inject(ILogger) @named('core:TabBarToolbarRegistry')
72
+ protected readonly logger: ILogger;
73
+
71
74
  protected readonly onDidChangeEmitter = new Emitter<void>();
72
75
  readonly onDidChange: Event<void> = this.onDidChangeEmitter.event;
73
76
  // debounce in order to avoid to fire more than once in the same tick
@@ -223,7 +226,7 @@ export class TabBarToolbarRegistry implements FrontendApplicationContribution {
223
226
  this.fireOnDidChange();
224
227
  return { dispose: () => this.unregisterMenuDelegate(menuPath) };
225
228
  }
226
- console.warn('Unable to register menu delegate. Delegate has already been registered', menuPath);
229
+ this.logger.warn('Unable to register menu delegate. Delegate has already been registered', menuPath);
227
230
  return Disposable.NULL;
228
231
  }
229
232