@theia/playwright 1.45.1 → 1.46.0-next.72

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 (164) hide show
  1. package/README.md +54 -54
  2. package/lib/index.d.ts +30 -30
  3. package/lib/index.js +57 -57
  4. package/lib/tests/fixtures/theia-fixture.d.ts +4 -0
  5. package/lib/tests/fixtures/theia-fixture.d.ts.map +1 -0
  6. package/lib/tests/fixtures/theia-fixture.js +24 -0
  7. package/lib/tests/fixtures/theia-fixture.js.map +1 -0
  8. package/lib/tests/theia-app.test.d.ts +1 -1
  9. package/lib/tests/theia-app.test.js +29 -29
  10. package/lib/tests/theia-application-shell.test.d.ts +2 -0
  11. package/lib/tests/theia-application-shell.test.d.ts.map +1 -0
  12. package/lib/tests/theia-application-shell.test.js +58 -0
  13. package/lib/tests/theia-application-shell.test.js.map +1 -0
  14. package/lib/tests/theia-explorer-view.test.d.ts +1 -1
  15. package/lib/tests/theia-explorer-view.test.js +183 -183
  16. package/lib/tests/theia-main-menu.test.d.ts +1 -1
  17. package/lib/tests/theia-main-menu.test.js +92 -92
  18. package/lib/tests/theia-output-view.test.d.ts +1 -1
  19. package/lib/tests/theia-output-view.test.js +78 -78
  20. package/lib/tests/theia-preference-view.test.d.ts +1 -1
  21. package/lib/tests/theia-preference-view.test.js +101 -101
  22. package/lib/tests/theia-problems-view.test.d.ts +1 -1
  23. package/lib/tests/theia-problems-view.test.js +54 -54
  24. package/lib/tests/theia-quick-command.test.d.ts +1 -1
  25. package/lib/tests/theia-quick-command.test.js +69 -69
  26. package/lib/tests/theia-sample-app.test.d.ts +1 -1
  27. package/lib/tests/theia-sample-app.test.js +57 -57
  28. package/lib/tests/theia-status-bar.test.d.ts +1 -1
  29. package/lib/tests/theia-status-bar.test.js +44 -44
  30. package/lib/tests/theia-terminal-view.test.d.ts +1 -1
  31. package/lib/tests/theia-terminal-view.test.js +78 -78
  32. package/lib/tests/theia-text-editor.test.d.ts +1 -1
  33. package/lib/tests/theia-text-editor.test.js +155 -155
  34. package/lib/tests/theia-toolbar.test.d.ts +1 -1
  35. package/lib/tests/theia-toolbar.test.js +61 -61
  36. package/lib/tests/theia-workspace.test.d.ts +1 -1
  37. package/lib/tests/theia-workspace.test.js +72 -72
  38. package/lib/theia-about-dialog.d.ts +4 -4
  39. package/lib/theia-about-dialog.js +26 -26
  40. package/lib/theia-app-loader.d.ts +19 -19
  41. package/lib/theia-app-loader.js +129 -129
  42. package/lib/theia-app.d.ts +50 -50
  43. package/lib/theia-app.js +153 -153
  44. package/lib/theia-context-menu.d.ts +8 -8
  45. package/lib/theia-context-menu.js +37 -37
  46. package/lib/theia-dialog.d.ts +28 -28
  47. package/lib/theia-dialog.js +99 -99
  48. package/lib/theia-editor.d.ts +9 -9
  49. package/lib/theia-editor.js +68 -68
  50. package/lib/theia-explorer-view.d.ts +47 -47
  51. package/lib/theia-explorer-view.js +273 -273
  52. package/lib/theia-main-menu.d.ts +12 -12
  53. package/lib/theia-main-menu.js +53 -53
  54. package/lib/theia-menu-item.d.ts +14 -14
  55. package/lib/theia-menu-item.js +66 -66
  56. package/lib/theia-menu.d.ts +16 -16
  57. package/lib/theia-menu.js +86 -86
  58. package/lib/theia-monaco-editor.d.ts +15 -15
  59. package/lib/theia-monaco-editor.js +75 -75
  60. package/lib/theia-notification-indicator.d.ts +7 -7
  61. package/lib/theia-notification-indicator.js +44 -44
  62. package/lib/theia-notification-overlay.d.ts +22 -22
  63. package/lib/theia-notification-overlay.js +79 -79
  64. package/lib/theia-output-channel.d.ts +24 -24
  65. package/lib/theia-output-channel.js +71 -71
  66. package/lib/theia-output-view.d.ts +9 -9
  67. package/lib/theia-output-view.js +81 -81
  68. package/lib/theia-page-object.d.ts +7 -7
  69. package/lib/theia-page-object.js +27 -27
  70. package/lib/theia-preference-view.d.ts +84 -84
  71. package/lib/theia-preference-view.js +209 -209
  72. package/lib/theia-problem-indicator.d.ts +8 -8
  73. package/lib/theia-problem-indicator.js +38 -38
  74. package/lib/theia-problem-view.d.ts +5 -5
  75. package/lib/theia-problem-view.js +30 -30
  76. package/lib/theia-quick-command-palette.d.ts +12 -12
  77. package/lib/theia-quick-command-palette.js +80 -80
  78. package/lib/theia-rename-dialog.d.ts +5 -5
  79. package/lib/theia-rename-dialog.js +35 -35
  80. package/lib/theia-status-bar.d.ts +13 -13
  81. package/lib/theia-status-bar.js +39 -39
  82. package/lib/theia-status-indicator.d.ts +10 -10
  83. package/lib/theia-status-indicator.js +48 -48
  84. package/lib/theia-terminal.d.ts +13 -13
  85. package/lib/theia-terminal.js +59 -59
  86. package/lib/theia-text-editor.d.ts +26 -26
  87. package/lib/theia-text-editor.js +120 -120
  88. package/lib/theia-toggle-bottom-indicator.d.ts +4 -4
  89. package/lib/theia-toggle-bottom-indicator.js +26 -26
  90. package/lib/theia-toolbar-item.d.ts +10 -10
  91. package/lib/theia-toolbar-item.js +39 -39
  92. package/lib/theia-toolbar.d.ts +19 -19
  93. package/lib/theia-toolbar.js +90 -90
  94. package/lib/theia-tree-node.d.ts +19 -19
  95. package/lib/theia-tree-node.js +72 -72
  96. package/lib/theia-view.d.ts +32 -32
  97. package/lib/theia-view.js +149 -149
  98. package/lib/theia-welcome-view.d.ts +6 -0
  99. package/lib/theia-welcome-view.d.ts.map +1 -0
  100. package/lib/theia-welcome-view.js +31 -0
  101. package/lib/theia-welcome-view.js.map +1 -0
  102. package/lib/theia-workspace.d.ts +18 -18
  103. package/lib/theia-workspace.js +69 -69
  104. package/lib/util.d.ts +19 -19
  105. package/lib/util.js +93 -93
  106. package/package.json +2 -2
  107. package/src/index.ts +46 -46
  108. package/src/tests/resources/sample-files1/sample.txt +4 -4
  109. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder1/sampleFolder1-1/sampleFile1-1-1.txt +1 -1
  110. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder1/sampleFolder1-1/sampleFile1-1-2.txt +1 -1
  111. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder1/sampleFolder1-2/sampleFile1-2-1.txt +1 -1
  112. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder1/sampleFolder1-2/sampleFile1-2-2.txt +1 -1
  113. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder2/sampleFolder2-1/sampleFile2-1-1.txt +1 -1
  114. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder2/sampleFolder2-1/sampleFile2-1-2.txt +1 -1
  115. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder2/sampleFolder2-2/sampleFile2-2-1.txt +1 -1
  116. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder2/sampleFolder2-2/sampleFile2-2-2.txt +1 -1
  117. package/src/tests/resources/sample-files2/another-sample.txt +1 -1
  118. package/src/tests/theia-app.test.ts +33 -33
  119. package/src/tests/theia-application-shell.test.ts +67 -0
  120. package/src/tests/theia-explorer-view.test.ts +211 -211
  121. package/src/tests/theia-main-menu.test.ts +112 -112
  122. package/src/tests/theia-output-view.test.ts +85 -85
  123. package/src/tests/theia-preference-view.test.ts +122 -122
  124. package/src/tests/theia-problems-view.test.ts +64 -64
  125. package/src/tests/theia-quick-command.test.ts +80 -80
  126. package/src/tests/theia-sample-app.test.ts +66 -66
  127. package/src/tests/theia-status-bar.test.ts +52 -52
  128. package/src/tests/theia-terminal-view.test.ts +90 -90
  129. package/src/tests/theia-text-editor.test.ts +187 -187
  130. package/src/tests/theia-toolbar.test.ts +69 -69
  131. package/src/tests/theia-workspace.test.ts +80 -80
  132. package/src/theia-about-dialog.ts +26 -26
  133. package/src/theia-app-loader.ts +167 -167
  134. package/src/theia-app.ts +188 -188
  135. package/src/theia-context-menu.ts +42 -42
  136. package/src/theia-dialog.ts +114 -114
  137. package/src/theia-editor.ts +73 -73
  138. package/src/theia-explorer-view.ts +311 -311
  139. package/src/theia-main-menu.ts +54 -54
  140. package/src/theia-menu-item.ts +75 -75
  141. package/src/theia-menu.ts +96 -96
  142. package/src/theia-monaco-editor.ts +83 -83
  143. package/src/theia-notification-indicator.ts +44 -44
  144. package/src/theia-notification-overlay.ts +94 -94
  145. package/src/theia-output-channel.ts +88 -88
  146. package/src/theia-output-view.ts +87 -87
  147. package/src/theia-page-object.ts +29 -29
  148. package/src/theia-preference-view.ts +240 -240
  149. package/src/theia-problem-indicator.ts +37 -37
  150. package/src/theia-problem-view.ts +30 -30
  151. package/src/theia-quick-command-palette.ts +83 -83
  152. package/src/theia-rename-dialog.ts +36 -36
  153. package/src/theia-status-bar.ts +44 -44
  154. package/src/theia-status-indicator.ts +50 -50
  155. package/src/theia-terminal.ts +69 -69
  156. package/src/theia-text-editor.ts +141 -141
  157. package/src/theia-toggle-bottom-indicator.ts +21 -21
  158. package/src/theia-toolbar-item.ts +41 -41
  159. package/src/theia-toolbar.ts +99 -99
  160. package/src/theia-tree-node.ts +81 -81
  161. package/src/theia-view.ts +177 -177
  162. package/src/theia-welcome-view.ts +31 -0
  163. package/src/theia-workspace.ts +76 -76
  164. package/src/util.ts +91 -91
