Skip to content

Commit 2cbd356

Browse files
committed
Add Firefox support
Signed-off-by: Andrew Stein <steinlink@gmail.com>
1 parent 62d567c commit 2cbd356

File tree

11 files changed

+89
-46
lines changed

11 files changed

+89
-46
lines changed

packages/perspective-viewer-d3fc/src/ts/tooltip/selectionData.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ export function getDataValues(data, settings) {
6868
value: toValue(main.type, data.mainValues[i]),
6969
}));
7070
}
71+
7172
return settings.mainValues.map((main) => ({
7273
name: main.name,
7374
value: toValue(
@@ -76,6 +77,7 @@ export function getDataValues(data, settings) {
7677
),
7778
}));
7879
}
80+
7981
return [
8082
{
8183
name: settings.mainValues[0].name,

packages/perspective-viewer-d3fc/test/js/splitby.spec.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ test.describe("Tooltip data values with various 'Split By' configurations", () =
5252
expect(tooltip_row_id_value).toBeTruthy();
5353
expect(tooltip_row_id_value).toMatch(/^(?!NaN$|-$).+$/);
5454
});
55+
5556
test("Show valid tooltip data with one 'Split By' configuration", async ({
5657
page,
5758
}) => {
@@ -78,8 +79,8 @@ test.describe("Tooltip data values with various 'Split By' configurations", () =
7879
force: true,
7980
}
8081
);
81-
await page.waitForSelector("#tooltip-values > li:nth-child(2)");
8282

83+
await page.waitForSelector("#tooltip-values > li:nth-child(2)");
8384
let tooltip_row_id_value = await page.evaluate(async () => {
8485
return document
8586
.querySelector("perspective-viewer-d3fc-xyline")
@@ -88,9 +89,12 @@ test.describe("Tooltip data values with various 'Split By' configurations", () =
8889
)?.textContent;
8990
});
9091

92+
await page.pause();
93+
9194
expect(tooltip_row_id_value).toBeTruthy();
9295
expect(tooltip_row_id_value).toMatch(/^(?!NaN$|-$).+$/);
9396
});
97+
9498
test("Show valid tooltip data with multiple 'Split By' configuration", async ({
9599
page,
96100
}) => {

packages/perspective-viewer-datagrid/test/js/column_style.spec.js

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,10 @@ async function test_column(page, selector, selector2) {
2323
window.__events__.push(evt);
2424
});
2525

26-
const header_button = viewer
27-
.querySelector("perspective-viewer-datagrid")
28-
.shadowRoot.querySelector(
29-
"regular-table thead tr:last-child th" + selector
30-
);
26+
const elem = viewer.querySelector("perspective-viewer-datagrid");
27+
const header_button = (
28+
window.chrome ? elem.shadowRoot : elem
29+
).querySelector("regular-table thead tr:last-child th" + selector);
3130

3231
const rect = header_button.getBoundingClientRect();
3332
return {
@@ -87,11 +86,10 @@ test.describe("Column Style Tests", () => {
8786
);
8887

8988
// Find the column config menu button
90-
const header_button = viewer
91-
.querySelector("perspective-viewer-datagrid")
92-
.shadowRoot.querySelector(
93-
"regular-table thead tr:last-child th"
94-
);
89+
const elem = viewer.querySelector("perspective-viewer-datagrid");
90+
const header_button = (
91+
window.chrome ? elem.shadowRoot : elem
92+
).querySelector("regular-table thead tr:last-child th");
9593

9694
// Get the button coords (slightly lower than center
9795
// because of the location of the menu button within

packages/perspective-viewer-datagrid/test/js/superstore.spec.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@ async function getDatagridContents(page) {
2424
if (!datagrid) {
2525
return "MISSING DATAGRID";
2626
}
27-
const regularTable = datagrid.shadowRoot.querySelector("regular-table");
27+
const regularTable = (
28+
window.chrome ? datagrid.shadowRoot : datagrid
29+
).querySelector("regular-table");
2830
return regularTable?.innerHTML || "MISSING";
2931
});
3032
}

rust/perspective-viewer/src/less/containers/scroll-panel.less

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,9 @@
2323

2424
.scroll-panel-content {
2525
position: relative;
26+
27+
// firefox doesn't support zero-sized containers;
28+
width: 1px;
29+
margin-left: -1px;
2630
}
2731
}

