@theia/core 1.73.0-next.9 → 1.73.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.
- package/README.md +26 -16
- package/i18n/nls.cs.json +273 -36
- package/i18n/nls.de.json +273 -36
- package/i18n/nls.es.json +273 -36
- package/i18n/nls.fr.json +273 -36
- package/i18n/nls.hu.json +273 -36
- package/i18n/nls.it.json +273 -36
- package/i18n/nls.ja.json +273 -36
- package/i18n/nls.json +273 -36
- package/i18n/nls.ko.json +273 -36
- package/i18n/nls.pl.json +273 -36
- package/i18n/nls.pt-br.json +273 -36
- package/i18n/nls.ru.json +273 -36
- package/i18n/nls.tr.json +273 -36
- package/i18n/nls.zh-cn.json +273 -36
- package/i18n/nls.zh-tw.json +273 -36
- package/lib/browser/authentication-service.d.ts +2 -0
- package/lib/browser/authentication-service.d.ts.map +1 -1
- package/lib/browser/authentication-service.js +8 -2
- package/lib/browser/authentication-service.js.map +1 -1
- package/lib/browser/catalog.json +314 -77
- package/lib/browser/frontend-application.d.ts +2 -0
- package/lib/browser/frontend-application.d.ts.map +1 -1
- package/lib/browser/frontend-application.js +15 -9
- package/lib/browser/frontend-application.js.map +1 -1
- package/lib/browser/json-schema-store.d.ts +2 -0
- package/lib/browser/json-schema-store.d.ts.map +1 -1
- package/lib/browser/json-schema-store.js +8 -2
- package/lib/browser/json-schema-store.js.map +1 -1
- package/lib/browser/keybinding.js +2 -1
- package/lib/browser/keybinding.js.map +1 -1
- package/lib/browser/keyboard/keyboard-layout-service.d.ts +2 -0
- package/lib/browser/keyboard/keyboard-layout-service.d.ts.map +1 -1
- package/lib/browser/keyboard/keyboard-layout-service.js +35 -12
- package/lib/browser/keyboard/keyboard-layout-service.js.map +1 -1
- package/lib/browser/keyboard/keyboard-layout-service.spec.js +26 -0
- package/lib/browser/keyboard/keyboard-layout-service.spec.js.map +1 -1
- package/lib/browser/markdown-rendering/markdown.d.ts +1 -1
- package/lib/browser/markdown-rendering/markdown.d.ts.map +1 -1
- package/lib/browser/markdown-rendering/markdown.js +1 -1
- package/lib/browser/markdown-rendering/markdown.js.map +1 -1
- package/lib/browser/menu/composite-menu-node.js +4 -4
- package/lib/browser/menu/composite-menu-node.js.map +1 -1
- package/lib/browser/messaging/ws-connection-source.d.ts.map +1 -1
- package/lib/browser/messaging/ws-connection-source.js +1 -6
- package/lib/browser/messaging/ws-connection-source.js.map +1 -1
- package/lib/browser/preferences/frontend-config-preference-contributions.d.ts +2 -0
- package/lib/browser/preferences/frontend-config-preference-contributions.d.ts.map +1 -1
- package/lib/browser/preferences/frontend-config-preference-contributions.js +7 -1
- package/lib/browser/preferences/frontend-config-preference-contributions.js.map +1 -1
- package/lib/browser/preferences/preference-proxy.spec.js +7 -0
- package/lib/browser/preferences/preference-proxy.spec.js.map +1 -1
- package/lib/browser/preferences/preference-schema-provider.spec.js +3 -0
- package/lib/browser/preferences/preference-schema-provider.spec.js.map +1 -1
- package/lib/browser/preferences/preference-validation-service.d.ts +2 -0
- package/lib/browser/preferences/preference-validation-service.d.ts.map +1 -1
- package/lib/browser/preferences/preference-validation-service.js +11 -5
- package/lib/browser/preferences/preference-validation-service.js.map +1 -1
- package/lib/browser/preferences/preference-validation-service.spec.js +2 -0
- package/lib/browser/preferences/preference-validation-service.spec.js.map +1 -1
- package/lib/browser/secondary-window-handler.d.ts +2 -0
- package/lib/browser/secondary-window-handler.d.ts.map +1 -1
- package/lib/browser/secondary-window-handler.js +12 -6
- package/lib/browser/secondary-window-handler.js.map +1 -1
- package/lib/browser/shell/application-shell.d.ts +2 -0
- package/lib/browser/shell/application-shell.d.ts.map +1 -1
- package/lib/browser/shell/application-shell.js +9 -3
- package/lib/browser/shell/application-shell.js.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.js +6 -6
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.js.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.js +2 -2
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.js.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.spec.js +131 -0
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.spec.js.map +1 -1
- package/lib/browser/status-bar/status-bar.d.ts +2 -2
- package/lib/browser/status-bar/status-bar.d.ts.map +1 -1
- package/lib/browser/status-bar/status-bar.js.map +1 -1
- package/lib/browser/test/jsdom.d.ts +4 -0
- package/lib/browser/test/jsdom.d.ts.map +1 -1
- package/lib/browser/test/jsdom.js +18 -0
- package/lib/browser/test/jsdom.js.map +1 -1
- package/lib/browser/tree/tree-container.spec.js +4 -0
- package/lib/browser/tree/tree-container.spec.js.map +1 -1
- package/lib/browser/tree/tree-model.d.ts +1 -0
- package/lib/browser/tree/tree-model.d.ts.map +1 -1
- package/lib/browser/tree/tree-model.js +3 -0
- package/lib/browser/tree/tree-model.js.map +1 -1
- package/lib/browser/tree/tree-view-welcome-widget.d.ts +1 -0
- package/lib/browser/tree/tree-view-welcome-widget.d.ts.map +1 -1
- package/lib/browser/tree/tree-view-welcome-widget.js +8 -6
- package/lib/browser/tree/tree-view-welcome-widget.js.map +1 -1
- package/lib/browser/tree/tree-view-welcome-widget.spec.d.ts +2 -0
- package/lib/browser/tree/tree-view-welcome-widget.spec.d.ts.map +1 -0
- package/lib/browser/tree/tree-view-welcome-widget.spec.js +68 -0
- package/lib/browser/tree/tree-view-welcome-widget.spec.js.map +1 -0
- package/lib/browser/tree/tree-widget.js +2 -2
- package/lib/browser/tree/tree-widget.js.map +1 -1
- package/lib/browser/tree/tree.d.ts +24 -2
- package/lib/browser/tree/tree.d.ts.map +1 -1
- package/lib/browser/tree/tree.js +20 -2
- package/lib/browser/tree/tree.js.map +1 -1
- package/lib/browser/tree/tree.spec.js +27 -0
- package/lib/browser/tree/tree.spec.js.map +1 -1
- package/lib/browser/window/default-window-service.d.ts +2 -1
- package/lib/browser/window/default-window-service.d.ts.map +1 -1
- package/lib/browser/window/default-window-service.js +10 -5
- package/lib/browser/window/default-window-service.js.map +1 -1
- package/lib/browser/window/default-window-service.spec.js +2 -0
- package/lib/browser/window/default-window-service.spec.js.map +1 -1
- package/lib/browser-only/messaging/frontend-only-service-connection-provider.d.ts +2 -0
- package/lib/browser-only/messaging/frontend-only-service-connection-provider.d.ts.map +1 -1
- package/lib/browser-only/messaging/frontend-only-service-connection-provider.js +8 -2
- package/lib/browser-only/messaging/frontend-only-service-connection-provider.js.map +1 -1
- package/lib/common/command.d.ts +2 -0
- package/lib/common/command.d.ts.map +1 -1
- package/lib/common/command.js +10 -4
- package/lib/common/command.js.map +1 -1
- package/lib/common/logger.d.ts.map +1 -1
- package/lib/common/logger.js +11 -1
- package/lib/common/logger.js.map +1 -1
- package/lib/common/logger.spec.js +46 -0
- package/lib/common/logger.spec.js.map +1 -1
- package/lib/common/preferences/injectable-preference-proxy.d.ts +3 -3
- package/lib/common/preferences/injectable-preference-proxy.d.ts.map +1 -1
- package/lib/common/preferences/injectable-preference-proxy.js +6 -1
- package/lib/common/preferences/injectable-preference-proxy.js.map +1 -1
- package/lib/common/preferences/preference-proxy.d.ts.map +1 -1
- package/lib/common/preferences/preference-proxy.js +6 -1
- package/lib/common/preferences/preference-proxy.js.map +1 -1
- package/lib/electron-main/electron-main-application.d.ts.map +1 -1
- package/lib/electron-main/electron-main-application.js +4 -2
- package/lib/electron-main/electron-main-application.js.map +1 -1
- package/lib/electron-node/hosting/electron-ws-origin-validator.d.ts.map +1 -1
- package/lib/electron-node/hosting/electron-ws-origin-validator.js +5 -2
- package/lib/electron-node/hosting/electron-ws-origin-validator.js.map +1 -1
- package/lib/electron-node/hosting/electron-ws-origin-validator.spec.d.ts +2 -0
- package/lib/electron-node/hosting/electron-ws-origin-validator.spec.d.ts.map +1 -0
- package/lib/electron-node/hosting/electron-ws-origin-validator.spec.js +59 -0
- package/lib/electron-node/hosting/electron-ws-origin-validator.spec.js.map +1 -0
- package/lib/electron-node/request/electron-backend-request-service.d.ts +2 -0
- package/lib/electron-node/request/electron-backend-request-service.d.ts.map +1 -1
- package/lib/electron-node/request/electron-backend-request-service.js +7 -1
- package/lib/electron-node/request/electron-backend-request-service.js.map +1 -1
- package/lib/electron-node/token/electron-token-backend-contribution.d.ts +2 -0
- package/lib/electron-node/token/electron-token-backend-contribution.d.ts.map +1 -1
- package/lib/electron-node/token/electron-token-backend-contribution.js +7 -1
- package/lib/electron-node/token/electron-token-backend-contribution.js.map +1 -1
- package/lib/electron-node/token/electron-token-validator.d.ts +2 -0
- package/lib/electron-node/token/electron-token-validator.d.ts.map +1 -1
- package/lib/electron-node/token/electron-token-validator.js +7 -1
- package/lib/electron-node/token/electron-token-validator.js.map +1 -1
- package/lib/node/backend-application-module.d.ts.map +1 -1
- package/lib/node/backend-application-module.js +2 -0
- package/lib/node/backend-application-module.js.map +1 -1
- package/lib/node/backend-application.d.ts +11 -0
- package/lib/node/backend-application.d.ts.map +1 -1
- package/lib/node/backend-application.js +40 -12
- package/lib/node/backend-application.js.map +1 -1
- package/lib/node/backend-application.spec.js +4 -2
- package/lib/node/backend-application.spec.js.map +1 -1
- package/lib/node/hosting/backend-hosting-module.d.ts.map +1 -1
- package/lib/node/hosting/backend-hosting-module.js +7 -0
- package/lib/node/hosting/backend-hosting-module.js.map +1 -1
- package/lib/node/hosting/browser-connection-token.d.ts +46 -0
- package/lib/node/hosting/browser-connection-token.d.ts.map +1 -0
- package/lib/node/hosting/browser-connection-token.js +120 -0
- package/lib/node/hosting/browser-connection-token.js.map +1 -0
- package/lib/node/hosting/browser-connection-token.spec.d.ts +2 -0
- package/lib/node/hosting/browser-connection-token.spec.d.ts.map +1 -0
- package/lib/node/hosting/browser-connection-token.spec.js +128 -0
- package/lib/node/hosting/browser-connection-token.spec.js.map +1 -0
- package/lib/node/hosting/ws-origin-validator.d.ts.map +1 -1
- package/lib/node/hosting/ws-origin-validator.js +21 -4
- package/lib/node/hosting/ws-origin-validator.js.map +1 -1
- package/lib/node/hosting/ws-origin-validator.spec.d.ts +2 -0
- package/lib/node/hosting/ws-origin-validator.spec.d.ts.map +1 -0
- package/lib/node/hosting/ws-origin-validator.spec.js +131 -0
- package/lib/node/hosting/ws-origin-validator.spec.js.map +1 -0
- package/lib/node/index.d.ts +1 -0
- package/lib/node/index.d.ts.map +1 -1
- package/lib/node/index.js +3 -1
- package/lib/node/index.js.map +1 -1
- package/lib/node/logger-cli-contribution.d.ts +6 -0
- package/lib/node/logger-cli-contribution.d.ts.map +1 -1
- package/lib/node/logger-cli-contribution.js +28 -5
- package/lib/node/logger-cli-contribution.js.map +1 -1
- package/lib/node/logger-cli-contribution.spec.js +54 -0
- package/lib/node/logger-cli-contribution.spec.js.map +1 -1
- package/lib/node/messaging/default-messaging-service.d.ts +2 -0
- package/lib/node/messaging/default-messaging-service.d.ts.map +1 -1
- package/lib/node/messaging/default-messaging-service.js +8 -2
- package/lib/node/messaging/default-messaging-service.js.map +1 -1
- package/lib/node/messaging/test/default-messaging-service.spec.js +2 -0
- package/lib/node/messaging/test/default-messaging-service.spec.js.map +1 -1
- package/lib/node/messaging/websocket-endpoint.d.ts +7 -0
- package/lib/node/messaging/websocket-endpoint.d.ts.map +1 -1
- package/lib/node/messaging/websocket-endpoint.js +21 -6
- package/lib/node/messaging/websocket-endpoint.js.map +1 -1
- package/lib/node/process-utils.d.ts +2 -0
- package/lib/node/process-utils.d.ts.map +1 -1
- package/lib/node/process-utils.js +8 -2
- package/lib/node/process-utils.js.map +1 -1
- package/lib/node/process-utils.spec.js +11 -9
- package/lib/node/process-utils.spec.js.map +1 -1
- package/lib/node/request/backend-request-facade.d.ts +19 -0
- package/lib/node/request/backend-request-facade.d.ts.map +1 -1
- package/lib/node/request/backend-request-facade.js +93 -3
- package/lib/node/request/backend-request-facade.js.map +1 -1
- package/lib/node/request/backend-request-facade.spec.d.ts +2 -0
- package/lib/node/request/backend-request-facade.spec.d.ts.map +1 -0
- package/lib/node/request/backend-request-facade.spec.js +171 -0
- package/lib/node/request/backend-request-facade.spec.js.map +1 -0
- package/package.json +29 -20
- package/src/browser/authentication-service.ts +6 -3
- package/src/browser/frontend-application.ts +13 -9
- package/src/browser/json-schema-store.ts +6 -2
- package/src/browser/keybinding.ts +2 -2
- package/src/browser/keyboard/keyboard-layout-service.spec.ts +28 -0
- package/src/browser/keyboard/keyboard-layout-service.ts +38 -14
- package/src/browser/markdown-rendering/markdown.tsx +2 -2
- package/src/browser/menu/composite-menu-node.ts +4 -4
- package/src/browser/messaging/ws-connection-source.ts +1 -6
- package/src/browser/preferences/frontend-config-preference-contributions.ts +7 -2
- package/src/browser/preferences/preference-proxy.spec.ts +8 -0
- package/src/browser/preferences/preference-schema-provider.spec.ts +5 -0
- package/src/browser/preferences/preference-validation-service.spec.ts +3 -1
- package/src/browser/preferences/preference-validation-service.ts +9 -6
- package/src/browser/secondary-window-handler.ts +11 -7
- package/src/browser/shell/application-shell.ts +8 -4
- package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.tsx +6 -6
- package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.ts +2 -2
- package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.spec.ts +159 -1
- package/src/browser/status-bar/status-bar.tsx +3 -3
- package/src/browser/test/jsdom.ts +18 -0
- package/src/browser/tree/tree-container.spec.ts +6 -0
- package/src/browser/tree/tree-model.ts +4 -0
- package/src/browser/tree/tree-view-welcome-widget.spec.ts +82 -0
- package/src/browser/tree/tree-view-welcome-widget.tsx +10 -11
- package/src/browser/tree/tree-widget.tsx +2 -2
- package/src/browser/tree/tree.spec.ts +30 -0
- package/src/browser/tree/tree.ts +31 -4
- package/src/browser/window/default-window-service.spec.ts +3 -1
- package/src/browser/window/default-window-service.ts +9 -6
- package/src/browser-only/messaging/frontend-only-service-connection-provider.ts +8 -3
- package/src/common/command.ts +8 -4
- package/src/common/i18n/nls.metadata.json +2659 -374
- package/src/common/logger.spec.ts +62 -1
- package/src/common/logger.ts +13 -4
- package/src/common/preferences/injectable-preference-proxy.ts +10 -4
- package/src/common/preferences/preference-proxy.ts +10 -4
- package/src/electron-main/electron-main-application.ts +4 -2
- package/src/electron-node/hosting/electron-ws-origin-validator.spec.ts +69 -0
- package/src/electron-node/hosting/electron-ws-origin-validator.ts +5 -2
- package/src/electron-node/request/electron-backend-request-service.ts +6 -2
- package/src/electron-node/token/electron-token-backend-contribution.ts +6 -2
- package/src/electron-node/token/electron-token-validator.ts +6 -2
- package/src/node/backend-application-module.ts +4 -2
- package/src/node/backend-application.spec.ts +5 -3
- package/src/node/backend-application.ts +33 -11
- package/src/node/hosting/backend-hosting-module.ts +10 -0
- package/src/node/hosting/browser-connection-token.spec.ts +167 -0
- package/src/node/hosting/browser-connection-token.ts +126 -0
- package/src/node/hosting/ws-origin-validator.spec.ts +193 -0
- package/src/node/hosting/ws-origin-validator.ts +23 -4
- package/src/node/index.ts +1 -0
- package/src/node/logger-cli-contribution.spec.ts +65 -0
- package/src/node/logger-cli-contribution.ts +32 -5
- package/src/node/messaging/default-messaging-service.ts +6 -2
- package/src/node/messaging/test/default-messaging-service.spec.ts +3 -1
- package/src/node/messaging/websocket-endpoint.ts +23 -7
- package/src/node/process-utils.spec.ts +12 -9
- package/src/node/process-utils.ts +7 -3
- package/src/node/request/backend-request-facade.spec.ts +203 -0
- package/src/node/request/backend-request-facade.ts +108 -3
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2026 EclipseSource and others.
|
|
3
|
+
//
|
|
4
|
+
// This program and the accompanying materials are made available under the
|
|
5
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
//
|
|
8
|
+
// This Source Code may also be made available under the following Secondary
|
|
9
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
+
// with the GNU Classpath Exception which is available at
|
|
12
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
13
|
+
//
|
|
14
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
|
+
// *****************************************************************************
|
|
16
|
+
|
|
17
|
+
import { enableJSDOM } from '../test/jsdom';
|
|
18
|
+
|
|
19
|
+
// The widget module transitively imports `@lumino/widgets`, which touches `document` at load time.
|
|
20
|
+
const disableJSDOM = enableJSDOM();
|
|
21
|
+
|
|
22
|
+
import { Container } from 'inversify';
|
|
23
|
+
import { expect } from 'chai';
|
|
24
|
+
import { ReactElement, ReactNode } from 'react';
|
|
25
|
+
import { CommandService } from '../../common';
|
|
26
|
+
import { LabelParser } from '../label-parser';
|
|
27
|
+
import { codicon } from '../widgets';
|
|
28
|
+
import { TreeViewWelcomeWidget } from './tree-view-welcome-widget';
|
|
29
|
+
|
|
30
|
+
disableJSDOM();
|
|
31
|
+
|
|
32
|
+
let labelParser: LabelParser;
|
|
33
|
+
|
|
34
|
+
before(() => {
|
|
35
|
+
const container = new Container();
|
|
36
|
+
container.bind(LabelParser).toSelf().inSingletonScope();
|
|
37
|
+
container.bind(CommandService).toDynamicValue(() => ({
|
|
38
|
+
executeCommand<T>(): Promise<T | undefined> {
|
|
39
|
+
return Promise.resolve(undefined);
|
|
40
|
+
}
|
|
41
|
+
})).inSingletonScope();
|
|
42
|
+
labelParser = container.get(LabelParser);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
describe('TreeViewWelcomeWidget#renderLabelWithIcons', () => {
|
|
46
|
+
|
|
47
|
+
type SpanElement = ReactElement<{ className?: string; children?: ReactNode }>;
|
|
48
|
+
|
|
49
|
+
// Exercise the protected helper without standing up the full TreeWidget DI graph.
|
|
50
|
+
function render(label: string): SpanElement[] {
|
|
51
|
+
const widget = Object.create(TreeViewWelcomeWidget.prototype) as {
|
|
52
|
+
labelParser: LabelParser;
|
|
53
|
+
renderLabelWithIcons(label: string): SpanElement[];
|
|
54
|
+
};
|
|
55
|
+
widget.labelParser = labelParser;
|
|
56
|
+
return widget.renderLabelWithIcons(label);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
it('renders a leading $(codicon) as a codicon span and keeps the trailing text', () => {
|
|
60
|
+
const nodes = render('$(robot) Launch AI Agent');
|
|
61
|
+
expect(nodes).to.have.lengthOf(2);
|
|
62
|
+
expect(nodes[0].props.className).to.equal(codicon('robot'));
|
|
63
|
+
expect(nodes[0].props.children).to.be.undefined;
|
|
64
|
+
expect(nodes[1].props.className).to.be.undefined;
|
|
65
|
+
expect(nodes[1].props.children).to.equal(' Launch AI Agent');
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('renders a plain label as a single text span with no codicon', () => {
|
|
69
|
+
const nodes = render('Open Documentation');
|
|
70
|
+
expect(nodes).to.have.lengthOf(1);
|
|
71
|
+
expect(nodes[0].props.className).to.be.undefined;
|
|
72
|
+
expect(nodes[0].props.children).to.equal('Open Documentation');
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('renders multiple codicons interleaved with text', () => {
|
|
76
|
+
const nodes = render('$(package) Import $(gear) Library');
|
|
77
|
+
const iconNodes = nodes.filter(n => typeof n.props.className === 'string' && n.props.className.includes('codicon-'));
|
|
78
|
+
expect(iconNodes).to.have.lengthOf(2);
|
|
79
|
+
expect(iconNodes[0].props.className).to.equal(codicon('package'));
|
|
80
|
+
expect(iconNodes[1].props.className).to.equal(codicon('gear'));
|
|
81
|
+
});
|
|
82
|
+
});
|
|
@@ -209,22 +209,14 @@ export class TreeViewWelcomeWidget extends TreeWidget {
|
|
|
209
209
|
className='theia-button theia-WelcomeViewButton'
|
|
210
210
|
disabled={!this.isEnabledClick(enablement)}
|
|
211
211
|
onClick={e => this.openLinkOrCommand(e, node.href)}>
|
|
212
|
-
{node.label}
|
|
212
|
+
{this.renderLabelWithIcons(node.label)}
|
|
213
213
|
</button>
|
|
214
214
|
</div>
|
|
215
215
|
);
|
|
216
216
|
}
|
|
217
217
|
|
|
218
218
|
protected renderTextNode(node: string, textKey: string | number): React.ReactNode {
|
|
219
|
-
return <span key={`text-${textKey}`}>
|
|
220
|
-
{this.labelParser.parse(node)
|
|
221
|
-
.map((segment, index) =>
|
|
222
|
-
LabelIcon.is(segment)
|
|
223
|
-
? <span
|
|
224
|
-
key={index}
|
|
225
|
-
className={codicon(segment.name)}
|
|
226
|
-
/>
|
|
227
|
-
: <span key={index}>{segment}</span>)}</span>;
|
|
219
|
+
return <span key={`text-${textKey}`}>{this.renderLabelWithIcons(node)}</span>;
|
|
228
220
|
}
|
|
229
221
|
|
|
230
222
|
protected renderLinkNode(node: ILink, linkKey: string | number, enablement: string | undefined): React.ReactNode {
|
|
@@ -233,11 +225,18 @@ export class TreeViewWelcomeWidget extends TreeWidget {
|
|
|
233
225
|
className={this.getLinkClassName(node.href, enablement)}
|
|
234
226
|
title={node.title || ''}
|
|
235
227
|
onClick={e => this.openLinkOrCommand(e, node.href)}>
|
|
236
|
-
{node.label}
|
|
228
|
+
{this.renderLabelWithIcons(node.label)}
|
|
237
229
|
</a>
|
|
238
230
|
);
|
|
239
231
|
}
|
|
240
232
|
|
|
233
|
+
protected renderLabelWithIcons(label: string): React.ReactNode[] {
|
|
234
|
+
return this.labelParser.parse(label).map((segment, index) =>
|
|
235
|
+
LabelIcon.is(segment)
|
|
236
|
+
? <span key={index} className={codicon(segment.name)} />
|
|
237
|
+
: <span key={index}>{segment}</span>);
|
|
238
|
+
}
|
|
239
|
+
|
|
241
240
|
protected getLinkClassName(href: string, enablement: string | undefined): string {
|
|
242
241
|
const classNames = ['theia-WelcomeViewCommandLink'];
|
|
243
242
|
// Only command-backed links can be disabled. All other, https:, file: remain enabled
|
|
@@ -545,7 +545,7 @@ export class TreeWidget extends ReactWidget implements StatefulWidget {
|
|
|
545
545
|
return <this.ScrollingRowRenderer rows={rows} />;
|
|
546
546
|
}
|
|
547
547
|
return <TreeWidget.View
|
|
548
|
-
ref={view => this.view = (view || undefined)}
|
|
548
|
+
ref={view => { this.view = (view || undefined); }}
|
|
549
549
|
width={this.node.offsetWidth}
|
|
550
550
|
height={this.node.offsetHeight}
|
|
551
551
|
rows={rows}
|
|
@@ -1689,7 +1689,7 @@ export namespace TreeWidget {
|
|
|
1689
1689
|
override render(): React.ReactNode {
|
|
1690
1690
|
const { rows, width, height, scrollToRow, renderNodeRow, onScrollEmitter, ...other } = this.props;
|
|
1691
1691
|
return <Virtuoso
|
|
1692
|
-
ref={list => {
|
|
1692
|
+
ref={(list: VirtuosoHandle | null) => {
|
|
1693
1693
|
this.list = (list || undefined);
|
|
1694
1694
|
this.scrollIntoViewIfNeeded();
|
|
1695
1695
|
}}
|
|
@@ -120,6 +120,36 @@ describe('Tree', () => {
|
|
|
120
120
|
}`, node);
|
|
121
121
|
});
|
|
122
122
|
|
|
123
|
+
it('removeChild - clears parent and sibling pointers on the removed node', () => {
|
|
124
|
+
const node = getNode();
|
|
125
|
+
const middle = node.children[1];
|
|
126
|
+
CompositeTreeNode.removeChild(node, middle);
|
|
127
|
+
expect(middle.parent).to.be.undefined;
|
|
128
|
+
expect(middle.previousSibling).to.be.undefined;
|
|
129
|
+
expect(middle.nextSibling).to.be.undefined;
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it('removeChild - purges the detached subtree from the tree index when a tree is provided', () => {
|
|
133
|
+
const target = model.getNode('1.2');
|
|
134
|
+
expect(target).to.not.be.undefined;
|
|
135
|
+
const parent = target!.parent!;
|
|
136
|
+
expect(model.getNode('1.2.1')).to.not.be.undefined;
|
|
137
|
+
CompositeTreeNode.removeChild(parent, target!, model);
|
|
138
|
+
expect(model.getNode('1.2')).to.be.undefined;
|
|
139
|
+
expect(model.getNode('1.2.1')).to.be.undefined;
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
it('removeChild - leaves the index untouched when no tree is provided', () => {
|
|
143
|
+
const target = model.getNode('1.2')!;
|
|
144
|
+
const parent = target.parent!;
|
|
145
|
+
CompositeTreeNode.removeChild(parent, target);
|
|
146
|
+
// Until the caller explicitly purges, the orphan is still in the index.
|
|
147
|
+
expect(model.getNode('1.2')).to.equal(target);
|
|
148
|
+
// Explicit purge cleans it up.
|
|
149
|
+
model.removeNode(target);
|
|
150
|
+
expect(model.getNode('1.2')).to.be.undefined;
|
|
151
|
+
});
|
|
152
|
+
|
|
123
153
|
let model: TreeModel;
|
|
124
154
|
beforeEach(() => {
|
|
125
155
|
model = createTreeModel();
|
package/src/browser/tree/tree.ts
CHANGED
|
@@ -14,13 +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 { injectable } from 'inversify';
|
|
17
|
+
import { injectable, inject, named } from 'inversify';
|
|
18
18
|
import { Event, Emitter, WaitUntilEvent } from '../../common/event';
|
|
19
19
|
import { Disposable, DisposableCollection } from '../../common/disposable';
|
|
20
20
|
import { CancellationToken, CancellationTokenSource } from '../../common/cancellation';
|
|
21
21
|
import { timeout } from '../../common/promise-util';
|
|
22
22
|
import { isObject, Mutable } from '../../common';
|
|
23
23
|
import { AccessibilityInformation } from '../../common/accessibility';
|
|
24
|
+
import { ILogger } from '../../common/logger';
|
|
24
25
|
|
|
25
26
|
export const Tree = Symbol('Tree');
|
|
26
27
|
|
|
@@ -78,6 +79,17 @@ export interface Tree extends Disposable {
|
|
|
78
79
|
readonly onDidUpdate: Event<TreeNode[]>;
|
|
79
80
|
|
|
80
81
|
markAsChecked(node: TreeNode, checked: boolean): void;
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Remove the given node and all of its descendants from the tree's internal
|
|
85
|
+
* id-to-node index. Safe to call on already-detached subtrees.
|
|
86
|
+
*
|
|
87
|
+
* Callers that mutate the tree structure directly via
|
|
88
|
+
* {@link CompositeTreeNode.removeChild} should invoke this (or pass the tree
|
|
89
|
+
* to `removeChild`) to keep {@link getNode} and {@link validateNode} from
|
|
90
|
+
* returning orphaned nodes.
|
|
91
|
+
*/
|
|
92
|
+
removeNode(node: TreeNode | undefined): void;
|
|
81
93
|
}
|
|
82
94
|
|
|
83
95
|
export interface TreeViewItemCheckboxInfo {
|
|
@@ -215,7 +227,17 @@ export namespace CompositeTreeNode {
|
|
|
215
227
|
return parent;
|
|
216
228
|
}
|
|
217
229
|
|
|
218
|
-
|
|
230
|
+
/**
|
|
231
|
+
* Detach the given `child` from the `parent`.
|
|
232
|
+
*
|
|
233
|
+
* After this call, the child's `parent`, `previousSibling`, and
|
|
234
|
+
* `nextSibling` references are cleared, symmetric with `setParent`. If a
|
|
235
|
+
* `tree` is provided, the child and its descendants are also purged from
|
|
236
|
+
* the tree's id-to-node index so that {@link Tree.getNode} no longer
|
|
237
|
+
* returns the detached subtree. Otherwise the index entries persist and
|
|
238
|
+
* the caller is responsible for cleanup (e.g., via `tree.removeNode`).
|
|
239
|
+
*/
|
|
240
|
+
export function removeChild(parent: CompositeTreeNode, child: TreeNode, tree?: Tree): void {
|
|
219
241
|
const children = parent.children as TreeNode[];
|
|
220
242
|
const index = children.findIndex(value => value.id === child.id);
|
|
221
243
|
if (index === -1) {
|
|
@@ -229,6 +251,8 @@ export namespace CompositeTreeNode {
|
|
|
229
251
|
if (nextSibling) {
|
|
230
252
|
Object.assign(nextSibling, { previousSibling });
|
|
231
253
|
}
|
|
254
|
+
Object.assign(child, { parent: undefined, previousSibling: undefined, nextSibling: undefined });
|
|
255
|
+
tree?.removeNode(child);
|
|
232
256
|
}
|
|
233
257
|
|
|
234
258
|
export function setParent(child: TreeNode, index: number, parent: CompositeTreeNode): void {
|
|
@@ -250,6 +274,9 @@ export namespace CompositeTreeNode {
|
|
|
250
274
|
@injectable()
|
|
251
275
|
export class TreeImpl implements Tree {
|
|
252
276
|
|
|
277
|
+
@inject(ILogger) @named('core:TreeImpl')
|
|
278
|
+
protected readonly logger: ILogger;
|
|
279
|
+
|
|
253
280
|
protected _root: TreeNode | undefined;
|
|
254
281
|
protected readonly onChangedEmitter = new Emitter<void>();
|
|
255
282
|
protected readonly onNodeRefreshedEmitter = new Emitter<CompositeTreeNode & WaitUntilEvent>();
|
|
@@ -344,7 +371,7 @@ export class TreeImpl implements Tree {
|
|
|
344
371
|
protected async setChildren(parent: CompositeTreeNode, children: TreeNode[]): Promise<CompositeTreeNode | undefined> {
|
|
345
372
|
const root = this.getRootNode(parent);
|
|
346
373
|
if (this.nodes[root.id] && this.nodes[root.id] !== root) {
|
|
347
|
-
|
|
374
|
+
this.logger.error(`Child node '${parent.id}' does not belong to this '${root.id}' tree.`);
|
|
348
375
|
return undefined;
|
|
349
376
|
}
|
|
350
377
|
this.removeNode(parent);
|
|
@@ -354,7 +381,7 @@ export class TreeImpl implements Tree {
|
|
|
354
381
|
return parent;
|
|
355
382
|
}
|
|
356
383
|
|
|
357
|
-
|
|
384
|
+
removeNode(node: TreeNode | undefined): void {
|
|
358
385
|
if (CompositeTreeNode.is(node)) {
|
|
359
386
|
node.children.forEach(child => this.removeNode(child));
|
|
360
387
|
}
|
|
@@ -15,11 +15,12 @@
|
|
|
15
15
|
// *****************************************************************************
|
|
16
16
|
|
|
17
17
|
import { Container } from 'inversify';
|
|
18
|
-
import { ContributionProvider } from '../../common';
|
|
18
|
+
import { ContributionProvider, ILogger } from '../../common';
|
|
19
19
|
import { CorePreferences } from '../../common/core-preferences';
|
|
20
20
|
import { FrontendApplicationContribution } from '../frontend-application-contribution';
|
|
21
21
|
import { DefaultWindowService } from './default-window-service';
|
|
22
22
|
import assert = require('assert');
|
|
23
|
+
import { MockLogger } from '../../common/test/mock-logger';
|
|
23
24
|
|
|
24
25
|
describe('DefaultWindowService', () => {
|
|
25
26
|
class TestFrontendApplicationContribution implements FrontendApplicationContribution {
|
|
@@ -42,6 +43,7 @@ describe('DefaultWindowService', () => {
|
|
|
42
43
|
.toConstantValue({
|
|
43
44
|
'application.confirmExit': confirmExit,
|
|
44
45
|
});
|
|
46
|
+
container.bind(ILogger).to(MockLogger).inSingletonScope();
|
|
45
47
|
return container.get(DefaultWindowService);
|
|
46
48
|
}
|
|
47
49
|
it('onWillStop should be called on every contribution (never)', () => {
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
// *****************************************************************************
|
|
16
16
|
|
|
17
17
|
import { inject, injectable, named } from 'inversify';
|
|
18
|
-
import { Event, Emitter } from '../../common';
|
|
18
|
+
import { Event, Emitter, ILogger } from '../../common';
|
|
19
19
|
import { CorePreferences } from '../../common/core-preferences';
|
|
20
20
|
import { ContributionProvider } from '../../common/contribution-provider';
|
|
21
21
|
import { FrontendApplicationContribution, OnWillStopAction } from '../frontend-application-contribution';
|
|
@@ -43,6 +43,9 @@ export class DefaultWindowService implements WindowService, FrontendApplicationC
|
|
|
43
43
|
@named(FrontendApplicationContribution)
|
|
44
44
|
protected readonly contributions: ContributionProvider<FrontendApplicationContribution>;
|
|
45
45
|
|
|
46
|
+
@inject(ILogger) @named('core:DefaultWindowService')
|
|
47
|
+
protected readonly logger: ILogger;
|
|
48
|
+
|
|
46
49
|
onStart(app: FrontendApplication): void {
|
|
47
50
|
this.frontendApplication = app;
|
|
48
51
|
this.registerUnloadListeners();
|
|
@@ -114,7 +117,7 @@ export class DefaultWindowService implements WindowService, FrontendApplicationC
|
|
|
114
117
|
return true;
|
|
115
118
|
}
|
|
116
119
|
const preparedValues = await Promise.all(vetoes.map(e => e.prepare?.(stopReason)));
|
|
117
|
-
|
|
120
|
+
this.logger.debug('Shutdown prevented by', vetoes.map(({ reason }) => reason).join(', '));
|
|
118
121
|
for (let i = 0; i < vetoes.length; i++) {
|
|
119
122
|
try {
|
|
120
123
|
const result = await vetoes[i].action(preparedValues[i], stopReason);
|
|
@@ -122,10 +125,10 @@ export class DefaultWindowService implements WindowService, FrontendApplicationC
|
|
|
122
125
|
return false;
|
|
123
126
|
}
|
|
124
127
|
} catch (e) {
|
|
125
|
-
|
|
128
|
+
this.logger.error(e);
|
|
126
129
|
}
|
|
127
130
|
}
|
|
128
|
-
|
|
131
|
+
this.logger.debug('OnWillStop actions resolved; allowing shutdown');
|
|
129
132
|
this.allowVetoes = false;
|
|
130
133
|
return true;
|
|
131
134
|
}
|
|
@@ -145,10 +148,10 @@ export class DefaultWindowService implements WindowService, FrontendApplicationC
|
|
|
145
148
|
const vetoes = this.collectContributionUnloadVetoes();
|
|
146
149
|
if (vetoes.length) {
|
|
147
150
|
// In the browser, we don't call the functions because this has to finish in a single tick, so we treat any desired action as a veto.
|
|
148
|
-
|
|
151
|
+
this.logger.debug('Shutdown prevented by', vetoes.map(({ reason }) => reason).join(', '));
|
|
149
152
|
return this.preventUnload(event);
|
|
150
153
|
}
|
|
151
|
-
|
|
154
|
+
this.logger.debug('Shutdown will proceed.');
|
|
152
155
|
}
|
|
153
156
|
|
|
154
157
|
/**
|
|
@@ -14,8 +14,9 @@
|
|
|
14
14
|
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
15
|
// *****************************************************************************
|
|
16
16
|
import { Event, RpcProxy, Channel, RpcProxyFactory, Emitter } from '../../common';
|
|
17
|
-
import { injectable } from 'inversify';
|
|
17
|
+
import { injectable, inject, named } from 'inversify';
|
|
18
18
|
import { ServiceConnectionProvider } from '../../browser/messaging/service-connection-provider';
|
|
19
|
+
import { ILogger } from '../../common/logger';
|
|
19
20
|
import { ConnectionSource } from '../../browser/messaging/connection-source';
|
|
20
21
|
|
|
21
22
|
@injectable()
|
|
@@ -25,15 +26,19 @@ export class FrontendOnlyConnectionSource implements ConnectionSource {
|
|
|
25
26
|
|
|
26
27
|
@injectable()
|
|
27
28
|
export class FrontendOnlyServiceConnectionProvider extends ServiceConnectionProvider {
|
|
29
|
+
|
|
30
|
+
@inject(ILogger) @named('core:FrontendOnlyServiceConnectionProvider')
|
|
31
|
+
protected readonly logger: ILogger;
|
|
32
|
+
|
|
28
33
|
onSocketDidOpen = Event.None;
|
|
29
34
|
onSocketDidClose = Event.None;
|
|
30
35
|
onIncomingMessageActivity = Event.None;
|
|
31
36
|
override createProxy<T extends object>(path: unknown, target?: unknown): RpcProxy<T> {
|
|
32
|
-
|
|
37
|
+
this.logger.debug(`[Frontend-Only Fallback] Created proxy connection for ${path}`);
|
|
33
38
|
const factory = target instanceof RpcProxyFactory ? target : new RpcProxyFactory<T>(target);
|
|
34
39
|
return factory.createProxy();
|
|
35
40
|
}
|
|
36
41
|
override listen(path: string, handler: ServiceConnectionProvider.ConnectionHandler, reconnect: boolean): void {
|
|
37
|
-
|
|
42
|
+
this.logger.debug('[Frontend-Only Fallback] Listen to websocket connection requested');
|
|
38
43
|
}
|
|
39
44
|
}
|
package/src/common/command.ts
CHANGED
|
@@ -21,6 +21,7 @@ import { ContributionProvider } from './contribution-provider';
|
|
|
21
21
|
import { nls } from './nls';
|
|
22
22
|
import debounce = require('p-debounce');
|
|
23
23
|
import { isObject } from './types';
|
|
24
|
+
import { ILogger } from './logger';
|
|
24
25
|
|
|
25
26
|
/**
|
|
26
27
|
* A command is a unique identifier of a function
|
|
@@ -190,6 +191,9 @@ export interface CommandService {
|
|
|
190
191
|
@injectable()
|
|
191
192
|
export class CommandRegistry implements CommandService {
|
|
192
193
|
|
|
194
|
+
@inject(ILogger) @named('core:CommandRegistry')
|
|
195
|
+
protected readonly logger: ILogger;
|
|
196
|
+
|
|
193
197
|
protected readonly _commands: { [id: string]: Command } = {};
|
|
194
198
|
protected readonly _handlers: { [id: string]: CommandHandler[] } = {};
|
|
195
199
|
|
|
@@ -232,7 +236,7 @@ export class CommandRegistry implements CommandService {
|
|
|
232
236
|
*/
|
|
233
237
|
registerCommand(command: Command, handler?: CommandHandler): Disposable {
|
|
234
238
|
if (this._commands[command.id]) {
|
|
235
|
-
|
|
239
|
+
this.logger.warn(`A command ${command.id} is already registered.`);
|
|
236
240
|
return Disposable.NULL;
|
|
237
241
|
}
|
|
238
242
|
const toDispose = new DisposableCollection(this.doRegisterCommand(command));
|
|
@@ -363,7 +367,7 @@ export class CommandRegistry implements CommandService {
|
|
|
363
367
|
return handler;
|
|
364
368
|
}
|
|
365
369
|
} catch (error) {
|
|
366
|
-
|
|
370
|
+
this.logger.error(error);
|
|
367
371
|
}
|
|
368
372
|
}
|
|
369
373
|
}
|
|
@@ -383,7 +387,7 @@ export class CommandRegistry implements CommandService {
|
|
|
383
387
|
return handler;
|
|
384
388
|
}
|
|
385
389
|
} catch (error) {
|
|
386
|
-
|
|
390
|
+
this.logger.error(error);
|
|
387
391
|
}
|
|
388
392
|
}
|
|
389
393
|
}
|
|
@@ -403,7 +407,7 @@ export class CommandRegistry implements CommandService {
|
|
|
403
407
|
return handler;
|
|
404
408
|
}
|
|
405
409
|
} catch (error) {
|
|
406
|
-
|
|
410
|
+
this.logger.error(error);
|
|
407
411
|
}
|
|
408
412
|
}
|
|
409
413
|
}
|