@theia/plugin-ext 1.18.0-next.d3501165 → 1.18.0-next.de7b81be

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 (72) hide show
  1. package/lib/common/arrays.d.ts +4 -0
  2. package/lib/common/arrays.d.ts.map +1 -1
  3. package/lib/common/arrays.js +9 -1
  4. package/lib/common/arrays.js.map +1 -1
  5. package/lib/common/plugin-api-rpc.d.ts +1 -2
  6. package/lib/common/plugin-api-rpc.d.ts.map +1 -1
  7. package/lib/common/plugin-api-rpc.js.map +1 -1
  8. package/lib/hosted/node/scanners/scanner-theia.js +1 -1
  9. package/lib/hosted/node/scanners/scanner-theia.js.map +1 -1
  10. package/lib/main/browser/custom-editors/custom-editor-opener.d.ts +1 -0
  11. package/lib/main/browser/custom-editors/custom-editor-opener.d.ts.map +1 -1
  12. package/lib/main/browser/custom-editors/custom-editor-opener.js +4 -1
  13. package/lib/main/browser/custom-editors/custom-editor-opener.js.map +1 -1
  14. package/lib/main/browser/dialogs/modal-notification.d.ts +1 -1
  15. package/lib/main/browser/dialogs/modal-notification.d.ts.map +1 -1
  16. package/lib/main/browser/dialogs/modal-notification.js +4 -4
  17. package/lib/main/browser/dialogs/modal-notification.js.map +1 -1
  18. package/lib/main/browser/plugin-ext-frontend-module.d.ts.map +1 -1
  19. package/lib/main/browser/plugin-ext-frontend-module.js +5 -3
  20. package/lib/main/browser/plugin-ext-frontend-module.js.map +1 -1
  21. package/lib/main/browser/plugin-ext-widget.d.ts.map +1 -1
  22. package/lib/main/browser/plugin-ext-widget.js +3 -2
  23. package/lib/main/browser/plugin-ext-widget.js.map +1 -1
  24. package/lib/main/browser/plugin-shared-style.js +1 -1
  25. package/lib/main/browser/plugin-shared-style.js.map +1 -1
  26. package/lib/main/browser/quick-open-main.d.ts +2 -5
  27. package/lib/main/browser/quick-open-main.d.ts.map +1 -1
  28. package/lib/main/browser/quick-open-main.js +48 -100
  29. package/lib/main/browser/quick-open-main.js.map +1 -1
  30. package/lib/main/browser/view/plugin-view-registry.js +1 -1
  31. package/lib/main/browser/view/plugin-view-registry.js.map +1 -1
  32. package/lib/main/browser/webview/webview.js +1 -1
  33. package/lib/main/browser/webview/webview.js.map +1 -1
  34. package/lib/plugin/languages.d.ts.map +1 -1
  35. package/lib/plugin/languages.js +2 -1
  36. package/lib/plugin/languages.js.map +1 -1
  37. package/lib/plugin/quick-open.d.ts +1 -3
  38. package/lib/plugin/quick-open.d.ts.map +1 -1
  39. package/lib/plugin/quick-open.js +2 -24
  40. package/lib/plugin/quick-open.js.map +1 -1
  41. package/lib/plugin/tasks/tasks.d.ts +1 -1
  42. package/lib/plugin/tasks/tasks.d.ts.map +1 -1
  43. package/lib/plugin/tasks/tasks.js +3 -2
  44. package/lib/plugin/tasks/tasks.js.map +1 -1
  45. package/lib/plugin/type-converters.d.ts.map +1 -1
  46. package/lib/plugin/type-converters.js +6 -1
  47. package/lib/plugin/type-converters.js.map +1 -1
  48. package/lib/plugin/types-impl.d.ts +3 -1
  49. package/lib/plugin/types-impl.d.ts.map +1 -1
  50. package/lib/plugin/types-impl.js +2 -0
  51. package/lib/plugin/types-impl.js.map +1 -1
  52. package/package.json +23 -23
  53. package/src/common/arrays.ts +8 -0
  54. package/src/common/plugin-api-rpc.ts +1 -2
  55. package/src/hosted/node/scanners/scanner-theia.ts +1 -1
  56. package/src/main/browser/custom-editors/custom-editor-opener.tsx +5 -1
  57. package/src/main/browser/dialogs/modal-notification.ts +6 -6
  58. package/src/main/browser/plugin-ext-frontend-module.ts +6 -4
  59. package/src/main/browser/plugin-ext-widget.tsx +3 -2
  60. package/src/main/browser/plugin-shared-style.ts +1 -1
  61. package/src/main/browser/quick-open-main.ts +53 -108
  62. package/src/main/browser/style/index.css +1 -5
  63. package/src/main/browser/style/plugin-sidebar.css +1 -1
  64. package/src/main/browser/view/plugin-view-registry.ts +2 -2
  65. package/src/main/browser/webview/pre/main.js +1 -1
  66. package/src/main/browser/webview/pre/service-worker.js +1 -1
  67. package/src/main/browser/webview/webview.ts +1 -1
  68. package/src/plugin/languages.ts +2 -1
  69. package/src/plugin/quick-open.ts +3 -27
  70. package/src/plugin/tasks/tasks.ts +3 -2
  71. package/src/plugin/type-converters.ts +9 -4
  72. package/src/plugin/types-impl.ts +3 -1
