@theia/playwright 1.47.1 → 1.48.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/README.md +54 -54
  2. package/lib/index.d.ts +30 -30
  3. package/lib/index.js +48 -48
  4. package/lib/tests/theia-app.test.d.ts +1 -1
  5. package/lib/tests/theia-app.test.js +29 -29
  6. package/lib/tests/theia-application-shell.test.d.ts +1 -1
  7. package/lib/tests/theia-application-shell.test.js +57 -57
  8. package/lib/tests/theia-explorer-view.test.d.ts +1 -1
  9. package/lib/tests/theia-explorer-view.test.js +183 -183
  10. package/lib/tests/theia-getting-started.test.d.ts +2 -0
  11. package/lib/tests/theia-getting-started.test.d.ts.map +1 -0
  12. package/lib/tests/theia-getting-started.test.js +46 -0
  13. package/lib/tests/theia-getting-started.test.js.map +1 -0
  14. package/lib/tests/theia-main-menu.test.d.ts +1 -1
  15. package/lib/tests/theia-main-menu.test.js +111 -92
  16. package/lib/tests/theia-main-menu.test.js.map +1 -1
  17. package/lib/tests/theia-output-view.test.d.ts +1 -1
  18. package/lib/tests/theia-output-view.test.js +78 -78
  19. package/lib/tests/theia-preference-view.test.d.ts +1 -1
  20. package/lib/tests/theia-preference-view.test.js +101 -101
  21. package/lib/tests/theia-problems-view.test.d.ts +1 -1
  22. package/lib/tests/theia-problems-view.test.js +54 -54
  23. package/lib/tests/theia-quick-command.test.d.ts +1 -1
  24. package/lib/tests/theia-quick-command.test.js +69 -69
  25. package/lib/tests/theia-sample-app.test.d.ts +1 -1
  26. package/lib/tests/theia-sample-app.test.js +57 -57
  27. package/lib/tests/theia-status-bar.test.d.ts +1 -1
  28. package/lib/tests/theia-status-bar.test.js +44 -44
  29. package/lib/tests/theia-terminal-view.test.d.ts +1 -1
  30. package/lib/tests/theia-terminal-view.test.js +78 -78
  31. package/lib/tests/theia-text-editor.test.d.ts +1 -1
  32. package/lib/tests/theia-text-editor.test.js +155 -155
  33. package/lib/tests/theia-toolbar.test.d.ts +1 -1
  34. package/lib/tests/theia-toolbar.test.js +61 -61
  35. package/lib/tests/theia-workspace.test.d.ts +1 -1
  36. package/lib/tests/theia-workspace.test.js +72 -72
  37. package/lib/theia-about-dialog.d.ts +4 -4
  38. package/lib/theia-about-dialog.js +26 -26
  39. package/lib/theia-app-loader.d.ts +19 -19
  40. package/lib/theia-app-loader.js +129 -129
  41. package/lib/theia-app.d.ts +50 -50
  42. package/lib/theia-app.js +153 -153
  43. package/lib/theia-context-menu.d.ts +8 -8
  44. package/lib/theia-context-menu.js +37 -37
  45. package/lib/theia-dialog.d.ts +28 -28
  46. package/lib/theia-dialog.js +99 -99
  47. package/lib/theia-editor.d.ts +9 -9
  48. package/lib/theia-editor.js +68 -68
  49. package/lib/theia-explorer-view.d.ts +47 -47
  50. package/lib/theia-explorer-view.js +273 -273
  51. package/lib/theia-main-menu.d.ts +12 -12
  52. package/lib/theia-main-menu.js +53 -53
  53. package/lib/theia-menu-item.d.ts +14 -14
  54. package/lib/theia-menu-item.js +66 -66
  55. package/lib/theia-menu.d.ts +16 -16
  56. package/lib/theia-menu.js +86 -86
  57. package/lib/theia-monaco-editor.d.ts +15 -15
  58. package/lib/theia-monaco-editor.js +75 -75
  59. package/lib/theia-notification-indicator.d.ts +7 -7
  60. package/lib/theia-notification-indicator.js +44 -44
  61. package/lib/theia-notification-overlay.d.ts +22 -22
  62. package/lib/theia-notification-overlay.js +79 -79
  63. package/lib/theia-output-channel.d.ts +24 -24
  64. package/lib/theia-output-channel.js +71 -71
  65. package/lib/theia-output-view.d.ts +9 -9
  66. package/lib/theia-output-view.js +81 -81
  67. package/lib/theia-page-object.d.ts +7 -7
  68. package/lib/theia-page-object.js +27 -27
  69. package/lib/theia-preference-view.d.ts +84 -84
  70. package/lib/theia-preference-view.js +209 -209
  71. package/lib/theia-problem-indicator.d.ts +8 -8
  72. package/lib/theia-problem-indicator.js +38 -38
  73. package/lib/theia-problem-view.d.ts +5 -5
  74. package/lib/theia-problem-view.js +30 -30
  75. package/lib/theia-quick-command-palette.d.ts +12 -12
  76. package/lib/theia-quick-command-palette.d.ts.map +1 -1
  77. package/lib/theia-quick-command-palette.js +78 -80
  78. package/lib/theia-quick-command-palette.js.map +1 -1
  79. package/lib/theia-rename-dialog.d.ts +5 -5
  80. package/lib/theia-rename-dialog.d.ts.map +1 -1
  81. package/lib/theia-rename-dialog.js +34 -35
  82. package/lib/theia-rename-dialog.js.map +1 -1
  83. package/lib/theia-status-bar.d.ts +13 -13
  84. package/lib/theia-status-bar.js +39 -39
  85. package/lib/theia-status-indicator.d.ts +10 -10
  86. package/lib/theia-status-indicator.js +48 -48
  87. package/lib/theia-terminal.d.ts +13 -13
  88. package/lib/theia-terminal.js +59 -59
  89. package/lib/theia-text-editor.d.ts +26 -26
  90. package/lib/theia-text-editor.js +120 -120
  91. package/lib/theia-toggle-bottom-indicator.d.ts +4 -4
  92. package/lib/theia-toggle-bottom-indicator.js +26 -26
  93. package/lib/theia-toolbar-item.d.ts +10 -10
  94. package/lib/theia-toolbar-item.js +39 -39
  95. package/lib/theia-toolbar.d.ts +19 -19
  96. package/lib/theia-toolbar.js +90 -90
  97. package/lib/theia-tree-node.d.ts +19 -19
  98. package/lib/theia-tree-node.js +72 -72
  99. package/lib/theia-view.d.ts +32 -32
  100. package/lib/theia-view.js +149 -149
  101. package/lib/theia-welcome-view.d.ts +5 -5
  102. package/lib/theia-welcome-view.js +30 -30
  103. package/lib/theia-workspace.d.ts +18 -18
  104. package/lib/theia-workspace.js +69 -69
  105. package/lib/util.d.ts +19 -19
  106. package/lib/util.js +93 -93
  107. package/package.json +2 -2
  108. package/src/index.ts +46 -46
  109. package/src/tests/resources/sample-files1/sample.txt +4 -4
  110. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder1/sampleFolder1-1/sampleFile1-1-1.txt +1 -1
  111. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder1/sampleFolder1-1/sampleFile1-1-2.txt +1 -1
  112. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder1/sampleFolder1-2/sampleFile1-2-1.txt +1 -1
  113. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder1/sampleFolder1-2/sampleFile1-2-2.txt +1 -1
  114. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder2/sampleFolder2-1/sampleFile2-1-1.txt +1 -1
  115. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder2/sampleFolder2-1/sampleFile2-1-2.txt +1 -1
  116. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder2/sampleFolder2-2/sampleFile2-2-1.txt +1 -1
  117. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder2/sampleFolder2-2/sampleFile2-2-2.txt +1 -1
  118. package/src/tests/resources/sample-files2/another-sample.txt +1 -1
  119. package/src/tests/theia-app.test.ts +33 -33
  120. package/src/tests/theia-application-shell.test.ts +67 -67
  121. package/src/tests/theia-explorer-view.test.ts +211 -211
  122. package/src/tests/theia-getting-started.test.ts +50 -0
  123. package/src/tests/theia-main-menu.test.ts +133 -112
  124. package/src/tests/theia-output-view.test.ts +85 -85
  125. package/src/tests/theia-preference-view.test.ts +122 -122
  126. package/src/tests/theia-problems-view.test.ts +64 -64
  127. package/src/tests/theia-quick-command.test.ts +80 -80
  128. package/src/tests/theia-sample-app.test.ts +66 -66
  129. package/src/tests/theia-status-bar.test.ts +52 -52
  130. package/src/tests/theia-terminal-view.test.ts +90 -90
  131. package/src/tests/theia-text-editor.test.ts +187 -187
  132. package/src/tests/theia-toolbar.test.ts +69 -69
  133. package/src/tests/theia-workspace.test.ts +80 -80
  134. package/src/theia-about-dialog.ts +26 -26
  135. package/src/theia-app-loader.ts +167 -167
  136. package/src/theia-app.ts +188 -188
  137. package/src/theia-context-menu.ts +42 -42
  138. package/src/theia-dialog.ts +114 -114
  139. package/src/theia-editor.ts +73 -73
  140. package/src/theia-explorer-view.ts +311 -311
  141. package/src/theia-main-menu.ts +54 -54
  142. package/src/theia-menu-item.ts +75 -75
  143. package/src/theia-menu.ts +96 -96
  144. package/src/theia-monaco-editor.ts +83 -83
  145. package/src/theia-notification-indicator.ts +44 -44
  146. package/src/theia-notification-overlay.ts +94 -94
  147. package/src/theia-output-channel.ts +88 -88
  148. package/src/theia-output-view.ts +87 -87
  149. package/src/theia-page-object.ts +29 -29
  150. package/src/theia-preference-view.ts +240 -240
  151. package/src/theia-problem-indicator.ts +37 -37
  152. package/src/theia-problem-view.ts +30 -30
  153. package/src/theia-quick-command-palette.ts +81 -83
  154. package/src/theia-rename-dialog.ts +35 -36
  155. package/src/theia-status-bar.ts +44 -44
  156. package/src/theia-status-indicator.ts +50 -50
  157. package/src/theia-terminal.ts +69 -69
  158. package/src/theia-text-editor.ts +141 -141
  159. package/src/theia-toggle-bottom-indicator.ts +21 -21
  160. package/src/theia-toolbar-item.ts +41 -41
  161. package/src/theia-toolbar.ts +99 -99
  162. package/src/theia-tree-node.ts +81 -81
  163. package/src/theia-view.ts +177 -177
  164. package/src/theia-welcome-view.ts +31 -31
  165. package/src/theia-workspace.ts +76 -76
  166. package/src/util.ts +91 -91
