@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.
Files changed (159) 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 +1 -1
  11. package/lib/tests/theia-getting-started.test.js +45 -45
  12. package/lib/tests/theia-main-menu.test.d.ts +1 -1
  13. package/lib/tests/theia-main-menu.test.js +111 -111
  14. package/lib/tests/theia-output-view.test.d.ts +1 -1
  15. package/lib/tests/theia-output-view.test.js +78 -78
  16. package/lib/tests/theia-preference-view.test.d.ts +1 -1
  17. package/lib/tests/theia-preference-view.test.js +101 -101
  18. package/lib/tests/theia-problems-view.test.d.ts +1 -1
  19. package/lib/tests/theia-problems-view.test.js +54 -54
  20. package/lib/tests/theia-quick-command.test.d.ts +1 -1
  21. package/lib/tests/theia-quick-command.test.js +69 -69
  22. package/lib/tests/theia-sample-app.test.d.ts +1 -1
  23. package/lib/tests/theia-sample-app.test.js +57 -57
  24. package/lib/tests/theia-status-bar.test.d.ts +1 -1
  25. package/lib/tests/theia-status-bar.test.js +44 -44
  26. package/lib/tests/theia-terminal-view.test.d.ts +1 -1
  27. package/lib/tests/theia-terminal-view.test.js +78 -78
  28. package/lib/tests/theia-text-editor.test.d.ts +1 -1
  29. package/lib/tests/theia-text-editor.test.js +155 -155
  30. package/lib/tests/theia-toolbar.test.d.ts +1 -1
  31. package/lib/tests/theia-toolbar.test.js +61 -61
  32. package/lib/tests/theia-workspace.test.d.ts +1 -1
  33. package/lib/tests/theia-workspace.test.js +72 -72
  34. package/lib/theia-about-dialog.d.ts +4 -4
  35. package/lib/theia-about-dialog.js +26 -26
  36. package/lib/theia-app-loader.d.ts +19 -19
  37. package/lib/theia-app-loader.js +129 -129
  38. package/lib/theia-app.d.ts +50 -50
  39. package/lib/theia-app.js +153 -153
  40. package/lib/theia-context-menu.d.ts +8 -8
  41. package/lib/theia-context-menu.js +37 -37
  42. package/lib/theia-dialog.d.ts +28 -28
  43. package/lib/theia-dialog.js +99 -99
  44. package/lib/theia-editor.d.ts +9 -9
  45. package/lib/theia-editor.js +68 -68
  46. package/lib/theia-explorer-view.d.ts +47 -47
  47. package/lib/theia-explorer-view.js +273 -273
  48. package/lib/theia-main-menu.d.ts +12 -12
  49. package/lib/theia-main-menu.js +53 -53
  50. package/lib/theia-menu-item.d.ts +14 -14
  51. package/lib/theia-menu-item.js +66 -66
  52. package/lib/theia-menu.d.ts +16 -16
  53. package/lib/theia-menu.js +86 -86
  54. package/lib/theia-monaco-editor.d.ts +15 -15
  55. package/lib/theia-monaco-editor.js +75 -75
  56. package/lib/theia-notification-indicator.d.ts +7 -7
  57. package/lib/theia-notification-indicator.js +44 -44
  58. package/lib/theia-notification-overlay.d.ts +22 -22
  59. package/lib/theia-notification-overlay.js +79 -79
  60. package/lib/theia-output-channel.d.ts +24 -24
  61. package/lib/theia-output-channel.js +71 -71
  62. package/lib/theia-output-view.d.ts +9 -9
  63. package/lib/theia-output-view.js +81 -81
  64. package/lib/theia-page-object.d.ts +7 -7
  65. package/lib/theia-page-object.js +27 -27
  66. package/lib/theia-preference-view.d.ts +84 -84
  67. package/lib/theia-preference-view.js +209 -209
  68. package/lib/theia-problem-indicator.d.ts +8 -8
  69. package/lib/theia-problem-indicator.js +38 -38
  70. package/lib/theia-problem-view.d.ts +5 -5
  71. package/lib/theia-problem-view.js +30 -30
  72. package/lib/theia-quick-command-palette.d.ts +12 -12
  73. package/lib/theia-quick-command-palette.js +78 -78
  74. package/lib/theia-rename-dialog.d.ts +5 -5
  75. package/lib/theia-rename-dialog.js +34 -34
  76. package/lib/theia-status-bar.d.ts +13 -13
  77. package/lib/theia-status-bar.js +39 -39
  78. package/lib/theia-status-indicator.d.ts +10 -10
  79. package/lib/theia-status-indicator.js +48 -48
  80. package/lib/theia-terminal.d.ts +13 -13
  81. package/lib/theia-terminal.js +59 -59
  82. package/lib/theia-text-editor.d.ts +26 -26
  83. package/lib/theia-text-editor.js +120 -120
  84. package/lib/theia-toggle-bottom-indicator.d.ts +4 -4
  85. package/lib/theia-toggle-bottom-indicator.js +26 -26
  86. package/lib/theia-toolbar-item.d.ts +10 -10
  87. package/lib/theia-toolbar-item.js +39 -39
  88. package/lib/theia-toolbar.d.ts +19 -19
  89. package/lib/theia-toolbar.js +90 -90
  90. package/lib/theia-tree-node.d.ts +19 -19
  91. package/lib/theia-tree-node.js +72 -72
  92. package/lib/theia-view.d.ts +32 -32
  93. package/lib/theia-view.js +149 -149
  94. package/lib/theia-welcome-view.d.ts +5 -5
  95. package/lib/theia-welcome-view.js +30 -30
  96. package/lib/theia-workspace.d.ts +18 -18
  97. package/lib/theia-workspace.js +69 -69
  98. package/lib/util.d.ts +19 -19
  99. package/lib/util.js +93 -93
  100. package/package.json +2 -2
  101. package/src/index.ts +46 -46
  102. package/src/tests/resources/sample-files1/sample.txt +4 -4
  103. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder1/sampleFolder1-1/sampleFile1-1-1.txt +1 -1
  104. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder1/sampleFolder1-1/sampleFile1-1-2.txt +1 -1
  105. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder1/sampleFolder1-2/sampleFile1-2-1.txt +1 -1
  106. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder1/sampleFolder1-2/sampleFile1-2-2.txt +1 -1
  107. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder2/sampleFolder2-1/sampleFile2-1-1.txt +1 -1
  108. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder2/sampleFolder2-1/sampleFile2-1-2.txt +1 -1
  109. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder2/sampleFolder2-2/sampleFile2-2-1.txt +1 -1
  110. package/src/tests/resources/sample-files1/sampleFolder/sampleFolder2/sampleFolder2-2/sampleFile2-2-2.txt +1 -1
  111. package/src/tests/resources/sample-files2/another-sample.txt +1 -1
  112. package/src/tests/theia-app.test.ts +33 -33
  113. package/src/tests/theia-application-shell.test.ts +67 -67
  114. package/src/tests/theia-explorer-view.test.ts +211 -211
  115. package/src/tests/theia-getting-started.test.ts +50 -50
  116. package/src/tests/theia-main-menu.test.ts +133 -133
  117. package/src/tests/theia-output-view.test.ts +85 -85
  118. package/src/tests/theia-preference-view.test.ts +122 -122
  119. package/src/tests/theia-problems-view.test.ts +64 -64
  120. package/src/tests/theia-quick-command.test.ts +80 -80
  121. package/src/tests/theia-sample-app.test.ts +66 -66
  122. package/src/tests/theia-status-bar.test.ts +52 -52
  123. package/src/tests/theia-terminal-view.test.ts +90 -90
  124. package/src/tests/theia-text-editor.test.ts +187 -187
  125. package/src/tests/theia-toolbar.test.ts +69 -69
  126. package/src/tests/theia-workspace.test.ts +80 -80
  127. package/src/theia-about-dialog.ts +26 -26
  128. package/src/theia-app-loader.ts +167 -167
  129. package/src/theia-app.ts +188 -188
  130. package/src/theia-context-menu.ts +42 -42
  131. package/src/theia-dialog.ts +114 -114
  132. package/src/theia-editor.ts +73 -73
  133. package/src/theia-explorer-view.ts +311 -311
  134. package/src/theia-main-menu.ts +54 -54
  135. package/src/theia-menu-item.ts +75 -75
  136. package/src/theia-menu.ts +96 -96
  137. package/src/theia-monaco-editor.ts +83 -83
  138. package/src/theia-notification-indicator.ts +44 -44
  139. package/src/theia-notification-overlay.ts +94 -94
  140. package/src/theia-output-channel.ts +88 -88
  141. package/src/theia-output-view.ts +87 -87
  142. package/src/theia-page-object.ts +29 -29
  143. package/src/theia-preference-view.ts +240 -240
  144. package/src/theia-problem-indicator.ts +37 -37
  145. package/src/theia-problem-view.ts +30 -30
  146. package/src/theia-quick-command-palette.ts +81 -81
  147. package/src/theia-rename-dialog.ts +35 -35
  148. package/src/theia-status-bar.ts +44 -44
  149. package/src/theia-status-indicator.ts +50 -50
  150. package/src/theia-terminal.ts +69 -69
  151. package/src/theia-text-editor.ts +141 -141
  152. package/src/theia-toggle-bottom-indicator.ts +21 -21
  153. package/src/theia-toolbar-item.ts +41 -41
  154. package/src/theia-toolbar.ts +99 -99
  155. package/src/theia-tree-node.ts +81 -81
  156. package/src/theia-view.ts +177 -177
  157. package/src/theia-welcome-view.ts +31 -31
  158. package/src/theia-workspace.ts +76 -76
  159. package/src/util.ts +91 -91
