@theia/plugin-ext 1.18.0-next.73c11a11 → 1.18.0-next.77

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/LICENSE +642 -0
  2. package/lib/common/arrays.d.ts +4 -0
  3. package/lib/common/arrays.d.ts.map +1 -1
  4. package/lib/common/arrays.js +9 -1
  5. package/lib/common/arrays.js.map +1 -1
  6. package/lib/common/plugin-api-rpc-model.d.ts +2 -0
  7. package/lib/common/plugin-api-rpc-model.d.ts.map +1 -1
  8. package/lib/common/plugin-api-rpc-model.js.map +1 -1
  9. package/lib/common/plugin-api-rpc.d.ts +22 -3
  10. package/lib/common/plugin-api-rpc.d.ts.map +1 -1
  11. package/lib/common/plugin-api-rpc.js +21 -1
  12. package/lib/common/plugin-api-rpc.js.map +1 -1
  13. package/lib/common/plugin-protocol.d.ts.map +1 -1
  14. package/lib/common/plugin-protocol.js.map +1 -1
  15. package/lib/hosted/browser/hosted-plugin.d.ts +3 -2
  16. package/lib/hosted/browser/hosted-plugin.d.ts.map +1 -1
  17. package/lib/hosted/browser/hosted-plugin.js +15 -7
  18. package/lib/hosted/browser/hosted-plugin.js.map +1 -1
  19. package/lib/hosted/browser/worker/debug-stub.d.ts.map +1 -1
  20. package/lib/hosted/browser/worker/debug-stub.js +1 -0
  21. package/lib/hosted/browser/worker/debug-stub.js.map +1 -1
  22. package/lib/hosted/node/scanners/scanner-theia.d.ts.map +1 -1
  23. package/lib/hosted/node/scanners/scanner-theia.js +2 -2
  24. package/lib/hosted/node/scanners/scanner-theia.js.map +1 -1
  25. package/lib/main/browser/callhierarchy/callhierarchy-type-converters.d.ts.map +1 -1
  26. package/lib/main/browser/callhierarchy/callhierarchy-type-converters.js +2 -1
  27. package/lib/main/browser/callhierarchy/callhierarchy-type-converters.js.map +1 -1
  28. package/lib/main/browser/custom-editors/custom-editor-opener.d.ts +1 -0
  29. package/lib/main/browser/custom-editors/custom-editor-opener.d.ts.map +1 -1
  30. package/lib/main/browser/custom-editors/custom-editor-opener.js +6 -2
  31. package/lib/main/browser/custom-editors/custom-editor-opener.js.map +1 -1
  32. package/lib/main/browser/debug/plugin-debug-adapter-contribution.d.ts +1 -1
  33. package/lib/main/browser/debug/plugin-debug-adapter-contribution.d.ts.map +1 -1
  34. package/lib/main/browser/debug/plugin-debug-adapter-contribution.js +2 -2
  35. package/lib/main/browser/debug/plugin-debug-adapter-contribution.js.map +1 -1
  36. package/lib/main/browser/debug/plugin-debug-service.d.ts +8 -0
  37. package/lib/main/browser/debug/plugin-debug-service.d.ts.map +1 -1
  38. package/lib/main/browser/debug/plugin-debug-service.js +15 -0
  39. package/lib/main/browser/debug/plugin-debug-service.js.map +1 -1
  40. package/lib/main/browser/dialogs/modal-notification.d.ts +1 -1
  41. package/lib/main/browser/dialogs/modal-notification.d.ts.map +1 -1
  42. package/lib/main/browser/dialogs/modal-notification.js +4 -4
  43. package/lib/main/browser/dialogs/modal-notification.js.map +1 -1
  44. package/lib/main/browser/plugin-ext-frontend-module.d.ts.map +1 -1
  45. package/lib/main/browser/plugin-ext-frontend-module.js +5 -3
  46. package/lib/main/browser/plugin-ext-frontend-module.js.map +1 -1
  47. package/lib/main/browser/plugin-ext-widget.d.ts.map +1 -1
  48. package/lib/main/browser/plugin-ext-widget.js +3 -2
  49. package/lib/main/browser/plugin-ext-widget.js.map +1 -1
  50. package/lib/main/browser/plugin-icon-theme-service.d.ts +2 -0
  51. package/lib/main/browser/plugin-icon-theme-service.d.ts.map +1 -1
  52. package/lib/main/browser/plugin-icon-theme-service.js +15 -2
  53. package/lib/main/browser/plugin-icon-theme-service.js.map +1 -1
  54. package/lib/main/browser/plugin-shared-style.js +1 -1
  55. package/lib/main/browser/plugin-shared-style.js.map +1 -1
  56. package/lib/main/browser/quick-open-main.d.ts +2 -5
  57. package/lib/main/browser/quick-open-main.d.ts.map +1 -1
  58. package/lib/main/browser/quick-open-main.js +48 -100
  59. package/lib/main/browser/quick-open-main.js.map +1 -1
  60. package/lib/main/browser/view/plugin-view-registry.js +1 -1
  61. package/lib/main/browser/view/plugin-view-registry.js.map +1 -1
  62. package/lib/main/browser/view/plugin-view-widget.d.ts +7 -1
  63. package/lib/main/browser/view/plugin-view-widget.d.ts.map +1 -1
  64. package/lib/main/browser/view/plugin-view-widget.js +10 -0
  65. package/lib/main/browser/view/plugin-view-widget.js.map +1 -1
  66. package/lib/main/browser/view/tree-views-main.d.ts +1 -0
  67. package/lib/main/browser/view/tree-views-main.d.ts.map +1 -1
  68. package/lib/main/browser/view/tree-views-main.js +6 -0
  69. package/lib/main/browser/view/tree-views-main.js.map +1 -1
  70. package/lib/main/browser/webview/webview.js +1 -1
  71. package/lib/main/browser/webview/webview.js.map +1 -1
  72. package/lib/plugin/languages/call-hierarchy.d.ts.map +1 -1
  73. package/lib/plugin/languages/call-hierarchy.js +2 -1
  74. package/lib/plugin/languages/call-hierarchy.js.map +1 -1
  75. package/lib/plugin/languages.d.ts.map +1 -1
  76. package/lib/plugin/languages.js +2 -1
  77. package/lib/plugin/languages.js.map +1 -1
  78. package/lib/plugin/node/debug/debug.d.ts +3 -2
  79. package/lib/plugin/node/debug/debug.d.ts.map +1 -1
  80. package/lib/plugin/node/debug/debug.js +24 -11
  81. package/lib/plugin/node/debug/debug.js.map +1 -1
  82. package/lib/plugin/plugin-context.d.ts.map +1 -1
  83. package/lib/plugin/plugin-context.js +7 -3
  84. package/lib/plugin/plugin-context.js.map +1 -1
  85. package/lib/plugin/plugin-manager.d.ts +2 -0
  86. package/lib/plugin/plugin-manager.d.ts.map +1 -1
  87. package/lib/plugin/plugin-manager.js +24 -3
  88. package/lib/plugin/plugin-manager.js.map +1 -1
  89. package/lib/plugin/plugin-storage.d.ts +4 -0
  90. package/lib/plugin/plugin-storage.d.ts.map +1 -1
  91. package/lib/plugin/plugin-storage.js +6 -1
  92. package/lib/plugin/plugin-storage.js.map +1 -1
  93. package/lib/plugin/quick-open.d.ts +1 -3
  94. package/lib/plugin/quick-open.d.ts.map +1 -1
  95. package/lib/plugin/quick-open.js +4 -26
  96. package/lib/plugin/quick-open.js.map +1 -1
  97. package/lib/plugin/tasks/tasks.d.ts +1 -1
  98. package/lib/plugin/tasks/tasks.d.ts.map +1 -1
  99. package/lib/plugin/tasks/tasks.js +3 -2
  100. package/lib/plugin/tasks/tasks.js.map +1 -1
  101. package/lib/plugin/tree/tree-views.d.ts +3 -0
  102. package/lib/plugin/tree/tree-views.d.ts.map +1 -1
  103. package/lib/plugin/tree/tree-views.js +15 -1
  104. package/lib/plugin/tree/tree-views.js.map +1 -1
  105. package/lib/plugin/type-converters.d.ts.map +1 -1
  106. package/lib/plugin/type-converters.js +9 -5
  107. package/lib/plugin/type-converters.js.map +1 -1
  108. package/lib/plugin/types-impl.d.ts +24 -1
  109. package/lib/plugin/types-impl.d.ts.map +1 -1
  110. package/lib/plugin/types-impl.js +28 -1
  111. package/lib/plugin/types-impl.js.map +1 -1
  112. package/package.json +29 -27
  113. package/src/common/arrays.ts +8 -0
  114. package/src/common/plugin-api-rpc-model.ts +2 -0
  115. package/src/common/plugin-api-rpc.ts +24 -3
  116. package/src/common/plugin-protocol.ts +1 -0
  117. package/src/hosted/browser/hosted-plugin.ts +17 -8
  118. package/src/hosted/browser/worker/debug-stub.ts +1 -0
  119. package/src/hosted/node/scanners/scanner-theia.ts +3 -2
  120. package/src/main/browser/callhierarchy/callhierarchy-type-converters.ts +2 -1
  121. package/src/main/browser/custom-editors/custom-editor-opener.tsx +7 -2
  122. package/src/main/browser/debug/plugin-debug-adapter-contribution.ts +3 -3
  123. package/src/main/browser/debug/plugin-debug-service.ts +23 -0
  124. package/src/main/browser/dialogs/modal-notification.ts +6 -6
  125. package/src/main/browser/plugin-ext-frontend-module.ts +6 -4
  126. package/src/main/browser/plugin-ext-widget.tsx +3 -2
  127. package/src/main/browser/plugin-icon-theme-service.ts +12 -2
  128. package/src/main/browser/plugin-shared-style.ts +1 -1
  129. package/src/main/browser/quick-open-main.ts +53 -108
  130. package/src/main/browser/style/index.css +1 -5
  131. package/src/main/browser/style/plugin-sidebar.css +1 -1
  132. package/src/main/browser/view/plugin-view-registry.ts +2 -2
  133. package/src/main/browser/view/plugin-view-widget.ts +15 -1
  134. package/src/main/browser/view/tree-views-main.ts +7 -0
  135. package/src/main/browser/webview/pre/host.js +19 -10
  136. package/src/main/browser/webview/pre/main.js +1 -2
  137. package/src/main/browser/webview/pre/service-worker.js +1 -1
  138. package/src/main/browser/webview/webview.ts +1 -1
  139. package/src/plugin/languages/call-hierarchy.ts +2 -1
  140. package/src/plugin/languages.ts +2 -1
  141. package/src/plugin/node/debug/debug.ts +26 -12
  142. package/src/plugin/plugin-context.ts +16 -7
  143. package/src/plugin/plugin-manager.ts +26 -4
  144. package/src/plugin/plugin-storage.ts +6 -0
  145. package/src/plugin/quick-open.ts +5 -29
  146. package/src/plugin/tasks/tasks.ts +3 -2
  147. package/src/plugin/tree/tree-views.ts +17 -1
  148. package/src/plugin/type-converters.ts +9 -6
  149. package/src/plugin/types-impl.ts +30 -1