package/package.json CHANGED
@@ -1,31 +1,31 @@
1
1
  {
2
2
  "name": "@theia/plugin-ext",
3
- "version": "1.18.0-next.d3501165",
3
+ "version": "1.18.0-next.de7b81be",
4
4
  "description": "Theia - Plugin Extension",
5
5
  "main": "lib/common/index.js",
6
6
  "typings": "lib/common/index.d.ts",
7
7
  "dependencies": {
8
- "@theia/bulk-edit": "1.18.0-next.d3501165",
9
- "@theia/callhierarchy": "1.18.0-next.d3501165",
10
- "@theia/console": "1.18.0-next.d3501165",
11
- "@theia/core": "1.18.0-next.d3501165",
12
- "@theia/debug": "1.18.0-next.d3501165",
13
- "@theia/editor": "1.18.0-next.d3501165",
14
- "@theia/file-search": "1.18.0-next.d3501165",
15
- "@theia/filesystem": "1.18.0-next.d3501165",
16
- "@theia/markers": "1.18.0-next.d3501165",
17
- "@theia/messages": "1.18.0-next.d3501165",
18
- "@theia/monaco": "1.18.0-next.d3501165",
19
- "@theia/navigator": "1.18.0-next.d3501165",
20
- "@theia/output": "1.18.0-next.d3501165",
21
- "@theia/plugin": "1.18.0-next.d3501165",
22
- "@theia/preferences": "1.18.0-next.d3501165",
23
- "@theia/scm": "1.18.0-next.d3501165",
24
- "@theia/search-in-workspace": "1.18.0-next.d3501165",
25
- "@theia/task": "1.18.0-next.d3501165",
26
- "@theia/terminal": "1.18.0-next.d3501165",
27
- "@theia/timeline": "1.18.0-next.d3501165",
28
- "@theia/workspace": "1.18.0-next.d3501165",
8
+ "@theia/bulk-edit": "1.18.0-next.de7b81be",
9
+ "@theia/callhierarchy": "1.18.0-next.de7b81be",
10
+ "@theia/console": "1.18.0-next.de7b81be",
11
+ "@theia/core": "1.18.0-next.de7b81be",
12
+ "@theia/debug": "1.18.0-next.de7b81be",
13
+ "@theia/editor": "1.18.0-next.de7b81be",
14
+ "@theia/file-search": "1.18.0-next.de7b81be",
15
+ "@theia/filesystem": "1.18.0-next.de7b81be",
16
+ "@theia/markers": "1.18.0-next.de7b81be",
17
+ "@theia/messages": "1.18.0-next.de7b81be",
18
+ "@theia/monaco": "1.18.0-next.de7b81be",
19
+ "@theia/navigator": "1.18.0-next.de7b81be",
20
+ "@theia/output": "1.18.0-next.de7b81be",
21
+ "@theia/plugin": "1.18.0-next.de7b81be",
22
+ "@theia/preferences": "1.18.0-next.de7b81be",
23
+ "@theia/scm": "1.18.0-next.de7b81be",
24
+ "@theia/search-in-workspace": "1.18.0-next.de7b81be",
25
+ "@theia/task": "1.18.0-next.de7b81be",
26
+ "@theia/terminal": "1.18.0-next.de7b81be",
27
+ "@theia/timeline": "1.18.0-next.de7b81be",
28
+ "@theia/workspace": "1.18.0-next.de7b81be",
29
29
  "@types/mime": "^2.0.1",
30
30
  "decompress": "^4.2.1",
31
31
  "escape-html": "^1.0.3",
@@ -79,7 +79,7 @@
79
79
  "test": "theiaext test"
80
80
  },
81
81
  "devDependencies": {
82
- "@theia/ext-scripts": "1.18.0-next.d3501165",
82
+ "@theia/ext-scripts": "1.18.0-next.de7b81be",
83
83
  "@types/decompress": "^4.2.2",
84
84
  "@types/escape-html": "^0.0.20",
85
85
  "@types/lodash.clonedeep": "^4.5.3",
@@ -44,3 +44,11 @@ export interface Splice<T> {
44
44
  readonly deleteCount: number;
45
45
  readonly toInsert: T[];
46
46
  }
47
+
48
+ /**
49
+ * @returns 'true' if the 'arg' is a 'ReadonlyArray'.
50
+ */
51
+ export function isReadonlyArray(arg: unknown): arg is readonly unknown[] {
52
+ // Since Typescript does not properly narrow down typings for 'ReadonlyArray' we need to help it.
53
+ return Array.isArray(arg);
54
+ }
@@ -609,7 +609,6 @@ export interface QuickOpenMain {
609
609
 
610
610
  $hide(): void;
611
611
  $showInputBox(options: TransferInputBox, validateInput: boolean): Promise<string | undefined>;
612
- $showCustomQuickPick<T extends theia.QuickPickItem>(options: TransferQuickPick<T>): void;
613
612
  }
614
613
 
615
614
  export interface WorkspaceMain {
@@ -1773,7 +1772,7 @@ export const MAIN_RPC_CONTEXT = {
1773
1772
  };
1774
1773
 
1775
1774
  export interface TasksExt {
1776
- $provideTasks(handle: number, token?: CancellationToken): Promise<TaskDto[] | undefined>;
1775
+ $provideTasks(handle: number): Promise<TaskDto[] | undefined>;
1777
1776
  $resolveTask(handle: number, task: TaskDto, token?: CancellationToken): Promise<TaskDto | undefined>;
1778
1777
  $onDidStartTask(execution: TaskExecutionDto, terminalId: number): void;
1779
1778
  $onDidEndTask(id: number): void;
@@ -698,7 +698,7 @@ export class TheiaPluginScanner implements PluginScanner {
698
698
  taskType: definitionContribution.type,
699
699
  source: pluginName,
700
700
  properties: {
701
- required: definitionContribution.required,
701
+ required: definitionContribution.required || [],
702
702
  all: propertyKeys,
703
703
  schema: definitionContribution
704
704
  }
@@ -37,10 +37,14 @@ export class CustomEditorOpener implements OpenHandler {
37
37
  @inject(ApplicationShell) protected readonly shell: ApplicationShell,
38
38
  @inject(WidgetManager) protected readonly widgetManager: WidgetManager
39
39
  ) {
40
- this.id = `custom-editor-${this.editor.viewType}`;
40
+ this.id = CustomEditorOpener.toCustomEditorId(this.editor.viewType);
41
41
  this.label = this.editor.displayName;
42
42
  }
43
43
 
44
+ static toCustomEditorId(editorViewType: string): string {
45
+ return `custom-editor-${editorViewType}`;
46
+ }
47
+
44
48
  canHandle(uri: URI): number {
45
49
  if (this.matches(this.editor.selector, uri)) {
46
50
  return this.getPriority();
@@ -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'>
@@ -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 => {
@@ -477,7 +477,7 @@
477
477
  const newFrame = document.createElement('iframe');
478
478
  newFrame.setAttribute('id', 'pending-frame');
479
479
  newFrame.setAttribute('frameborder', '0');
480
- newFrame.setAttribute('sandbox', options.allowScripts ? 'allow-scripts allow-forms allow-same-origin' : 'allow-same-origin');
480
+ newFrame.setAttribute('sandbox', options.allowScripts ? 'allow-scripts allow-forms allow-same-origin allow-downloads' : 'allow-same-origin');
481
481
  if (host.fakeLoad) {
482
482
  // We should just be able to use srcdoc, but I wasn't
483
483
  // 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%';
@@ -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
 
@@ -16,7 +16,7 @@
16
16
  /* eslint-disable @typescript-eslint/no-explicit-any */
17
17
  import {
18
18
  QuickOpenExt, PLUGIN_RPC_CONTEXT as Ext, QuickOpenMain, TransferInputBox, Plugin,
19
- Item, TransferQuickInputButton, TransferQuickPickItems, TransferQuickInput, TransferQuickPick
19
+ Item, TransferQuickInputButton, TransferQuickPickItems, TransferQuickInput
20
20
  } from '../common/plugin-api-rpc';
21
21
  import * as theia from '@theia/plugin';
22
22
  import { QuickPickItem, InputBoxOptions, InputBox, QuickPick, QuickInput } from '@theia/plugin';
@@ -178,10 +178,6 @@ export class QuickOpenExtImpl implements QuickOpenExt {
178
178
  return session;
179
179
  }
180
180
 
181
- showCustomQuickPick<T extends QuickPickItem>(options: TransferQuickPick<T>): void {
182
- this.proxy.$showCustomQuickPick(options);
183
- }
184
-
185
181
  hide(): void {
186
182
  this.proxy.$hide();
187
183
  }
@@ -389,6 +385,7 @@ export class QuickInputExt implements QuickInput {
389
385
  this._fireHide();
390
386
  this.disposableCollection.dispose();
391
387
  this._onDidDispose();
388
+ this.quickOpenMain.$dispose(this._id);
392
389
  }
393
390
 
394
391
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -616,6 +613,7 @@ export class QuickPickExt<T extends theia.QuickPickItem> extends QuickInputExt i
616
613
  this._handlesToItems.set(i, item);
617
614
  this._itemsToHandles.set(item, i);
618
615
  });
616
+ items.forEach((item, i) => Object.assign(item, { handle: i }));
619
617
  this.update({
620
618
  items
621
619
  });
@@ -690,26 +688,4 @@ export class QuickPickExt<T extends theia.QuickPickItem> extends QuickInputExt i
690
688
  this._selectedItems = items;
691
689
  this._onDidChangeSelectionEmitter.fire(items);
692
690
  }
693
-
694
- show(): void {
695
- super.show();
696
- this.quickOpen.showCustomQuickPick({
697
- id: this._id,
698
- title: this.title,
699
- step: this.step,
700
- totalSteps: this.totalSteps,
701
- enabled: this.enabled,
702
- busy: this.busy,
703
- ignoreFocusOut: this.ignoreFocusOut,
704
- value: this.value,
705
- placeholder: this.placeholder,
706
- buttons: this.buttons,
707
- items: convertToTransferQuickPickItems(this.items),
708
- canSelectMany: this.canSelectMany,
709
- matchOnDescription: this.matchOnDescription,
710
- matchOnDetail: this.matchOnDetail,
711
- activeItems: this.activeItems,
712
- selectedItems: this.selectedItems
713
- });
714
- }
715
691
  }
@@ -29,6 +29,7 @@ import { TaskProviderAdapter } from './task-provider';
29
29
  import { Emitter, Event } from '@theia/core/lib/common/event';
30
30
  import { TerminalServiceExtImpl } from '../terminal-ext';
31
31
  import { UUID } from '@theia/core/shared/@phosphor/coreutils';
32
+ import { CancellationToken } from '@theia/core/lib/common/cancellation';
32
33
 
33
34
  type ExecutionCallback = (resolvedDefinition: theia.TaskDefinition) => Thenable<theia.Pseudoterminal>;
34
35
  export class TasksExtImpl implements TasksExt {
@@ -164,10 +165,10 @@ export class TasksExtImpl implements TasksExt {
164
165
  throw new Error('Task was not successfully transformed into a task config');
165
166
  }
166
167
 
167
- $provideTasks(handle: number, token: theia.CancellationToken): Promise<TaskDto[] | undefined> {
168
+ $provideTasks(handle: number): Promise<TaskDto[] | undefined> {
168
169
  const adapter = this.adaptersMap.get(handle);
169
170
  if (adapter) {
170
- return adapter.provideTasks(token).then(tasks => {
171
+ return adapter.provideTasks(CancellationToken.None).then(tasks => {
171
172
  if (tasks) {
172
173
  for (const task of tasks) {
173
174
  if (task.taskType === 'customExecution') {