@@ -1,29 +1,29 @@
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 { Page } from '@playwright/test';
18
-
19
- import { TheiaApp } from './theia-app';
20
-
21
- export abstract class TheiaPageObject {
22
-
23
- constructor(public app: TheiaApp) { }
24
-
25
- get page(): Page {
26
- return this.app.page;
27
- }
28
-
29
- }
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 { Page } from '@playwright/test';
18
+
19
+ import { TheiaApp } from './theia-app';
20
+
21
+ export abstract class TheiaPageObject {
22
+
23
+ constructor(public app: TheiaApp) { }
24
+
25
+ get page(): Page {
26
+ return this.app.page;
27
+ }
28
+
29
+ }
@@ -1,240 +1,240 @@
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
- import { TheiaApp } from './theia-app';
19
- import { TheiaView } from './theia-view';
20
-
21
- const TheiaSettingsViewData = {
22
- tabSelector: '#shell-tab-settings_widget',
23
- viewSelector: '#settings_widget'
24
- };
25
-
26
- export const PreferenceIds = {
27
- Editor: {
28
- AutoSave: 'files.autoSave',
29
- RenderWhitespace: 'editor.renderWhitespace'
30
- },
31
- Explorer: {
32
- AutoReveal: 'explorer.autoReveal'
33
- },
34
- DiffEditor: {
35
- MaxComputationTime: 'diffEditor.maxComputationTime'
36
- },
37
- Files: {
38
- EnableTrash: 'files.enableTrash'
39
- }
40
- };
41
-
42
- export const DefaultPreferences = {
43
- Editor: {
44
- AutoSave: {
45
- Off: 'off',
46
- AfterDelay: 'afterDelay',
47
- OnFocusChange: 'onFocusChange',
48
- OnWindowChange: 'onWindowChange'
49
- },
50
- RenderWhitespace: {
51
- None: 'none',
52
- Boundary: 'boundary',
53
- Selection: 'selection',
54
- Trailing: 'trailing',
55
- All: 'all'
56
- }
57
- },
58
- Explorer: {
59
- AutoReveal: {
60
- Enabled: true
61
- }
62
- },
63
- DiffEditor: {
64
- MaxComputationTime: '5000'
65
- },
66
- Files: {
67
- EnableTrash: {
68
- Enabled: true
69
- }
70
- }
71
- };
72
-
73
- export enum TheiaPreferenceScope {
74
- User = 'User',
75
- Workspace = 'Workspace'
76
- }
77
-
78
- export class TheiaPreferenceView extends TheiaView {
79
- public customTimeout?: number;
80
- protected modificationIndicator = '.theia-mod-item-modified';
81
- protected optionSelectLabel = '.theia-select-component-label';
82
- protected optionSelectDropdown = '.theia-select-component-dropdown';
83
- protected optionSelectDropdownValue = '.theia-select-component-option-value';
84
-
85
- constructor(app: TheiaApp) {
86
- super(TheiaSettingsViewData, app);
87
- }
88
-
89
- override async open(preferenceScope = TheiaPreferenceScope.Workspace): Promise<TheiaView> {
90
- await this.app.quickCommandPalette.trigger('Preferences: Open Settings (UI)');
91
- await this.waitForVisible();
92
- await this.openPreferenceScope(preferenceScope);
93
- return this;
94
- }
95
-
96
- protected getScopeSelector(scope: TheiaPreferenceScope): string {
97
- return `li.preferences-scope-tab div.p-TabBar-tabLabel:has-text("${scope}")`;
98
- }
99
-
100
- async openPreferenceScope(scope: TheiaPreferenceScope): Promise<void> {
101
- await this.activate();
102
- const scopeTab = await this.page.waitForSelector(this.getScopeSelector(scope));
103
- await scopeTab.click();
104
- }
105
-
106
- async getBooleanPreferenceByPath(sectionTitle: string, name: string): Promise<boolean> {
107
- const preferenceId = await this.findPreferenceId(sectionTitle, name);
108
- return this.getBooleanPreferenceById(preferenceId);
109
- }
110
-
111
- async getBooleanPreferenceById(preferenceId: string): Promise<boolean> {
112
- const element = await this.findPreferenceEditorById(preferenceId);
113
- return element.isChecked();
114
- }
115
-
116
- async setBooleanPreferenceByPath(sectionTitle: string, name: string, value: boolean): Promise<void> {
117
- const preferenceId = await this.findPreferenceId(sectionTitle, name);
118
- return this.setBooleanPreferenceById(preferenceId, value);
119
- }
120
-
121
- async setBooleanPreferenceById(preferenceId: string, value: boolean): Promise<void> {
122
- const element = await this.findPreferenceEditorById(preferenceId);
123
- return value ? element.check() : element.uncheck();
124
- }
125
-
126
- async getStringPreferenceByPath(sectionTitle: string, name: string): Promise<string> {
127
- const preferenceId = await this.findPreferenceId(sectionTitle, name);
128
- return this.getStringPreferenceById(preferenceId);
129
- }
130
-
131
- async getStringPreferenceById(preferenceId: string): Promise<string> {
132
- const element = await this.findPreferenceEditorById(preferenceId);
133
- return element.evaluate(e => (e as HTMLInputElement).value);
134
- }
135
-
136
- async setStringPreferenceByPath(sectionTitle: string, name: string, value: string): Promise<void> {
137
- const preferenceId = await this.findPreferenceId(sectionTitle, name);
138
- return this.setStringPreferenceById(preferenceId, value);
139
- }
140
-
141
- async setStringPreferenceById(preferenceId: string, value: string): Promise<void> {
142
- const element = await this.findPreferenceEditorById(preferenceId);
143
- return element.fill(value);
144
- }
145
-
146
- async getOptionsPreferenceByPath(sectionTitle: string, name: string): Promise<string> {
147
- const preferenceId = await this.findPreferenceId(sectionTitle, name);
148
- return this.getOptionsPreferenceById(preferenceId);
149
- }
150
-
151
- async getOptionsPreferenceById(preferenceId: string): Promise<string> {
152
- const element = await this.findPreferenceEditorById(preferenceId, this.optionSelectLabel);
153
- return element.evaluate(e => e.textContent ?? '');
154
- }
155
-
156
- async setOptionsPreferenceByPath(sectionTitle: string, name: string, value: string): Promise<void> {
157
- const preferenceId = await this.findPreferenceId(sectionTitle, name);
158
- return this.setOptionsPreferenceById(preferenceId, value);
159
- }
160
-
161
- async setOptionsPreferenceById(preferenceId: string, value: string): Promise<void> {
162
- const element = await this.findPreferenceEditorById(preferenceId, this.optionSelectLabel);
163
- await element.click();
164
- const option = await this.page.waitForSelector(`${this.optionSelectDropdown} ${this.optionSelectDropdownValue}:has-text("${value}")`);
165
- await option.click();
166
- }
167
-
168
- async resetPreferenceByPath(sectionTitle: string, name: string): Promise<void> {
169
- const preferenceId = await this.findPreferenceId(sectionTitle, name);
170
- return this.resetPreferenceById(preferenceId);
171
- }
172
-
173
- async resetPreferenceById(preferenceId: string): Promise<void> {
174
- // this is just to fail if the preference doesn't exist at all
175
- await this.findPreferenceEditorById(preferenceId, '');
176
- const resetPreferenceButton = await this.findPreferenceResetButton(preferenceId);
177
- await resetPreferenceButton.click();
178
- await this.waitForUnmodified(preferenceId);
179
- }
180
-
181
- private async findPreferenceId(sectionTitle: string, name: string): Promise<string> {
182
- const viewElement = await this.viewElement();
183
- const sectionElement = await viewElement?.$(`xpath=//li[contains(@class, 'settings-section-title') and text() = '${sectionTitle}']/..`);
184
-
185
- const firstPreferenceAfterSection = await sectionElement?.$(`xpath=following-sibling::li[div/text() = '${name}'][1]`);
186
- const preferenceId = await firstPreferenceAfterSection?.getAttribute('data-pref-id');
187
- if (!preferenceId) {
188
- throw new Error(`Could not find preference id for "${sectionTitle}" > (...) > "${name}"`);
189
- }
190
- return preferenceId;
191
- }
192
-
193
- private async findPreferenceEditorById(preferenceId: string, elementType: string = 'input'): Promise<ElementHandle<SVGElement | HTMLElement>> {
194
- const viewElement = await this.viewElement();
195
- const element = await viewElement?.waitForSelector(this.getPreferenceEditorSelector(preferenceId, elementType), { timeout: this.customTimeout });
196
- if (!element) {
197
- throw new Error(`Could not find element with preference id "${preferenceId}"`);
198
- }
199
- return element;
200
- }
201
-
202
- private getPreferenceSelector(preferenceId: string): string {
203
- return `li[data-pref-id="${preferenceId}"]`;
204
- }
205
-
206
- private getPreferenceEditorSelector(preferenceId: string, elementType: string): string {
207
- return `${this.getPreferenceSelector(preferenceId)} ${elementType}`;
208
- }
209
-
210
- private async findPreferenceResetButton(preferenceId: string): Promise<ElementHandle<SVGElement | HTMLElement>> {
211
- await this.activate();
212
- const viewElement = await this.viewElement();
213
- const settingsContextMenuBtn = await viewElement?.waitForSelector(`${this.getPreferenceSelector(preferenceId)} .settings-context-menu-btn`);
214
- if (!settingsContextMenuBtn) {
215
- throw new Error(`Could not find context menu button for element with preference id "${preferenceId}"`);
216
- }
217
- await settingsContextMenuBtn.click();
218
- const resetPreferenceButton = await this.page.waitForSelector('li[data-command="preferences:reset"]');
219
- if (!resetPreferenceButton) {
220
- throw new Error(`Could not find menu entry to reset preference with id "${preferenceId}"`);
221
- }
222
- return resetPreferenceButton;
223
- }
224
-
225
- async waitForModified(preferenceId: string): Promise<void> {
226
- await this.activate();
227
- const viewElement = await this.viewElement();
228
- await viewElement?.waitForSelector(`${this.getPreferenceGutterSelector(preferenceId)}${this.modificationIndicator}`, { timeout: this.customTimeout });
229
- }
230
-
231
- async waitForUnmodified(preferenceId: string): Promise<void> {
232
- await this.activate();
233
- const viewElement = await this.viewElement();
234
- await viewElement?.waitForSelector(`${this.getPreferenceGutterSelector(preferenceId)}${this.modificationIndicator}`, { state: 'detached', timeout: this.customTimeout });
235
- }
236
-
237
- private getPreferenceGutterSelector(preferenceId: string): string {
238
- return `${this.getPreferenceSelector(preferenceId)} .pref-context-gutter`;
239
- }
240
- }
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
+ import { TheiaApp } from './theia-app';
19
+ import { TheiaView } from './theia-view';
20
+
21
+ const TheiaSettingsViewData = {
22
+ tabSelector: '#shell-tab-settings_widget',
23
+ viewSelector: '#settings_widget'
24
+ };
25
+
26
+ export const PreferenceIds = {
27
+ Editor: {
28
+ AutoSave: 'files.autoSave',
29
+ RenderWhitespace: 'editor.renderWhitespace'
30
+ },
31
+ Explorer: {
32
+ AutoReveal: 'explorer.autoReveal'
33
+ },
34
+ DiffEditor: {
35
+ MaxComputationTime: 'diffEditor.maxComputationTime'
36
+ },
37
+ Files: {
38
+ EnableTrash: 'files.enableTrash'
39
+ }
40
+ };
41
+
42
+ export const DefaultPreferences = {
43
+ Editor: {
44
+ AutoSave: {
45
+ Off: 'off',
46
+ AfterDelay: 'afterDelay',
47
+ OnFocusChange: 'onFocusChange',
48
+ OnWindowChange: 'onWindowChange'
49
+ },
50
+ RenderWhitespace: {
51
+ None: 'none',
52
+ Boundary: 'boundary',
53
+ Selection: 'selection',
54
+ Trailing: 'trailing',
55
+ All: 'all'
56
+ }
57
+ },
58
+ Explorer: {
59
+ AutoReveal: {
60
+ Enabled: true
61
+ }
62
+ },
63
+ DiffEditor: {
64
+ MaxComputationTime: '5000'
65
+ },
66
+ Files: {
67
+ EnableTrash: {
68
+ Enabled: true
69
+ }
70
+ }
71
+ };
72
+
73
+ export enum TheiaPreferenceScope {
74
+ User = 'User',
75
+ Workspace = 'Workspace'
76
+ }
77
+
78
+ export class TheiaPreferenceView extends TheiaView {
79
+ public customTimeout?: number;
80
+ protected modificationIndicator = '.theia-mod-item-modified';
81
+ protected optionSelectLabel = '.theia-select-component-label';
82
+ protected optionSelectDropdown = '.theia-select-component-dropdown';
83
+ protected optionSelectDropdownValue = '.theia-select-component-option-value';
84
+
85
+ constructor(app: TheiaApp) {
86
+ super(TheiaSettingsViewData, app);
87
+ }
88
+
89
+ override async open(preferenceScope = TheiaPreferenceScope.Workspace): Promise<TheiaView> {
90
+ await this.app.quickCommandPalette.trigger('Preferences: Open Settings (UI)');
91
+ await this.waitForVisible();
92
+ await this.openPreferenceScope(preferenceScope);
93
+ return this;
94
+ }
95
+
96
+ protected getScopeSelector(scope: TheiaPreferenceScope): string {
97
+ return `li.preferences-scope-tab div.p-TabBar-tabLabel:has-text("${scope}")`;
98
+ }
99
+
100
+ async openPreferenceScope(scope: TheiaPreferenceScope): Promise<void> {
101
+ await this.activate();
102
+ const scopeTab = await this.page.waitForSelector(this.getScopeSelector(scope));
103
+ await scopeTab.click();
104
+ }
105
+
106
+ async getBooleanPreferenceByPath(sectionTitle: string, name: string): Promise<boolean> {
107
+ const preferenceId = await this.findPreferenceId(sectionTitle, name);
108
+ return this.getBooleanPreferenceById(preferenceId);
109
+ }
110
+
111
+ async getBooleanPreferenceById(preferenceId: string): Promise<boolean> {
112
+ const element = await this.findPreferenceEditorById(preferenceId);
113
+ return element.isChecked();
114
+ }
115
+
116
+ async setBooleanPreferenceByPath(sectionTitle: string, name: string, value: boolean): Promise<void> {
117
+ const preferenceId = await this.findPreferenceId(sectionTitle, name);
118
+ return this.setBooleanPreferenceById(preferenceId, value);
119
+ }
120
+
121
+ async setBooleanPreferenceById(preferenceId: string, value: boolean): Promise<void> {
122
+ const element = await this.findPreferenceEditorById(preferenceId);
123
+ return value ? element.check() : element.uncheck();
124
+ }
125
+
126
+ async getStringPreferenceByPath(sectionTitle: string, name: string): Promise<string> {
127
+ const preferenceId = await this.findPreferenceId(sectionTitle, name);
128
+ return this.getStringPreferenceById(preferenceId);
129
+ }
130
+
131
+ async getStringPreferenceById(preferenceId: string): Promise<string> {
132
+ const element = await this.findPreferenceEditorById(preferenceId);
133
+ return element.evaluate(e => (e as HTMLInputElement).value);
134
+ }
135
+
136
+ async setStringPreferenceByPath(sectionTitle: string, name: string, value: string): Promise<void> {
137
+ const preferenceId = await this.findPreferenceId(sectionTitle, name);
138
+ return this.setStringPreferenceById(preferenceId, value);
139
+ }
140
+
141
+ async setStringPreferenceById(preferenceId: string, value: string): Promise<void> {
142
+ const element = await this.findPreferenceEditorById(preferenceId);
143
+ return element.fill(value);
144
+ }
145
+
146
+ async getOptionsPreferenceByPath(sectionTitle: string, name: string): Promise<string> {
147
+ const preferenceId = await this.findPreferenceId(sectionTitle, name);
148
+ return this.getOptionsPreferenceById(preferenceId);
149
+ }
150
+
151
+ async getOptionsPreferenceById(preferenceId: string): Promise<string> {
152
+ const element = await this.findPreferenceEditorById(preferenceId, this.optionSelectLabel);
153
+ return element.evaluate(e => e.textContent ?? '');
154
+ }
155
+
156
+ async setOptionsPreferenceByPath(sectionTitle: string, name: string, value: string): Promise<void> {
157
+ const preferenceId = await this.findPreferenceId(sectionTitle, name);
158
+ return this.setOptionsPreferenceById(preferenceId, value);
159
+ }
160
+
161
+ async setOptionsPreferenceById(preferenceId: string, value: string): Promise<void> {
162
+ const element = await this.findPreferenceEditorById(preferenceId, this.optionSelectLabel);
163
+ await element.click();
164
+ const option = await this.page.waitForSelector(`${this.optionSelectDropdown} ${this.optionSelectDropdownValue}:has-text("${value}")`);
165
+ await option.click();
166
+ }
167
+
168
+ async resetPreferenceByPath(sectionTitle: string, name: string): Promise<void> {
169
+ const preferenceId = await this.findPreferenceId(sectionTitle, name);
170
+ return this.resetPreferenceById(preferenceId);
171
+ }
172
+
173
+ async resetPreferenceById(preferenceId: string): Promise<void> {
174
+ // this is just to fail if the preference doesn't exist at all
175
+ await this.findPreferenceEditorById(preferenceId, '');
176
+ const resetPreferenceButton = await this.findPreferenceResetButton(preferenceId);
177
+ await resetPreferenceButton.click();
178
+ await this.waitForUnmodified(preferenceId);
179
+ }
180
+
181
+ private async findPreferenceId(sectionTitle: string, name: string): Promise<string> {
182
+ const viewElement = await this.viewElement();
183
+ const sectionElement = await viewElement?.$(`xpath=//li[contains(@class, 'settings-section-title') and text() = '${sectionTitle}']/..`);
184
+
185
+ const firstPreferenceAfterSection = await sectionElement?.$(`xpath=following-sibling::li[div/text() = '${name}'][1]`);
186
+ const preferenceId = await firstPreferenceAfterSection?.getAttribute('data-pref-id');
187
+ if (!preferenceId) {
188
+ throw new Error(`Could not find preference id for "${sectionTitle}" > (...) > "${name}"`);
189
+ }
190
+ return preferenceId;
191
+ }
192
+
193
+ private async findPreferenceEditorById(preferenceId: string, elementType: string = 'input'): Promise<ElementHandle<SVGElement | HTMLElement>> {
194
+ const viewElement = await this.viewElement();
195
+ const element = await viewElement?.waitForSelector(this.getPreferenceEditorSelector(preferenceId, elementType), { timeout: this.customTimeout });
196
+ if (!element) {
197
+ throw new Error(`Could not find element with preference id "${preferenceId}"`);
198
+ }
199
+ return element;
200
+ }
201
+
202
+ private getPreferenceSelector(preferenceId: string): string {
203
+ return `li[data-pref-id="${preferenceId}"]`;
204
+ }
205
+
206
+ private getPreferenceEditorSelector(preferenceId: string, elementType: string): string {
207
+ return `${this.getPreferenceSelector(preferenceId)} ${elementType}`;
208
+ }
209
+
210
+ private async findPreferenceResetButton(preferenceId: string): Promise<ElementHandle<SVGElement | HTMLElement>> {
211
+ await this.activate();
212
+ const viewElement = await this.viewElement();
213
+ const settingsContextMenuBtn = await viewElement?.waitForSelector(`${this.getPreferenceSelector(preferenceId)} .settings-context-menu-btn`);
214
+ if (!settingsContextMenuBtn) {
215
+ throw new Error(`Could not find context menu button for element with preference id "${preferenceId}"`);
216
+ }
217
+ await settingsContextMenuBtn.click();
218
+ const resetPreferenceButton = await this.page.waitForSelector('li[data-command="preferences:reset"]');
219
+ if (!resetPreferenceButton) {
220
+ throw new Error(`Could not find menu entry to reset preference with id "${preferenceId}"`);
221
+ }
222
+ return resetPreferenceButton;
223
+ }
224
+
225
+ async waitForModified(preferenceId: string): Promise<void> {
226
+ await this.activate();
227
+ const viewElement = await this.viewElement();
228
+ await viewElement?.waitForSelector(`${this.getPreferenceGutterSelector(preferenceId)}${this.modificationIndicator}`, { timeout: this.customTimeout });
229
+ }
230
+
231
+ async waitForUnmodified(preferenceId: string): Promise<void> {
232
+ await this.activate();
233
+ const viewElement = await this.viewElement();
234
+ await viewElement?.waitForSelector(`${this.getPreferenceGutterSelector(preferenceId)}${this.modificationIndicator}`, { state: 'detached', timeout: this.customTimeout });
235
+ }
236
+
237
+ private getPreferenceGutterSelector(preferenceId: string): string {
238
+ return `${this.getPreferenceSelector(preferenceId)} .pref-context-gutter`;
239
+ }
240
+ }
@@ -1,37 +1,37 @@
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
- import { TheiaStatusIndicator } from './theia-status-indicator';
19
-
20
- export class TheiaProblemIndicator extends TheiaStatusIndicator {
21
- id = 'problem-marker-status';
22
-
23
- async numberOfProblems(): Promise<number> {
24
- const spans = await this.getSpans();
25
- return spans ? +await spans[1].innerText() : -1;
26
- }
27
-
28
- async numberOfWarnings(): Promise<number> {
29
- const spans = await this.getSpans();
30
- return spans ? +await spans[3].innerText() : -1;
31
- }
32
-
33
- protected async getSpans(): Promise<ElementHandle[] | undefined> {
34
- const handle = await this.getElementHandle();
35
- return handle?.$$('span');
36
- }
37
- }
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
+ import { TheiaStatusIndicator } from './theia-status-indicator';
19
+
20
+ export class TheiaProblemIndicator extends TheiaStatusIndicator {
21
+ id = 'problem-marker-status';
22
+
23
+ async numberOfProblems(): Promise<number> {
24
+ const spans = await this.getSpans();
25
+ return spans ? +await spans[1].innerText() : -1;
26
+ }
27
+
28
+ async numberOfWarnings(): Promise<number> {
29
+ const spans = await this.getSpans();
30
+ return spans ? +await spans[3].innerText() : -1;
31
+ }
32
+
33
+ protected async getSpans(): Promise<ElementHandle[] | undefined> {
34
+ const handle = await this.getElementHandle();
35
+ return handle?.$$('span');
36
+ }
37
+ }