@@ -14,7 +14,7 @@
14
14
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
15
15
  ********************************************************************************/
16
16
 
17
- import { DebugExt, } from '../../../common/plugin-api-rpc';
17
+ import { DebugExt } from '../../../common/plugin-api-rpc';
18
18
  import { DebugConfiguration } from '@theia/debug/lib/common/debug-configuration';
19
19
  import { MaybePromise } from '@theia/core/lib/common/types';
20
20
  import { DebuggerDescription } from '@theia/debug/lib/common/debug-service';
@@ -37,8 +37,8 @@ export class PluginDebugAdapterContribution {
37
37
  return this.description.label;
38
38
  }
39
39
 
40
- async provideDebugConfigurations(workspaceFolderUri: string | undefined): Promise<DebugConfiguration[]> {
41
- return this.debugExt.$provideDebugConfigurations(this.type, workspaceFolderUri);
40
+ async provideDebugConfigurations(workspaceFolderUri: string | undefined, dynamic: boolean = false): Promise<DebugConfiguration[]> {
41
+ return this.debugExt.$provideDebugConfigurations(this.type, workspaceFolderUri, dynamic);
42
42
  }
43
43
 
44
44
  async resolveDebugConfiguration(config: DebugConfiguration, workspaceFolderUri: string | undefined): Promise<DebugConfiguration | undefined> {
@@ -25,6 +25,7 @@ import { WorkspaceService } from '@theia/workspace/lib/browser';
25
25
  import { DebuggerContribution } from '../../../common/plugin-protocol';
26
26
  import { DebugRequestTypes } from '@theia/debug/lib/browser/debug-session-connection';
27
27
  import * as theia from '@theia/plugin';
28
+
28
29
  /**
29
30
  * Debug adapter contribution registrator.
30
31
  */
@@ -111,6 +112,28 @@ export class PluginDebugService implements DebugService, PluginDebugAdapterContr
111
112
  }
112
113
  }