package/src/theia-app.ts CHANGED
@@ -1,188 +1,188 @@
1
- // *****************************************************************************
2
- // Copyright (C) 2021-2023 logi.cals GmbH, EclipseSource and others.
3
- //
4
- // This program and the accompanying materials are made available under the
5
- // terms of the Eclipse Public License v. 2.0 which is available at
6
- // http://www.eclipse.org/legal/epl-2.0.
7
- //
8
- // This Source Code may also be made available under the following Secondary
9
- // Licenses when the conditions for such availability set forth in the Eclipse
10
- // Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
- // with the GNU Classpath Exception which is available at
12
- // https://www.gnu.org/software/classpath/license.html.
13
- //
14
- // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
- // *****************************************************************************
16
-
17
- import { Page } from '@playwright/test';
18
- import { TheiaEditor } from './theia-editor';
19
- import { DOT_FILES_FILTER, TheiaExplorerView } from './theia-explorer-view';
20
- import { TheiaMenuBar } from './theia-main-menu';
21
- import { TheiaPreferenceScope, TheiaPreferenceView } from './theia-preference-view';
22
- import { TheiaQuickCommandPalette } from './theia-quick-command-palette';
23
- import { TheiaStatusBar } from './theia-status-bar';
24
- import { TheiaTerminal } from './theia-terminal';
25
- import { TheiaView } from './theia-view';
26
- import { TheiaWorkspace } from './theia-workspace';
27
-
28
- export interface TheiaAppData {
29
- loadingSelector: string;
30
- shellSelector: string;
31
- };
32
-
33
- export const DefaultTheiaAppData: TheiaAppData = {
34
- loadingSelector: '.theia-preload',
35
- shellSelector: '.theia-ApplicationShell'
36
- };
37
-
38
- export class TheiaApp {
39
-
40
- statusBar: TheiaStatusBar;
41
- quickCommandPalette: TheiaQuickCommandPalette;
42
- menuBar: TheiaMenuBar;
43
-
44
- protected appData = DefaultTheiaAppData;
45
-
46
- public constructor(
47
- public page: Page,
48
- public workspace: TheiaWorkspace,
49
- public isElectron: boolean,
50
- ) {
51
- this.statusBar = this.createStatusBar();
52
- this.quickCommandPalette = this.createQuickCommandPalette();
53
- this.menuBar = this.createMenuBar();
54
- }
55
-
56
- protected createStatusBar(): TheiaStatusBar {
57
- return new TheiaStatusBar(this);
58
- }
59
-
60
- protected createQuickCommandPalette(): TheiaQuickCommandPalette {
61
- return new TheiaQuickCommandPalette(this);
62
- }
63
-
64
- protected createMenuBar(): TheiaMenuBar {
65
- return new TheiaMenuBar(this);
66
- }
67
-
68
- async isShellVisible(): Promise<boolean> {
69
- return this.page.isVisible(this.appData.shellSelector);
70
- }
71
-
72
- async waitForShellAndInitialized(): Promise<void> {
73
- await this.page.waitForSelector(this.appData.loadingSelector, { state: 'detached' });
74
- await this.page.waitForSelector(this.appData.shellSelector);
75
- await this.waitForInitialized();
76
- }
77
-
78
- async isMainContentPanelVisible(): Promise<boolean> {
79
- const contentPanel = await this.page.$('#theia-main-content-panel');
80
- return !!contentPanel && contentPanel.isVisible();
81
- }
82
-
83
- async openPreferences(viewFactory: { new(app: TheiaApp): TheiaPreferenceView }, preferenceScope = TheiaPreferenceScope.Workspace): Promise<TheiaPreferenceView> {
84
- const view = new viewFactory(this);
85
- if (await view.isTabVisible()) {
86
- await view.activate();
87
- return view;
88
- }
89
- await view.open(preferenceScope);
90
- return view;
91
- }
92
-
93
- async openView<T extends TheiaView>(viewFactory: { new(app: TheiaApp): T }): Promise<T> {
94
- const view = new viewFactory(this);
95
- if (await view.isTabVisible()) {
96
- await view.activate();
97
- return view;
98
- }
99
- await view.open();
100
- return view;
101
- }
102
-
103
- async openEditor<T extends TheiaEditor>(filePath: string, editorFactory: { new(filePath: string, app: TheiaApp): T },
104
- editorName?: string, expectFileNodes = true): Promise<T> {
105
- const explorer = await this.openView(TheiaExplorerView);
106
- if (!explorer) {
107
- throw Error('TheiaExplorerView could not be opened.');
108
- }
109
- if (expectFileNodes) {
110
- await explorer.waitForVisibleFileNodes();
111
- const fileStatElements = await explorer.visibleFileStatNodes(DOT_FILES_FILTER);
112
- if (fileStatElements.length < 1) {
113
- throw Error('TheiaExplorerView is empty.');
114
- }
115
- }
116
- const fileNode = await explorer.fileStatNode(filePath);
117
- if (!fileNode || ! await fileNode?.isFile()) {
118
- throw Error(`Specified path '${filePath}' could not be found or isn't a file.`);
119
- }
120
-
121
- const editor = new editorFactory(filePath, this);
122
- const contextMenu = await fileNode.openContextMenu();
123
- const editorToUse = editorName ? editorName : editor.name ? editor.name : undefined;
124
- if (editorToUse) {
125
- const menuItem = await contextMenu.menuItemByNamePath('Open With', editorToUse);
126
- if (!menuItem) {
127
- throw Error(`Editor named '${editorName}' could not be found in "Open With" menu.`);
128
- }
129
- await menuItem.click();
130
- } else {
131
- await contextMenu.clickMenuItem('Open');
132
- }
133
-
134
- await editor.waitForVisible();
135
- return editor;
136
- }
137
-
138
- async activateExistingEditor<T extends TheiaEditor>(filePath: string, editorFactory: { new(filePath: string, app: TheiaApp): T }): Promise<T> {
139
- const editor = new editorFactory(filePath, this);
140
- if (!await editor.isTabVisible()) {
141
- throw new Error(`Could not find opened editor for file ${filePath}`);
142
- }
143
- await editor.activate();
144
- await editor.waitForVisible();
145
- return editor;
146
- }
147
-
148
- async openTerminal<T extends TheiaTerminal>(terminalFactory: { new(id: string, app: TheiaApp): T }): Promise<T> {
149
- const mainMenu = await this.menuBar.openMenu('Terminal');
150
- const menuItem = await mainMenu.menuItemByName('New Terminal');
151
- if (!menuItem) {
152
- throw Error('Menu item \'New Terminal\' could not be found.');
153
- }
154
-
155
- const newTabIds = await this.runAndWaitForNewTabs(() => menuItem.click());
156
- if (newTabIds.length > 1) {
157
- console.warn('More than one new tab detected after opening the terminal');
158
- }
159
-
160
- return new terminalFactory(newTabIds[0], this);
161
- }
162
-
163
- protected async runAndWaitForNewTabs(command: () => Promise<void>): Promise<string[]> {
164
- const tabIdsBefore = await this.visibleTabIds();
165
- await command();
166
- return (await this.waitForNewTabs(tabIdsBefore)).filter(item => !tabIdsBefore.includes(item));
167
- }
168
-
169
- protected async waitForNewTabs(tabIds: string[]): Promise<string[]> {
170
- let tabIdsCurrent: string[];
171
- while ((tabIdsCurrent = (await this.visibleTabIds())).length <= tabIds.length) {
172
- console.debug('Awaiting a new tab to appear');
173
- }
174
- return tabIdsCurrent;
175
- }
176
-
177
- protected async visibleTabIds(): Promise<string[]> {
178
- const tabs = await this.page.$$('.p-TabBar-tab');
179
- const tabIds = (await Promise.all(tabs.map(tab => tab.getAttribute('id')))).filter(id => !!id);
180
- return tabIds as string[];
181
- }
182
-
183
- /** Specific Theia apps may add additional conditions to wait for. */
184
- async waitForInitialized(): Promise<void> {
185
- // empty by default
186
- }
187
-
188
- }
1
+ // *****************************************************************************
2
+ // Copyright (C) 2021-2023 logi.cals GmbH, EclipseSource and others.
3
+ //
4
+ // This program and the accompanying materials are made available under the
5
+ // terms of the Eclipse Public License v. 2.0 which is available at
6
+ // http://www.eclipse.org/legal/epl-2.0.
7
+ //
8
+ // This Source Code may also be made available under the following Secondary
9
+ // Licenses when the conditions for such availability set forth in the Eclipse
10
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
+ // with the GNU Classpath Exception which is available at
12
+ // https://www.gnu.org/software/classpath/license.html.
13
+ //
14
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
+ // *****************************************************************************
16
+
17
+ import { Page } from '@playwright/test';
18
+ import { TheiaEditor } from './theia-editor';
19
+ import { DOT_FILES_FILTER, TheiaExplorerView } from './theia-explorer-view';
20
+ import { TheiaMenuBar } from './theia-main-menu';
21
+ import { TheiaPreferenceScope, TheiaPreferenceView } from './theia-preference-view';
22
+ import { TheiaQuickCommandPalette } from './theia-quick-command-palette';
23
+ import { TheiaStatusBar } from './theia-status-bar';
24
+ import { TheiaTerminal } from './theia-terminal';
25
+ import { TheiaView } from './theia-view';
26
+ import { TheiaWorkspace } from './theia-workspace';
27
+
28
+ export interface TheiaAppData {
29
+ loadingSelector: string;
30
+ shellSelector: string;
31
+ };
32
+
33
+ export const DefaultTheiaAppData: TheiaAppData = {
34
+ loadingSelector: '.theia-preload',
35
+ shellSelector: '.theia-ApplicationShell'
36
+ };
37
+
38
+ export class TheiaApp {
39
+
40
+ statusBar: TheiaStatusBar;
41
+ quickCommandPalette: TheiaQuickCommandPalette;
42
+ menuBar: TheiaMenuBar;
43
+
44
+ protected appData = DefaultTheiaAppData;
45
+
46
+ public constructor(
47
+ public page: Page,
48
+ public workspace: TheiaWorkspace,
49
+ public isElectron: boolean,
50
+ ) {
51
+ this.statusBar = this.createStatusBar();
52
+ this.quickCommandPalette = this.createQuickCommandPalette();
53
+ this.menuBar = this.createMenuBar();
54
+ }
55
+
56
+ protected createStatusBar(): TheiaStatusBar {
57
+ return new TheiaStatusBar(this);
58
+ }
59
+
60
+ protected createQuickCommandPalette(): TheiaQuickCommandPalette {
61
+ return new TheiaQuickCommandPalette(this);
62
+ }
63
+
64
+ protected createMenuBar(): TheiaMenuBar {
65
+ return new TheiaMenuBar(this);
66
+ }
67
+
68
+ async isShellVisible(): Promise<boolean> {
69
+ return this.page.isVisible(this.appData.shellSelector);
70
+ }
71
+
72
+ async waitForShellAndInitialized(): Promise<void> {
73
+ await this.page.waitForSelector(this.appData.loadingSelector, { state: 'detached' });
74
+ await this.page.waitForSelector(this.appData.shellSelector);
75
+ await this.waitForInitialized();
76
+ }
77
+
78
+ async isMainContentPanelVisible(): Promise<boolean> {
79
+ const contentPanel = await this.page.$('#theia-main-content-panel');
80
+ return !!contentPanel && contentPanel.isVisible();
81
+ }
82
+
83
+ async openPreferences(viewFactory: { new(app: TheiaApp): TheiaPreferenceView }, preferenceScope = TheiaPreferenceScope.Workspace): Promise<TheiaPreferenceView> {
84
+ const view = new viewFactory(this);
85
+ if (await view.isTabVisible()) {
86
+ await view.activate();
87
+ return view;
88
+ }
89
+ await view.open(preferenceScope);
90
+ return view;
91
+ }
92
+
93
+ async openView<T extends TheiaView>(viewFactory: { new(app: TheiaApp): T }): Promise<T> {
94
+ const view = new viewFactory(this);
95
+ if (await view.isTabVisible()) {
96
+ await view.activate();
97
+ return view;
98
+ }
99
+ await view.open();
100
+ return view;
101
+ }
102
+
103
+ async openEditor<T extends TheiaEditor>(filePath: string, editorFactory: { new(filePath: string, app: TheiaApp): T },
104
+ editorName?: string, expectFileNodes = true): Promise<T> {
105
+ const explorer = await this.openView(TheiaExplorerView);
106
+ if (!explorer) {
107
+ throw Error('TheiaExplorerView could not be opened.');
108
+ }
109
+ if (expectFileNodes) {
110
+ await explorer.waitForVisibleFileNodes();
111
+ const fileStatElements = await explorer.visibleFileStatNodes(DOT_FILES_FILTER);
112
+ if (fileStatElements.length < 1) {
113
+ throw Error('TheiaExplorerView is empty.');
114
+ }
115
+ }
116
+ const fileNode = await explorer.fileStatNode(filePath);
117
+ if (!fileNode || ! await fileNode?.isFile()) {
118
+ throw Error(`Specified path '${filePath}' could not be found or isn't a file.`);
119
+ }
120
+
121
+ const editor = new editorFactory(filePath, this);
122
+ const contextMenu = await fileNode.openContextMenu();
123
+ const editorToUse = editorName ? editorName : editor.name ? editor.name : undefined;
124
+ if (editorToUse) {
125
+ const menuItem = await contextMenu.menuItemByNamePath('Open With', editorToUse);
126
+ if (!menuItem) {
127
+ throw Error(`Editor named '${editorName}' could not be found in "Open With" menu.`);
128
+ }
129
+ await menuItem.click();
130
+ } else {
131
+ await contextMenu.clickMenuItem('Open');
132
+ }
133
+
134
+ await editor.waitForVisible();
135
+ return editor;
136
+ }
137
+
138
+ async activateExistingEditor<T extends TheiaEditor>(filePath: string, editorFactory: { new(filePath: string, app: TheiaApp): T }): Promise<T> {
139
+ const editor = new editorFactory(filePath, this);
140
+ if (!await editor.isTabVisible()) {
141
+ throw new Error(`Could not find opened editor for file ${filePath}`);
142
+ }
143
+ await editor.activate();
144
+ await editor.waitForVisible();
145
+ return editor;
146
+ }
147
+
148
+ async openTerminal<T extends TheiaTerminal>(terminalFactory: { new(id: string, app: TheiaApp): T }): Promise<T> {
149
+ const mainMenu = await this.menuBar.openMenu('Terminal');
150
+ const menuItem = await mainMenu.menuItemByName('New Terminal');
151
+ if (!menuItem) {
152
+ throw Error('Menu item \'New Terminal\' could not be found.');
153
+ }
154
+
155
+ const newTabIds = await this.runAndWaitForNewTabs(() => menuItem.click());
156
+ if (newTabIds.length > 1) {
157
+ console.warn('More than one new tab detected after opening the terminal');
158
+ }
159
+
160
+ return new terminalFactory(newTabIds[0], this);
161
+ }
162
+
163
+ protected async runAndWaitForNewTabs(command: () => Promise<void>): Promise<string[]> {
164
+ const tabIdsBefore = await this.visibleTabIds();
165
+ await command();
166
+ return (await this.waitForNewTabs(tabIdsBefore)).filter(item => !tabIdsBefore.includes(item));
167
+ }
168
+
169
+ protected async waitForNewTabs(tabIds: string[]): Promise<string[]> {
170
+ let tabIdsCurrent: string[];
171
+ while ((tabIdsCurrent = (await this.visibleTabIds())).length <= tabIds.length) {
172
+ console.debug('Awaiting a new tab to appear');
173
+ }
174
+ return tabIdsCurrent;
175
+ }
176
+
177
+ protected async visibleTabIds(): Promise<string[]> {
178
+ const tabs = await this.page.$$('.p-TabBar-tab');
179
+ const tabIds = (await Promise.all(tabs.map(tab => tab.getAttribute('id')))).filter(id => !!id);
180
+ return tabIds as string[];
181
+ }
182
+
183
+ /** Specific Theia apps may add additional conditions to wait for. */
184
+ async waitForInitialized(): Promise<void> {
185
+ // empty by default
186
+ }
187
+
188
+ }
@@ -1,42 +1,42 @@
1
- // *****************************************************************************
2
- // Copyright (C) 2021 logi.cals GmbH, EclipseSource and others.
3
- //
4
- // This program and the accompanying materials are made available under the
5
- // terms of the Eclipse Public License v. 2.0 which is available at
6
- // http://www.eclipse.org/legal/epl-2.0.
7
- //
8
- // This Source Code may also be made available under the following Secondary
9
- // Licenses when the conditions for such availability set forth in the Eclipse
10
- // Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
- // with the GNU Classpath Exception which is available at
12
- // https://www.gnu.org/software/classpath/license.html.
13
- //
14
- // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
- // *****************************************************************************
16
-
17
- import { ElementHandle } from '@playwright/test';
18
-
19
- import { TheiaApp } from './theia-app';
20
- import { TheiaMenu } from './theia-menu';
21
-
22
- export class TheiaContextMenu extends TheiaMenu {
23
-
24
- public static async openAt(app: TheiaApp, x: number, y: number): Promise<TheiaContextMenu> {
25
- await app.page.mouse.move(x, y);
26
- await app.page.mouse.click(x, y, { button: 'right' });
27
- return TheiaContextMenu.returnWhenVisible(app);
28
- }
29
-
30
- public static async open(app: TheiaApp, element: () => Promise<ElementHandle<SVGElement | HTMLElement>>): Promise<TheiaContextMenu> {
31
- const elementHandle = await element();
32
- await elementHandle.click({ button: 'right' });
33
- return TheiaContextMenu.returnWhenVisible(app);
34
- }
35
-
36
- private static async returnWhenVisible(app: TheiaApp): Promise<TheiaContextMenu> {
37
- const menu = new TheiaContextMenu(app);
38
- await menu.waitForVisible();
39
- return menu;
40
- }
41
-
42
- }
1
+ // *****************************************************************************
2
+ // Copyright (C) 2021 logi.cals GmbH, EclipseSource and others.
3
+ //
4
+ // This program and the accompanying materials are made available under the
5
+ // terms of the Eclipse Public License v. 2.0 which is available at
6
+ // http://www.eclipse.org/legal/epl-2.0.
7
+ //
8
+ // This Source Code may also be made available under the following Secondary
9
+ // Licenses when the conditions for such availability set forth in the Eclipse
10
+ // Public License v. 2.0 are satisfied: GNU General Public License, version 2
11
+ // with the GNU Classpath Exception which is available at
12
+ // https://www.gnu.org/software/classpath/license.html.
13
+ //
14
+ // SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
15
+ // *****************************************************************************
16
+
17
+ import { ElementHandle } from '@playwright/test';
18
+
19
+ import { TheiaApp } from './theia-app';
20
+ import { TheiaMenu } from './theia-menu';
21
+
22
+ export class TheiaContextMenu extends TheiaMenu {
23
+
24
+ public static async openAt(app: TheiaApp, x: number, y: number): Promise<TheiaContextMenu> {
25
+ await app.page.mouse.move(x, y);
26
+ await app.page.mouse.click(x, y, { button: 'right' });
27
+ return TheiaContextMenu.returnWhenVisible(app);
28
+ }
29
+
30
+ public static async open(app: TheiaApp, element: () => Promise<ElementHandle<SVGElement | HTMLElement>>): Promise<TheiaContextMenu> {
31
+ const elementHandle = await element();
32
+ await elementHandle.click({ button: 'right' });
33
+ return TheiaContextMenu.returnWhenVisible(app);
34
+ }
35
+
36
+ private static async returnWhenVisible(app: TheiaApp): Promise<TheiaContextMenu> {
37
+ const menu = new TheiaContextMenu(app);
38
+ await menu.waitForVisible();
39
+ return menu;
40
+ }
41
+
42
+ }