@theia/playwright 1.48.1 → 1.48.2
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.
- package/README.md +54 -54
- package/lib/index.d.ts +30 -30
- package/lib/index.js +48 -48
- package/lib/tests/theia-app.test.d.ts +1 -1
- package/lib/tests/theia-app.test.js +29 -29
- package/lib/tests/theia-application-shell.test.d.ts +1 -1
- package/lib/tests/theia-application-shell.test.js +57 -57
- package/lib/tests/theia-explorer-view.test.d.ts +1 -1
- package/lib/tests/theia-explorer-view.test.js +183 -183
- package/lib/tests/theia-getting-started.test.d.ts +1 -1
- package/lib/tests/theia-getting-started.test.js +45 -45
- package/lib/tests/theia-main-menu.test.d.ts +1 -1
- package/lib/tests/theia-main-menu.test.js +111 -111
- package/lib/tests/theia-output-view.test.d.ts +1 -1
- package/lib/tests/theia-output-view.test.js +78 -78
- package/lib/tests/theia-preference-view.test.d.ts +1 -1
- package/lib/tests/theia-preference-view.test.js +101 -101
- package/lib/tests/theia-problems-view.test.d.ts +1 -1
- package/lib/tests/theia-problems-view.test.js +54 -54
- package/lib/tests/theia-quick-command.test.d.ts +1 -1
- package/lib/tests/theia-quick-command.test.js +69 -69
- package/lib/tests/theia-sample-app.test.d.ts +1 -1
- package/lib/tests/theia-sample-app.test.js +57 -57
- package/lib/tests/theia-status-bar.test.d.ts +1 -1
- package/lib/tests/theia-status-bar.test.js +44 -44
- package/lib/tests/theia-terminal-view.test.d.ts +1 -1
- package/lib/tests/theia-terminal-view.test.js +78 -78
- package/lib/tests/theia-text-editor.test.d.ts +1 -1
- package/lib/tests/theia-text-editor.test.js +155 -155
- package/lib/tests/theia-toolbar.test.d.ts +1 -1
- package/lib/tests/theia-toolbar.test.js +61 -61
- package/lib/tests/theia-workspace.test.d.ts +1 -1
- package/lib/tests/theia-workspace.test.js +72 -72
- package/lib/theia-about-dialog.d.ts +4 -4
- package/lib/theia-about-dialog.js +26 -26
- package/lib/theia-app-loader.d.ts +19 -19
- package/lib/theia-app-loader.js +129 -129
- package/lib/theia-app.d.ts +50 -50
- package/lib/theia-app.js +153 -153
- package/lib/theia-context-menu.d.ts +8 -8
- package/lib/theia-context-menu.js +37 -37
- package/lib/theia-dialog.d.ts +28 -28
- package/lib/theia-dialog.js +99 -99
- package/lib/theia-editor.d.ts +9 -9
- package/lib/theia-editor.js +68 -68
- package/lib/theia-explorer-view.d.ts +47 -47
- package/lib/theia-explorer-view.js +273 -273
- package/lib/theia-main-menu.d.ts +12 -12
- package/lib/theia-main-menu.js +53 -53
- package/lib/theia-menu-item.d.ts +14 -14
- package/lib/theia-menu-item.js +66 -66
- package/lib/theia-menu.d.ts +16 -16
- package/lib/theia-menu.js +86 -86
- package/lib/theia-monaco-editor.d.ts +15 -15
- package/lib/theia-monaco-editor.js +75 -75
- package/lib/theia-notification-indicator.d.ts +7 -7
- package/lib/theia-notification-indicator.js +44 -44
- package/lib/theia-notification-overlay.d.ts +22 -22
- package/lib/theia-notification-overlay.js +79 -79
- package/lib/theia-output-channel.d.ts +24 -24
- package/lib/theia-output-channel.js +71 -71
- package/lib/theia-output-view.d.ts +9 -9
- package/lib/theia-output-view.js +81 -81
- package/lib/theia-page-object.d.ts +7 -7
- package/lib/theia-page-object.js +27 -27
- package/lib/theia-preference-view.d.ts +84 -84
- package/lib/theia-preference-view.js +209 -209
- package/lib/theia-problem-indicator.d.ts +8 -8
- package/lib/theia-problem-indicator.js +38 -38
- package/lib/theia-problem-view.d.ts +5 -5
- package/lib/theia-problem-view.js +30 -30
- package/lib/theia-quick-command-palette.d.ts +12 -12
- package/lib/theia-quick-command-palette.js +78 -78
- package/lib/theia-rename-dialog.d.ts +5 -5
- package/lib/theia-rename-dialog.js +34 -34
- package/lib/theia-status-bar.d.ts +13 -13
- package/lib/theia-status-bar.js +39 -39
- package/lib/theia-status-indicator.d.ts +10 -10
- package/lib/theia-status-indicator.js +48 -48
- package/lib/theia-terminal.d.ts +13 -13
- package/lib/theia-terminal.js +59 -59
- package/lib/theia-text-editor.d.ts +26 -26
- package/lib/theia-text-editor.js +120 -120
- package/lib/theia-toggle-bottom-indicator.d.ts +4 -4
- package/lib/theia-toggle-bottom-indicator.js +26 -26
- package/lib/theia-toolbar-item.d.ts +10 -10
- package/lib/theia-toolbar-item.js +39 -39
- package/lib/theia-toolbar.d.ts +19 -19
- package/lib/theia-toolbar.js +90 -90
- package/lib/theia-tree-node.d.ts +19 -19
- package/lib/theia-tree-node.js +72 -72
- package/lib/theia-view.d.ts +32 -32
- package/lib/theia-view.js +149 -149
- package/lib/theia-welcome-view.d.ts +5 -5
- package/lib/theia-welcome-view.js +30 -30
- package/lib/theia-workspace.d.ts +18 -18
- package/lib/theia-workspace.js +69 -69
- package/lib/util.d.ts +19 -19
- package/lib/util.js +93 -93
- package/package.json +2 -2
- package/src/index.ts +46 -46
- package/src/tests/resources/sample-files1/sample.txt +4 -4
- package/src/tests/resources/sample-files1/sampleFolder/sampleFolder1/sampleFolder1-1/sampleFile1-1-1.txt +1 -1
- package/src/tests/resources/sample-files1/sampleFolder/sampleFolder1/sampleFolder1-1/sampleFile1-1-2.txt +1 -1
- package/src/tests/resources/sample-files1/sampleFolder/sampleFolder1/sampleFolder1-2/sampleFile1-2-1.txt +1 -1
- package/src/tests/resources/sample-files1/sampleFolder/sampleFolder1/sampleFolder1-2/sampleFile1-2-2.txt +1 -1
- package/src/tests/resources/sample-files1/sampleFolder/sampleFolder2/sampleFolder2-1/sampleFile2-1-1.txt +1 -1
- package/src/tests/resources/sample-files1/sampleFolder/sampleFolder2/sampleFolder2-1/sampleFile2-1-2.txt +1 -1
- package/src/tests/resources/sample-files1/sampleFolder/sampleFolder2/sampleFolder2-2/sampleFile2-2-1.txt +1 -1
- package/src/tests/resources/sample-files1/sampleFolder/sampleFolder2/sampleFolder2-2/sampleFile2-2-2.txt +1 -1
- package/src/tests/resources/sample-files2/another-sample.txt +1 -1
- package/src/tests/theia-app.test.ts +33 -33
- package/src/tests/theia-application-shell.test.ts +67 -67
- package/src/tests/theia-explorer-view.test.ts +211 -211
- package/src/tests/theia-getting-started.test.ts +50 -50
- package/src/tests/theia-main-menu.test.ts +133 -133
- package/src/tests/theia-output-view.test.ts +85 -85
- package/src/tests/theia-preference-view.test.ts +122 -122
- package/src/tests/theia-problems-view.test.ts +64 -64
- package/src/tests/theia-quick-command.test.ts +80 -80
- package/src/tests/theia-sample-app.test.ts +66 -66
- package/src/tests/theia-status-bar.test.ts +52 -52
- package/src/tests/theia-terminal-view.test.ts +90 -90
- package/src/tests/theia-text-editor.test.ts +187 -187
- package/src/tests/theia-toolbar.test.ts +69 -69
- package/src/tests/theia-workspace.test.ts +80 -80
- package/src/theia-about-dialog.ts +26 -26
- package/src/theia-app-loader.ts +167 -167
- package/src/theia-app.ts +188 -188
- package/src/theia-context-menu.ts +42 -42
- package/src/theia-dialog.ts +114 -114
- package/src/theia-editor.ts +73 -73
- package/src/theia-explorer-view.ts +311 -311
- package/src/theia-main-menu.ts +54 -54
- package/src/theia-menu-item.ts +75 -75
- package/src/theia-menu.ts +96 -96
- package/src/theia-monaco-editor.ts +83 -83
- package/src/theia-notification-indicator.ts +44 -44
- package/src/theia-notification-overlay.ts +94 -94
- package/src/theia-output-channel.ts +88 -88
- package/src/theia-output-view.ts +87 -87
- package/src/theia-page-object.ts +29 -29
- package/src/theia-preference-view.ts +240 -240
- package/src/theia-problem-indicator.ts +37 -37
- package/src/theia-problem-view.ts +30 -30
- package/src/theia-quick-command-palette.ts +81 -81
- package/src/theia-rename-dialog.ts +35 -35
- package/src/theia-status-bar.ts +44 -44
- package/src/theia-status-indicator.ts +50 -50
- package/src/theia-terminal.ts +69 -69
- package/src/theia-text-editor.ts +141 -141
- package/src/theia-toggle-bottom-indicator.ts +21 -21
- package/src/theia-toolbar-item.ts +41 -41
- package/src/theia-toolbar.ts +99 -99
- package/src/theia-tree-node.ts +81 -81
- package/src/theia-view.ts +177 -177
- package/src/theia-welcome-view.ts +31 -31
- package/src/theia-workspace.ts +76 -76
- package/src/util.ts +91 -91
package/src/theia-page-object.ts
CHANGED
|
@@ -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
|
+
}
|