@theia/plugin-ext 1.18.0-next.8e7f15b3 → 1.18.0-next.93

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 (168) 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 +27 -8
  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/debug-main.js +1 -1
  33. package/lib/main/browser/debug/debug-main.js.map +1 -1
  34. package/lib/main/browser/debug/plugin-debug-adapter-contribution.d.ts +1 -1
  35. package/lib/main/browser/debug/plugin-debug-adapter-contribution.d.ts.map +1 -1
  36. package/lib/main/browser/debug/plugin-debug-adapter-contribution.js +2 -2
  37. package/lib/main/browser/debug/plugin-debug-adapter-contribution.js.map +1 -1
  38. package/lib/main/browser/debug/plugin-debug-service.d.ts +8 -0
  39. package/lib/main/browser/debug/plugin-debug-service.d.ts.map +1 -1
  40. package/lib/main/browser/debug/plugin-debug-service.js +15 -0
  41. package/lib/main/browser/debug/plugin-debug-service.js.map +1 -1
  42. package/lib/main/browser/debug/plugin-debug-session-factory.d.ts +2 -2
  43. package/lib/main/browser/debug/plugin-debug-session-factory.d.ts.map +1 -1
  44. package/lib/main/browser/dialogs/modal-notification.d.ts +1 -1
  45. package/lib/main/browser/dialogs/modal-notification.d.ts.map +1 -1
  46. package/lib/main/browser/dialogs/modal-notification.js +4 -4
  47. package/lib/main/browser/dialogs/modal-notification.js.map +1 -1
  48. package/lib/main/browser/plugin-ext-frontend-module.d.ts.map +1 -1
  49. package/lib/main/browser/plugin-ext-frontend-module.js +5 -3
  50. package/lib/main/browser/plugin-ext-frontend-module.js.map +1 -1
  51. package/lib/main/browser/plugin-ext-widget.d.ts.map +1 -1
  52. package/lib/main/browser/plugin-ext-widget.js +3 -2
  53. package/lib/main/browser/plugin-ext-widget.js.map +1 -1
  54. package/lib/main/browser/plugin-icon-theme-service.d.ts +2 -0
  55. package/lib/main/browser/plugin-icon-theme-service.d.ts.map +1 -1
  56. package/lib/main/browser/plugin-icon-theme-service.js +15 -2
  57. package/lib/main/browser/plugin-icon-theme-service.js.map +1 -1
  58. package/lib/main/browser/plugin-shared-style.js +1 -1
  59. package/lib/main/browser/plugin-shared-style.js.map +1 -1
  60. package/lib/main/browser/quick-open-main.d.ts +3 -6
  61. package/lib/main/browser/quick-open-main.d.ts.map +1 -1
  62. package/lib/main/browser/quick-open-main.js +48 -100
  63. package/lib/main/browser/quick-open-main.js.map +1 -1
  64. package/lib/main/browser/view/plugin-view-registry.d.ts +3 -1
  65. package/lib/main/browser/view/plugin-view-registry.d.ts.map +1 -1
  66. package/lib/main/browser/view/plugin-view-registry.js +62 -21
  67. package/lib/main/browser/view/plugin-view-registry.js.map +1 -1
  68. package/lib/main/browser/view/plugin-view-widget.d.ts +9 -1
  69. package/lib/main/browser/view/plugin-view-widget.d.ts.map +1 -1
  70. package/lib/main/browser/view/plugin-view-widget.js +13 -1
  71. package/lib/main/browser/view/plugin-view-widget.js.map +1 -1
  72. package/lib/main/browser/view/tree-views-main.d.ts +1 -0
  73. package/lib/main/browser/view/tree-views-main.d.ts.map +1 -1
  74. package/lib/main/browser/view/tree-views-main.js +6 -0
  75. package/lib/main/browser/view/tree-views-main.js.map +1 -1
  76. package/lib/main/browser/webview/webview.d.ts +1 -1
  77. package/lib/main/browser/webview/webview.d.ts.map +1 -1
  78. package/lib/main/browser/webview/webview.js +2 -2
  79. package/lib/main/browser/webview/webview.js.map +1 -1
  80. package/lib/plugin/languages/call-hierarchy.d.ts.map +1 -1
  81. package/lib/plugin/languages/call-hierarchy.js +2 -1
  82. package/lib/plugin/languages/call-hierarchy.js.map +1 -1
  83. package/lib/plugin/languages.d.ts.map +1 -1
  84. package/lib/plugin/languages.js +2 -1
  85. package/lib/plugin/languages.js.map +1 -1
  86. package/lib/plugin/node/debug/debug.d.ts +4 -3
  87. package/lib/plugin/node/debug/debug.d.ts.map +1 -1
  88. package/lib/plugin/node/debug/debug.js +34 -15
  89. package/lib/plugin/node/debug/debug.js.map +1 -1
  90. package/lib/plugin/node/debug/plugin-debug-adapter-session.d.ts +3 -3
  91. package/lib/plugin/node/debug/plugin-debug-adapter-session.d.ts.map +1 -1
  92. package/lib/plugin/node/debug/plugin-debug-adapter-session.js.map +1 -1
  93. package/lib/plugin/node/debug/plugin-debug-adapter-starter.d.ts +6 -4
  94. package/lib/plugin/node/debug/plugin-debug-adapter-starter.d.ts.map +1 -1
  95. package/lib/plugin/node/debug/plugin-debug-adapter-starter.js +23 -13
  96. package/lib/plugin/node/debug/plugin-debug-adapter-starter.js.map +1 -1
  97. package/lib/plugin/plugin-context.d.ts.map +1 -1
  98. package/lib/plugin/plugin-context.js +9 -3
  99. package/lib/plugin/plugin-context.js.map +1 -1
  100. package/lib/plugin/plugin-manager.d.ts +2 -0
  101. package/lib/plugin/plugin-manager.d.ts.map +1 -1
  102. package/lib/plugin/plugin-manager.js +24 -3
  103. package/lib/plugin/plugin-manager.js.map +1 -1
  104. package/lib/plugin/plugin-storage.d.ts +4 -0
  105. package/lib/plugin/plugin-storage.d.ts.map +1 -1
  106. package/lib/plugin/plugin-storage.js +6 -1
  107. package/lib/plugin/plugin-storage.js.map +1 -1
  108. package/lib/plugin/quick-open.d.ts +1 -3
  109. package/lib/plugin/quick-open.d.ts.map +1 -1
  110. package/lib/plugin/quick-open.js +12 -27
  111. package/lib/plugin/quick-open.js.map +1 -1
  112. package/lib/plugin/tasks/tasks.d.ts +1 -1
  113. package/lib/plugin/tasks/tasks.d.ts.map +1 -1
  114. package/lib/plugin/tasks/tasks.js +3 -2
  115. package/lib/plugin/tasks/tasks.js.map +1 -1
  116. package/lib/plugin/tree/tree-views.d.ts +3 -0
  117. package/lib/plugin/tree/tree-views.d.ts.map +1 -1
  118. package/lib/plugin/tree/tree-views.js +15 -1
  119. package/lib/plugin/tree/tree-views.js.map +1 -1
  120. package/lib/plugin/type-converters.d.ts.map +1 -1
  121. package/lib/plugin/type-converters.js +9 -5
  122. package/lib/plugin/type-converters.js.map +1 -1
  123. package/lib/plugin/types-impl.d.ts +57 -1
  124. package/lib/plugin/types-impl.d.ts.map +1 -1
  125. package/lib/plugin/types-impl.js +88 -1
  126. package/lib/plugin/types-impl.js.map +1 -1
  127. package/package.json +29 -27
  128. package/src/common/arrays.ts +8 -0
  129. package/src/common/plugin-api-rpc-model.ts +2 -0
  130. package/src/common/plugin-api-rpc.ts +29 -8
  131. package/src/common/plugin-protocol.ts +1 -0
  132. package/src/hosted/browser/hosted-plugin.ts +17 -8
  133. package/src/hosted/browser/worker/debug-stub.ts +1 -0
  134. package/src/hosted/node/scanners/scanner-theia.ts +3 -2
  135. package/src/main/browser/callhierarchy/callhierarchy-type-converters.ts +2 -1
  136. package/src/main/browser/custom-editors/custom-editor-opener.tsx +7 -2
  137. package/src/main/browser/debug/debug-main.ts +1 -1
  138. package/src/main/browser/debug/plugin-debug-adapter-contribution.ts +3 -3
  139. package/src/main/browser/debug/plugin-debug-service.ts +23 -0
  140. package/src/main/browser/debug/plugin-debug-session-factory.ts +2 -2
  141. package/src/main/browser/dialogs/modal-notification.ts +6 -6
  142. package/src/main/browser/plugin-ext-frontend-module.ts +6 -4
  143. package/src/main/browser/plugin-ext-widget.tsx +3 -2
  144. package/src/main/browser/plugin-icon-theme-service.ts +12 -2
  145. package/src/main/browser/plugin-shared-style.ts +1 -1
  146. package/src/main/browser/quick-open-main.ts +54 -109
  147. package/src/main/browser/style/index.css +1 -5
  148. package/src/main/browser/style/plugin-sidebar.css +1 -1
  149. package/src/main/browser/view/plugin-view-registry.ts +67 -24
  150. package/src/main/browser/view/plugin-view-widget.ts +22 -3
  151. package/src/main/browser/view/tree-views-main.ts +7 -0
  152. package/src/main/browser/webview/pre/host.js +19 -10
  153. package/src/main/browser/webview/pre/main.js +1 -2
  154. package/src/main/browser/webview/pre/service-worker.js +1 -1
  155. package/src/main/browser/webview/webview.ts +2 -2
  156. package/src/plugin/languages/call-hierarchy.ts +2 -1
  157. package/src/plugin/languages.ts +2 -1
  158. package/src/plugin/node/debug/debug.ts +40 -19
  159. package/src/plugin/node/debug/plugin-debug-adapter-session.ts +3 -3
  160. package/src/plugin/node/debug/plugin-debug-adapter-starter.ts +24 -14
  161. package/src/plugin/plugin-context.ts +20 -7
  162. package/src/plugin/plugin-manager.ts +26 -4
  163. package/src/plugin/plugin-storage.ts +6 -0
  164. package/src/plugin/quick-open.ts +14 -31
  165. package/src/plugin/tasks/tasks.ts +3 -2
  166. package/src/plugin/tree/tree-views.ts +17 -1
  167. package/src/plugin/type-converters.ts +9 -6
  168. package/src/plugin/types-impl.ts +82 -1
