@jupyterlab/galata 5.0.0-alpha.2 → 5.0.0-alpha.21

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 (100) hide show
  1. package/README.md +192 -31
  2. package/lib/benchmarkReporter.d.ts +1 -0
  3. package/lib/benchmarkReporter.js +34 -39
  4. package/lib/benchmarkReporter.js.map +1 -1
  5. package/lib/benchmarkVLTpl.js +19 -5
  6. package/lib/benchmarkVLTpl.js.map +1 -1
  7. package/lib/contents.d.ts +5 -5
  8. package/lib/contents.js +32 -36
  9. package/lib/contents.js.map +1 -1
  10. package/lib/extension/global.d.ts +197 -0
  11. package/lib/extension/global.js +601 -0
  12. package/lib/extension/global.js.map +1 -0
  13. package/lib/extension/index.d.ts +6 -0
  14. package/lib/extension/index.js +27 -0
  15. package/lib/extension/index.js.map +1 -0
  16. package/lib/extension/tokens.d.ts +232 -0
  17. package/lib/extension/tokens.js +13 -0
  18. package/lib/extension/tokens.js.map +1 -0
  19. package/lib/extension.d.ts +223 -0
  20. package/lib/{global.js → extension.js} +1 -2
  21. package/lib/extension.js.map +1 -0
  22. package/lib/fixtures.d.ts +32 -10
  23. package/lib/fixtures.js +64 -17
  24. package/lib/fixtures.js.map +1 -1
  25. package/lib/galata.d.ts +140 -19
  26. package/lib/galata.js +272 -87
  27. package/lib/galata.js.map +1 -1
  28. package/lib/helpers/activity.d.ts +6 -0
  29. package/lib/helpers/activity.js +19 -5
  30. package/lib/helpers/activity.js.map +1 -1
  31. package/lib/helpers/debuggerpanel.d.ts +4 -0
  32. package/lib/helpers/debuggerpanel.js +16 -0
  33. package/lib/helpers/debuggerpanel.js.map +1 -1
  34. package/lib/helpers/filebrowser.js +8 -2
  35. package/lib/helpers/filebrowser.js.map +1 -1
  36. package/lib/helpers/index.d.ts +1 -0
  37. package/lib/helpers/index.js +6 -1
  38. package/lib/helpers/index.js.map +1 -1
  39. package/lib/helpers/kernel.js +7 -7
  40. package/lib/helpers/kernel.js.map +1 -1
  41. package/lib/helpers/menu.d.ts +7 -0
  42. package/lib/helpers/menu.js +17 -1
  43. package/lib/helpers/menu.js.map +1 -1
  44. package/lib/helpers/notebook.d.ts +6 -4
  45. package/lib/helpers/notebook.js +127 -31
  46. package/lib/helpers/notebook.js.map +1 -1
  47. package/lib/helpers/sidebar.d.ts +8 -1
  48. package/lib/helpers/sidebar.js +33 -15
  49. package/lib/helpers/sidebar.js.map +1 -1
  50. package/lib/helpers/statusbar.js +1 -1
  51. package/lib/helpers/statusbar.js.map +1 -1
  52. package/lib/helpers/style.d.ts +42 -0
  53. package/lib/helpers/style.js +50 -0
  54. package/lib/helpers/style.js.map +1 -0
  55. package/lib/helpers/theme.js +1 -1
  56. package/lib/helpers/theme.js.map +1 -1
  57. package/lib/index.d.ts +5 -2
  58. package/lib/index.js +12 -3
  59. package/lib/index.js.map +1 -1
  60. package/lib/jupyterlabpage.d.ts +29 -4
  61. package/lib/jupyterlabpage.js +38 -22
  62. package/lib/jupyterlabpage.js.map +1 -1
  63. package/lib/playwright-config.js +5 -1
  64. package/lib/playwright-config.js.map +1 -1
  65. package/lib/utils.js +5 -1
  66. package/lib/utils.js.map +1 -1
  67. package/package.json +31 -47
  68. package/src/benchmarkReporter.ts +756 -0
  69. package/src/benchmarkVLTpl.ts +91 -0
  70. package/src/contents.ts +472 -0
  71. package/src/extension.ts +281 -0
  72. package/src/fixtures.ts +387 -0
  73. package/src/galata.ts +1035 -0
  74. package/src/helpers/activity.ts +115 -0
  75. package/src/helpers/debuggerpanel.ts +159 -0
  76. package/src/helpers/filebrowser.ts +228 -0
  77. package/src/helpers/index.ts +15 -0
  78. package/src/helpers/kernel.ts +39 -0
  79. package/src/helpers/logconsole.ts +32 -0
  80. package/src/helpers/menu.ts +228 -0
  81. package/src/helpers/notebook.ts +1217 -0
  82. package/src/helpers/performance.ts +57 -0
  83. package/src/helpers/sidebar.ts +289 -0
  84. package/src/helpers/statusbar.ts +56 -0
  85. package/src/helpers/style.ts +100 -0
  86. package/src/helpers/theme.ts +50 -0
  87. package/src/index.ts +19 -0
  88. package/src/jupyterlabpage.ts +704 -0
  89. package/src/playwright-config.ts +26 -0
  90. package/src/utils.ts +264 -0
  91. package/src/vega-statistics.d.ts +15 -0
  92. package/lib/global.d.ts +0 -23
  93. package/lib/global.js.map +0 -1
  94. package/lib/inpage/tokens.d.ts +0 -135
  95. package/lib/inpage/tokens.js +0 -9
  96. package/lib/inpage/tokens.js.map +0 -1
  97. package/lib/lib-inpage/inpage.js +0 -3957
  98. package/lib/lib-inpage/inpage.js.map +0 -1
  99. package/style/index.css +0 -10
  100. package/style/index.js +0 -10
