@theia/plugin-ext 1.29.0-next.9 → 1.29.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/lib/common/plugin-api-rpc.d.ts +13 -15
- package/lib/common/plugin-api-rpc.d.ts.map +1 -1
- package/lib/common/plugin-api-rpc.js.map +1 -1
- package/lib/common/rpc-protocol.d.ts +1 -1
- package/lib/common/rpc-protocol.d.ts.map +1 -1
- package/lib/common/rpc-protocol.js +3 -3
- package/lib/common/rpc-protocol.js.map +1 -1
- package/lib/main/browser/authentication-main.d.ts +3 -6
- package/lib/main/browser/authentication-main.d.ts.map +1 -1
- package/lib/main/browser/authentication-main.js +16 -37
- package/lib/main/browser/authentication-main.js.map +1 -1
- package/lib/main/browser/comments/comment-thread-widget.d.ts +2 -0
- package/lib/main/browser/comments/comment-thread-widget.d.ts.map +1 -1
- package/lib/main/browser/comments/comment-thread-widget.js +4 -3
- package/lib/main/browser/comments/comment-thread-widget.js.map +1 -1
- package/lib/main/browser/debug/debug-main.d.ts +1 -1
- package/lib/main/browser/debug/debug-main.d.ts.map +1 -1
- package/lib/main/browser/debug/debug-main.js +20 -10
- package/lib/main/browser/debug/debug-main.js.map +1 -1
- package/lib/main/browser/debug/plugin-debug-session-factory.d.ts +4 -4
- package/lib/main/browser/debug/plugin-debug-session-factory.d.ts.map +1 -1
- package/lib/main/browser/debug/plugin-debug-session-factory.js.map +1 -1
- package/lib/main/browser/plugin-ext-frontend-module.d.ts +1 -0
- package/lib/main/browser/plugin-ext-frontend-module.d.ts.map +1 -1
- package/lib/main/browser/plugin-ext-frontend-module.js +1 -0
- package/lib/main/browser/plugin-ext-frontend-module.js.map +1 -1
- package/lib/main/browser/theme-icon-override.d.ts +2 -0
- package/lib/main/browser/theme-icon-override.d.ts.map +1 -0
- package/lib/main/browser/theme-icon-override.js +217 -0
- package/lib/main/browser/theme-icon-override.js.map +1 -0
- package/lib/main/browser/view/plugin-view-registry.d.ts.map +1 -1
- package/lib/main/browser/view/plugin-view-registry.js +0 -1
- package/lib/main/browser/view/plugin-view-registry.js.map +1 -1
- package/lib/main/browser/view/plugin-view-widget.d.ts +9 -8
- package/lib/main/browser/view/plugin-view-widget.d.ts.map +1 -1
- package/lib/main/browser/view/plugin-view-widget.js +7 -4
- package/lib/main/browser/view/plugin-view-widget.js.map +1 -1
- package/lib/main/browser/view/tree-view-decorator-service.d.ts +1 -1
- package/lib/main/browser/view/tree-view-decorator-service.d.ts.map +1 -1
- package/lib/main/browser/view/tree-view-decorator-service.js +1 -1
- package/lib/main/browser/view/tree-view-decorator-service.js.map +1 -1
- package/lib/main/node/plugin-ext-backend-module.d.ts +1 -1
- package/lib/main/node/plugin-ext-backend-module.d.ts.map +1 -1
- package/lib/main/node/plugin-ext-backend-module.js +4 -1
- package/lib/main/node/plugin-ext-backend-module.js.map +1 -1
- package/lib/main/node/plugin-localization-backend-contribution.d.ts +10 -0
- package/lib/main/node/plugin-localization-backend-contribution.d.ts.map +1 -0
- package/lib/main/node/plugin-localization-backend-contribution.js +59 -0
- package/lib/main/node/plugin-localization-backend-contribution.js.map +1 -0
- package/lib/plugin/authentication-ext.d.ts +1 -11
- package/lib/plugin/authentication-ext.d.ts.map +1 -1
- package/lib/plugin/authentication-ext.js +3 -55
- package/lib/plugin/authentication-ext.js.map +1 -1
- package/lib/plugin/languages/code-action.d.ts.map +1 -1
- package/lib/plugin/languages/code-action.js +8 -9
- package/lib/plugin/languages/code-action.js.map +1 -1
- package/lib/plugin/languages/document-highlight.d.ts.map +1 -1
- package/lib/plugin/languages/document-highlight.js +0 -1
- package/lib/plugin/languages/document-highlight.js.map +1 -1
- package/lib/plugin/languages/util.d.ts +2 -2
- package/lib/plugin/languages/util.d.ts.map +1 -1
- package/lib/plugin/languages/util.js +0 -2
- package/lib/plugin/languages/util.js.map +1 -1
- package/lib/plugin/plugin-context.d.ts.map +1 -1
- package/lib/plugin/plugin-context.js +3 -35
- package/lib/plugin/plugin-context.js.map +1 -1
- package/lib/plugin/preference-registry.d.ts.map +1 -1
- package/lib/plugin/preference-registry.js +5 -0
- package/lib/plugin/preference-registry.js.map +1 -1
- package/lib/plugin/preference-registry.spec.js +44 -1
- package/lib/plugin/preference-registry.spec.js.map +1 -1
- package/lib/plugin/quick-open.d.ts +5 -1
- package/lib/plugin/quick-open.d.ts.map +1 -1
- package/lib/plugin/quick-open.js +27 -4
- package/lib/plugin/quick-open.js.map +1 -1
- package/lib/plugin/type-converters.d.ts +6 -6
- package/lib/plugin/type-converters.d.ts.map +1 -1
- package/lib/plugin/type-converters.js +45 -53
- package/lib/plugin/type-converters.js.map +1 -1
- package/lib/plugin/types-impl.d.ts +8 -3
- package/lib/plugin/types-impl.d.ts.map +1 -1
- package/lib/plugin/types-impl.js +12 -8
- package/lib/plugin/types-impl.js.map +1 -1
- package/lib/plugin/workspace.d.ts.map +1 -1
- package/lib/plugin/workspace.js +6 -1
- package/lib/plugin/workspace.js.map +1 -1
- package/lib/plugin-ext-backend-electron-module.js +2 -2
- package/lib/plugin-ext-backend-electron-module.js.map +1 -1
- package/lib/plugin-ext-backend-module.js +2 -2
- package/lib/plugin-ext-backend-module.js.map +1 -1
- package/package.json +26 -26
- package/src/common/plugin-api-rpc.ts +10 -15
- package/src/common/rpc-protocol.ts +5 -5
- package/src/main/browser/authentication-main.ts +17 -42
- package/src/main/browser/comments/comment-thread-widget.tsx +5 -3
- package/src/main/browser/debug/debug-main.ts +20 -12
- package/src/main/browser/debug/plugin-debug-session-factory.ts +3 -3
- package/src/main/browser/plugin-ext-frontend-module.ts +1 -0
- package/src/main/browser/style/tree.css +2 -0
- package/src/main/browser/theme-icon-override.ts +221 -0
- package/src/main/browser/view/plugin-view-registry.ts +0 -1
- package/src/main/browser/view/plugin-view-widget.ts +14 -11
- package/src/main/browser/view/tree-view-decorator-service.ts +2 -2
- package/src/main/node/plugin-ext-backend-module.ts +6 -1
- package/src/main/node/plugin-localization-backend-contribution.ts +42 -0
- package/src/plugin/authentication-ext.ts +3 -70
- package/src/plugin/debug/debug-ext.ts +1 -1
- package/src/plugin/languages/code-action.ts +9 -12
- package/src/plugin/languages/document-highlight.ts +1 -2
- package/src/plugin/languages/util.ts +2 -4
- package/src/plugin/plugin-context.ts +7 -41
- package/src/plugin/preference-registry.spec.ts +45 -1
- package/src/plugin/preference-registry.ts +5 -0
- package/src/plugin/quick-open.ts +32 -6
- package/src/plugin/type-converters.ts +51 -59
- package/src/plugin/types-impl.ts +18 -14
- package/src/plugin/workspace.ts +5 -1
- package/src/plugin-ext-backend-electron-module.ts +2 -2
- package/src/plugin-ext-backend-module.ts +2 -2
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
// code copied and modified from https://github.com/microsoft/vscode/blob/1.47.3/src/vs/workbench/api/browser/mainThreadAuthentication.ts
|
|
22
22
|
|
|
23
23
|
import { interfaces } from '@theia/core/shared/inversify';
|
|
24
|
-
import { AuthenticationExt, AuthenticationMain,
|
|
24
|
+
import { AuthenticationExt, AuthenticationMain, MAIN_RPC_CONTEXT } from '../../common/plugin-api-rpc';
|
|
25
25
|
import { RPCProtocol } from '../../common/rpc-protocol';
|
|
26
26
|
import { MessageService } from '@theia/core/lib/common/message-service';
|
|
27
27
|
import { Dialog, StorageService } from '@theia/core/lib/browser';
|
|
@@ -43,28 +43,17 @@ export class AuthenticationMainImpl implements AuthenticationMain {
|
|
|
43
43
|
private readonly storageService: StorageService;
|
|
44
44
|
private readonly authenticationService: AuthenticationService;
|
|
45
45
|
private readonly quickPickService: QuickPickService;
|
|
46
|
-
private readonly extensionService: PluginManagerExt;
|
|
47
46
|
constructor(rpc: RPCProtocol, container: interfaces.Container) {
|
|
48
47
|
this.proxy = rpc.getProxy(MAIN_RPC_CONTEXT.AUTHENTICATION_EXT);
|
|
49
48
|
this.messageService = container.get(MessageService);
|
|
50
49
|
this.storageService = container.get(StorageService);
|
|
51
50
|
this.authenticationService = container.get(AuthenticationService);
|
|
52
51
|
this.quickPickService = container.get(QuickPickService);
|
|
53
|
-
this.extensionService = rpc.getProxy(MAIN_RPC_CONTEXT.HOSTED_PLUGIN_MANAGER_EXT);
|
|
54
52
|
|
|
55
53
|
this.authenticationService.onDidChangeSessions(e => {
|
|
56
|
-
this.proxy.$onDidChangeAuthenticationSessions(e.providerId, e.label);
|
|
57
|
-
});
|
|
58
|
-
this.authenticationService.onDidRegisterAuthenticationProvider(info => {
|
|
59
|
-
this.proxy.$onDidChangeAuthenticationProviders([info], []);
|
|
60
|
-
});
|
|
61
|
-
this.authenticationService.onDidUnregisterAuthenticationProvider(providerId => {
|
|
62
|
-
this.proxy.$onDidChangeAuthenticationProviders([], [providerId]);
|
|
54
|
+
this.proxy.$onDidChangeAuthenticationSessions({ id: e.providerId, label: e.label });
|
|
63
55
|
});
|
|
64
56
|
}
|
|
65
|
-
$getProviderIds(): Promise<string[]> {
|
|
66
|
-
return Promise.resolve(this.authenticationService.getProviderIds());
|
|
67
|
-
}
|
|
68
57
|
|
|
69
58
|
async $registerAuthenticationProvider(id: string, label: string, supportsMultipleAccounts: boolean): Promise<void> {
|
|
70
59
|
const provider = new AuthenticationProviderImpl(this.proxy, id, label, supportsMultipleAccounts, this.storageService, this.messageService);
|
|
@@ -230,15 +219,7 @@ export class AuthenticationMainImpl implements AuthenticationMain {
|
|
|
230
219
|
this.storageService.setData(`authentication-session-${extensionName}-${providerId}`, sessionId);
|
|
231
220
|
}
|
|
232
221
|
|
|
233
|
-
$
|
|
234
|
-
return this.extensionService.$activateByEvent(getAuthenticationProviderActivationEvent(id));
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
$removeSession(providerId: string, sessionId: string): Promise<void> {
|
|
238
|
-
return this.authenticationService.logout(providerId, sessionId);
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
$sendDidChangeSessions(providerId: string, event: theia.AuthenticationProviderAuthenticationSessionsChangeEvent): void {
|
|
222
|
+
$onDidChangeSessions(providerId: string, event: theia.AuthenticationProviderAuthenticationSessionsChangeEvent): void {
|
|
242
223
|
this.authenticationService.updateSessions(providerId, event);
|
|
243
224
|
}
|
|
244
225
|
}
|
|
@@ -272,8 +253,10 @@ interface AccountUsage {
|
|
|
272
253
|
}
|
|
273
254
|
|
|
274
255
|
export class AuthenticationProviderImpl implements AuthenticationProvider {
|
|
275
|
-
|
|
276
|
-
private
|
|
256
|
+
/** map from account name to session ids */
|
|
257
|
+
private accounts = new Map<string, string[]>();
|
|
258
|
+
/** map from session id to account name */
|
|
259
|
+
private sessions = new Map<string, string>();
|
|
277
260
|
|
|
278
261
|
readonly onDidChangeSessions: theia.Event<theia.AuthenticationProviderAuthenticationSessionsChangeEvent>;
|
|
279
262
|
|
|
@@ -313,7 +296,7 @@ export class AuthenticationProviderImpl implements AuthenticationProvider {
|
|
|
313
296
|
Dialog.CANCEL);
|
|
314
297
|
|
|
315
298
|
if (result && result === nls.localizeByDefault('Sign Out') && sessionsForAccount) {
|
|
316
|
-
sessionsForAccount.forEach(sessionId => this.
|
|
299
|
+
sessionsForAccount.forEach(sessionId => this.removeSession(sessionId));
|
|
317
300
|
removeAccountUsage(this.storageService, this.id, accountName);
|
|
318
301
|
}
|
|
319
302
|
}
|
|
@@ -325,10 +308,10 @@ export class AuthenticationProviderImpl implements AuthenticationProvider {
|
|
|
325
308
|
async updateSessionItems(event: theia.AuthenticationProviderAuthenticationSessionsChangeEvent): Promise<void> {
|
|
326
309
|
const { added, removed } = event;
|
|
327
310
|
const session = await this.proxy.$getSessions(this.id);
|
|
328
|
-
const addedSessions = session.filter(s => added.some(addedSession =>
|
|
311
|
+
const addedSessions = added ? session.filter(s => added.some(addedSession => addedSession.id === s.id)) : [];
|
|
329
312
|
|
|
330
|
-
removed
|
|
331
|
-
const sessionId =
|
|
313
|
+
removed?.forEach(removedSession => {
|
|
314
|
+
const sessionId = removedSession.id;
|
|
332
315
|
if (sessionId) {
|
|
333
316
|
const accountName = this.sessions.get(sessionId);
|
|
334
317
|
if (accountName) {
|
|
@@ -347,29 +330,21 @@ export class AuthenticationProviderImpl implements AuthenticationProvider {
|
|
|
347
330
|
addedSessions.forEach(s => this.registerSession(s));
|
|
348
331
|
}
|
|
349
332
|
|
|
350
|
-
login(scopes: string[]): Promise<theia.AuthenticationSession> {
|
|
351
|
-
return this.
|
|
333
|
+
async login(scopes: string[]): Promise<theia.AuthenticationSession> {
|
|
334
|
+
return this.createSession(scopes);
|
|
352
335
|
}
|
|
353
336
|
|
|
354
337
|
async logout(sessionId: string): Promise<void> {
|
|
355
|
-
|
|
356
|
-
this.messageService.info('Successfully signed out.');
|
|
338
|
+
return this.removeSession(sessionId);
|
|
357
339
|
}
|
|
358
340
|
|
|
359
341
|
createSession(scopes: string[]): Thenable<theia.AuthenticationSession> {
|
|
360
|
-
return this.
|
|
342
|
+
return this.proxy.$createSession(this.id, scopes);
|
|
361
343
|
}
|
|
362
344
|
|
|
363
345
|
removeSession(sessionId: string): Thenable<void> {
|
|
364
|
-
return this.
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
// utility method to be backwards compatible with the old AuthenticationProviderAuthenticationSessionsChangeEvent containing only the session id string
|
|
368
|
-
private getSessionId(obj: string | theia.AuthenticationSession | undefined): string | undefined {
|
|
369
|
-
if (!obj || typeof obj === 'string') {
|
|
370
|
-
return obj;
|
|
371
|
-
}
|
|
372
|
-
return obj.id;
|
|
346
|
+
return this.proxy.$removeSession(this.id, sessionId)
|
|
347
|
+
.then(() => { this.messageService.info('Successfully signed out.'); });
|
|
373
348
|
}
|
|
374
349
|
}
|
|
375
350
|
|
|
@@ -22,7 +22,6 @@ import {
|
|
|
22
22
|
} from '../../../common/plugin-api-rpc-model';
|
|
23
23
|
import { CommentGlyphWidget } from './comment-glyph-widget';
|
|
24
24
|
import { BaseWidget, DISABLED_CLASS } from '@theia/core/lib/browser';
|
|
25
|
-
import * as ReactDOM from '@theia/core/shared/react-dom';
|
|
26
25
|
import * as React from '@theia/core/shared/react';
|
|
27
26
|
import { MouseTargetType } from '@theia/editor/lib/browser';
|
|
28
27
|
import { CommentsService } from './comments-service';
|
|
@@ -36,6 +35,7 @@ import {
|
|
|
36
35
|
import { CommentsContextKeyService } from './comments-context-key-service';
|
|
37
36
|
import { RefObject } from '@theia/core/shared/react';
|
|
38
37
|
import * as monaco from '@theia/monaco-editor-core';
|
|
38
|
+
import { createRoot, Root } from '@theia/core/shared/react-dom/client';
|
|
39
39
|
|
|
40
40
|
/*---------------------------------------------------------------------------------------------
|
|
41
41
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
@@ -50,6 +50,7 @@ export const COMMENT_TITLE: MenuPath = ['comment-title-menu'];
|
|
|
50
50
|
export class CommentThreadWidget extends BaseWidget {
|
|
51
51
|
|
|
52
52
|
protected readonly zoneWidget: MonacoEditorZoneWidget;
|
|
53
|
+
protected readonly containerNodeRoot: Root;
|
|
53
54
|
protected readonly commentGlyphWidget: CommentGlyphWidget;
|
|
54
55
|
protected readonly contextMenu: CompositeMenuNode;
|
|
55
56
|
protected readonly commentFormRef: RefObject<CommentForm> = React.createRef<CommentForm>();
|
|
@@ -67,6 +68,7 @@ export class CommentThreadWidget extends BaseWidget {
|
|
|
67
68
|
) {
|
|
68
69
|
super();
|
|
69
70
|
this.toDispose.push(this.zoneWidget = new MonacoEditorZoneWidget(editor));
|
|
71
|
+
this.containerNodeRoot = createRoot(this.zoneWidget.containerNode);
|
|
70
72
|
this.toDispose.push(this.commentGlyphWidget = new CommentGlyphWidget(editor));
|
|
71
73
|
this.toDispose.push(this._commentThread.onDidChangeCollapsibleState(state => {
|
|
72
74
|
if (state === CommentThreadCollapsibleState.Expanded && !this.isExpanded) {
|
|
@@ -255,7 +257,7 @@ export class CommentThreadWidget extends BaseWidget {
|
|
|
255
257
|
|
|
256
258
|
protected render(): void {
|
|
257
259
|
const headHeight = Math.ceil(this.zoneWidget.editor.getOption(monaco.editor.EditorOption.lineHeight) * 1.2);
|
|
258
|
-
|
|
260
|
+
this.containerNodeRoot.render(<div className={'review-widget'}>
|
|
259
261
|
<div className={'head'} style={{ height: headHeight, lineHeight: `${headHeight}px` }}>
|
|
260
262
|
<div className={'review-title'}>
|
|
261
263
|
<span className={'filename'}>{this.getThreadLabel()}</span>
|
|
@@ -295,7 +297,7 @@ export class CommentThreadWidget extends BaseWidget {
|
|
|
295
297
|
ref={this.commentFormRef}
|
|
296
298
|
/>
|
|
297
299
|
</div>
|
|
298
|
-
</div
|
|
300
|
+
</div>);
|
|
299
301
|
}
|
|
300
302
|
}
|
|
301
303
|
|
|
@@ -34,7 +34,7 @@ import { URI as Uri } from '@theia/core/shared/vscode-uri';
|
|
|
34
34
|
import { SourceBreakpoint, FunctionBreakpoint } from '@theia/debug/lib/browser/breakpoint/breakpoint-marker';
|
|
35
35
|
import { DebugConfiguration, DebugSessionOptions } from '@theia/debug/lib/common/debug-configuration';
|
|
36
36
|
import { DebuggerDescription } from '@theia/debug/lib/common/debug-service';
|
|
37
|
-
import { DebugProtocol } from 'vscode
|
|
37
|
+
import { DebugProtocol } from '@vscode/debugprotocol';
|
|
38
38
|
import { DebugConfigurationManager } from '@theia/debug/lib/browser/debug-configuration-manager';
|
|
39
39
|
import { TerminalService } from '@theia/terminal/lib/browser/base/terminal-service';
|
|
40
40
|
import { MessageClient } from '@theia/core/lib/common/message-service-protocol';
|
|
@@ -55,6 +55,7 @@ import { ContributionProvider } from '@theia/core/lib/common';
|
|
|
55
55
|
import { DebugContribution } from '@theia/debug/lib/browser/debug-contribution';
|
|
56
56
|
import { ConnectionImpl } from '../../../common/connection';
|
|
57
57
|
import { WorkspaceService } from '@theia/workspace/lib/browser';
|
|
58
|
+
import { DebugSessionOptions as TheiaDebugSessionOptions } from '@theia/debug/lib/browser/debug-session-options';
|
|
58
59
|
|
|
59
60
|
export class DebugMainImpl implements DebugMain, Disposable {
|
|
60
61
|
private readonly debugExt: DebugExt;
|
|
@@ -294,29 +295,36 @@ export class DebugMainImpl implements DebugMain, Disposable {
|
|
|
294
295
|
}
|
|
295
296
|
|
|
296
297
|
async $startDebugging(folder: WorkspaceFolder | undefined, nameOrConfiguration: string | DebugConfiguration, options: DebugSessionOptions): Promise<boolean> {
|
|
297
|
-
|
|
298
|
-
|
|
298
|
+
// search for matching options
|
|
299
|
+
let sessionOptions: TheiaDebugSessionOptions | undefined;
|
|
299
300
|
if (typeof nameOrConfiguration === 'string') {
|
|
300
301
|
for (const configOptions of this.configurationManager.all) {
|
|
301
|
-
if (configOptions.
|
|
302
|
-
|
|
302
|
+
if (configOptions.name === nameOrConfiguration) {
|
|
303
|
+
sessionOptions = configOptions;
|
|
303
304
|
}
|
|
304
305
|
}
|
|
305
306
|
} else {
|
|
306
|
-
|
|
307
|
+
sessionOptions = {
|
|
308
|
+
name: nameOrConfiguration.name,
|
|
309
|
+
configuration: nameOrConfiguration
|
|
310
|
+
};
|
|
307
311
|
}
|
|
308
312
|
|
|
309
|
-
if (!
|
|
313
|
+
if (!sessionOptions) {
|
|
310
314
|
console.error(`There is no debug configuration for ${nameOrConfiguration}`);
|
|
311
315
|
return false;
|
|
312
316
|
}
|
|
313
317
|
|
|
314
|
-
|
|
315
|
-
const
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
}
|
|
318
|
+
// translate given extra data
|
|
319
|
+
const workspaceFolderUri = folder && Uri.revive(folder.uri).toString();
|
|
320
|
+
if (TheiaDebugSessionOptions.isConfiguration(sessionOptions)) {
|
|
321
|
+
sessionOptions = { ...sessionOptions, configuration: { ...sessionOptions.configuration, ...options }, workspaceFolderUri };
|
|
322
|
+
} else {
|
|
323
|
+
sessionOptions = { ...sessionOptions, ...options, workspaceFolderUri };
|
|
324
|
+
}
|
|
319
325
|
|
|
326
|
+
// start options
|
|
327
|
+
const session = await this.sessionManager.start(sessionOptions);
|
|
320
328
|
return !!session;
|
|
321
329
|
}
|
|
322
330
|
|
|
@@ -22,7 +22,7 @@ import { LabelProvider } from '@theia/core/lib/browser/label-provider';
|
|
|
22
22
|
import { MessageClient } from '@theia/core/lib/common/message-service-protocol';
|
|
23
23
|
import { OutputChannelManager } from '@theia/output/lib/browser/output-channel';
|
|
24
24
|
import { DebugPreferences } from '@theia/debug/lib/browser/debug-preferences';
|
|
25
|
-
import {
|
|
25
|
+
import { DebugConfigurationSessionOptions } from '@theia/debug/lib/browser/debug-session-options';
|
|
26
26
|
import { DebugSession } from '@theia/debug/lib/browser/debug-session';
|
|
27
27
|
import { DebugSessionConnection } from '@theia/debug/lib/browser/debug-session-connection';
|
|
28
28
|
import { TerminalWidgetOptions, TerminalWidget } from '@theia/terminal/lib/browser/base/terminal-widget';
|
|
@@ -36,7 +36,7 @@ import { PluginChannel } from '../../../common/connection';
|
|
|
36
36
|
export class PluginDebugSession extends DebugSession {
|
|
37
37
|
constructor(
|
|
38
38
|
override readonly id: string,
|
|
39
|
-
override readonly options:
|
|
39
|
+
override readonly options: DebugConfigurationSessionOptions,
|
|
40
40
|
override readonly parentSession: DebugSession | undefined,
|
|
41
41
|
protected override readonly connection: DebugSessionConnection,
|
|
42
42
|
protected override readonly terminalServer: TerminalService,
|
|
@@ -80,7 +80,7 @@ export class PluginDebugSessionFactory extends DefaultDebugSessionFactory {
|
|
|
80
80
|
super();
|
|
81
81
|
}
|
|
82
82
|
|
|
83
|
-
override get(sessionId: string, options:
|
|
83
|
+
override get(sessionId: string, options: DebugConfigurationSessionOptions, parentSession?: DebugSession): DebugSession {
|
|
84
84
|
const connection = new DebugSessionConnection(
|
|
85
85
|
sessionId,
|
|
86
86
|
this.connectionFactory,
|
|
@@ -79,6 +79,7 @@ import { AuthenticationService } from '@theia/core/lib/browser/authentication-se
|
|
|
79
79
|
import { bindTreeViewDecoratorUtilities, TreeViewDecoratorService } from './view/tree-view-decorator-service';
|
|
80
80
|
import { CodeEditorWidgetUtil } from './menus/vscode-theia-menu-mappings';
|
|
81
81
|
import { PluginMenuCommandAdapter } from './menus/plugin-menu-command-adapter';
|
|
82
|
+
import './theme-icon-override';
|
|
82
83
|
|
|
83
84
|
export default new ContainerModule((bind, unbind, isBound, rebind) => {
|
|
84
85
|
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2022 TypeFox 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 WITH Classpath-exception-2.0
|
|
15
|
+
// *****************************************************************************
|
|
16
|
+
|
|
17
|
+
import { ThemeIcon } from '@theia/monaco-editor-core/esm/vs/platform/theme/common/themeService';
|
|
18
|
+
|
|
19
|
+
// @monaco-uplift
|
|
20
|
+
// Keep this up-to-date with the table at https://code.visualstudio.com/api/references/icons-in-labels#icon-listing
|
|
21
|
+
const codeIconMap: Record<string, string> = {
|
|
22
|
+
'accounts-view-bar-icon': 'account',
|
|
23
|
+
'breakpoints-activate': 'activate-breakpoints',
|
|
24
|
+
'breakpoints-remove-all': 'close-all',
|
|
25
|
+
'breakpoints-view-icon': 'debug-alt',
|
|
26
|
+
'callhierarchy-incoming': 'call-incoming',
|
|
27
|
+
'callhierarchy-outgoing': 'call-outgoing',
|
|
28
|
+
'callstack-view-icon': 'debug-alt',
|
|
29
|
+
'callstack-view-session': 'bug',
|
|
30
|
+
'comments-view-icon': 'comment-discussion',
|
|
31
|
+
'debug-collapse-all': 'collapse-all',
|
|
32
|
+
'debug-configure': 'gear',
|
|
33
|
+
'debug-console-clear-all': 'clear-all',
|
|
34
|
+
'debug-console-evaluation-input': 'arrow-small-right',
|
|
35
|
+
'debug-console-evaluation-prompt': 'chevron-right',
|
|
36
|
+
'debug-console-view-icon': 'debug-console',
|
|
37
|
+
'debug-gripper': 'gripper',
|
|
38
|
+
'default-view-icon': 'window',
|
|
39
|
+
'diff-editor-next-change': 'arrow-down',
|
|
40
|
+
'diff-editor-previous-change': 'arrow-up',
|
|
41
|
+
'diff-editor-toggle-whitespace': 'whitespace',
|
|
42
|
+
'diff-insert': 'add',
|
|
43
|
+
'diff-remove': 'remove',
|
|
44
|
+
'diff-review-close': 'close',
|
|
45
|
+
'diff-review-insert': 'add',
|
|
46
|
+
'diff-review-remove': 'remove',
|
|
47
|
+
'explorer-view-icon': 'files',
|
|
48
|
+
'extensions-clear-search-results': 'clear-all',
|
|
49
|
+
'extensions-configure-recommended': 'pencil',
|
|
50
|
+
'extensions-filter': 'filter',
|
|
51
|
+
'extensions-info-message': 'info',
|
|
52
|
+
'extensions-install-count': 'cloud-download',
|
|
53
|
+
'extensions-install-local-in-remote': 'cloud-download',
|
|
54
|
+
'extensions-install-workspace-recommended': 'cloud-download',
|
|
55
|
+
'extensions-manage': 'gear',
|
|
56
|
+
'extensions-rating': 'star',
|
|
57
|
+
'extensions-refresh': 'refresh',
|
|
58
|
+
'extensions-remote': 'remote',
|
|
59
|
+
'extensions-star-empty': 'star-empty',
|
|
60
|
+
'extensions-star-full': 'star-full',
|
|
61
|
+
'extensions-star-half': 'star-half',
|
|
62
|
+
'extensions-sync-enabled': 'sync',
|
|
63
|
+
'extensions-sync-ignored': 'sync-ignored',
|
|
64
|
+
'extensions-view-icon': 'extensions',
|
|
65
|
+
'extensions-warning-message': 'warning',
|
|
66
|
+
'find-collapsed': 'chevron-right',
|
|
67
|
+
'find-expanded': 'chevron-down',
|
|
68
|
+
'find-next-match': 'arrow-down',
|
|
69
|
+
'find-previous-match': 'arrow-up',
|
|
70
|
+
'find-replace': 'replace',
|
|
71
|
+
'find-replace-all': 'replace-all',
|
|
72
|
+
'find-selection': 'selection',
|
|
73
|
+
'folding-collapsed': 'chevron-right',
|
|
74
|
+
'folding-expanded': 'chevron-down',
|
|
75
|
+
'getting-started-beginner': 'lightbulb',
|
|
76
|
+
'getting-started-codespaces': 'github',
|
|
77
|
+
'getting-started-item-checked': 'pass-filled',
|
|
78
|
+
'getting-started-item-unchecked': 'circle-large-outline',
|
|
79
|
+
'getting-started-setup': 'heart',
|
|
80
|
+
'goto-next-location': 'arrow-down',
|
|
81
|
+
'goto-previous-location': 'arrow-up',
|
|
82
|
+
'keybindings-add': 'add',
|
|
83
|
+
'keybindings-edit': 'edit',
|
|
84
|
+
'keybindings-record-keys': 'record-keys',
|
|
85
|
+
'keybindings-sort': 'sort-precedence',
|
|
86
|
+
'loaded-scripts-view-icon': 'debug-alt',
|
|
87
|
+
'marker-navigation-next': 'chevron-down',
|
|
88
|
+
'marker-navigation-previous': 'chevron-up',
|
|
89
|
+
'markers-view-filter': 'filter',
|
|
90
|
+
'markers-view-icon': 'warning',
|
|
91
|
+
'markers-view-multi-line-collapsed': 'chevron-down',
|
|
92
|
+
'markers-view-multi-line-expanded': 'chevron-up',
|
|
93
|
+
'notebook-clear': 'clear-all',
|
|
94
|
+
'notebook-collapsed': 'chevron-right',
|
|
95
|
+
'notebook-delete-cell': 'trash',
|
|
96
|
+
'notebook-edit': 'pencil',
|
|
97
|
+
'notebook-execute': 'play',
|
|
98
|
+
'notebook-execute-all': 'run-all',
|
|
99
|
+
'notebook-expanded': 'chevron-down',
|
|
100
|
+
'notebook-kernel-configure': 'settings-gear',
|
|
101
|
+
'notebook-kernel-select': 'server-environment',
|
|
102
|
+
'notebook-mimetype': 'code',
|
|
103
|
+
'notebook-move-down': 'arrow-down',
|
|
104
|
+
'notebook-move-up': 'arrow-up',
|
|
105
|
+
'notebook-open-as-text': 'file-code',
|
|
106
|
+
'notebook-render-output': 'preview',
|
|
107
|
+
'notebook-revert': 'discard',
|
|
108
|
+
'notebook-split-cell': 'split-vertical',
|
|
109
|
+
'notebook-state-error': 'error',
|
|
110
|
+
'notebook-state-success': 'check',
|
|
111
|
+
'notebook-stop': 'primitive-square',
|
|
112
|
+
'notebook-stop-edit': 'check',
|
|
113
|
+
'notebook-unfold': 'unfold',
|
|
114
|
+
'notifications-clear': 'close',
|
|
115
|
+
'notifications-clear-all': 'clear-all',
|
|
116
|
+
'notifications-collapse': 'chevron-down',
|
|
117
|
+
'notifications-configure': 'gear',
|
|
118
|
+
'notifications-expand': 'chevron-up',
|
|
119
|
+
'notifications-hide': 'chevron-down',
|
|
120
|
+
'open-editors-view-icon': 'book',
|
|
121
|
+
'outline-view-icon': 'symbol-class',
|
|
122
|
+
'output-view-icon': 'output',
|
|
123
|
+
'panel-close': 'close',
|
|
124
|
+
'panel-maximize': 'chevron-up',
|
|
125
|
+
'panel-restore': 'chevron-down',
|
|
126
|
+
'parameter-hints-next': 'chevron-down',
|
|
127
|
+
'parameter-hints-previous': 'chevron-up',
|
|
128
|
+
'ports-forward-icon': 'plus',
|
|
129
|
+
'ports-open-browser-icon': 'globe',
|
|
130
|
+
'ports-stop-forward-icon': 'x',
|
|
131
|
+
'ports-view-icon': 'plug',
|
|
132
|
+
'preferences-clear-input': 'clear-all',
|
|
133
|
+
'preferences-open-settings': 'go-to-file',
|
|
134
|
+
'private-ports-view-icon': 'lock',
|
|
135
|
+
'public-ports-view-icon': 'eye',
|
|
136
|
+
'refactor-preview-view-icon': 'lightbulb',
|
|
137
|
+
'remote-explorer-documentation': 'book',
|
|
138
|
+
'remote-explorer-feedback': 'twitter',
|
|
139
|
+
'remote-explorer-get-started': 'star',
|
|
140
|
+
'remote-explorer-report-issues': 'comment',
|
|
141
|
+
'remote-explorer-review-issues': 'issues',
|
|
142
|
+
'remote-explorer-view-icon': 'remote-explorer',
|
|
143
|
+
'review-comment-collapse': 'chevron-up',
|
|
144
|
+
'run-view-icon': 'debug-alt',
|
|
145
|
+
'search-clear-results': 'clear-all',
|
|
146
|
+
'search-collapse-results': 'collapse-all',
|
|
147
|
+
'search-details': 'ellipsis',
|
|
148
|
+
'search-expand-results': 'expand-all',
|
|
149
|
+
'search-hide-replace': 'chevron-right',
|
|
150
|
+
'search-new-editor': 'new-file',
|
|
151
|
+
'search-refresh': 'refresh',
|
|
152
|
+
'search-remove': 'close',
|
|
153
|
+
'search-replace': 'replace',
|
|
154
|
+
'search-replace-all': 'replace-all',
|
|
155
|
+
'search-show-context': 'list-selection',
|
|
156
|
+
'search-show-replace': 'chevron-down',
|
|
157
|
+
'search-stop': 'search-stop',
|
|
158
|
+
'search-view-icon': 'search',
|
|
159
|
+
'settings-add': 'add',
|
|
160
|
+
'settings-discard': 'discard',
|
|
161
|
+
'settings-edit': 'edit',
|
|
162
|
+
'settings-folder-dropdown': 'triangle-down',
|
|
163
|
+
'settings-group-collapsed': 'chevron-right',
|
|
164
|
+
'settings-group-expanded': 'chevron-down',
|
|
165
|
+
'settings-more-action': 'gear',
|
|
166
|
+
'settings-remove': 'close',
|
|
167
|
+
'settings-sync-view-icon': 'sync',
|
|
168
|
+
'settings-view-bar-icon': 'settings-gear',
|
|
169
|
+
'source-control-view-icon': 'source-control',
|
|
170
|
+
'suggest-more-info': 'chevron-right',
|
|
171
|
+
'tasks-list-configure': 'gear',
|
|
172
|
+
'tasks-remove': 'close',
|
|
173
|
+
'terminal-kill': 'trash',
|
|
174
|
+
'terminal-new': 'add',
|
|
175
|
+
'terminal-rename': 'gear',
|
|
176
|
+
'terminal-view-icon': 'terminal',
|
|
177
|
+
'test-view-icon': 'beaker',
|
|
178
|
+
'testing-cancel-icon': 'close',
|
|
179
|
+
'testing-debug-icon': 'debug-alt',
|
|
180
|
+
'testing-error-icon': 'warning',
|
|
181
|
+
'testing-failed-icon': 'close',
|
|
182
|
+
'testing-passed-icon': 'pass',
|
|
183
|
+
'testing-queued-icon': 'watch',
|
|
184
|
+
'testing-run-all-icon': 'run-all',
|
|
185
|
+
'testing-run-icon': 'run',
|
|
186
|
+
'testing-show-as-list-icon': 'list-tree',
|
|
187
|
+
'testing-skipped-icon': 'debug-step-over',
|
|
188
|
+
'testing-unset-icon': 'circle-outline',
|
|
189
|
+
'timeline-open': 'history',
|
|
190
|
+
'timeline-pin': 'pin',
|
|
191
|
+
'timeline-refresh': 'refresh',
|
|
192
|
+
'timeline-unpin': 'pinned',
|
|
193
|
+
'timeline-view-icon': 'history',
|
|
194
|
+
'variables-view-icon': 'debug-alt',
|
|
195
|
+
'view-pane-container-collapsed': 'chevron-right',
|
|
196
|
+
'view-pane-container-expanded': 'chevron-down',
|
|
197
|
+
'watch-expressions-add': 'add',
|
|
198
|
+
'watch-expressions-add-function-breakpoint': 'add',
|
|
199
|
+
'watch-expressions-remove-all': 'close-all',
|
|
200
|
+
'watch-view-icon': 'debug-alt',
|
|
201
|
+
'widget-close': 'close'
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
const originalAsCSSSelector = ThemeIcon.asCSSSelector;
|
|
205
|
+
const originalAsClassName = ThemeIcon.asClassName;
|
|
206
|
+
const originalAsClassNameArray = ThemeIcon.asClassNameArray;
|
|
207
|
+
|
|
208
|
+
function buildMappedIcon(icon: ThemeIcon): ThemeIcon {
|
|
209
|
+
const id = codeIconMap[icon.id] ?? icon.id;
|
|
210
|
+
const newIcon: ThemeIcon = {
|
|
211
|
+
...icon,
|
|
212
|
+
id
|
|
213
|
+
};
|
|
214
|
+
return newIcon;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
Object.assign(ThemeIcon, {
|
|
218
|
+
asCSSSelector: (icon: ThemeIcon) => originalAsCSSSelector(buildMappedIcon(icon)),
|
|
219
|
+
asClassName: (icon: ThemeIcon) => originalAsClassName(buildMappedIcon(icon)),
|
|
220
|
+
asClassNameArray: (icon: ThemeIcon) => originalAsClassNameArray(buildMappedIcon(icon))
|
|
221
|
+
});
|
|
@@ -490,7 +490,6 @@ export class PluginViewRegistry implements FrontendApplicationContribution {
|
|
|
490
490
|
const currentDataWidget = widget.widgets[0];
|
|
491
491
|
const viewDataWidget = await this.createViewDataWidget(view.id, webviewId);
|
|
492
492
|
if (widget.isDisposed) {
|
|
493
|
-
// eslint-disable-next-line no-unused-expressions
|
|
494
493
|
viewDataWidget?.dispose();
|
|
495
494
|
return;
|
|
496
495
|
}
|
|
@@ -22,7 +22,7 @@ import { StatefulWidget } from '@theia/core/lib/browser/shell/shell-layout-resto
|
|
|
22
22
|
import { Message } from '@theia/core/shared/@phosphor/messaging';
|
|
23
23
|
import { TreeViewWidget } from './tree-view-widget';
|
|
24
24
|
import { DescriptionWidget } from '@theia/core/lib/browser/view-container';
|
|
25
|
-
import { DisposableCollection, Emitter } from '@theia/core/lib/common';
|
|
25
|
+
import { DisposableCollection, Emitter, Event } from '@theia/core/lib/common';
|
|
26
26
|
import { ContextKeyService } from '@theia/core/lib/browser/context-key-service';
|
|
27
27
|
|
|
28
28
|
@injectable()
|
|
@@ -34,7 +34,14 @@ export class PluginViewWidgetIdentifier {
|
|
|
34
34
|
@injectable()
|
|
35
35
|
export class PluginViewWidget extends Panel implements StatefulWidget, DescriptionWidget {
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
currentViewContainerId?: string;
|
|
38
|
+
|
|
39
|
+
protected _message?: string;
|
|
40
|
+
protected _description: string = '';
|
|
41
|
+
protected _suppressUpdateViewVisibility = false;
|
|
42
|
+
protected updatingViewVisibility = false;
|
|
43
|
+
protected onDidChangeDescriptionEmitter = new Emitter<void>();
|
|
44
|
+
protected toDispose = new DisposableCollection(this.onDidChangeDescriptionEmitter);
|
|
38
45
|
|
|
39
46
|
@inject(MenuModelRegistry)
|
|
40
47
|
protected readonly menus: MenuModelRegistry;
|
|
@@ -48,16 +55,12 @@ export class PluginViewWidget extends Panel implements StatefulWidget, Descripti
|
|
|
48
55
|
@inject(PluginViewWidgetIdentifier)
|
|
49
56
|
readonly options: PluginViewWidgetIdentifier;
|
|
50
57
|
|
|
51
|
-
currentViewContainerId: string | undefined;
|
|
52
|
-
|
|
53
58
|
constructor() {
|
|
54
59
|
super();
|
|
55
60
|
this.node.tabIndex = -1;
|
|
56
61
|
this.node.style.height = '100%';
|
|
57
62
|
}
|
|
58
63
|
|
|
59
|
-
public onDidChangeDescription: Emitter<void> = new Emitter<void>();
|
|
60
|
-
|
|
61
64
|
@postConstruct()
|
|
62
65
|
protected init(): void {
|
|
63
66
|
this.id = this.options.id;
|
|
@@ -66,6 +69,10 @@ export class PluginViewWidget extends Panel implements StatefulWidget, Descripti
|
|
|
66
69
|
this.toDispose.push(localContext);
|
|
67
70
|
}
|
|
68
71
|
|
|
72
|
+
get onDidChangeDescription(): Event<void> {
|
|
73
|
+
return this.onDidChangeDescriptionEmitter.event;
|
|
74
|
+
}
|
|
75
|
+
|
|
69
76
|
protected override onActivateRequest(msg: Message): void {
|
|
70
77
|
super.onActivateRequest(msg);
|
|
71
78
|
const widget = this.widgets[0];
|
|
@@ -97,12 +104,10 @@ export class PluginViewWidget extends Panel implements StatefulWidget, Descripti
|
|
|
97
104
|
}
|
|
98
105
|
}
|
|
99
106
|
|
|
100
|
-
protected _suppressUpdateViewVisibility = false;
|
|
101
107
|
set suppressUpdateViewVisibility(suppressUpdateViewVisibility: boolean) {
|
|
102
108
|
this._suppressUpdateViewVisibility = !this.updatingViewVisibility && suppressUpdateViewVisibility;
|
|
103
109
|
}
|
|
104
110
|
|
|
105
|
-
protected updatingViewVisibility = false;
|
|
106
111
|
updateViewVisibility(cb: () => void): void {
|
|
107
112
|
if (this._suppressUpdateViewVisibility) {
|
|
108
113
|
return;
|
|
@@ -115,7 +120,6 @@ export class PluginViewWidget extends Panel implements StatefulWidget, Descripti
|
|
|
115
120
|
}
|
|
116
121
|
}
|
|
117
122
|
|
|
118
|
-
private _message: string | undefined;
|
|
119
123
|
get message(): string | undefined {
|
|
120
124
|
return this._message;
|
|
121
125
|
}
|
|
@@ -125,14 +129,13 @@ export class PluginViewWidget extends Panel implements StatefulWidget, Descripti
|
|
|
125
129
|
this.updateWidgetMessage();
|
|
126
130
|
}
|
|
127
131
|
|
|
128
|
-
private _description: string = '';
|
|
129
132
|
get description(): string {
|
|
130
133
|
return this._description;
|
|
131
134
|
}
|
|
132
135
|
|
|
133
136
|
set description(description: string) {
|
|
134
137
|
this._description = description;
|
|
135
|
-
this.
|
|
138
|
+
this.onDidChangeDescriptionEmitter.fire();
|
|
136
139
|
}
|
|
137
140
|
|
|
138
141
|
private updateWidgetMessage(): void {
|
|
@@ -32,9 +32,9 @@ export class TreeViewDecoratorAdapter extends FileTreeDecoratorAdapter {
|
|
|
32
32
|
}
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
protected isTreeItem(node:
|
|
35
|
+
protected isTreeItem(node: unknown): node is TreeItem & { resourceUri: Uri } {
|
|
36
36
|
const candidate = node as TreeItem;
|
|
37
|
-
return !!candidate && 'resourceUri' in candidate && !!candidate.resourceUri;
|
|
37
|
+
return !!candidate && typeof node === 'object' && 'resourceUri' in candidate && !!candidate.resourceUri;
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
|
|
@@ -39,8 +39,10 @@ import { PluginTheiaEnvironment } from '../common/plugin-theia-environment';
|
|
|
39
39
|
import { PluginTheiaDeployerParticipant } from './plugin-theia-deployer-participant';
|
|
40
40
|
import { WebviewBackendSecurityWarnings } from './webview-backend-security-warnings';
|
|
41
41
|
import { PluginUninstallationManager } from './plugin-uninstallation-manager';
|
|
42
|
+
import { LocalizationBackendContribution } from '@theia/core/lib/node/i18n/localization-backend-contribution';
|
|
43
|
+
import { PluginLocalizationBackendContribution } from './plugin-localization-backend-contribution';
|
|
42
44
|
|
|
43
|
-
export function bindMainBackend(bind: interfaces.Bind): void {
|
|
45
|
+
export function bindMainBackend(bind: interfaces.Bind, unbind: interfaces.Unbind, isBound: interfaces.IsBound, rebind: interfaces.Rebind): void {
|
|
44
46
|
bind(PluginApiContribution).toSelf().inSingletonScope();
|
|
45
47
|
bind(BackendApplicationContribution).toService(PluginApiContribution);
|
|
46
48
|
bind(WsRequestValidatorContribution).toService(PluginApiContribution);
|
|
@@ -85,4 +87,7 @@ export function bindMainBackend(bind: interfaces.Bind): void {
|
|
|
85
87
|
|
|
86
88
|
bind(WebviewBackendSecurityWarnings).toSelf().inSingletonScope();
|
|
87
89
|
bind(BackendApplicationContribution).toService(WebviewBackendSecurityWarnings);
|
|
90
|
+
|
|
91
|
+
rebind(LocalizationBackendContribution).to(PluginLocalizationBackendContribution).inSingletonScope();
|
|
92
|
+
|
|
88
93
|
}
|