@@ -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 {
@@ -194,54 +194,55 @@ export class QuickOpenMainImpl implements QuickOpenMain, Disposable {
194
194
 
195
195
  private sessions = new Map<number, QuickInputSession>();
196
196
 
197
- $createOrUpdate<T extends theia.QuickPickItem>(params: TransferQuickInput<T>): Promise<void> {
197
+ $createOrUpdate<T extends theia.QuickPickItem>(params: TransferQuickInput): 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, ViewContainerPart
22
22
  } from '@theia/core/lib/browser';
23
23
  import { ViewContainer, View, ViewWelcome } from '../../../common';
24
24
  import { PluginSharedStyle } from '../plugin-shared-style';
@@ -34,13 +34,13 @@ import { MenuModelRegistry } from '@theia/core/lib/common/menu';
34
34
  import { QuickViewService } from '@theia/core/lib/browser';
35
35
  import { Emitter } from '@theia/core/lib/common/event';
36
36
  import { ContextKeyService } from '@theia/core/lib/browser/context-key-service';
37
- import { SearchInWorkspaceWidget } from '@theia/search-in-workspace/lib/browser/search-in-workspace-widget';
38
37
  import { ViewContextKeyService } from './view-context-key-service';
39
38
  import { PROBLEMS_WIDGET_ID } from '@theia/markers/lib/browser/problem/problem-widget';
40
39
  import { OUTPUT_WIDGET_KIND } from '@theia/output/lib/browser/output-widget';
41
40
  import { DebugConsoleContribution } from '@theia/debug/lib/browser/console/debug-console-contribution';
42
41
  import { TERMINAL_WIDGET_FACTORY_ID } from '@theia/terminal/lib/browser/terminal-widget-impl';
43
42
  import { TreeViewWidget } from './tree-view-widget';
43
+ import { SEARCH_VIEW_CONTAINER_ID } from '@theia/search-in-workspace/lib/browser/search-in-workspace-factory';
44
44
 
45
45
  export const PLUGIN_VIEW_FACTORY_ID = 'plugin-view';
46
46
  export const PLUGIN_VIEW_CONTAINER_FACTORY_ID = 'plugin-view-container';
@@ -100,8 +100,8 @@ export class PluginViewRegistry implements FrontendApplicationContribution {
100
100
  protected init(): void {
101
101
  // VS Code Viewlets
102
102
  this.trackVisibleWidget(EXPLORER_VIEW_CONTAINER_ID, { viewletId: 'workbench.view.explorer' });
103
- this.trackVisibleWidget(SearchInWorkspaceWidget.ID, { viewletId: 'workbench.view.search', sideArea: true });
104
103
  this.trackVisibleWidget(SCM_VIEW_CONTAINER_ID, { viewletId: 'workbench.view.scm' });
104
+ this.trackVisibleWidget(SEARCH_VIEW_CONTAINER_ID, { viewletId: 'workbench.view.search' });
105
105
  this.trackVisibleWidget(DebugWidget.ID, { viewletId: 'workbench.view.debug' });
106
106
  // TODO workbench.view.extensions - Theia does not have a proper extension view yet
107
107
 
@@ -111,7 +111,6 @@ export class PluginViewRegistry implements FrontendApplicationContribution {
111
111
  this.trackVisibleWidget(DebugConsoleContribution.options.id, { panelId: 'workbench.panel.repl' });
112
112
  this.trackVisibleWidget(TERMINAL_WIDGET_FACTORY_ID, { panelId: 'workbench.panel.terminal' });
113
113
  // TODO workbench.panel.comments - Theia does not have a proper comments view yet
114
- this.trackVisibleWidget(SearchInWorkspaceWidget.ID, { panelId: 'workbench.view.search', sideArea: false });
115
114
 
116
115
  this.updateFocusedView();
117
116
  this.shell.onDidChangeActiveWidget(() => this.updateFocusedView());
@@ -123,6 +122,9 @@ export class PluginViewRegistry implements FrontendApplicationContribution {
123
122
  if (factoryId === SCM_VIEW_CONTAINER_ID && widget instanceof ViewContainerWidget) {
124
123
  waitUntil(this.prepareViewContainer('scm', widget));
125
124
  }
125
+ if (factoryId === SEARCH_VIEW_CONTAINER_ID && widget instanceof ViewContainerWidget) {
126
+ waitUntil(this.prepareViewContainer('search', widget));
127
+ }
126
128
  if (factoryId === DebugWidget.ID && widget instanceof DebugWidget) {
127
129
  const viewContainer = widget['sessionWidget']['viewContainer'];
128
130
  waitUntil(this.prepareViewContainer('debug', viewContainer));
@@ -146,7 +148,7 @@ export class PluginViewRegistry implements FrontendApplicationContribution {
146
148
  });
147
149
  this.doRegisterViewContainer('test', 'left', {
148
150
  label: 'Test',
149
- iconClass: 'theia-plugin-test-tab-icon',
151
+ iconClass: codicon('beaker'),
150
152
  closeable: true
151
153
  });
152
154
  this.contextKeyService.onDidChange(e => {
@@ -401,7 +403,9 @@ export class PluginViewRegistry implements FrontendApplicationContribution {
401
403
  return;
402
404
  }
403
405
  const [, view] = data;
404
- widget.title.label = view.name;
406
+ if (!widget.title.label) {
407
+ widget.title.label = view.name;
408
+ }
405
409
  const currentDataWidget = widget.widgets[0];
406
410
  const viewDataWidget = await this.createViewDataWidget(view.id);
407
411
  if (widget.isDisposed) {
@@ -466,6 +470,14 @@ export class PluginViewRegistry implements FrontendApplicationContribution {
466
470
  }
467
471
  for (const viewId of this.getContainerViews(viewContainerId)) {
468
472
  const identifier = this.toPluginViewWidgetIdentifier(viewId);
473
+ // Keep existing widget in its current container and reregister its part to the plugin view widget events.
474
+ const existingWidget = this.widgetManager.tryGetWidget<PluginViewWidget>(PLUGIN_VIEW_FACTORY_ID, identifier);
475
+ if (existingWidget && existingWidget.currentViewContainerId) {
476
+ const currentContainer = await this.getPluginViewContainer(existingWidget.currentViewContainerId);
477
+ if (currentContainer && this.registerWidgetPartEvents(existingWidget, currentContainer)) {
478
+ continue;
479
+ }
480
+ }
469
481
  const widget = await this.widgetManager.getOrCreateWidget<PluginViewWidget>(PLUGIN_VIEW_FACTORY_ID, identifier);
470
482
  if (containerWidget.getTrackableWidgets().indexOf(widget) === -1) {
471
483
  containerWidget.addWidget(widget, {
@@ -473,27 +485,49 @@ export class PluginViewRegistry implements FrontendApplicationContribution {
473
485
  initiallyHidden: !this.isViewVisible(viewId)
474
486
  });
475
487
  }
476
- const part = containerWidget.getPartFor(widget);
477
- if (part) {
478
- // if a view is explicitly hidden then suppress updating visibility based on `when` closure
479
- part.onDidChangeVisibility(() => widget.suppressUpdateViewVisibility = part.isHidden);
488
+ this.registerWidgetPartEvents(widget, containerWidget);
489
+ }
490
+ }
480
491
 
481
- const tryFireOnDidExpandView = () => {
482
- if (widget.widgets.length === 0) {
483
- if (!part.collapsed && part.isVisible) {
484
- this.onDidExpandViewEmitter.fire(viewId);
485
- }
486
- } else {
487
- toFire.dispose();
492
+ protected registerWidgetPartEvents(widget: PluginViewWidget, containerWidget: ViewContainerWidget): ViewContainerPart | undefined {
493
+ const part = containerWidget.getPartFor(widget);
494
+ if (part) {
495
+
496
+ widget.currentViewContainerId = this.getViewContainerId(containerWidget);
497
+ part.onDidMove(event => { widget.currentViewContainerId = this.getViewContainerId(event); });
498
+
499
+ // if a view is explicitly hidden then suppress updating visibility based on `when` closure
500
+ part.onDidChangeVisibility(() => widget.suppressUpdateViewVisibility = part.isHidden);
501
+
502
+ const tryFireOnDidExpandView = () => {
503
+ if (widget.widgets.length === 0) {
504
+ if (!part.collapsed && part.isVisible) {
505
+ const viewId = this.toViewId(widget.options);
506
+ this.onDidExpandViewEmitter.fire(viewId);
488
507
  }
489
- };
490
- const toFire = new DisposableCollection(
491
- part.onCollapsed(tryFireOnDidExpandView),
492
- part.onDidChangeVisibility(tryFireOnDidExpandView)
493
- );
508
+ } else {
509
+ toFire.dispose();
510
+ }
511
+ };
512
+ const toFire = new DisposableCollection(
513
+ part.onCollapsed(tryFireOnDidExpandView),
514
+ part.onDidChangeVisibility(tryFireOnDidExpandView)
515
+ );
494
516
 
495
- tryFireOnDidExpandView();
496
- }
517
+ tryFireOnDidExpandView();
518
+ return part;
519
+ }
520
+ };
521
+
522
+ protected getViewContainerId(container: ViewContainerWidget): string | undefined {
523
+ const description = this.widgetManager.getDescription(container);
524
+ switch (description?.factoryId) {
525
+ case EXPLORER_VIEW_CONTAINER_ID: return 'explorer';
526
+ case SCM_VIEW_CONTAINER_ID: return 'scm';
527
+ case SEARCH_VIEW_CONTAINER_ID: return 'search';
528
+ case undefined: return container.parent?.parent instanceof DebugWidget ? 'debug' : container.id;
529
+ case PLUGIN_VIEW_CONTAINER_FACTORY_ID: return this.toViewContainerId(description.options);
530
+ default: return container.id;
497
531
  }
498
532
  }
499
533
 
@@ -504,6 +538,9 @@ export class PluginViewRegistry implements FrontendApplicationContribution {
504
538
  if (viewContainerId === 'scm') {
505
539
  return this.widgetManager.getWidget<ViewContainerWidget>(SCM_VIEW_CONTAINER_ID);
506
540
  }
541
+ if (viewContainerId === 'search') {
542
+ return this.widgetManager.getWidget<ViewContainerWidget>(SEARCH_VIEW_CONTAINER_ID);
543
+ }
507
544
  if (viewContainerId === 'debug') {
508
545
  const debug = await this.widgetManager.getWidget(DebugWidget.ID);
509
546
  if (debug instanceof DebugWidget) {
@@ -546,6 +583,12 @@ export class PluginViewRegistry implements FrontendApplicationContribution {
546
583
  await this.prepareViewContainer('scm', scm);
547
584
  }
548
585
  })().catch(console.error));
586
+ promises.push((async () => {
587
+ const search = await this.widgetManager.getWidget(SEARCH_VIEW_CONTAINER_ID);
588
+ if (search instanceof ViewContainerWidget) {
589
+ await this.prepareViewContainer('search', search);
590
+ }
591
+ })().catch(console.error));
549
592
  promises.push((async () => {
550
593
  const debug = await this.widgetManager.getWidget(DebugWidget.ID);
551
594
  if (debug instanceof DebugWidget) {
@@ -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;
@@ -44,12 +46,16 @@ export class PluginViewWidget extends Panel implements StatefulWidget {
44
46
  @inject(PluginViewWidgetIdentifier)
45
47
  readonly options: PluginViewWidgetIdentifier;
46
48
 
49
+ currentViewContainerId: string | undefined;
50
+
47
51
  constructor() {
48
52
  super();
49
53
  this.node.tabIndex = -1;
50
54
  this.node.style.height = '100%';
51
55
  }
52
56
 
57
+ public onDidChangeDescription: Emitter<void> = new Emitter<void>();
58
+
53
59
  @postConstruct()
54
60
  protected init(): void {
55
61
  this.id = this.options.id;
@@ -71,7 +77,8 @@ export class PluginViewWidget extends Panel implements StatefulWidget {
71
77
  label: this.title.label,
72
78
  message: this.message,
73
79
  widgets: this.widgets,
74
- suppressUpdateViewVisibility: this._suppressUpdateViewVisibility
80
+ suppressUpdateViewVisibility: this._suppressUpdateViewVisibility,
81
+ currentViewContainerId: this.currentViewContainerId
75
82
  };
76
83
  }
77
84
 
@@ -79,6 +86,7 @@ export class PluginViewWidget extends Panel implements StatefulWidget {
79
86
  this.title.label = state.label;
80
87
  this.message = state.message;
81
88
  this.suppressUpdateViewVisibility = state.suppressUpdateViewVisibility;
89
+ this.currentViewContainerId = state.currentViewContainerId;
82
90
  for (const widget of state.widgets) {
83
91
  this.addWidget(widget);
84
92
  }
@@ -112,6 +120,16 @@ export class PluginViewWidget extends Panel implements StatefulWidget {
112
120
  this.updateWidgetMessage();
113
121
  }
114
122
 
123
+ private _description: string = '';
124
+ get description(): string {
125
+ return this._description;
126
+ }
127
+
128
+ set description(description: string) {
129
+ this._description = description;
130
+ this.onDidChangeDescription.fire();
131
+ }
132
+
115
133
  private updateWidgetMessage(): void {
116
134
  const widget = this.widgets[0];
117
135
  if (widget) {
@@ -136,6 +154,7 @@ export namespace PluginViewWidget {
136
154
  label: string,
137
155
  message?: string,
138
156
  widgets: ReadonlyArray<Widget>,
139
- suppressUpdateViewVisibility: boolean
157
+ suppressUpdateViewVisibility: boolean;
158
+ currentViewContainerId: string | undefined;
140
159
  }
141
160
  }
@@ -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`);
@@ -40,7 +40,7 @@ import { Schemes } from '../../../common/uri-components';
40
40
  import { PluginSharedStyle } from '../plugin-shared-style';
41
41
  import { WebviewThemeDataProvider } from './webview-theme-data-provider';
42
42
  import { ExternalUriService } from '@theia/core/lib/browser/external-uri-service';
43
- import { OutputChannelManager } from '@theia/output/lib/common/output-channel';
43
+ import { OutputChannelManager } from '@theia/output/lib/browser/output-channel';
44
44
  import { WebviewPreferences } from './webview-preferences';
45
45
  import { WebviewResourceCache } from './webview-resource-cache';
46
46
  import { Endpoint } from '@theia/core/lib/browser/endpoint';
@@ -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