@@ -0,0 +1,228 @@
1
+ // Copyright (c) Jupyter Development Team.
2
+ // Distributed under the terms of the Modified BSD License.
3
+
4
+ import { ElementHandle, Page } from '@playwright/test';
5
+ import * as Utils from '../utils';
6
+
7
+ /**
8
+ * Main menu helpers
9
+ */
10
+ export class MenuHelper {
11
+ constructor(readonly page: Page) {}
12
+
13
+ /**
14
+ * Close all menus
15
+ */
16
+ async closeAll(): Promise<void> {
17
+ const page = this.page;
18
+ const existingMenus = await page.$$('.lm-Menu');
19
+ const numOpenMenus = existingMenus.length;
20
+ // close menus
21
+ for (let i = 0; i < numOpenMenus; ++i) {
22
+ await page.keyboard.press('Escape');
23
+ await page.waitForTimeout(100);
24
+ await page.waitForFunction((menuCount: number) => {
25
+ return document.querySelectorAll('.lm-Menu').length === menuCount;
26
+ }, numOpenMenus - (i + 1));
27
+ }
28
+ }
29
+
30
+ /**
31
+ * Get the handle on a menu from its label.
32
+ *
33
+ * @param label Menu label
34
+ * @returns Handle to the menu or null
35
+ */
36
+ getMenuBarItem(label: string): Promise<ElementHandle<Element> | null> {
37
+ return this.page.$(
38
+ `xpath=//li[./div[text()="${label}" and ${Utils.xpContainsClass(
39
+ 'lm-MenuBar-itemLabel'
40
+ )}]]`
41
+ );
42
+ }
43
+
44
+ /**
45
+ * Open a context menu and get its handle.
46
+ *
47
+ * @param selector Element over which the menu should be opened
48
+ * @returns Handle to the menu or null
49
+ */
50
+ async openContextMenu(
51
+ selector: string
52
+ ): Promise<ElementHandle<Element> | null> {
53
+ await this.page.click(selector, {
54
+ button: 'right'
55
+ });
56
+ return await this.page.$('.lm-Menu');
57
+ }
58
+
59
+ /**
60
+ * Get the handle on a menu item from its path.
61
+ *
62
+ * The separator used is '>'; e.g. to look for the new Notebook item 'File>New>Notebook'.
63
+ *
64
+ * @param path Menu item path
65
+ * @returns Handle to the menu item
66
+ */
67
+ async getMenuItem(path: string): Promise<ElementHandle<Element> | null> {
68
+ const page = this.page;
69
+ const parts = path.split('>');
70
+ const numParts = parts.length;
71
+ let subMenu: ElementHandle<Element> | null = null;
72
+
73
+ for (let i = 0; i < numParts; ++i) {
74
+ const part = parts[i];
75
+ const menuItem =
76
+ i === 0
77
+ ? await this.getMenuBarItem(part)
78
+ : await this.getMenuItemInMenu(subMenu!, part);
79
+ if (menuItem) {
80
+ if (i === numParts - 1) {
81
+ return menuItem;
82
+ } else {
83
+ if (i === 0) {
84
+ subMenu = await page.$('.lm-Menu.lm-MenuBar-menu');
85
+ } else {
86
+ const newMenus = await page.$$('.lm-Menu');
87
+ subMenu =
88
+ newMenus?.length > 0 ? newMenus[newMenus.length - 1] : null;
89
+ }
90
+ if (!subMenu) {
91
+ return null;
92
+ }
93
+ }
94
+ } else {
95
+ return null;
96
+ }
97
+ }
98
+
99
+ return null;
100
+ }
101
+
102
+ /**
103
+ * Get a menu item handle from its label.
104
+ *
105
+ * @param parentMenu Menu handle
106
+ * @param label Item label
107
+ * @returns Handle to the menu item
108
+ */
109
+ async getMenuItemInMenu(
110
+ parentMenu: ElementHandle<Element>,
111
+ label: string
112
+ ): Promise<ElementHandle<Element> | null> {
113
+ const items = await parentMenu.$$(
114
+ `xpath=./ul/li[./div[text()="${label}" and ${Utils.xpContainsClass(
115
+ 'lm-Menu-itemLabel'
116
+ )}]]`
117
+ );
118
+ if (items.length > 1) {
119
+ throw new Error(`More than one menu item matches label '${label}'`);
120
+ }
121
+ return items.length > 0 ? items[0] : null;
122
+ }
123
+
124
+ /**
125
+ * Whether any menus are opened or not
126
+ *
127
+ * @returns Opened menus status
128
+ */
129
+ async isAnyOpen(): Promise<boolean> {
130
+ return (await this.page.$('.lm-Menu')) !== null;
131
+ }
132
+
133
+ /**
134
+ * Whether a menu is opened or not
135
+ *
136
+ * @param path Menu path
137
+ * @returns Opened menu status
138
+ */
139
+ async isOpen(path: string): Promise<boolean> {
140
+ return (await this.getMenuItem(path)) !== null;
141
+ }
142
+
143
+ /**
144
+ * Open a menu from its path
145
+ *
146
+ * @param path Menu path
147
+ * @returns Handle to the opened menu
148
+ */
149
+ async open(path: string): Promise<ElementHandle<Element> | null> {
150
+ await this.closeAll();
151
+
152
+ const page = this.page;
153
+ const parts = path.split('>');
154
+ const numParts = parts.length;
155
+ let subMenu: ElementHandle<Element> | null = null;
156
+
157
+ for (let i = 0; i < numParts; ++i) {
158
+ const part = parts[i];
159
+ const menuItem =
160
+ i === 0
161
+ ? await this.getMenuBarItem(part)
162
+ : await this.getMenuItemInMenu(subMenu!, part);
163
+ if (menuItem) {
164
+ if (i === 0) {
165
+ await menuItem.click();
166
+ subMenu = await page.waitForSelector('.lm-Menu.lm-MenuBar-menu', {
167
+ state: 'visible'
168
+ });
169
+ } else {
170
+ const existingMenus = await page.$$('.lm-Menu');
171
+ await menuItem.hover();
172
+ await page.waitForFunction(
173
+ ({ n, item }) => {
174
+ return (
175
+ document.querySelectorAll('.lm-Menu').length === n &&
176
+ item.classList.contains('lm-mod-active')
177
+ );
178
+ },
179
+ { n: existingMenus.length + 1, item: menuItem }
180
+ );
181
+ await page.waitForTimeout(200);
182
+
183
+ // Fetch a new list of menus, and fetch the last one.
184
+ // We are assuming the last menu is the most recently opened.
185
+ const newMenus = await page.$$('.lm-Menu');
186
+ subMenu = newMenus[newMenus.length - 1];
187
+ }
188
+ }
189
+ }
190
+
191
+ return subMenu;
192
+ }
193
+
194
+ /**
195
+ * Get the handle to the last opened menu
196
+ *
197
+ * @returns Handle to the opened menu
198
+ */
199
+ async getOpenMenu(): Promise<ElementHandle<Element> | null> {
200
+ const openMenus = await this.page.$$('.lm-Widget.lm-Menu .lm-Menu-content');
201
+ if (openMenus.length > 0) {
202
+ return openMenus[openMenus.length - 1];
203
+ }
204
+
205
+ return null;
206
+ }
207
+
208
+ /**
209
+ * Click on a menu item from its path
210
+ *
211
+ * @param path Menu item path
212
+ */
213
+ async clickMenuItem(path: string): Promise<void> {
214
+ const parts = path.split('>');
215
+ const numParts = parts.length;
216
+ const label = parts[numParts - 1];
217
+ path = parts.slice(0, numParts - 1).join('>');
218
+
219
+ // open parent menu
220
+ const parentMenu = await this.open(path);
221
+ const menuItem =
222
+ parentMenu && (await this.getMenuItemInMenu(parentMenu, label));
223
+
224
+ if (menuItem) {
225
+ await menuItem.click();
226
+ }
227
+ }
228
+ }