@@ -1,80 +1,80 @@
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 { expect, test } from '@playwright/test';
18
- import { TheiaAppLoader } from '../theia-app-loader';
19
- import { DOT_FILES_FILTER, TheiaExplorerView } from '../theia-explorer-view';
20
- import { TheiaWorkspace } from '../theia-workspace';
21
-
22
- test.describe('Theia Workspace', () => {
23
- let isElectron: boolean;
24
- test.beforeAll(async ({ playwright, browser }) => {
25
- isElectron = process.env.USE_ELECTRON === 'true';
26
- });
27
-
28
- test('should be initialized empty by default', async ({ playwright, browser }) => {
29
- if (!isElectron) {
30
- const app = await TheiaAppLoader.load({ playwright, browser });
31
- const explorer = await app.openView(TheiaExplorerView);
32
- const fileStatElements = await explorer.visibleFileStatNodes(DOT_FILES_FILTER);
33
- expect(fileStatElements.length).toBe(0);
34
- await app.page.close();
35
- }
36
- });
37
-
38
- test('should be initialized with the contents of a file location', async ({ playwright, browser }) => {
39
- const ws = new TheiaWorkspace(['src/tests/resources/sample-files1']);
40
- const app = await TheiaAppLoader.load({ playwright, browser }, ws);
41
- const explorer = await app.openView(TheiaExplorerView);
42
- // resources/sample-files1 contains two folders and one file
43
- expect(await explorer.existsDirectoryNode('sampleFolder')).toBe(true);
44
- expect(await explorer.existsDirectoryNode('sampleFolderCompact')).toBe(true);
45
- expect(await explorer.existsFileNode('sample.txt')).toBe(true);
46
- await app.page.close();
47
- });
48
-
49
- test('should be initialized with the contents of multiple file locations', async ({ playwright, browser }) => {
50
- const ws = new TheiaWorkspace(['src/tests/resources/sample-files1', 'src/tests/resources/sample-files2']);
51
- const app = await TheiaAppLoader.load({ playwright, browser }, ws);
52
- const explorer = await app.openView(TheiaExplorerView);
53
- // resources/sample-files1 contains two folders and one file
54
- expect(await explorer.existsDirectoryNode('sampleFolder')).toBe(true);
55
- expect(await explorer.existsDirectoryNode('sampleFolderCompact')).toBe(true);
56
- expect(await explorer.existsFileNode('sample.txt')).toBe(true);
57
- // resources/sample-files2 contains one file
58
- expect(await explorer.existsFileNode('another-sample.txt')).toBe(true);
59
- await app.page.close();
60
- });
61
-
62
- test('open sample.txt via file menu', async ({ playwright, browser }) => {
63
- const ws = new TheiaWorkspace(['src/tests/resources/sample-files1']);
64
- const app = await TheiaAppLoader.load({ playwright, browser }, ws);
65
- const menuEntry = app.isElectron ? 'Open File...' : 'Open...';
66
-
67
- await (await app.menuBar.openMenu('File')).clickMenuItem(menuEntry);
68
- const fileDialog = await app.page.waitForSelector('div[class="dialogBlock"]');
69
- expect(await fileDialog.isVisible()).toBe(true);
70
-
71
- const fileEntry = app.page.getByText('sample.txt');
72
- await fileEntry.click();
73
- await app.page.locator('#theia-dialog-shell').getByRole('button', { name: 'Open' }).click();
74
-
75
- const span = await app.page.waitForSelector('span:has-text("content line 2")');
76
- expect(await span.isVisible()).toBe(true);
77
- await app.page.close();
78
- });
79
-
80
- });
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 { expect, test } from '@playwright/test';
18
+ import { TheiaAppLoader } from '../theia-app-loader';
19
+ import { DOT_FILES_FILTER, TheiaExplorerView } from '../theia-explorer-view';
20
+ import { TheiaWorkspace } from '../theia-workspace';
21
+
22
+ test.describe('Theia Workspace', () => {
23
+ let isElectron: boolean;
24
+ test.beforeAll(async ({ playwright, browser }) => {
25
+ isElectron = process.env.USE_ELECTRON === 'true';
26
+ });
27
+
28
+ test('should be initialized empty by default', async ({ playwright, browser }) => {
29
+ if (!isElectron) {
30
+ const app = await TheiaAppLoader.load({ playwright, browser });
31
+ const explorer = await app.openView(TheiaExplorerView);
32
+ const fileStatElements = await explorer.visibleFileStatNodes(DOT_FILES_FILTER);
33
+ expect(fileStatElements.length).toBe(0);
34
+ await app.page.close();
35
+ }
36
+ });
37
+
38
+ test('should be initialized with the contents of a file location', async ({ playwright, browser }) => {
39
+ const ws = new TheiaWorkspace(['src/tests/resources/sample-files1']);
40
+ const app = await TheiaAppLoader.load({ playwright, browser }, ws);
41
+ const explorer = await app.openView(TheiaExplorerView);
42
+ // resources/sample-files1 contains two folders and one file
43
+ expect(await explorer.existsDirectoryNode('sampleFolder')).toBe(true);
44
+ expect(await explorer.existsDirectoryNode('sampleFolderCompact')).toBe(true);
45
+ expect(await explorer.existsFileNode('sample.txt')).toBe(true);
46
+ await app.page.close();
47
+ });
48
+
49
+ test('should be initialized with the contents of multiple file locations', async ({ playwright, browser }) => {
50
+ const ws = new TheiaWorkspace(['src/tests/resources/sample-files1', 'src/tests/resources/sample-files2']);
51
+ const app = await TheiaAppLoader.load({ playwright, browser }, ws);
52
+ const explorer = await app.openView(TheiaExplorerView);
53
+ // resources/sample-files1 contains two folders and one file
54
+ expect(await explorer.existsDirectoryNode('sampleFolder')).toBe(true);
55
+ expect(await explorer.existsDirectoryNode('sampleFolderCompact')).toBe(true);
56
+ expect(await explorer.existsFileNode('sample.txt')).toBe(true);
57
+ // resources/sample-files2 contains one file
58
+ expect(await explorer.existsFileNode('another-sample.txt')).toBe(true);
59
+ await app.page.close();
60
+ });
61
+
62
+ test('open sample.txt via file menu', async ({ playwright, browser }) => {
63
+ const ws = new TheiaWorkspace(['src/tests/resources/sample-files1']);
64
+ const app = await TheiaAppLoader.load({ playwright, browser }, ws);
65
+ const menuEntry = app.isElectron ? 'Open File...' : 'Open...';
66
+
67
+ await (await app.menuBar.openMenu('File')).clickMenuItem(menuEntry);
68
+ const fileDialog = await app.page.waitForSelector('div[class="dialogBlock"]');
69
+ expect(await fileDialog.isVisible()).toBe(true);
70
+
71
+ const fileEntry = app.page.getByText('sample.txt');
72
+ await fileEntry.click();
73
+ await app.page.locator('#theia-dialog-shell').getByRole('button', { name: 'Open' }).click();
74
+
75
+ const span = await app.page.waitForSelector('span:has-text("content line 2")');
76
+ expect(await span.isVisible()).toBe(true);
77
+ await app.page.close();
78
+ });
79
+
80
+ });
@@ -1,26 +1,26 @@
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 { TheiaDialog } from './theia-dialog';
18
-
19
- export class TheiaAboutDialog extends TheiaDialog {
20
-
21
- override async isVisible(): Promise<boolean> {
22
- const dialog = await this.page.$(`${this.blockSelector} .theia-aboutDialog`);
23
- return !!dialog && dialog.isVisible();
24
- }
25
-
26
- }
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 { TheiaDialog } from './theia-dialog';
18
+
19
+ export class TheiaAboutDialog extends TheiaDialog {
20
+
21
+ override async isVisible(): Promise<boolean> {
22
+ const dialog = await this.page.$(`${this.blockSelector} .theia-aboutDialog`);
23
+ return !!dialog && dialog.isVisible();
24
+ }
25
+
26
+ }
@@ -1,167 +1,167 @@
1
- // *****************************************************************************
2
- // Copyright (C) 2022 STMicroelectronics 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, PlaywrightWorkerArgs, _electron as electron } from '@playwright/test';
18
- import * as path from 'path';
19
- import * as fs from 'fs';
20
- import { TheiaApp } from './theia-app';
21
- import { TheiaWorkspace } from './theia-workspace';
22
- import { OSUtil } from './util';
23
-
24
- export interface TheiaAppFactory<T extends TheiaApp> {
25
- new(page: Page, initialWorkspace?: TheiaWorkspace, isElectron?: boolean): T;
26
- }
27
-
28
- // TODO this is just a sketch, we need a proper way to configure tests and pass this configuration to the `TheiaAppLoader`:
29
- export interface TheiaPlaywrightTestConfig {
30
- useElectron?: {
31
- /** Path to the Theia Electron app package (absolute or relative to this package). */
32
- electronAppPath?: string,
33
- /** Path to the folder containing the plugins to load (absolute or relative to this package). */
34
- pluginsPath?: string,
35
- // eslint-disable-next-line max-len
36
- /** Electron launch options as [specified by Playwright](https://github.com/microsoft/playwright/blob/396487fc4c19bf27554eac9beea9db135e96cfb4/packages/playwright-core/types/types.d.ts#L14182). */
37
- launchOptions?: object,
38
- }
39
- }
40
-
41
- function theiaAppFactory<T extends TheiaApp>(factory?: TheiaAppFactory<T>): TheiaAppFactory<T> {
42
- return (factory ?? TheiaApp) as TheiaAppFactory<T>;
43
- }
44
-
45
- function initializeWorkspace(initialWorkspace?: TheiaWorkspace): TheiaWorkspace {
46
- const workspace = initialWorkspace ? initialWorkspace : new TheiaWorkspace();
47
- workspace.initialize();
48
- return workspace;
49
- }
50
-
51
- namespace TheiaBrowserAppLoader {
52
-
53
- export async function load<T extends TheiaApp>(
54
- page: Page,
55
- initialWorkspace?: TheiaWorkspace,
56
- factory?: TheiaAppFactory<T>
57
- ): Promise<T> {
58
- const workspace = initializeWorkspace(initialWorkspace);
59
- return createAndLoad<T>(page, workspace, factory);
60
- }
61
-
62
- async function createAndLoad<T extends TheiaApp>(
63
- page: Page,
64
- workspace: TheiaWorkspace,
65
- factory?: TheiaAppFactory<T>
66
- ): Promise<T> {
67
- const appFactory = theiaAppFactory<T>(factory);
68
- const app = new appFactory(page, workspace, false);
69
- await loadOrReload(app, '/#' + app.workspace.urlEncodedPath);
70
- await app.waitForShellAndInitialized();
71
- return app;
72
- }
73
-
74
- async function loadOrReload(app: TheiaApp, url: string): Promise<void> {
75
- if (app.page.url() === url) {
76
- await app.page.reload();
77
- } else {
78
- const wasLoadedAlready = await app.isShellVisible();
79
- await app.page.goto(url);
80
- if (wasLoadedAlready) {
81
- // Theia doesn't refresh on URL change only
82
- // So we need to reload if the app was already loaded before
83
- await app.page.reload();
84
- }
85
- }
86
- }
87
- }
88
-
89
- namespace TheiaElectronAppLoader {
90
-
91
- export async function load<T extends TheiaApp>(
92
- args: TheiaPlaywrightTestConfig & PlaywrightWorkerArgs,
93
- initialWorkspace?: TheiaWorkspace,
94
- factory?: TheiaAppFactory<T>,
95
- ): Promise<T> {
96
- const workspace = initializeWorkspace(initialWorkspace);
97
- const electronConfig = args.useElectron ?? {
98
- electronAppPath: '../electron',
99
- pluginsPath: '../../plugins'
100
- };
101
- if (electronConfig === undefined || electronConfig.launchOptions === undefined && electronConfig.electronAppPath === undefined) {
102
- throw Error('The Theia Playwright configuration must either specify `useElectron.electronAppPath` or `useElectron.launchOptions`');
103
- }
104
- const appPath = electronConfig.electronAppPath!;
105
- const pluginsPath = electronConfig.pluginsPath;
106
- const launchOptions = electronConfig.launchOptions ?? {
107
- additionalArgs: ['--no-cluster'],
108
- electronAppPath: appPath,
109
- pluginsPath: pluginsPath
110
- };
111
- const playwrightOptions = toPlaywrightOptions(launchOptions, workspace);
112
- console.log(`Launching Electron with options: ${JSON.stringify(playwrightOptions)}`);
113
- const electronApp = await electron.launch(playwrightOptions);
114
- const page = await electronApp.firstWindow();
115
-
116
- const appFactory = theiaAppFactory<T>(factory);
117
- const app = new appFactory(page, workspace, true);
118
- await app.waitForShellAndInitialized();
119
- return app;
120
- }
121
-
122
- export function toPlaywrightOptions(
123
- electronLaunchOptions: { additionalArgs: string[], electronAppPath: string, pluginsPath?: string } | object,
124
- workspace?: TheiaWorkspace
125
- ): { executablePath: string, args: string[] } | object {
126
- if ('additionalArgs' in electronLaunchOptions && 'electronAppPath' in electronLaunchOptions) {
127
- const executablePath = path.normalize(path.join(electronLaunchOptions.electronAppPath, 'node_modules/.bin/electron')) + (OSUtil.isWindows ? '.cmd' : '');
128
- if (!fs.existsSync(executablePath)) {
129
- const errorMsg = `executablePath: ${executablePath} does not exist`;
130
- console.log(errorMsg);
131
- throw new Error(errorMsg);
132
- }
133
- const args = [
134
- electronLaunchOptions.electronAppPath,
135
- ...electronLaunchOptions.additionalArgs,
136
- `--app-project-path=${electronLaunchOptions.electronAppPath}`
137
- ];
138
- if (electronLaunchOptions.pluginsPath) {
139
- args.push(`--plugins=local-dir:${electronLaunchOptions.pluginsPath}`);
140
- }
141
- if (workspace) {
142
- args.push(workspace.path);
143
- }
144
-
145
- return { executablePath: executablePath, args: args };
146
- }
147
- return electronLaunchOptions;
148
- }
149
- }
150
-
151
- export namespace TheiaAppLoader {
152
-
153
- export async function load<T extends TheiaApp>(
154
- args: TheiaPlaywrightTestConfig & PlaywrightWorkerArgs,
155
- initialWorkspace?: TheiaWorkspace,
156
- factory?: TheiaAppFactory<T>,
157
- ): Promise<T> {
158
- if (process.env.USE_ELECTRON === 'true') {
159
- // disable native elements and early window to avoid issues with the electron app
160
- process.env.THEIA_ELECTRON_DISABLE_NATIVE_ELEMENTS = '1';
161
- process.env.THEIA_ELECTRON_NO_EARLY_WINDOW = '1';
162
- return TheiaElectronAppLoader.load(args, initialWorkspace, factory);
163
- }
164
- const page = await args.browser.newPage();
165
- return TheiaBrowserAppLoader.load(page, initialWorkspace, factory);
166
- }
167
- }
1
+ // *****************************************************************************
2
+ // Copyright (C) 2022 STMicroelectronics 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, PlaywrightWorkerArgs, _electron as electron } from '@playwright/test';
18
+ import * as path from 'path';
19
+ import * as fs from 'fs';
20
+ import { TheiaApp } from './theia-app';
21
+ import { TheiaWorkspace } from './theia-workspace';
22
+ import { OSUtil } from './util';
23
+
24
+ export interface TheiaAppFactory<T extends TheiaApp> {
25
+ new(page: Page, initialWorkspace?: TheiaWorkspace, isElectron?: boolean): T;
26
+ }
27
+
28
+ // TODO this is just a sketch, we need a proper way to configure tests and pass this configuration to the `TheiaAppLoader`:
29
+ export interface TheiaPlaywrightTestConfig {
30
+ useElectron?: {
31
+ /** Path to the Theia Electron app package (absolute or relative to this package). */
32
+ electronAppPath?: string,
33
+ /** Path to the folder containing the plugins to load (absolute or relative to this package). */
34
+ pluginsPath?: string,
35
+ // eslint-disable-next-line max-len
36
+ /** Electron launch options as [specified by Playwright](https://github.com/microsoft/playwright/blob/396487fc4c19bf27554eac9beea9db135e96cfb4/packages/playwright-core/types/types.d.ts#L14182). */
37
+ launchOptions?: object,
38
+ }
39
+ }
40
+
41
+ function theiaAppFactory<T extends TheiaApp>(factory?: TheiaAppFactory<T>): TheiaAppFactory<T> {
42
+ return (factory ?? TheiaApp) as TheiaAppFactory<T>;
43
+ }
44
+
45
+ function initializeWorkspace(initialWorkspace?: TheiaWorkspace): TheiaWorkspace {
46
+ const workspace = initialWorkspace ? initialWorkspace : new TheiaWorkspace();
47
+ workspace.initialize();
48
+ return workspace;
49
+ }
50
+
51
+ namespace TheiaBrowserAppLoader {
52
+
53
+ export async function load<T extends TheiaApp>(
54
+ page: Page,
55
+ initialWorkspace?: TheiaWorkspace,
56
+ factory?: TheiaAppFactory<T>
57
+ ): Promise<T> {
58
+ const workspace = initializeWorkspace(initialWorkspace);
59
+ return createAndLoad<T>(page, workspace, factory);
60
+ }
61
+
62
+ async function createAndLoad<T extends TheiaApp>(
63
+ page: Page,
64
+ workspace: TheiaWorkspace,
65
+ factory?: TheiaAppFactory<T>
66
+ ): Promise<T> {
67
+ const appFactory = theiaAppFactory<T>(factory);
68
+ const app = new appFactory(page, workspace, false);
69
+ await loadOrReload(app, '/#' + app.workspace.urlEncodedPath);
70
+ await app.waitForShellAndInitialized();
71
+ return app;
72
+ }
73
+
74
+ async function loadOrReload(app: TheiaApp, url: string): Promise<void> {
75
+ if (app.page.url() === url) {
76
+ await app.page.reload();
77
+ } else {
78
+ const wasLoadedAlready = await app.isShellVisible();
79
+ await app.page.goto(url);
80
+ if (wasLoadedAlready) {
81
+ // Theia doesn't refresh on URL change only
82
+ // So we need to reload if the app was already loaded before
83
+ await app.page.reload();
84
+ }
85
+ }
86
+ }
87
+ }
88
+
89
+ namespace TheiaElectronAppLoader {
90
+
91
+ export async function load<T extends TheiaApp>(
92
+ args: TheiaPlaywrightTestConfig & PlaywrightWorkerArgs,
93
+ initialWorkspace?: TheiaWorkspace,
94
+ factory?: TheiaAppFactory<T>,
95
+ ): Promise<T> {
96
+ const workspace = initializeWorkspace(initialWorkspace);
97
+ const electronConfig = args.useElectron ?? {
98
+ electronAppPath: '../electron',
99
+ pluginsPath: '../../plugins'
100
+ };
101
+ if (electronConfig === undefined || electronConfig.launchOptions === undefined && electronConfig.electronAppPath === undefined) {
102
+ throw Error('The Theia Playwright configuration must either specify `useElectron.electronAppPath` or `useElectron.launchOptions`');
103
+ }
104
+ const appPath = electronConfig.electronAppPath!;
105
+ const pluginsPath = electronConfig.pluginsPath;
106
+ const launchOptions = electronConfig.launchOptions ?? {
107
+ additionalArgs: ['--no-cluster'],
108
+ electronAppPath: appPath,
109
+ pluginsPath: pluginsPath
110
+ };
111
+ const playwrightOptions = toPlaywrightOptions(launchOptions, workspace);
112
+ console.log(`Launching Electron with options: ${JSON.stringify(playwrightOptions)}`);
113
+ const electronApp = await electron.launch(playwrightOptions);
114
+ const page = await electronApp.firstWindow();
115
+
116
+ const appFactory = theiaAppFactory<T>(factory);
117
+ const app = new appFactory(page, workspace, true);
118
+ await app.waitForShellAndInitialized();
119
+ return app;
120
+ }
121
+
122
+ export function toPlaywrightOptions(
123
+ electronLaunchOptions: { additionalArgs: string[], electronAppPath: string, pluginsPath?: string } | object,
124
+ workspace?: TheiaWorkspace
125
+ ): { executablePath: string, args: string[] } | object {
126
+ if ('additionalArgs' in electronLaunchOptions && 'electronAppPath' in electronLaunchOptions) {
127
+ const executablePath = path.normalize(path.join(electronLaunchOptions.electronAppPath, 'node_modules/.bin/electron')) + (OSUtil.isWindows ? '.cmd' : '');
128
+ if (!fs.existsSync(executablePath)) {
129
+ const errorMsg = `executablePath: ${executablePath} does not exist`;
130
+ console.log(errorMsg);
131
+ throw new Error(errorMsg);
132
+ }
133
+ const args = [
134
+ electronLaunchOptions.electronAppPath,
135
+ ...electronLaunchOptions.additionalArgs,
136
+ `--app-project-path=${electronLaunchOptions.electronAppPath}`
137
+ ];
138
+ if (electronLaunchOptions.pluginsPath) {
139
+ args.push(`--plugins=local-dir:${electronLaunchOptions.pluginsPath}`);
140
+ }
141
+ if (workspace) {
142
+ args.push(workspace.path);
143
+ }
144
+
145
+ return { executablePath: executablePath, args: args };
146
+ }
147
+ return electronLaunchOptions;
148
+ }
149
+ }
150
+
151
+ export namespace TheiaAppLoader {
152
+
153
+ export async function load<T extends TheiaApp>(
154
+ args: TheiaPlaywrightTestConfig & PlaywrightWorkerArgs,
155
+ initialWorkspace?: TheiaWorkspace,
156
+ factory?: TheiaAppFactory<T>,
157
+ ): Promise<T> {
158
+ if (process.env.USE_ELECTRON === 'true') {
159
+ // disable native elements and early window to avoid issues with the electron app
160
+ process.env.THEIA_ELECTRON_DISABLE_NATIVE_ELEMENTS = '1';
161
+ process.env.THEIA_ELECTRON_NO_EARLY_WINDOW = '1';
162
+ return TheiaElectronAppLoader.load(args, initialWorkspace, factory);
163
+ }
164
+ const page = await args.browser.newPage();
165
+ return TheiaBrowserAppLoader.load(page, initialWorkspace, factory);
166
+ }
167
+ }