@theia/core 1.73.0-next.9 → 1.74.0-next.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -16
- package/i18n/nls.cs.json +268 -36
- package/i18n/nls.de.json +268 -36
- package/i18n/nls.es.json +268 -36
- package/i18n/nls.fr.json +268 -36
- package/i18n/nls.hu.json +268 -36
- package/i18n/nls.it.json +268 -36
- package/i18n/nls.ja.json +268 -36
- package/i18n/nls.json +268 -36
- package/i18n/nls.ko.json +268 -36
- package/i18n/nls.pl.json +268 -36
- package/i18n/nls.pt-br.json +268 -36
- package/i18n/nls.ru.json +268 -36
- package/i18n/nls.tr.json +268 -36
- package/i18n/nls.zh-cn.json +268 -36
- package/i18n/nls.zh-tw.json +268 -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 +269 -72
- 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/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/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/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/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,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// *****************************************************************************
|
|
3
|
+
// Copyright (C) 2026 EclipseSource GmbH and others.
|
|
4
|
+
//
|
|
5
|
+
// This program and the accompanying materials are made available under the
|
|
6
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
7
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
8
|
+
//
|
|
9
|
+
// This Source Code may also be made available under the following Secondary
|
|
10
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
11
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
12
|
+
// with the GNU Classpath Exception which is available at
|
|
13
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
14
|
+
//
|
|
15
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
16
|
+
// *****************************************************************************
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
const chai_1 = require("chai");
|
|
19
|
+
const sinon = require("sinon");
|
|
20
|
+
const backend_request_facade_1 = require("./backend-request-facade");
|
|
21
|
+
const backend_application_config_provider_1 = require("../backend-application-config-provider");
|
|
22
|
+
describe('isUrlAllowed', () => {
|
|
23
|
+
it('should allow a URL that matches an exact origin pattern', () => {
|
|
24
|
+
const patterns = ['https://open-vsx.org'];
|
|
25
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('https://open-vsx.org/api/extensions', patterns)).to.be.true;
|
|
26
|
+
});
|
|
27
|
+
it('should allow a URL with a path when pattern has no path', () => {
|
|
28
|
+
const patterns = ['https://example.com'];
|
|
29
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('https://example.com/some/deep/path?query=1', patterns)).to.be.true;
|
|
30
|
+
});
|
|
31
|
+
it('should allow a URL that exactly matches the origin', () => {
|
|
32
|
+
const patterns = ['https://example.com'];
|
|
33
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('https://example.com', patterns)).to.be.true;
|
|
34
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('https://example.com/', patterns)).to.be.true;
|
|
35
|
+
});
|
|
36
|
+
it('should reject a URL with a different scheme', () => {
|
|
37
|
+
const patterns = ['https://example.com'];
|
|
38
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('http://example.com/path', patterns)).to.be.false;
|
|
39
|
+
});
|
|
40
|
+
it('should reject a URL with a different host', () => {
|
|
41
|
+
const patterns = ['https://example.com'];
|
|
42
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('https://evil.com/path', patterns)).to.be.false;
|
|
43
|
+
});
|
|
44
|
+
it('should reject a URL with a different port', () => {
|
|
45
|
+
const patterns = ['https://example.com'];
|
|
46
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('https://example.com:8443/path', patterns)).to.be.false;
|
|
47
|
+
});
|
|
48
|
+
it('should allow a URL when port matches explicitly', () => {
|
|
49
|
+
const patterns = ['https://example.com:8443'];
|
|
50
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('https://example.com:8443/path', patterns)).to.be.true;
|
|
51
|
+
});
|
|
52
|
+
it('should treat default ports as equivalent', () => {
|
|
53
|
+
const patterns = ['https://example.com:443'];
|
|
54
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('https://example.com/path', patterns)).to.be.true;
|
|
55
|
+
const httpPatterns = ['http://example.com:80'];
|
|
56
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('http://example.com/path', httpPatterns)).to.be.true;
|
|
57
|
+
const implicitPatterns = ['http://example.com'];
|
|
58
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('http://example.com:80/path', implicitPatterns)).to.be.true;
|
|
59
|
+
});
|
|
60
|
+
it('should match wildcard subdomains', () => {
|
|
61
|
+
const patterns = ['https://*.example.com'];
|
|
62
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('https://foo.example.com/path', patterns)).to.be.true;
|
|
63
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('https://bar.baz.example.com/path', patterns)).to.be.true;
|
|
64
|
+
});
|
|
65
|
+
it('should not match the bare domain with a wildcard subdomain pattern', () => {
|
|
66
|
+
const patterns = ['https://*.example.com'];
|
|
67
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('https://example.com/path', patterns)).to.be.false;
|
|
68
|
+
});
|
|
69
|
+
it('should reject non-http(s) schemes', () => {
|
|
70
|
+
const patterns = ['file:///etc/passwd'];
|
|
71
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('file:///etc/passwd', patterns)).to.be.false;
|
|
72
|
+
});
|
|
73
|
+
it('should reject ftp scheme', () => {
|
|
74
|
+
const patterns = ['ftp://files.example.com'];
|
|
75
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('ftp://files.example.com/data', patterns)).to.be.false;
|
|
76
|
+
});
|
|
77
|
+
it('should reject a URL when target uses non-http(s) scheme even if patterns exist', () => {
|
|
78
|
+
const patterns = ['https://example.com'];
|
|
79
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('file:///etc/passwd', patterns)).to.be.false;
|
|
80
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('ftp://example.com/data', patterns)).to.be.false;
|
|
81
|
+
});
|
|
82
|
+
it('should reject all URLs when allowlist is empty', () => {
|
|
83
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('https://example.com', [])).to.be.false;
|
|
84
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('http://localhost:3000', [])).to.be.false;
|
|
85
|
+
});
|
|
86
|
+
it('should reject invalid URLs', () => {
|
|
87
|
+
const patterns = ['https://example.com'];
|
|
88
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('not a url', patterns)).to.be.false;
|
|
89
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('', patterns)).to.be.false;
|
|
90
|
+
});
|
|
91
|
+
it('should allow private IPs only when explicitly in the allowlist', () => {
|
|
92
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('http://127.0.0.1:8080/secret', [])).to.be.false;
|
|
93
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('http://127.0.0.1:8080/secret', ['https://example.com'])).to.be.false;
|
|
94
|
+
const patternsWithLoopback = ['http://127.0.0.1:8080'];
|
|
95
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('http://127.0.0.1:8080/secret', patternsWithLoopback)).to.be.true;
|
|
96
|
+
});
|
|
97
|
+
it('should reject cloud metadata endpoint by default', () => {
|
|
98
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('http://169.254.169.254/latest/meta-data/', [])).to.be.false;
|
|
99
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('http://169.254.169.254/latest/meta-data/', ['https://example.com'])).to.be.false;
|
|
100
|
+
});
|
|
101
|
+
it('should merge multiple patterns correctly', () => {
|
|
102
|
+
const patterns = [
|
|
103
|
+
'https://open-vsx.org',
|
|
104
|
+
'https://marketplace.example.com',
|
|
105
|
+
'https://*.cdn.example.com'
|
|
106
|
+
];
|
|
107
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('https://open-vsx.org/api/v2/extensions', patterns)).to.be.true;
|
|
108
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('https://marketplace.example.com/download', patterns)).to.be.true;
|
|
109
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('https://files.cdn.example.com/ext.vsix', patterns)).to.be.true;
|
|
110
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('https://evil.com/malware', patterns)).to.be.false;
|
|
111
|
+
});
|
|
112
|
+
it('should handle patterns with trailing slashes', () => {
|
|
113
|
+
const patterns = ['https://example.com/'];
|
|
114
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('https://example.com/path', patterns)).to.be.true;
|
|
115
|
+
});
|
|
116
|
+
it('should handle invalid patterns gracefully', () => {
|
|
117
|
+
const patterns = ['not a valid pattern', 'https://example.com'];
|
|
118
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('https://example.com/path', patterns)).to.be.true;
|
|
119
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('https://other.com/path', patterns)).to.be.false;
|
|
120
|
+
});
|
|
121
|
+
it('should prevent host spoofing via subdomain prefix', () => {
|
|
122
|
+
const patterns = ['https://example.com'];
|
|
123
|
+
(0, chai_1.expect)((0, backend_request_facade_1.isUrlAllowed)('https://example.com.evil.com/path', patterns)).to.be.false;
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
describe('BackendRequestFacade', () => {
|
|
127
|
+
describe('configure', () => {
|
|
128
|
+
let configProviderStub;
|
|
129
|
+
beforeEach(() => {
|
|
130
|
+
configProviderStub = sinon.stub(backend_application_config_provider_1.BackendApplicationConfigProvider, 'get');
|
|
131
|
+
});
|
|
132
|
+
afterEach(() => {
|
|
133
|
+
configProviderStub.restore();
|
|
134
|
+
});
|
|
135
|
+
it('should be a no-op when configureProxyFromPreferences is false', async () => {
|
|
136
|
+
configProviderStub.returns({
|
|
137
|
+
singleInstance: true,
|
|
138
|
+
frontendConnectionTimeout: 0,
|
|
139
|
+
configurationFolder: '.theia',
|
|
140
|
+
configureProxyFromPreferences: false
|
|
141
|
+
});
|
|
142
|
+
const facade = new backend_request_facade_1.BackendRequestFacade();
|
|
143
|
+
const configureStub = sinon.stub().resolves();
|
|
144
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
145
|
+
facade.requestService = {
|
|
146
|
+
configure: configureStub
|
|
147
|
+
};
|
|
148
|
+
await facade.configure({ proxyUrl: 'http://evil.com', strictSSL: false });
|
|
149
|
+
(0, chai_1.expect)(configureStub.called).to.be.false;
|
|
150
|
+
});
|
|
151
|
+
it('should pass through to the underlying request service when configureProxyFromPreferences is true', async () => {
|
|
152
|
+
configProviderStub.returns({
|
|
153
|
+
singleInstance: true,
|
|
154
|
+
frontendConnectionTimeout: 0,
|
|
155
|
+
configurationFolder: '.theia',
|
|
156
|
+
configureProxyFromPreferences: true
|
|
157
|
+
});
|
|
158
|
+
const facade = new backend_request_facade_1.BackendRequestFacade();
|
|
159
|
+
const configureStub = sinon.stub().resolves();
|
|
160
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
161
|
+
facade.requestService = {
|
|
162
|
+
configure: configureStub
|
|
163
|
+
};
|
|
164
|
+
const config = { proxyUrl: 'http://my-proxy.com:8080', strictSSL: true, proxyAuthorization: 'Bearer token' };
|
|
165
|
+
await facade.configure(config);
|
|
166
|
+
(0, chai_1.expect)(configureStub.calledOnce).to.be.true;
|
|
167
|
+
(0, chai_1.expect)(configureStub.firstCall.args[0]).to.deep.equal(config);
|
|
168
|
+
});
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
//# sourceMappingURL=backend-request-facade.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend-request-facade.spec.js","sourceRoot":"","sources":["../../../src/node/request/backend-request-facade.spec.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theia/core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.74.0-next.0+72573426f",
|
|
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",
|
|
7
7
|
"dependencies": {
|
|
8
|
-
"@babel/runtime": "^7.29.
|
|
8
|
+
"@babel/runtime": "^7.29.7",
|
|
9
9
|
"@lumino/algorithm": "^2.0.4",
|
|
10
10
|
"@lumino/commands": "^2.3.3",
|
|
11
11
|
"@lumino/coreutils": "^2.2.2",
|
|
@@ -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.
|
|
21
|
-
"@theia/request": "1.
|
|
20
|
+
"@theia/application-package": "1.74.0-next.0+72573426f",
|
|
21
|
+
"@theia/request": "1.74.0-next.0+72573426f",
|
|
22
22
|
"@types/body-parser": "^1.19.6",
|
|
23
23
|
"@types/express": "^4.17.25",
|
|
24
24
|
"@types/fs-extra": "^4.0.15",
|
|
@@ -26,21 +26,18 @@
|
|
|
26
26
|
"@types/lodash.throttle": "^4.1.9",
|
|
27
27
|
"@types/markdown-it": "^14.1.2",
|
|
28
28
|
"@types/markdown-it-emoji": "^3.0.1",
|
|
29
|
-
"@types/react": "^18.3.28",
|
|
30
|
-
"@types/react-dom": "^18.3.7",
|
|
31
29
|
"@types/route-parser": "^0.1.7",
|
|
32
30
|
"@types/safer-buffer": "^2.1.3",
|
|
33
|
-
"@types/uuid": "^9.0.8",
|
|
34
31
|
"@types/ws": "^8.18.1",
|
|
35
|
-
"@types/yargs": "^17",
|
|
32
|
+
"@types/yargs": "^17.0.35",
|
|
36
33
|
"@vscode/codicons": "0.0.45",
|
|
37
34
|
"ajv": "^6.15.0",
|
|
38
35
|
"async-mutex": "^0.4.1",
|
|
39
36
|
"body-parser": "^1.20.5",
|
|
40
37
|
"cookie": "^1.1.1",
|
|
41
|
-
"dompurify": "^3.4.
|
|
38
|
+
"dompurify": "^3.4.7",
|
|
42
39
|
"drivelist": "^12.0.2",
|
|
43
|
-
"express": "^4.22.
|
|
40
|
+
"express": "^4.22.2",
|
|
44
41
|
"fast-json-stable-stringify": "^2.1.0",
|
|
45
42
|
"file-icons-js": "~1.0.3",
|
|
46
43
|
"font-awesome": "^4.7.0",
|
|
@@ -54,14 +51,12 @@
|
|
|
54
51
|
"keytar": "7.9.0",
|
|
55
52
|
"lodash.debounce": "^4.0.8",
|
|
56
53
|
"lodash.throttle": "^4.1.1",
|
|
57
|
-
"markdown-it": "^14.
|
|
54
|
+
"markdown-it": "^14.2.0",
|
|
58
55
|
"markdown-it-anchor": "^9.2.0",
|
|
59
56
|
"markdown-it-emoji": "^3.0.0",
|
|
60
57
|
"msgpackr": "^1.11.12",
|
|
61
58
|
"p-debounce": "^2.1.0",
|
|
62
59
|
"perfect-scrollbar": "1.5.5",
|
|
63
|
-
"react": "^18.3.1",
|
|
64
|
-
"react-dom": "^18.3.1",
|
|
65
60
|
"react-tooltip": "^4.5.1",
|
|
66
61
|
"react-virtuoso": "^2.19.1",
|
|
67
62
|
"reflect-metadata": "^0.2.2",
|
|
@@ -70,18 +65,28 @@
|
|
|
70
65
|
"socket.io": "^4.8.3",
|
|
71
66
|
"socket.io-client": "^4.8.3",
|
|
72
67
|
"tslib": "^2.8.1",
|
|
73
|
-
"uuid": "^
|
|
68
|
+
"uuid": "^11.1.1",
|
|
74
69
|
"vscode-languageserver-protocol": "3.17.5",
|
|
75
70
|
"vscode-uri": "3.0.8",
|
|
76
|
-
"ws": "^8.
|
|
71
|
+
"ws": "^8.21.0",
|
|
77
72
|
"yargs": "^17.7.2"
|
|
78
73
|
},
|
|
79
74
|
"peerDependencies": {
|
|
80
|
-
"@theia/electron": "*"
|
|
75
|
+
"@theia/electron": "*",
|
|
76
|
+
"@types/react": "^18.3.0 || ^19.0.0",
|
|
77
|
+
"@types/react-dom": "^18.3.0 || ^19.0.0",
|
|
78
|
+
"react": "^18.3.1 || ^19.0.0",
|
|
79
|
+
"react-dom": "^18.3.1 || ^19.0.0"
|
|
81
80
|
},
|
|
82
81
|
"peerDependenciesMeta": {
|
|
83
82
|
"@theia/electron": {
|
|
84
83
|
"optional": true
|
|
84
|
+
},
|
|
85
|
+
"@types/react": {
|
|
86
|
+
"optional": true
|
|
87
|
+
},
|
|
88
|
+
"@types/react-dom": {
|
|
89
|
+
"optional": true
|
|
85
90
|
}
|
|
86
91
|
},
|
|
87
92
|
"publishConfig": {
|
|
@@ -213,13 +218,17 @@
|
|
|
213
218
|
"watch": "theiaext watch"
|
|
214
219
|
},
|
|
215
220
|
"devDependencies": {
|
|
216
|
-
"@theia/ext-scripts": "1.
|
|
217
|
-
"@theia/re-exports": "1.
|
|
221
|
+
"@theia/ext-scripts": "1.73.0",
|
|
222
|
+
"@theia/re-exports": "1.73.0",
|
|
223
|
+
"@types/react": "^18.3.28",
|
|
224
|
+
"@types/react-dom": "^18.3.7",
|
|
218
225
|
"minimist": "^1.2.8",
|
|
219
|
-
"nodejs-file-downloader": "4.13.0"
|
|
226
|
+
"nodejs-file-downloader": "4.13.0",
|
|
227
|
+
"react": "^18.3.1",
|
|
228
|
+
"react-dom": "^18.3.1"
|
|
220
229
|
},
|
|
221
230
|
"nyc": {
|
|
222
231
|
"extends": "../../configs/nyc.json"
|
|
223
232
|
},
|
|
224
|
-
"gitHead": "
|
|
233
|
+
"gitHead": "72573426f320fefc89a96ba55ce05c752d182123"
|
|
225
234
|
}
|
|
@@ -20,13 +20,14 @@
|
|
|
20
20
|
*--------------------------------------------------------------------------------------------*/
|
|
21
21
|
// code copied and modified from https://github.com/microsoft/vscode/blob/1.47.3/src/vs/workbench/services/authentication/browser/authenticationService.ts
|
|
22
22
|
|
|
23
|
-
import { injectable, inject, postConstruct } from 'inversify';
|
|
23
|
+
import { injectable, inject, postConstruct, named } from 'inversify';
|
|
24
24
|
import { Emitter, Event } from '../common/event';
|
|
25
25
|
import { StorageService } from '../browser/storage-service';
|
|
26
26
|
import { Disposable, DisposableCollection } from '../common/disposable';
|
|
27
27
|
import { ACCOUNTS_MENU, ACCOUNTS_SUBMENU, MenuModelRegistry } from '../common/menu';
|
|
28
28
|
import { Command, CommandRegistry } from '../common/command';
|
|
29
29
|
import { nls } from '../common/nls';
|
|
30
|
+
import { ILogger } from '../common/logger';
|
|
30
31
|
|
|
31
32
|
export interface AuthenticationSessionAccountInformation {
|
|
32
33
|
readonly id: string;
|
|
@@ -202,6 +203,8 @@ export class AuthenticationServiceImpl implements AuthenticationService {
|
|
|
202
203
|
@inject(MenuModelRegistry) protected readonly menus: MenuModelRegistry;
|
|
203
204
|
@inject(CommandRegistry) protected readonly commands: CommandRegistry;
|
|
204
205
|
@inject(StorageService) protected readonly storageService: StorageService;
|
|
206
|
+
@inject(ILogger) @named('core:AuthenticationServiceImpl')
|
|
207
|
+
protected readonly logger: ILogger;
|
|
205
208
|
|
|
206
209
|
@postConstruct()
|
|
207
210
|
init(): void {
|
|
@@ -308,7 +311,7 @@ export class AuthenticationServiceImpl implements AuthenticationService {
|
|
|
308
311
|
this.onDidUnregisterAuthenticationProviderEmitter.fire({ id, label: provider.label });
|
|
309
312
|
this.updateAccountsMenuItem();
|
|
310
313
|
} else {
|
|
311
|
-
|
|
314
|
+
this.logger.error(`Failed to unregister an authentication provider. A provider with id '${id}' was not found.`);
|
|
312
315
|
}
|
|
313
316
|
this.authenticationProviderDisposables.get(id)?.dispose();
|
|
314
317
|
this.authenticationProviderDisposables.delete(id);
|
|
@@ -325,7 +328,7 @@ export class AuthenticationServiceImpl implements AuthenticationService {
|
|
|
325
328
|
await this.updateNewSessionRequests(provider);
|
|
326
329
|
}
|
|
327
330
|
} else {
|
|
328
|
-
|
|
331
|
+
this.logger.error(`Failed to update an authentication session. An authentication provider with id '${id}' was not found.`);
|
|
329
332
|
}
|
|
330
333
|
}
|
|
331
334
|
|
|
@@ -27,6 +27,7 @@ import { CorePreferences } from '../common/core-preferences';
|
|
|
27
27
|
import { WindowService } from './window/window-service';
|
|
28
28
|
import { TooltipService } from './tooltip-service';
|
|
29
29
|
import { FrontendApplicationContribution } from './frontend-application-contribution';
|
|
30
|
+
import { ILogger } from '../common/logger';
|
|
30
31
|
|
|
31
32
|
const TIMER_WARNING_THRESHOLD = 100;
|
|
32
33
|
|
|
@@ -48,6 +49,9 @@ export class FrontendApplication {
|
|
|
48
49
|
@inject(BackendStopwatch)
|
|
49
50
|
protected readonly backendStopwatch: BackendStopwatch;
|
|
50
51
|
|
|
52
|
+
@inject(ILogger) @named('core:FrontendApplication')
|
|
53
|
+
protected readonly logger: ILogger;
|
|
54
|
+
|
|
51
55
|
private settlementContext?: MeasurementContext<FrontendApplicationContribution>;
|
|
52
56
|
|
|
53
57
|
constructor(
|
|
@@ -217,10 +221,10 @@ export class FrontendApplication {
|
|
|
217
221
|
return await this.layoutRestorer.restoreLayout(this);
|
|
218
222
|
} catch (error) {
|
|
219
223
|
if (ApplicationShellLayoutMigrationError.is(error)) {
|
|
220
|
-
|
|
221
|
-
|
|
224
|
+
this.logger.warn(error.message);
|
|
225
|
+
this.logger.info('Initializing the default layout instead...');
|
|
222
226
|
} else {
|
|
223
|
-
|
|
227
|
+
this.logger.error('Could not restore layout', error);
|
|
224
228
|
}
|
|
225
229
|
return false;
|
|
226
230
|
}
|
|
@@ -258,7 +262,7 @@ export class FrontendApplication {
|
|
|
258
262
|
await this.measureContribution(contribution, 'initialize',
|
|
259
263
|
() => contribution.initialize!());
|
|
260
264
|
} catch (error) {
|
|
261
|
-
|
|
265
|
+
this.logger.error('Could not initialize contribution', error);
|
|
262
266
|
}
|
|
263
267
|
}
|
|
264
268
|
}
|
|
@@ -269,7 +273,7 @@ export class FrontendApplication {
|
|
|
269
273
|
await this.measureContribution(contribution, 'configure',
|
|
270
274
|
() => contribution.configure!(this));
|
|
271
275
|
} catch (error) {
|
|
272
|
-
|
|
276
|
+
this.logger.error('Could not configure contribution', error);
|
|
273
277
|
}
|
|
274
278
|
}
|
|
275
279
|
}
|
|
@@ -294,7 +298,7 @@ export class FrontendApplication {
|
|
|
294
298
|
await this.measureContribution(contribution, 'onStart',
|
|
295
299
|
() => contribution.onStart!(this));
|
|
296
300
|
} catch (error) {
|
|
297
|
-
|
|
301
|
+
this.logger.error('Could not start contribution', error);
|
|
298
302
|
}
|
|
299
303
|
}
|
|
300
304
|
}
|
|
@@ -304,17 +308,17 @@ export class FrontendApplication {
|
|
|
304
308
|
* Stop the frontend application contributions. This is called when the window is unloaded.
|
|
305
309
|
*/
|
|
306
310
|
protected stopContributions(): void {
|
|
307
|
-
|
|
311
|
+
this.logger.info('>>> Stopping frontend contributions...');
|
|
308
312
|
for (const contribution of this.contributions.getContributions()) {
|
|
309
313
|
if (contribution.onStop) {
|
|
310
314
|
try {
|
|
311
315
|
contribution.onStop(this);
|
|
312
316
|
} catch (error) {
|
|
313
|
-
|
|
317
|
+
this.logger.error('Could not stop contribution', error);
|
|
314
318
|
}
|
|
315
319
|
}
|
|
316
320
|
}
|
|
317
|
-
|
|
321
|
+
this.logger.info('<<< All frontend contributions have been stopped.');
|
|
318
322
|
}
|
|
319
323
|
|
|
320
324
|
protected async measureContribution<T>(contribution: FrontendApplicationContribution, hook: string, fn: () => MaybePromise<T>): Promise<T> {
|
|
@@ -20,6 +20,7 @@ import { FrontendApplicationContribution } from './frontend-application-contribu
|
|
|
20
20
|
import { Emitter, MaybePromise, URI } from '../common';
|
|
21
21
|
import { timeout, Deferred } from '../common/promise-util';
|
|
22
22
|
import { IJSONSchema } from '../common/json-schema';
|
|
23
|
+
import { ILogger } from '../common/logger';
|
|
23
24
|
|
|
24
25
|
export interface JsonSchemaConfiguration {
|
|
25
26
|
fileMatch: string | string[];
|
|
@@ -41,6 +42,9 @@ export class JsonSchemaStore implements FrontendApplicationContribution {
|
|
|
41
42
|
@inject(ContributionProvider) @named(JsonSchemaContribution)
|
|
42
43
|
protected readonly contributions: ContributionProvider<JsonSchemaContribution>;
|
|
43
44
|
|
|
45
|
+
@inject(ILogger) @named('core:JsonSchemaStore')
|
|
46
|
+
protected readonly logger: ILogger;
|
|
47
|
+
|
|
44
48
|
protected readonly _schemas = new Deferred<JsonSchemaConfiguration[]>();
|
|
45
49
|
get schemas(): Promise<JsonSchemaConfiguration[]> {
|
|
46
50
|
return this._schemas.promise;
|
|
@@ -68,9 +72,9 @@ export class JsonSchemaStore implements FrontendApplicationContribution {
|
|
|
68
72
|
if (result) {
|
|
69
73
|
pendingRegistrations.push(result.then(() => { }, e => {
|
|
70
74
|
if (e instanceof Error && e.message === frozenErrorCode) {
|
|
71
|
-
|
|
75
|
+
this.logger.error(`${contribution.constructor.name}.registerSchemas is taking more than ${registerTimeout.toFixed(1)} ms, new schemas are ignored.`);
|
|
72
76
|
} else {
|
|
73
|
-
|
|
77
|
+
this.logger.error(e);
|
|
74
78
|
}
|
|
75
79
|
}));
|
|
76
80
|
}
|
|
@@ -128,7 +128,7 @@ export class KeybindingRegistry {
|
|
|
128
128
|
@inject(StatusBar)
|
|
129
129
|
protected readonly statusBar: StatusBar;
|
|
130
130
|
|
|
131
|
-
@inject(ILogger)
|
|
131
|
+
@inject(ILogger) @named('core:KeybindingRegistry')
|
|
132
132
|
protected readonly logger: ILogger;
|
|
133
133
|
|
|
134
134
|
@inject(ContextKeyService)
|
|
@@ -545,7 +545,7 @@ export class KeybindingRegistry {
|
|
|
545
545
|
if (command) {
|
|
546
546
|
if (this.commandRegistry.isEnabled(binding.command, binding.args)) {
|
|
547
547
|
this.commandRegistry.executeCommand(binding.command, binding.args)
|
|
548
|
-
.catch(e =>
|
|
548
|
+
.catch(e => this.logger.error('Failed to execute command:', e));
|
|
549
549
|
}
|
|
550
550
|
|
|
551
551
|
/* Note that if a keybinding is in context but the command is
|
|
@@ -157,10 +157,10 @@ export function useMarkdown(
|
|
|
157
157
|
markdownRenderer: MarkdownRenderer,
|
|
158
158
|
markdownOptions?: MarkdownProps['markdownOptions'],
|
|
159
159
|
onRender?: (element: HTMLElement | undefined) => void
|
|
160
|
-
): React.
|
|
160
|
+
): React.Ref<HTMLDivElement> {
|
|
161
161
|
// eslint-disable-next-line no-null/no-null
|
|
162
162
|
const containerRef = React.useRef<HTMLDivElement>(null);
|
|
163
|
-
const renderResultRef = React.useRef<MarkdownRenderResult | undefined>();
|
|
163
|
+
const renderResultRef = React.useRef<MarkdownRenderResult | undefined>(undefined);
|
|
164
164
|
|
|
165
165
|
const renderedElement = React.useMemo(() => {
|
|
166
166
|
renderResultRef.current?.dispose();
|
|
@@ -31,11 +31,11 @@ export class SubMenuLink implements CompoundMenuNode {
|
|
|
31
31
|
|
|
32
32
|
get sortString(): string { return this._sortString || this.delegate.sortString; };
|
|
33
33
|
isVisible<T>(effectiveMenuPath: MenuPath, contextMatcher: ContextExpressionMatcher<T>, context: T | undefined, ...args: unknown[]): boolean {
|
|
34
|
-
return this.delegate.isVisible(effectiveMenuPath, contextMatcher, context) && (!this._when || contextMatcher.match(this._when, context));
|
|
34
|
+
return this.delegate.isVisible(effectiveMenuPath, contextMatcher, context, ...args) && (!this._when || contextMatcher.match(this._when, context));
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
isEmpty<T>(effectiveMenuPath: MenuPath, contextMatcher: ContextExpressionMatcher<T>, context: T | undefined, ...args: unknown[]): boolean {
|
|
38
|
-
return this.delegate.isEmpty(effectiveMenuPath, contextMatcher, context, args);
|
|
38
|
+
return this.delegate.isEmpty(effectiveMenuPath, contextMatcher, context, ...args);
|
|
39
39
|
}
|
|
40
40
|
}
|
|
41
41
|
|
|
@@ -78,8 +78,8 @@ export abstract class AbstractCompoundMenuImpl implements MenuNode {
|
|
|
78
78
|
|
|
79
79
|
isEmpty<T>(effectiveMenuPath: MenuPath, contextMatcher: ContextExpressionMatcher<T>, context: T | undefined, ...args: unknown[]): boolean {
|
|
80
80
|
for (const child of this.children) {
|
|
81
|
-
if (child.isVisible(effectiveMenuPath, contextMatcher, context, args)) {
|
|
82
|
-
if (!CompoundMenuNode.is(child) || !child.isEmpty(effectiveMenuPath, contextMatcher, context, args)) {
|
|
81
|
+
if (child.isVisible(effectiveMenuPath, contextMatcher, context, ...args)) {
|
|
82
|
+
if (!CompoundMenuNode.is(child) || !child.isEmpty(effectiveMenuPath, contextMatcher, context, ...args)) {
|
|
83
83
|
return false;
|
|
84
84
|
}
|
|
85
85
|
}
|
|
@@ -208,12 +208,7 @@ export class WebSocketConnectionSource implements ConnectionSource {
|
|
|
208
208
|
reconnection: true,
|
|
209
209
|
reconnectionDelay: 1000,
|
|
210
210
|
reconnectionDelayMax: 10000,
|
|
211
|
-
reconnectionAttempts: Infinity
|
|
212
|
-
extraHeaders: {
|
|
213
|
-
// Socket.io strips the `origin` header
|
|
214
|
-
// We need to provide our own for validation
|
|
215
|
-
'fix-origin': window.location.origin
|
|
216
|
-
}
|
|
211
|
+
reconnectionAttempts: Infinity
|
|
217
212
|
});
|
|
218
213
|
}
|
|
219
214
|
|
|
@@ -14,16 +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 { injectable } from 'inversify';
|
|
17
|
+
import { injectable, named, inject } from 'inversify';
|
|
18
18
|
import { PreferenceContribution, PreferenceSchema, PreferenceSchemaService } from '../../common/preferences/preference-schema';
|
|
19
19
|
import { FrontendApplicationConfigProvider } from '../frontend-application-config-provider';
|
|
20
20
|
import { FrontendApplicationPreferenceConfig } from './preference-contribution';
|
|
21
21
|
import { PreferenceLanguageOverrideService } from '../../common/preferences/preference-language-override-service';
|
|
22
22
|
import { PreferenceScope } from '../../common/preferences';
|
|
23
23
|
import { DefaultTheme } from '@theia/application-package/lib/application-props';
|
|
24
|
+
import { ILogger } from '../../common/logger';
|
|
24
25
|
|
|
25
26
|
@injectable()
|
|
26
27
|
export class FrontendConfigPreferenceContribution implements PreferenceContribution {
|
|
28
|
+
|
|
29
|
+
@inject(ILogger) @named('core:FrontendConfigPreferenceContribution')
|
|
30
|
+
protected readonly logger: ILogger;
|
|
31
|
+
|
|
27
32
|
schema: PreferenceSchema = { scope: PreferenceScope.Folder, properties: {} };
|
|
28
33
|
async initSchema(service: PreferenceSchemaService): Promise<void> {
|
|
29
34
|
const config = FrontendApplicationConfigProvider.get();
|
|
@@ -44,7 +49,7 @@ export class FrontendConfigPreferenceContribution implements PreferenceContribut
|
|
|
44
49
|
}
|
|
45
50
|
}
|
|
46
51
|
} catch (e) {
|
|
47
|
-
|
|
52
|
+
this.logger.error('Failed to load preferences from frontend configuration.', e);
|
|
48
53
|
}
|
|
49
54
|
}
|
|
50
55
|
}
|
|
@@ -162,6 +162,14 @@ describe('Preference Proxy', () => {
|
|
|
162
162
|
expect(Object.keys(proxy).join()).to.equal(['my.pref'].join());
|
|
163
163
|
});
|
|
164
164
|
|
|
165
|
+
it('supports object introspection through Symbol.toStringTag', async () => {
|
|
166
|
+
const { proxy, promisedSchema } = getProxy();
|
|
167
|
+
if (promisedSchema) {
|
|
168
|
+
await promisedSchema;
|
|
169
|
+
}
|
|
170
|
+
expect(Object.prototype.toString.call(proxy)).to.equal('[object Object]');
|
|
171
|
+
});
|
|
172
|
+
|
|
165
173
|
it('it should provide access in deep style but not flat', async () => {
|
|
166
174
|
const { proxy, promisedSchema } = getProxy(undefined, { style: 'deep' });
|
|
167
175
|
if (promisedSchema) {
|
|
@@ -24,6 +24,8 @@ import { bindPreferenceService } from '../frontend-application-bindings';
|
|
|
24
24
|
import { FrontendApplicationConfigProvider } from '../frontend-application-config-provider';
|
|
25
25
|
import { IndexedAccess, PreferenceDataProperty, PreferenceSchemaService } from '../../common/preferences/preference-schema';
|
|
26
26
|
import { PreferenceProvider, PreferenceProviderProvider, PreferenceScope } from '../../common/preferences';
|
|
27
|
+
import { ILogger } from '../../common';
|
|
28
|
+
import { MockLogger } from '../../common/test/mock-logger';
|
|
27
29
|
|
|
28
30
|
disableJSDOM();
|
|
29
31
|
|
|
@@ -38,6 +40,9 @@ let testContainer: Container;
|
|
|
38
40
|
function createTestContainer(): Container {
|
|
39
41
|
const result = new Container();
|
|
40
42
|
bindPreferenceService(result.bind.bind(result));
|
|
43
|
+
|
|
44
|
+
result.bind(ILogger).to(MockLogger).inSingletonScope();
|
|
45
|
+
|
|
41
46
|
return result;
|
|
42
47
|
}
|
|
43
48
|
|
|
@@ -21,9 +21,10 @@ import { JSONValue } from '@lumino/coreutils';
|
|
|
21
21
|
import { IJSONSchema, JsonType } from '../../common/json-schema';
|
|
22
22
|
import {
|
|
23
23
|
DefaultsPreferenceProvider, Disposable, PreferenceDataProperty, PreferenceProvider,
|
|
24
|
-
PreferenceSchemaService, PreferenceSchemaServiceImpl, PreferenceScope
|
|
24
|
+
PreferenceSchemaService, PreferenceSchemaServiceImpl, PreferenceScope, ILogger
|
|
25
25
|
} from '../../common';
|
|
26
26
|
import { PreferenceLanguageOverrideService } from '../../common/preferences/preference-language-override-service';
|
|
27
|
+
import { MockLogger } from '../../common/test/mock-logger';
|
|
27
28
|
|
|
28
29
|
/* eslint-disable no-null/no-null */
|
|
29
30
|
|
|
@@ -35,6 +36,7 @@ describe('Preference Validation Service', () => {
|
|
|
35
36
|
} as unknown as PreferenceSchemaService);
|
|
36
37
|
container.bind(PreferenceLanguageOverrideService).to(PreferenceLanguageOverrideService).inSingletonScope();
|
|
37
38
|
container.bind(PreferenceProvider).to(DefaultsPreferenceProvider).inSingletonScope().whenTargetNamed(PreferenceScope.Default);
|
|
39
|
+
container.bind(ILogger).to(MockLogger).inSingletonScope();
|
|
38
40
|
|
|
39
41
|
const validator = container.resolve(PreferenceValidationService);
|
|
40
42
|
const validateBySchema: (value: JSONValue, schema: PreferenceDataProperty) => JSONValue = validator.validateBySchema.bind(validator, 'dummy');
|