rust/perspective-viewer/test/js/column_settings.spec.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -141,11 +141,10 @@ test.describe("Plugin Styles", () => {
141141
});
142142

143143
await page.waitForFunction(() => {
144-
return (
145-
document
146-
.querySelector("perspective-viewer-datagrid")
147-
?.shadowRoot?.querySelectorAll("tbody tr").length! >= 1
148-
);
144+
const elem = document.querySelector("perspective-viewer-datagrid");
145+
return (window as any).chrome
146+
? elem?.shadowRoot?.querySelectorAll("tbody tr").length! >= 1
147+
: elem?.querySelectorAll("tbody tr").length! >= 1;
149148
});
150149

151150
await expect(view.columnSettingsSidebar.container).toBeVisible();

rust/perspective-viewer/test/js/expressions.spec.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,7 @@ test.describe("Expressions", () => {
361361
await addExprButton.click();
362362
await page.evaluate(openSidebarAndScrollToBottom);
363363
let clicked = await addExprButton.getAttribute("class");
364+
364365
expect(clicked).toBe("dragdrop-hover");
365366
});
366367

rust/perspective-viewer/test/js/leaks.spec.js

Lines changed: 46 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ test.beforeEach(async ({ page }) => {
2929

3030
test.describe("leaks", () => {
3131
// This originally has a timeout of 120000
32-
test("doesn't leak elements", async ({ page }) => {
32+
test("doesn't leak elements", async ({ page, browserName }) => {
3333
let viewer = await page.$("perspective-viewer");
3434
await page.evaluate(async (viewer) => {
3535
window.__TABLE__ = await viewer.getTable();
@@ -38,9 +38,12 @@ test.describe("leaks", () => {
3838

3939
// From a helpful blog
4040
// https://media-codings.com/articles/automatically-detect-memory-leaks-with-puppeteer
41-
await page.evaluate(() => window.gc());
42-
const heap1 = await page.evaluate(
43-
() => performance.memory.usedJSHeapSize
41+
if (browserName !== "firefox") {
42+
await page.evaluate(() => window.gc());
43+
}
44+
45+
const heap1 = await page.evaluate(() =>
46+
window.chrome ? performance.memory.usedJSHeapSize : 1
4447
);
4548

4649
for (var i = 0; i < 500; i++) {
@@ -61,9 +64,12 @@ test.describe("leaks", () => {
6164
// TODO this is very generous memory allowance suggests we
6265
// leak ~0.1% per instance.
6366
// TODO: Not yet sure how to access window.gc() in Playwright
64-
await page.evaluate(() => window.gc());
65-
const heap2 = await page.evaluate(
66-
() => performance.memory.usedJSHeapSize
67+
if (browserName !== "firefox") {
68+
await page.evaluate(() => window.gc());
69+
}
70+
71+
const heap2 = await page.evaluate(() =>
72+
window.chrome ? performance.memory.usedJSHeapSize : 1
6773
);
6874

6975
expect((heap2 - heap1) / heap1).toBeLessThan(1);
@@ -77,16 +83,22 @@ test.describe("leaks", () => {
7783
await compareContentsToSnapshot(contents, ["does-not-leak.txt"]);
7884
});
7985

80-
test("doesn't leak views when setting group by", async ({ page }) => {
86+
test("doesn't leak views when setting group by", async ({
87+
page,
88+
browserName,
89+
}) => {
8190
let viewer = await page.$("perspective-viewer");
8291
await page.evaluate(async (viewer) => {
8392
window.__TABLE__ = await viewer.getTable();
8493
await viewer.reset();
8594
}, viewer);
8695

87-
await page.evaluate(() => window.gc());
88-
const heap1 = await page.evaluate(
89-
() => performance.memory.usedJSHeapSize
96+
if (browserName !== "firefox") {
97+
await page.evaluate(() => window.gc());
98+
}
99+
100+
const heap1 = await page.evaluate(() =>
101+
window.chrome ? performance.memory.usedJSHeapSize : 1
90102
);
91103

92104
for (var i = 0; i < 500; i++) {
@@ -108,9 +120,12 @@ test.describe("leaks", () => {
108120
}, viewer);
109121
}
110122

111-
await page.evaluate(() => window.gc());
112-
const heap2 = await page.evaluate(
113-
() => performance.memory.usedJSHeapSize
123+
if (browserName !== "firefox") {
124+
await page.evaluate(() => window.gc());
125+
}
126+
127+
const heap2 = await page.evaluate(() =>
128+
window.chrome ? performance.memory.usedJSHeapSize : 1
114129
);
115130
expect((heap2 - heap1) / heap1).toBeLessThan(0.5);
116131

@@ -125,16 +140,22 @@ test.describe("leaks", () => {
125140
]);
126141
});
127142

128-
test("doesn't leak views when setting filters", async ({ page }) => {
143+
test("doesn't leak views when setting filters", async ({
144+
page,
145+
browserName,
146+
}) => {
129147
let viewer = await page.$("perspective-viewer");
130148
await page.evaluate(async (viewer) => {
131149
window.__TABLE__ = await viewer.getTable();
132150
await viewer.reset();
133151
}, viewer);
134152

135-
await page.evaluate(() => window.gc());
136-
const heap1 = await page.evaluate(
137-
() => performance.memory.usedJSHeapSize
153+
if (browserName !== "firefox") {
154+
await page.evaluate(() => window.gc());
155+
}
156+
157+
const heap1 = await page.evaluate(() =>
158+
window.chrome ? performance.memory.usedJSHeapSize : 1
138159
);
139160

140161
for (var i = 0; i < 500; i++) {
@@ -146,12 +167,15 @@ test.describe("leaks", () => {
146167
}, viewer);
147168
}
148169

149-
await page.evaluate(() => window.gc());
150-
const heap2 = await page.evaluate(
151-
() => performance.memory.usedJSHeapSize
170+
if (browserName !== "firefox") {
171+
await page.evaluate(() => window.gc());
172+
}
173+
174+
const heap2 = await page.evaluate(() =>
175+
window.chrome ? performance.memory.usedJSHeapSize : 1
152176
);
153-
expect((heap2 - heap1) / heap1).toBeLessThan(0.5);
154177

178+
expect((heap2 - heap1) / heap1).toBeLessThan(0.5);
155179
const contents = await page.evaluate(async (viewer) => {
156180
await viewer.restore({
157181
filter: [["Sales", "<", 10]],

rust/perspective-viewer/test/js/settings.spec.js

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ test.describe("Settings", () => {
7676
test("load and restore with settings called at the same time does not throw", async ({
7777
page,
7878
consoleLogs,
79+
browserName,
7980
}) => {
8081
const errors = [];
8182
page.on("pageerror", async (msg) => {
@@ -107,18 +108,25 @@ test.describe("Settings", () => {
107108
});
108109

109110
const contents = await get_contents(page);
110-
expect(errors).toEqual([
111-
"::Intentional Load Error",
111+
expect(errors[0]).toContain(
112+
"::Intentional Load Error"
112113
// "RuntimeError::unreachable",
113-
]);
114+
);
115+
116+
// await page.pause();
114117

115118
consoleLogs.expectedLogs.push(
116119
"error",
117-
/Invalid config: Error: `restore\(\)` called before `load\(\)`.*/
120+
browserName === "firefox"
121+
? /Invalid config: Error.*/
122+
: /Invalid config: Error: `restore\(\)` called before `load\(\)`.*/
118123
);
124+
119125
consoleLogs.expectedLogs.push(
120126
"error",
121-
/Caught error: Error: `restore\(\)` called before `load\(\)`.*/
127+
browserName === "firefox"
128+
? /Caught error: Error.*/
129+
: /Caught error: Error: `restore\(\)` called before `load\(\)`.*/
122130
);
123131
});
124132
});

tools/perspective-test/playwright.config.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ if (package_venn.include.length === 0) {
5858
}
5959

6060
const DEVICE_OPTIONS = {
61+
"Desktop Firefox": {},
6162
"Desktop Chrome": {
6263
launchOptions: {
6364
args: [
@@ -199,9 +200,9 @@ const GLOBAL_TEARDOWN_PATH = __require.resolve(
199200

200201
// See https://playwright.dev/docs/test-configuration.
201202
export default defineConfig({
202-
timeout: 360_000,
203+
timeout: 30_000,
203204
expect: {
204-
timeout: 360_000,
205+
timeout: 30_000,
205206
},
206207
forbidOnly: !!process.env.CI,
207208
retries: 0,

0 commit comments

Comments
 (0)