113
114
 
115
+ async provideDynamicDebugConfigurations(): Promise<{ type: string, configurations: DebugConfiguration[] }[]> {
116
+ const result: Promise<{ type: string, configurations: theia.DebugConfiguration[] }>[] = [];
117
+
118
+ for (const [type, contributor] of this.contributors.entries()) {
119
+ const typeConfigurations = this.resolveDynamicConfigurationsForType(type, contributor);
120
+ result.push(typeConfigurations);
121
+ }
122
+
123
+ return Promise.all(result);
124
+ }
125
+
126
+ protected async resolveDynamicConfigurationsForType(
127
+ type: string,
128
+ contributor: PluginDebugAdapterContribution): Promise<{ type: string, configurations: DebugConfiguration[] }> {
129
+
130
+ const configurations = await contributor.provideDebugConfigurations(undefined, true);
131
+ for (const configuration of configurations) {
132
+ configuration.dynamic = true;
133
+ }
134
+ return { type, configurations };
135
+ }
136
+
114
137
  async resolveDebugConfiguration(config: DebugConfiguration, workspaceFolderUri: string | undefined): Promise<DebugConfiguration> {
115
138
  let resolved = config;
116
139
 
@@ -15,7 +15,7 @@
15
15
  ********************************************************************************/
16
16
  import { injectable } from '@theia/core/shared/inversify';
17
17
  import { Message } from '@theia/core/shared/@phosphor/messaging';
18
- import { Key } from '@theia/core/lib/browser';
18
+ import { codiconArray, Key } from '@theia/core/lib/browser';
19
19
  import { AbstractDialog } from '@theia/core/lib/browser/dialogs';
20
20
  import '../../../../src/main/browser/dialogs/style/modal-notification.css';
21
21
  import { MainMessageItem } from '../../../common/plugin-api-rpc';
@@ -60,7 +60,7 @@ export class ModalNotification extends AbstractDialog<string | undefined> {
60
60
  const iconContainer = messageNode.appendChild(document.createElement('div'));
61
61
  iconContainer.classList.add(ICON);
62
62
  const iconElement = iconContainer.appendChild(document.createElement('i'));
63
- iconElement.classList.add('fa', this.toIconClass(messageType), 'fa-fw', messageType.toString());
63
+ iconElement.classList.add(...this.toIconClass(messageType), messageType.toString());
64
64
 
65
65
  const textContainer = messageNode.appendChild(document.createElement('div'));
66
66
  textContainer.classList.add(TEXT);
@@ -86,13 +86,13 @@ export class ModalNotification extends AbstractDialog<string | undefined> {
86
86
  return messageNode;
87
87
  }
88
88
 
89
- protected toIconClass(icon: MessageType): string {
89
+ protected toIconClass(icon: MessageType): string[] {
90
90
  if (icon === MessageType.Error) {
91
- return 'fa-times-circle';
91
+ return codiconArray('error');
92
92
  }
93
93
  if (icon === MessageType.Warning) {
94
- return 'fa-warning';
94
+ return codiconArray('warning');
95
95
  }
96
- return 'fa-info-circle';
96
+ return codiconArray('info');
97
97
  }
98
98
  }
@@ -21,7 +21,7 @@ import '../../../src/main/browser/style/comments.css';
21
21
  import { ContainerModule } from '@theia/core/shared/inversify';
22
22
  import {
23
23
  FrontendApplicationContribution, WidgetFactory, bindViewContribution,
24
- ViewContainerIdentifier, ViewContainer, createTreeContainer, TreeImpl, TreeWidget, TreeModelImpl, LabelProviderContribution, TreeProps
24
+ ViewContainerIdentifier, ViewContainer, createTreeContainer, TreeImpl, TreeWidget, TreeModelImpl, LabelProviderContribution
25
25
  } from '@theia/core/lib/browser';
26
26
  import { MaybePromise, CommandContribution, ResourceResolver, bindContributionProvider } from '@theia/core/lib/common';
27
27
  import { WebSocketConnectionProvider } from '@theia/core/lib/browser/messaging';
@@ -147,10 +147,12 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
147
147
  createWidget: (identifier: TreeViewWidgetIdentifier) => {
148
148
  const child = createTreeContainer(container, {
149
149
  contextMenuPath: VIEW_ITEM_CONTEXT_MENU,
150
- search: true,
151
- globalSelection: true
150
+ expandOnlyOnExpansionToggleClick: true,
151
+ expansionTogglePadding: 22,
152
+ globalSelection: true,
153
+ leftPadding: 8,
154
+ search: true
152
155
  });
153
- child.rebind(TreeProps).toConstantValue({ leftPadding: 8, expansionTogglePadding: 22, expandOnlyOnExpansionToggleClick: true, });
154
156
  child.bind(TreeViewWidgetIdentifier).toConstantValue(identifier);
155
157
  child.bind(PluginTree).toSelf();
156
158
  child.rebind(TreeImpl).toService(PluginTree);
@@ -23,6 +23,7 @@ import { AlertMessage } from '@theia/core/lib/browser/widgets/alert-message';
23
23
  import { HostedPluginSupport, PluginProgressLocation } from '../../hosted/browser/hosted-plugin';
24
24
  import { ProgressBarFactory } from '@theia/core/lib/browser/progress-bar-factory';
25
25
  import { DisposableCollection } from '@theia/core/lib/common/disposable';
26
+ import { codicon } from '@theia/core/lib/browser';
26
27
 
27
28
  @injectable()
28
29
  export class PluginWidget extends ReactWidget {
@@ -38,7 +39,7 @@ export class PluginWidget extends ReactWidget {
38
39
  this.id = 'plugins';
39
40
  this.title.label = 'Plugins';
40
41
  this.title.caption = 'Plugins';
41
- this.title.iconClass = 'fa plugins-tab-icon';
42
+ this.title.iconClass = codicon('diff-added');
42
43
  this.title.closable = true;
43
44
  this.node.tabIndex = 0;
44
45
  this.addClass('theia-plugins');
@@ -86,7 +87,7 @@ export class PluginWidget extends ReactWidget {
86
87
  return <div key={plugin.model.name} className={this.createPluginClassName(plugin)}>
87
88
  <div className='column flexcontainer pluginInformationContainer'>
88
89
  <div className='row flexcontainer'>
89
- <div className='fa fa-puzzle-piece fa-2x fa-fw'></div>
90
+ <div className={codicon('list-selection')}></div>
90
91
  <div title={plugin.model.name} className='pluginName noWrapInfo'>{plugin.model.name}</div>
91
92
  </div>
92
93
  <div className='row flexcontainer'>
@@ -36,6 +36,7 @@ import { WorkspaceRootNode } from '@theia/navigator/lib/browser/navigator-tree';
36
36
  import { Endpoint } from '@theia/core/lib/browser/endpoint';
37
37
  import { FileService } from '@theia/filesystem/lib/browser/file-service';
38
38
  import { FileStat, FileChangeType } from '@theia/filesystem/lib/common/files';
39
+ import { WorkspaceService } from '@theia/workspace/lib/browser';
39
40
 
40
41
  export interface PluginIconDefinition {
41
42
  iconPath: string;
@@ -107,6 +108,9 @@ export class PluginIconTheme extends PluginIconThemeDefinition implements IconTh
107
108
  @inject(PluginIconThemeDefinition)
108
109
  protected readonly definition: PluginIconThemeDefinition;
109
110
 
111
+ @inject(WorkspaceService)
112
+ protected readonly workspaceService: WorkspaceService;
113
+
110
114
  protected readonly onDidChangeEmitter = new Emitter<DidChangeLabelEvent>();
111
115
  readonly onDidChange = this.onDidChangeEmitter.event;
112
116
 
@@ -508,9 +512,15 @@ export class PluginIconTheme extends PluginIconThemeDefinition implements IconTh
508
512
  const name = this.labelProvider.getName(element);
509
513
  const classNames = this.fileNameIcon(name);
510
514
  if (uri) {
511
- const language = monaco.services.StaticServices.modeService.get().createByFilepathOrFirstLine(monaco.Uri.parse(uri));
515
+ const parsedURI = new URI(uri);
516
+ const isRoot = this.workspaceService.getWorkspaceRootUri(new URI(uri))?.isEqual(parsedURI);
517
+ if (isRoot) {
518
+ classNames.unshift(this.rootFolderIcon);
519
+ } else {
520
+ classNames.unshift(this.fileIcon);
521
+ }
522
+ const language = monaco.services.StaticServices.modeService.get().createByFilepathOrFirstLine(parsedURI['codeUri']);
512
523
  classNames.push(this.languageIcon(language.languageIdentifier.language));
513
- classNames.unshift(this.fileIcon);
514
524
  }
515
525
  return classNames;
516
526
  }
@@ -111,7 +111,7 @@ export class PluginSharedStyle {
111
111
  background-position: 2px;
112
112
  width: ${size}px;
113
113
  height: ${size}px;
114
- background: no-repeat url("${theme.type === 'light' ? lightIconUrl : darkIconUrl}");
114
+ background: center no-repeat url("${theme.type === 'light' ? lightIconUrl : darkIconUrl}");
115
115
  background-size: ${size}px;
116
116
  `));
117
117
  return {
@@ -15,7 +15,7 @@
15
15
  ********************************************************************************/
16
16
  /* eslint-disable @typescript-eslint/no-explicit-any */
17
17
 
18
- import { InputBoxOptions, QuickPickItem as QuickPickItemExt } from '@theia/plugin';
18
+ import { InputBoxOptions } from '@theia/plugin';
19
19
  import { interfaces } from '@theia/core/shared/inversify';
20
20
  import { RPCProtocol } from '../../common/rpc-protocol';
21
21
  import {
@@ -23,15 +23,17 @@ import {
23
23
  QuickOpenMain,
24
24
  MAIN_RPC_CONTEXT,
25
25
  TransferInputBox,
26
- TransferQuickPick,
27
26
  TransferQuickPickItems,
28
27
  TransferQuickInput,
29
28
  TransferQuickInputButton
30
29
  } from '../../common/plugin-api-rpc';
31
30
  import {
32
- InputOptions, PickOptions, QuickInputButton, QuickInputService, QuickPickItem, QuickPickValue
31
+ InputOptions,
32
+ PickOptions,
33
+ QuickInputButton,
34
+ QuickInputButtonHandle,
35
+ QuickInputService
33
36
  } from '@theia/core/lib/browser';
34
- import { QuickPickService } from '@theia/core/lib/common/quick-pick-service';
35
37
  import { DisposableCollection, Disposable } from '@theia/core/lib/common/disposable';
36
38
  import { CancellationToken } from '@theia/core/lib/common/cancellation';
37
39
  import { MonacoQuickInputService } from '@theia/monaco/lib/browser/monaco-quick-input-service';
@@ -47,7 +49,6 @@ export interface QuickInputSession {
47
49
  export class QuickOpenMainImpl implements QuickOpenMain, Disposable {
48
50
 
49
51
  private quickInputService: QuickInputService;
50
- private quickPickService: QuickPickService;
51
52
  private proxy: QuickOpenExt;
52
53
  private delegate: MonacoQuickInputService;
53
54
  private readonly items: Record<number, {
@@ -61,7 +62,6 @@ export class QuickOpenMainImpl implements QuickOpenMain, Disposable {
61
62
  this.proxy = rpc.getProxy(MAIN_RPC_CONTEXT.QUICK_OPEN_EXT);
62
63
  this.delegate = container.get(MonacoQuickInputService);
63
64
  this.quickInputService = container.get(QuickInputService);
64
- this.quickPickService = container.get(QuickPickService);
65
65
  }
66
66
 
67
67
  dispose(): void {
@@ -196,52 +196,53 @@ export class QuickOpenMainImpl implements QuickOpenMain, Disposable {
196
196
 
197
197
  $createOrUpdate<T extends theia.QuickPickItem>(params: TransferQuickInput<T>): Promise<void> {
198
198
  const sessionId = params.id;
199
- const session = this.sessions.get(sessionId);
200
- // if (!session) {
201
- // if (params.type === 'quickPick') {
202
- // const quickPick = this.quickInputService.createQuickPick();
203
- // quickPick.onDidAccept(() => {
204
- // this.proxy.$acceptOnDidAccept(sessionId);
205
- // });
206
- // quickPick.onDidChangeActive((items: Array<monaco.quickInput.IQuickPickItem>) => {
207
- // this.proxy.$onDidChangeActive(sessionId, items.map(item => (item as TransferQuickPickItems).handle));
208
- // });
209
- // quickPick.onDidChangeSelection((items: Array<monaco.quickInput.IQuickPickItem>) => {
210
- // this.proxy.$onDidChangeSelection(sessionId, items.map(item => (item as TransferQuickPickItems).handle));
211
- // });
212
- // quickPick.onDidTriggerButton((button: QuickInputButtonHandle) => {
213
- // this.proxy.$acceptOnDidTriggerButton(sessionId, button);
214
- // });
215
- // quickPick.onDidChangeValue((value: string) => {
216
- // this.proxy.$acceptDidChangeValue(sessionId, value);
217
- // });
218
- // quickPick.onDidHide(() => {
219
- // this.proxy.$acceptOnDidHide(sessionId);
220
- // });
221
- // session = {
222
- // input: quickPick,
223
- // handlesToItems: new Map()
224
- // };
225
- // } else {
226
- // const inputBox = this.quickInputService.createInputBox();
227
- // inputBox.onDidAccept(() => {
228
- // this.proxy.$acceptOnDidAccept(sessionId);
229
- // });
230
- // inputBox.onDidTriggerButton((button: QuickInputButtonHandle) => {
231
- // this.proxy.$acceptOnDidTriggerButton(sessionId, button);
232
- // });
233
- // inputBox.onDidChangeValue((value: string) => {
234
- // this.proxy.$acceptDidChangeValue(sessionId, value);
235
- // });
236
- // inputBox.onDidHide(() => {
237
- // this.proxy.$acceptOnDidHide(sessionId);
238
- // });
239
- // session = {
240
- // input: inputBox,
241
- // handlesToItems: new Map()
242
- // };
243
- // }
244
- // }
199
+ let session = this.sessions.get(sessionId);
200
+ if (!session) {
201
+ if (params.type === 'quickPick') {
202
+ const quickPick = this.quickInputService.createQuickPick();
203
+ quickPick.onDidAccept(() => {
204
+ this.proxy.$acceptOnDidAccept(sessionId);
205
+ });
206
+ quickPick.onDidChangeActive((items: Array<monaco.quickInput.IQuickPickItem>) => {
207
+ this.proxy.$onDidChangeActive(sessionId, items.map(item => (item as TransferQuickPickItems).handle));
208
+ });
209
+ quickPick.onDidChangeSelection((items: Array<monaco.quickInput.IQuickPickItem>) => {
210
+ this.proxy.$onDidChangeSelection(sessionId, items.map(item => (item as TransferQuickPickItems).handle));
211
+ });
212
+ quickPick.onDidTriggerButton((button: QuickInputButtonHandle) => {
213
+ this.proxy.$acceptOnDidTriggerButton(sessionId, button);
214
+ });
215
+ quickPick.onDidChangeValue((value: string) => {
216
+ this.proxy.$acceptDidChangeValue(sessionId, value);
217
+ });
218
+ quickPick.onDidHide(() => {
219
+ this.proxy.$acceptOnDidHide(sessionId);
220
+ });
221
+ session = {
222
+ input: quickPick,
223
+ handlesToItems: new Map()
224
+ };
225
+ } else {
226
+ const inputBox = this.quickInputService.createInputBox();
227
+ inputBox.onDidAccept(() => {
228
+ this.proxy.$acceptOnDidAccept(sessionId);
229
+ });
230
+ inputBox.onDidTriggerButton((button: QuickInputButtonHandle) => {
231
+ this.proxy.$acceptOnDidTriggerButton(sessionId, button);
232
+ });
233
+ inputBox.onDidChangeValue((value: string) => {
234
+ this.proxy.$acceptDidChangeValue(sessionId, value);
235
+ });
236
+ inputBox.onDidHide(() => {
237
+ this.proxy.$acceptOnDidHide(sessionId);
238
+ });
239
+ session = {
240
+ input: inputBox,
241
+ handlesToItems: new Map()
242
+ };
243
+ }
244
+ this.sessions.set(sessionId, session);
245
+ }
245
246
  if (session) {
246
247
  const { input, handlesToItems } = session;
247
248
  for (const param in params) {
@@ -297,47 +298,6 @@ export class QuickOpenMainImpl implements QuickOpenMain, Disposable {
297
298
  return Promise.resolve(undefined);
298
299
  }
299
300
 
300
- async $showCustomQuickPick<T extends QuickPickItemExt>(options: TransferQuickPick<T>): Promise<void> {
301
- const sessionId = options.id;
302
- const toDispose = new DisposableCollection();
303
-
304
- toDispose.push(this.quickPickService.onDidAccept(() => {
305
- this.proxy.$acceptOnDidAccept(sessionId);
306
- }));
307
- toDispose.push(this.quickPickService.onDidChangeActive((e: { quickPick: any, activeItems: Array<QuickPickValue<number>> }) => {
308
- this.proxy.$onDidChangeActive(sessionId, e.activeItems.map(item => item.value!));
309
- }));
310
- toDispose.push(this.quickPickService.onDidChangeSelection((e: { quickPick: any, selectedItems: Array<QuickPickValue<number>> }) => {
311
- this.proxy.$onDidChangeSelection(sessionId, e.selectedItems.map(item => item.value!));
312
- }));
313
- toDispose.push(this.quickPickService.onDidChangeValue((e: { quickPick: any, filter: string }) => {
314
- this.proxy.$acceptDidChangeValue(sessionId, e.filter);
315
- }));
316
- toDispose.push(this.quickPickService.onDidTriggerButton(button => {
317
- this.proxy.$acceptOnDidTriggerButton(sessionId, button);
318
- }));
319
- toDispose.push(this.quickPickService.onDidHide(() => {
320
- this.proxy.$acceptOnDidHide(sessionId);
321
- if (!toDispose.disposed) {
322
- toDispose.dispose();
323
- }
324
- }));
325
- this.toDispose.push(toDispose);
326
-
327
- this.quickPickService.show(this.convertToQuickPickItem(options.items), {
328
- buttons: options.buttons ? this.convertToQuickInputButtons(options.buttons) : [],
329
- placeholder: options.placeholder,
330
- matchOnDescription: options.matchOnDescription,
331
- step: options.step,
332
- title: options.title,
333
- totalSteps: options.totalSteps,
334
- ignoreFocusOut: options.ignoreFocusOut,
335
- value: options.value,
336
- matchOnLabel: true,
337
- runIfSingle: false,
338
- });
339
- }
340
-
341
301
  $hide(): void {
342
302
  this.delegate.hide();
343
303
  }
@@ -351,21 +311,6 @@ export class QuickOpenMainImpl implements QuickOpenMain, Disposable {
351
311
  return Promise.resolve(undefined);
352
312
  }
353
313
 
354
- private convertToQuickPickItem(items: TransferQuickPickItems[] | undefined): Array<QuickPickItem> {
355
- const convertedItems: QuickPickValue<number>[] = [];
356
- if (items) {
357
- for (const i of items) {
358
- convertedItems.push({
359
- label: i.label,
360
- description: i.description,
361
- detail: i.detail,
362
- value: i.handle
363
- });
364
- }
365
- }
366
- return convertedItems;
367
- }
368
-
369
314
  private convertToQuickInputButtons(buttons: Array<TransferQuickInputButton>): Array<QuickInputButton> {
370
315
  return buttons.map((button, i) => ({
371
316
  iconPath: getIconUris(button.iconPath),
@@ -37,11 +37,7 @@
37
37
  .theia-plugin-view-container {
38
38
  -webkit-mask: url('');
39
39
  mask: url('');
40
- }
41
-
42
- .theia-plugin-test-tab-icon {
43
- -webkit-mask: url('test.svg');
44
- mask: url('test.svg');
40
+ background-color: var(--theia-activityBar-inactiveForeground);
45
41
  }
46
42
 
47
43
  .theia-plugin-file-icon,
@@ -30,7 +30,6 @@
30
30
  .theia-plugins .pluginHeaderContainer {
31
31
  padding: 5px 15px;
32
32
  font-size: var(--theia-ui-font-size0);
33
- border-bottom: 1px solid;
34
33
  }
35
34
 
36
35
  .theia-side-panel .theia-plugins .pluginHeaderContainer {
@@ -48,6 +47,7 @@
48
47
  .theia-plugins .pluginName {
49
48
  flex: 1;
50
49
  margin-right: 5px;
50
+ margin-left: 4px;
51
51
  font-size: var(--theia-ui-font-size1);
52
52
  font-weight: 400;
53
53
  }
@@ -18,7 +18,7 @@ import { injectable, inject, postConstruct, optional } from '@theia/core/shared/
18
18
  import {
19
19
  ApplicationShell, ViewContainer as ViewContainerWidget, WidgetManager,
20
20
  ViewContainerIdentifier, ViewContainerTitleOptions, Widget, FrontendApplicationContribution,
21
- StatefulWidget, CommonMenus, BaseWidget, TreeViewWelcomeWidget
21
+ StatefulWidget, CommonMenus, BaseWidget, TreeViewWelcomeWidget, codicon
22
22
  } from '@theia/core/lib/browser';
23
23
  import { ViewContainer, View, ViewWelcome } from '../../../common';
24
24
  import { PluginSharedStyle } from '../plugin-shared-style';
@@ -146,7 +146,7 @@ export class PluginViewRegistry implements FrontendApplicationContribution {
146
146
  });
147
147
  this.doRegisterViewContainer('test', 'left', {
148
148
  label: 'Test',
149
- iconClass: 'theia-plugin-test-tab-icon',
149
+ iconClass: codicon('beaker'),
150
150
  closeable: true
151
151
  });
152
152
  this.contextKeyService.onDidChange(e => {
@@ -22,6 +22,8 @@ import { ViewContextKeyService } from './view-context-key-service';
22
22
  import { StatefulWidget } from '@theia/core/lib/browser/shell/shell-layout-restorer';
23
23
  import { Message } from '@theia/core/shared/@phosphor/messaging';
24
24
  import { TreeViewWidget } from './tree-view-widget';
25
+ import { DescriptionWidget } from '@theia/core/lib/browser/view-container';
26
+ import { Emitter } from '@theia/core/lib/common';
25
27
 
26
28
  @injectable()
27
29
  export class PluginViewWidgetIdentifier {
@@ -30,7 +32,7 @@ export class PluginViewWidgetIdentifier {
30
32
  }
31
33
 
32
34
  @injectable()
33
- export class PluginViewWidget extends Panel implements StatefulWidget {
35
+ export class PluginViewWidget extends Panel implements StatefulWidget, DescriptionWidget {
34
36
 
35
37
  @inject(MenuModelRegistry)
36
38
  protected readonly menus: MenuModelRegistry;
@@ -50,6 +52,8 @@ export class PluginViewWidget extends Panel implements StatefulWidget {
50
52
  this.node.style.height = '100%';
51
53
  }
52
54
 
55
+ public onDidChangeDescription: Emitter<void> = new Emitter<void>();
56
+
53
57
  @postConstruct()
54
58
  protected init(): void {
55
59
  this.id = this.options.id;
@@ -112,6 +116,16 @@ export class PluginViewWidget extends Panel implements StatefulWidget {
112
116
  this.updateWidgetMessage();
113
117
  }
114
118
 
119
+ private _description: string = '';
120
+ get description(): string {
121
+ return this._description;
122
+ }
123
+
124
+ set description(description: string) {
125
+ this._description = description;
126
+ this.onDidChangeDescription.fire();
127
+ }
128
+
115
129
  private updateWidgetMessage(): void {
116
130
  const widget = this.widgets[0];
117
131
  if (widget) {
@@ -150,6 +150,13 @@ export class TreeViewsMainImpl implements TreeViewsMain, Disposable {
150
150
  }
151
151
  }
152
152
 
153
+ async $setDescription(treeViewId: string, description: string): Promise<void> {
154
+ const viewPanel = await this.viewRegistry.getView(treeViewId);
155
+ if (viewPanel) {
156
+ viewPanel.description = description;
157
+ }
158
+ }
159
+
153
160
  protected handleTreeEvents(treeViewId: string, treeViewWidget: TreeViewWidget): void {
154
161
  this.toDispose.push(treeViewWidget.model.onExpansionChanged(event => {
155
162
  this.proxy.$setExpanded(treeViewId, event.id, event.expanded);
@@ -25,19 +25,28 @@
25
25
  const hostMessaging = new class HostMessaging {
26
26
  constructor() {
27
27
  this.handlers = new Map();
28
- window.addEventListener('message', (e) => {
29
- if (e.data && (e.data.command === 'onmessage' || e.data.command === 'do-update-state')) {
28
+ window.addEventListener('message', e => {
29
+ let sourceIsChildFrame = false;
30
+ for (let i = 0; i < window.frames.length; i++) {
31
+ const frame = window.frames[i];
32
+ if (e.source === frame) {
33
+ sourceIsChildFrame = true;
34
+ break;
35
+ }
36
+ }
37
+ if (sourceIsChildFrame && e.data && (e.data.command === 'onmessage' || e.data.command === 'do-update-state')) {
30
38
  // Came from inner iframe
31
39
  this.postMessage(e.data.command, e.data.data);
32
- return;
33
40
  }
34
-
35
- const channel = e.data.channel;
36
- const handler = this.handlers.get(channel);
37
- if (handler) {
38
- handler(e, e.data.args);
39
- } else {
40
- console.error('no handler for ', e);
41
+ // Note: `window.parent === window` when there is no parent...
42
+ if (sourceIsChildFrame || e.source === window.parent) {
43
+ const channel = e.data.channel;
44
+ const handler = this.handlers.get(channel);
45
+ if (handler) {
46
+ handler(e, e.data.args);
47
+ } else {
48
+ console.error('no handler for ', e);
49
+ }
41
50
  }
42
51
  });
43
52
  }
@@ -193,7 +193,6 @@
193
193
  initialScrollProgress: undefined
194
194
  };
195
195
 
196
-
197
196
  /**
198
197
  * @param {HTMLDocument?} document
199
198
  * @param {HTMLElement?} body
@@ -477,7 +476,7 @@
477
476
  const newFrame = document.createElement('iframe');
478
477
  newFrame.setAttribute('id', 'pending-frame');
479
478
  newFrame.setAttribute('frameborder', '0');
480
- newFrame.setAttribute('sandbox', options.allowScripts ? 'allow-scripts allow-forms allow-same-origin' : 'allow-same-origin');
479
+ newFrame.setAttribute('sandbox', options.allowScripts ? 'allow-scripts allow-forms allow-same-origin allow-downloads' : 'allow-same-origin');
481
480
  if (host.fakeLoad) {
482
481
  // We should just be able to use srcdoc, but I wasn't
483
482
  // seeing the service worker applying properly.
@@ -248,7 +248,7 @@ async function processLocalhostRequest(event, requestUrl) {
248
248
  const origin = requestUrl.origin;
249
249
 
250
250
  const resolveRedirect = redirectOrigin => {
251
- if (!redirectOrigin) {
251
+ if (!redirectOrigin || requestUrl.origin === redirectOrigin) {
252
252
  return fetch(event.request);
253
253
  }
254
254
  const location = event.request.url.replace(new RegExp(`^${requestUrl.origin}(/|$)`), `${redirectOrigin}$1`);
@@ -249,7 +249,7 @@ export class WebviewWidget extends BaseWidget implements StatefulWidget {
249
249
 
250
250
  const element = document.createElement('iframe');
251
251
  element.className = 'webview';
252
- element.sandbox.add('allow-scripts', 'allow-forms', 'allow-same-origin');
252
+ element.sandbox.add('allow-scripts', 'allow-forms', 'allow-same-origin', 'allow-downloads');
253
253
  element.setAttribute('src', `${this.externalEndpoint}/index.html?id=${this.identifier.id}`);
254
254
  element.style.border = 'none';
255
255
  element.style.width = '100%';
@@ -72,7 +72,8 @@ export class CallHierarchyAdapter {
72
72
  range: this.fromRange(item.range),
73
73
  selectionRange: this.fromRange(item.selectionRange),
74
74
  name: item.name,
75
- kind: item.kind
75
+ kind: item.kind,
76
+ tags: item.tags
76
77
  };
77
78
  }
78
79
 
@@ -90,6 +90,7 @@ import { DeclarationAdapter } from './languages/declaration';
90
90
  import { CallHierarchyAdapter } from './languages/call-hierarchy';
91
91
  import { BinaryBuffer } from '@theia/core/lib/common/buffer';
92
92
  import { DocumentSemanticTokensAdapter, DocumentRangeSemanticTokensAdapter } from './languages/semantic-highlighting';
93
+ import { isReadonlyArray } from '../common/arrays';
93
94
 
94
95
  type Adapter = CompletionAdapter |
95
96
  SignatureHelpAdapter |
@@ -204,7 +205,7 @@ export class LanguagesExtImpl implements LanguagesExt {
204
205
  }
205
206
 
206
207
  private transformDocumentSelector(selector: theia.DocumentSelector): SerializedDocumentFilter[] {
207
- if (Array.isArray(selector)) {
208
+ if (isReadonlyArray(selector)) {
208
209
  return selector.map(sel => this.doTransformDocumentSelector(sel)!);
209
210
  }
210
211