@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.
- package/README.md +192 -31
- package/lib/benchmarkReporter.d.ts +1 -0
- package/lib/benchmarkReporter.js +34 -39
- package/lib/benchmarkReporter.js.map +1 -1
- package/lib/benchmarkVLTpl.js +19 -5
- package/lib/benchmarkVLTpl.js.map +1 -1
- package/lib/contents.d.ts +5 -5
- package/lib/contents.js +32 -36
- package/lib/contents.js.map +1 -1
- package/lib/extension/global.d.ts +197 -0
- package/lib/extension/global.js +601 -0
- package/lib/extension/global.js.map +1 -0
- package/lib/extension/index.d.ts +6 -0
- package/lib/extension/index.js +27 -0
- package/lib/extension/index.js.map +1 -0
- package/lib/extension/tokens.d.ts +232 -0
- package/lib/extension/tokens.js +13 -0
- package/lib/extension/tokens.js.map +1 -0
- package/lib/extension.d.ts +223 -0
- package/lib/{global.js → extension.js} +1 -2
- package/lib/extension.js.map +1 -0
- package/lib/fixtures.d.ts +32 -10
- package/lib/fixtures.js +64 -17
- package/lib/fixtures.js.map +1 -1
- package/lib/galata.d.ts +140 -19
- package/lib/galata.js +272 -87
- package/lib/galata.js.map +1 -1
- package/lib/helpers/activity.d.ts +6 -0
- package/lib/helpers/activity.js +19 -5
- package/lib/helpers/activity.js.map +1 -1
- package/lib/helpers/debuggerpanel.d.ts +4 -0
- package/lib/helpers/debuggerpanel.js +16 -0
- package/lib/helpers/debuggerpanel.js.map +1 -1
- package/lib/helpers/filebrowser.js +8 -2
- package/lib/helpers/filebrowser.js.map +1 -1
- package/lib/helpers/index.d.ts +1 -0
- package/lib/helpers/index.js +6 -1
- package/lib/helpers/index.js.map +1 -1
- package/lib/helpers/kernel.js +7 -7
- package/lib/helpers/kernel.js.map +1 -1
- package/lib/helpers/menu.d.ts +7 -0
- package/lib/helpers/menu.js +17 -1
- package/lib/helpers/menu.js.map +1 -1
- package/lib/helpers/notebook.d.ts +6 -4
- package/lib/helpers/notebook.js +127 -31
- package/lib/helpers/notebook.js.map +1 -1
- package/lib/helpers/sidebar.d.ts +8 -1
- package/lib/helpers/sidebar.js +33 -15
- package/lib/helpers/sidebar.js.map +1 -1
- package/lib/helpers/statusbar.js +1 -1
- package/lib/helpers/statusbar.js.map +1 -1
- package/lib/helpers/style.d.ts +42 -0
- package/lib/helpers/style.js +50 -0
- package/lib/helpers/style.js.map +1 -0
- package/lib/helpers/theme.js +1 -1
- package/lib/helpers/theme.js.map +1 -1
- package/lib/index.d.ts +5 -2
- package/lib/index.js +12 -3
- package/lib/index.js.map +1 -1
- package/lib/jupyterlabpage.d.ts +29 -4
- package/lib/jupyterlabpage.js +38 -22
- package/lib/jupyterlabpage.js.map +1 -1
- package/lib/playwright-config.js +5 -1
- package/lib/playwright-config.js.map +1 -1
- package/lib/utils.js +5 -1
- package/lib/utils.js.map +1 -1
- package/package.json +31 -47
- package/src/benchmarkReporter.ts +756 -0
- package/src/benchmarkVLTpl.ts +91 -0
- package/src/contents.ts +472 -0
- package/src/extension.ts +281 -0
- package/src/fixtures.ts +387 -0
- package/src/galata.ts +1035 -0
- package/src/helpers/activity.ts +115 -0
- package/src/helpers/debuggerpanel.ts +159 -0
- package/src/helpers/filebrowser.ts +228 -0
- package/src/helpers/index.ts +15 -0
- package/src/helpers/kernel.ts +39 -0
- package/src/helpers/logconsole.ts +32 -0
- package/src/helpers/menu.ts +228 -0
- package/src/helpers/notebook.ts +1217 -0
- package/src/helpers/performance.ts +57 -0
- package/src/helpers/sidebar.ts +289 -0
- package/src/helpers/statusbar.ts +56 -0
- package/src/helpers/style.ts +100 -0
- package/src/helpers/theme.ts +50 -0
- package/src/index.ts +19 -0
- package/src/jupyterlabpage.ts +704 -0
- package/src/playwright-config.ts +26 -0
- package/src/utils.ts +264 -0
- package/src/vega-statistics.d.ts +15 -0
- package/lib/global.d.ts +0 -23
- package/lib/global.js.map +0 -1
- package/lib/inpage/tokens.d.ts +0 -135
- package/lib/inpage/tokens.js +0 -9
- package/lib/inpage/tokens.js.map +0 -1
- package/lib/lib-inpage/inpage.js +0 -3957
- package/lib/lib-inpage/inpage.js.map +0 -1
- package/style/index.css +0 -10
- 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
|
+
}
|