tauri-test-cli 0.7.2 → 0.9.0
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/dist/cli.js +236 -223
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -120717,6 +120717,7 @@ async function disconnect() {
|
|
|
120717
120717
|
|
|
120718
120718
|
// src/commands/screenshot.ts
|
|
120719
120719
|
import { writeFile } from "fs/promises";
|
|
120720
|
+
import { execFileSync } from "child_process";
|
|
120720
120721
|
|
|
120721
120722
|
// src/driver.ts
|
|
120722
120723
|
import { spawn as spawn2, execSync as execSync2 } from "child_process";
|
|
@@ -120930,24 +120931,34 @@ async function screenshot(options = {}) {
|
|
|
120930
120931
|
const { width, height } = await browser3.getWindowSize();
|
|
120931
120932
|
let data2;
|
|
120932
120933
|
let method;
|
|
120933
|
-
|
|
120934
|
-
|
|
120935
|
-
method = "html2canvas";
|
|
120936
|
-
} catch (err) {
|
|
120937
|
-
console.error(`html2canvas failed: ${err}, trying canvas fallback...`);
|
|
120934
|
+
const xvfbDisplay2 = getXvfbDisplay();
|
|
120935
|
+
if (xvfbDisplay2 !== null) {
|
|
120938
120936
|
try {
|
|
120939
|
-
data2 =
|
|
120940
|
-
method = "
|
|
120941
|
-
} catch (
|
|
120942
|
-
|
|
120943
|
-
|
|
120944
|
-
|
|
120945
|
-
|
|
120937
|
+
data2 = captureWithX11(xvfbDisplay2);
|
|
120938
|
+
method = "x11";
|
|
120939
|
+
} catch (err) {
|
|
120940
|
+
console.error(`X11 capture failed: ${err}, falling back to JS-based methods...`);
|
|
120941
|
+
}
|
|
120942
|
+
}
|
|
120943
|
+
if (!data2 && xvfbDisplay2 === null) {
|
|
120944
|
+
try {
|
|
120945
|
+
data2 = await withTimeout(browser3.takeScreenshot(), timeout, `Native screenshot timed out after ${timeout}ms`);
|
|
120946
|
+
method = "native";
|
|
120947
|
+
} catch (err) {
|
|
120948
|
+
console.error(`Native screenshot failed: ${err}, trying html2canvas...`);
|
|
120949
|
+
}
|
|
120950
|
+
}
|
|
120951
|
+
if (!data2) {
|
|
120952
|
+
try {
|
|
120953
|
+
data2 = await withTimeout(captureWithHtml2Canvas(browser3), timeout, "html2canvas timed out");
|
|
120954
|
+
method = "html2canvas";
|
|
120955
|
+
} catch (err) {
|
|
120956
|
+
console.error(`html2canvas failed: ${err}, trying canvas fallback...`);
|
|
120946
120957
|
try {
|
|
120947
|
-
data2 = await withTimeout(browser3
|
|
120948
|
-
method = "
|
|
120949
|
-
} catch (
|
|
120950
|
-
throw new Error(`All screenshot methods failed: html2canvas: ${err}, canvas: ${canvasErr}
|
|
120958
|
+
data2 = await withTimeout(captureWithCanvas(browser3), timeout, "Canvas screenshot timed out");
|
|
120959
|
+
method = "canvas";
|
|
120960
|
+
} catch (canvasErr) {
|
|
120961
|
+
throw new Error(`All screenshot methods failed: ${xvfbDisplay2 !== null ? "x11 failed, " : ""}html2canvas: ${err}, canvas: ${canvasErr}`);
|
|
120951
120962
|
}
|
|
120952
120963
|
}
|
|
120953
120964
|
}
|
|
@@ -120993,105 +121004,106 @@ async function captureWithHtml2Canvas(browser3) {
|
|
|
120993
121004
|
throw new Error("Failed to load html2canvas from CDN");
|
|
120994
121005
|
}
|
|
120995
121006
|
await new Promise((r) => setTimeout(r, 50));
|
|
120996
|
-
await browser3.execute(() => {
|
|
120997
|
-
|
|
120998
|
-
|
|
120999
|
-
|
|
121000
|
-
|
|
121001
|
-
|
|
121002
|
-
}
|
|
121003
|
-
h2c(document.body, {
|
|
121004
|
-
useCORS: true,
|
|
121005
|
-
allowTaint: true,
|
|
121006
|
-
logging: false,
|
|
121007
|
-
backgroundColor: "#ffffff"
|
|
121008
|
-
}).then((canvas) => {
|
|
121009
|
-
const dataUrl = canvas.toDataURL("image/png");
|
|
121010
|
-
window.__h2cResult = dataUrl.replace(/^data:image\/png;base64,/, "");
|
|
121011
|
-
}).catch(() => {
|
|
121012
|
-
window.__h2cResult = "";
|
|
121013
|
-
});
|
|
121014
|
-
setTimeout(() => {
|
|
121015
|
-
if (window.__h2cResult === undefined) {
|
|
121016
|
-
window.__h2cResult = "";
|
|
121007
|
+
const base64 = await browser3.execute(() => {
|
|
121008
|
+
return new Promise((resolve) => {
|
|
121009
|
+
const h2c = window.html2canvas;
|
|
121010
|
+
if (!h2c) {
|
|
121011
|
+
resolve("");
|
|
121012
|
+
return;
|
|
121017
121013
|
}
|
|
121018
|
-
|
|
121014
|
+
h2c(document.body, {
|
|
121015
|
+
useCORS: true,
|
|
121016
|
+
allowTaint: false,
|
|
121017
|
+
logging: false,
|
|
121018
|
+
backgroundColor: "#ffffff"
|
|
121019
|
+
}).then((canvas) => {
|
|
121020
|
+
try {
|
|
121021
|
+
const dataUrl = canvas.toDataURL("image/png");
|
|
121022
|
+
resolve(dataUrl.replace(/^data:image\/png;base64,/, ""));
|
|
121023
|
+
} catch {
|
|
121024
|
+
resolve("");
|
|
121025
|
+
}
|
|
121026
|
+
}).catch(() => resolve(""));
|
|
121027
|
+
setTimeout(() => resolve(""), 4000);
|
|
121028
|
+
});
|
|
121019
121029
|
});
|
|
121020
|
-
const base64 = await pollForResult(browser3, "__h2cResult");
|
|
121021
121030
|
if (!base64) {
|
|
121022
121031
|
throw new Error("html2canvas capture returned empty");
|
|
121023
121032
|
}
|
|
121024
121033
|
return base64;
|
|
121025
121034
|
}
|
|
121026
121035
|
async function captureWithCanvas(browser3) {
|
|
121027
|
-
await browser3.execute(() => {
|
|
121028
|
-
|
|
121029
|
-
|
|
121030
|
-
|
|
121031
|
-
|
|
121032
|
-
|
|
121033
|
-
|
|
121034
|
-
|
|
121035
|
-
|
|
121036
|
-
|
|
121037
|
-
|
|
121038
|
-
|
|
121039
|
-
|
|
121040
|
-
|
|
121041
|
-
|
|
121042
|
-
|
|
121043
|
-
|
|
121044
|
-
|
|
121045
|
-
|
|
121046
|
-
|
|
121047
|
-
|
|
121048
|
-
|
|
121049
|
-
|
|
121050
|
-
|
|
121051
|
-
|
|
121052
|
-
|
|
121053
|
-
|
|
121054
|
-
};
|
|
121055
|
-
img.onerror = () => {
|
|
121056
|
-
URL.revokeObjectURL(url2);
|
|
121057
|
-
ctx.fillStyle = "#000000";
|
|
121058
|
-
ctx.font = "16px monospace";
|
|
121059
|
-
const text3 = document.body.innerText || "";
|
|
121060
|
-
const lines = text3.split(`
|
|
121036
|
+
const base64 = await browser3.execute(() => {
|
|
121037
|
+
return new Promise((resolve) => {
|
|
121038
|
+
try {
|
|
121039
|
+
const w2 = window.innerWidth || 800;
|
|
121040
|
+
const h = window.innerHeight || 600;
|
|
121041
|
+
const canvas = document.createElement("canvas");
|
|
121042
|
+
canvas.width = w2;
|
|
121043
|
+
canvas.height = h;
|
|
121044
|
+
const ctx = canvas.getContext("2d");
|
|
121045
|
+
ctx.fillStyle = "#ffffff";
|
|
121046
|
+
ctx.fillRect(0, 0, w2, h);
|
|
121047
|
+
const serializer = new XMLSerializer;
|
|
121048
|
+
const cloned = document.documentElement.cloneNode(true);
|
|
121049
|
+
const html3 = serializer.serializeToString(cloned);
|
|
121050
|
+
const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="${w2}" height="${h}">
|
|
121051
|
+
<foreignObject width="100%" height="100%">
|
|
121052
|
+
${html3}
|
|
121053
|
+
</foreignObject>
|
|
121054
|
+
</svg>`;
|
|
121055
|
+
const blob = new Blob([svg], { type: "image/svg+xml;charset=utf-8" });
|
|
121056
|
+
const url2 = URL.createObjectURL(blob);
|
|
121057
|
+
const img = new Image;
|
|
121058
|
+
const renderText2 = () => {
|
|
121059
|
+
ctx.fillStyle = "#000000";
|
|
121060
|
+
ctx.font = "16px monospace";
|
|
121061
|
+
const text3 = document.body.innerText || "";
|
|
121062
|
+
const lines = text3.split(`
|
|
121061
121063
|
`);
|
|
121062
|
-
|
|
121063
|
-
|
|
121064
|
-
|
|
121065
|
-
const dataUrl = canvas.toDataURL("image/png");
|
|
121066
|
-
window.__canvasResult = dataUrl.replace(/^data:image\/png;base64,/, "");
|
|
121067
|
-
};
|
|
121068
|
-
img.src = url2;
|
|
121069
|
-
setTimeout(() => {
|
|
121070
|
-
if (window.__canvasResult === undefined) {
|
|
121064
|
+
for (let i = 0;i < lines.length && i < 40; i++) {
|
|
121065
|
+
ctx.fillText(lines[i], 10, 20 + i * 20);
|
|
121066
|
+
}
|
|
121071
121067
|
const dataUrl = canvas.toDataURL("image/png");
|
|
121072
|
-
|
|
121073
|
-
}
|
|
121074
|
-
|
|
121075
|
-
|
|
121076
|
-
|
|
121077
|
-
|
|
121068
|
+
resolve(dataUrl.replace(/^data:image\/png;base64,/, ""));
|
|
121069
|
+
};
|
|
121070
|
+
img.onload = () => {
|
|
121071
|
+
try {
|
|
121072
|
+
ctx.drawImage(img, 0, 0);
|
|
121073
|
+
URL.revokeObjectURL(url2);
|
|
121074
|
+
const dataUrl = canvas.toDataURL("image/png");
|
|
121075
|
+
resolve(dataUrl.replace(/^data:image\/png;base64,/, ""));
|
|
121076
|
+
} catch {
|
|
121077
|
+
URL.revokeObjectURL(url2);
|
|
121078
|
+
renderText2();
|
|
121079
|
+
}
|
|
121080
|
+
};
|
|
121081
|
+
img.onerror = () => {
|
|
121082
|
+
URL.revokeObjectURL(url2);
|
|
121083
|
+
renderText2();
|
|
121084
|
+
};
|
|
121085
|
+
img.src = url2;
|
|
121086
|
+
setTimeout(() => {
|
|
121087
|
+
try {
|
|
121088
|
+
const dataUrl = canvas.toDataURL("image/png");
|
|
121089
|
+
resolve(dataUrl.replace(/^data:image\/png;base64,/, ""));
|
|
121090
|
+
} catch {
|
|
121091
|
+
renderText2();
|
|
121092
|
+
}
|
|
121093
|
+
}, 4000);
|
|
121094
|
+
} catch (e) {
|
|
121095
|
+
resolve("");
|
|
121096
|
+
}
|
|
121097
|
+
});
|
|
121078
121098
|
});
|
|
121079
|
-
const base64 = await pollForResult(browser3, "__canvasResult");
|
|
121080
121099
|
if (!base64) {
|
|
121081
121100
|
throw new Error("Canvas screenshot capture returned empty");
|
|
121082
121101
|
}
|
|
121083
121102
|
return base64;
|
|
121084
121103
|
}
|
|
121085
|
-
|
|
121086
|
-
const
|
|
121087
|
-
|
|
121088
|
-
const val3 = await browser3.execute((k) => window[k], key);
|
|
121089
|
-
if (val3 !== undefined)
|
|
121090
|
-
return val3;
|
|
121091
|
-
await new Promise((r) => setTimeout(r, intervalMs));
|
|
121092
|
-
}
|
|
121093
|
-
const val2 = await browser3.execute((k) => window[k], key);
|
|
121094
|
-
return val2 ?? "";
|
|
121104
|
+
function captureWithX11(display) {
|
|
121105
|
+
const result = execFileSync("import", ["-display", `:${display}`, "-window", "root", "png:-"], { maxBuffer: 50 * 1024 * 1024, timeout: 1e4 });
|
|
121106
|
+
return result.toString("base64");
|
|
121095
121107
|
}
|
|
121096
121108
|
|
|
121097
121109
|
// src/commands/snapshot.ts
|
|
@@ -121370,6 +121382,7 @@ import { readFileSync } from "fs";
|
|
|
121370
121382
|
|
|
121371
121383
|
// src/commands/screenshot.ts
|
|
121372
121384
|
import { writeFile as writeFile3 } from "fs/promises";
|
|
121385
|
+
import { execFileSync as execFileSync2 } from "child_process";
|
|
121373
121386
|
var HTML2CANVAS_CDN2 = "https://cdn.jsdelivr.net/npm/html2canvas@1.4.1/dist/html2canvas.min.js";
|
|
121374
121387
|
async function screenshot2(options = {}) {
|
|
121375
121388
|
const browser3 = requireBrowser();
|
|
@@ -121381,24 +121394,34 @@ async function screenshot2(options = {}) {
|
|
|
121381
121394
|
const { width, height } = await browser3.getWindowSize();
|
|
121382
121395
|
let data2;
|
|
121383
121396
|
let method;
|
|
121384
|
-
|
|
121385
|
-
|
|
121386
|
-
method = "html2canvas";
|
|
121387
|
-
} catch (err) {
|
|
121388
|
-
console.error(`html2canvas failed: ${err}, trying canvas fallback...`);
|
|
121397
|
+
const xvfbDisplay2 = getXvfbDisplay();
|
|
121398
|
+
if (xvfbDisplay2 !== null) {
|
|
121389
121399
|
try {
|
|
121390
|
-
data2 =
|
|
121391
|
-
method = "
|
|
121392
|
-
} catch (
|
|
121393
|
-
|
|
121394
|
-
|
|
121395
|
-
|
|
121396
|
-
|
|
121400
|
+
data2 = captureWithX112(xvfbDisplay2);
|
|
121401
|
+
method = "x11";
|
|
121402
|
+
} catch (err) {
|
|
121403
|
+
console.error(`X11 capture failed: ${err}, falling back to JS-based methods...`);
|
|
121404
|
+
}
|
|
121405
|
+
}
|
|
121406
|
+
if (!data2 && xvfbDisplay2 === null) {
|
|
121407
|
+
try {
|
|
121408
|
+
data2 = await withTimeout2(browser3.takeScreenshot(), timeout, `Native screenshot timed out after ${timeout}ms`);
|
|
121409
|
+
method = "native";
|
|
121410
|
+
} catch (err) {
|
|
121411
|
+
console.error(`Native screenshot failed: ${err}, trying html2canvas...`);
|
|
121412
|
+
}
|
|
121413
|
+
}
|
|
121414
|
+
if (!data2) {
|
|
121415
|
+
try {
|
|
121416
|
+
data2 = await withTimeout2(captureWithHtml2Canvas2(browser3), timeout, "html2canvas timed out");
|
|
121417
|
+
method = "html2canvas";
|
|
121418
|
+
} catch (err) {
|
|
121419
|
+
console.error(`html2canvas failed: ${err}, trying canvas fallback...`);
|
|
121397
121420
|
try {
|
|
121398
|
-
data2 = await withTimeout2(browser3
|
|
121399
|
-
method = "
|
|
121400
|
-
} catch (
|
|
121401
|
-
throw new Error(`All screenshot methods failed: html2canvas: ${err}, canvas: ${canvasErr}
|
|
121421
|
+
data2 = await withTimeout2(captureWithCanvas2(browser3), timeout, "Canvas screenshot timed out");
|
|
121422
|
+
method = "canvas";
|
|
121423
|
+
} catch (canvasErr) {
|
|
121424
|
+
throw new Error(`All screenshot methods failed: ${xvfbDisplay2 !== null ? "x11 failed, " : ""}html2canvas: ${err}, canvas: ${canvasErr}`);
|
|
121402
121425
|
}
|
|
121403
121426
|
}
|
|
121404
121427
|
}
|
|
@@ -121444,105 +121467,106 @@ async function captureWithHtml2Canvas2(browser3) {
|
|
|
121444
121467
|
throw new Error("Failed to load html2canvas from CDN");
|
|
121445
121468
|
}
|
|
121446
121469
|
await new Promise((r) => setTimeout(r, 50));
|
|
121447
|
-
await browser3.execute(() => {
|
|
121448
|
-
|
|
121449
|
-
|
|
121450
|
-
|
|
121451
|
-
|
|
121452
|
-
|
|
121453
|
-
}
|
|
121454
|
-
h2c(document.body, {
|
|
121455
|
-
useCORS: true,
|
|
121456
|
-
allowTaint: true,
|
|
121457
|
-
logging: false,
|
|
121458
|
-
backgroundColor: "#ffffff"
|
|
121459
|
-
}).then((canvas) => {
|
|
121460
|
-
const dataUrl = canvas.toDataURL("image/png");
|
|
121461
|
-
window.__h2cResult = dataUrl.replace(/^data:image\/png;base64,/, "");
|
|
121462
|
-
}).catch(() => {
|
|
121463
|
-
window.__h2cResult = "";
|
|
121464
|
-
});
|
|
121465
|
-
setTimeout(() => {
|
|
121466
|
-
if (window.__h2cResult === undefined) {
|
|
121467
|
-
window.__h2cResult = "";
|
|
121470
|
+
const base64 = await browser3.execute(() => {
|
|
121471
|
+
return new Promise((resolve) => {
|
|
121472
|
+
const h2c = window.html2canvas;
|
|
121473
|
+
if (!h2c) {
|
|
121474
|
+
resolve("");
|
|
121475
|
+
return;
|
|
121468
121476
|
}
|
|
121469
|
-
|
|
121477
|
+
h2c(document.body, {
|
|
121478
|
+
useCORS: true,
|
|
121479
|
+
allowTaint: false,
|
|
121480
|
+
logging: false,
|
|
121481
|
+
backgroundColor: "#ffffff"
|
|
121482
|
+
}).then((canvas) => {
|
|
121483
|
+
try {
|
|
121484
|
+
const dataUrl = canvas.toDataURL("image/png");
|
|
121485
|
+
resolve(dataUrl.replace(/^data:image\/png;base64,/, ""));
|
|
121486
|
+
} catch {
|
|
121487
|
+
resolve("");
|
|
121488
|
+
}
|
|
121489
|
+
}).catch(() => resolve(""));
|
|
121490
|
+
setTimeout(() => resolve(""), 4000);
|
|
121491
|
+
});
|
|
121470
121492
|
});
|
|
121471
|
-
const base64 = await pollForResult2(browser3, "__h2cResult");
|
|
121472
121493
|
if (!base64) {
|
|
121473
121494
|
throw new Error("html2canvas capture returned empty");
|
|
121474
121495
|
}
|
|
121475
121496
|
return base64;
|
|
121476
121497
|
}
|
|
121477
121498
|
async function captureWithCanvas2(browser3) {
|
|
121478
|
-
await browser3.execute(() => {
|
|
121479
|
-
|
|
121480
|
-
|
|
121481
|
-
|
|
121482
|
-
|
|
121483
|
-
|
|
121484
|
-
|
|
121485
|
-
|
|
121486
|
-
|
|
121487
|
-
|
|
121488
|
-
|
|
121489
|
-
|
|
121490
|
-
|
|
121491
|
-
|
|
121492
|
-
|
|
121493
|
-
|
|
121494
|
-
|
|
121495
|
-
|
|
121496
|
-
|
|
121497
|
-
|
|
121498
|
-
|
|
121499
|
-
|
|
121500
|
-
|
|
121501
|
-
|
|
121502
|
-
|
|
121503
|
-
|
|
121504
|
-
|
|
121505
|
-
};
|
|
121506
|
-
img.onerror = () => {
|
|
121507
|
-
URL.revokeObjectURL(url2);
|
|
121508
|
-
ctx.fillStyle = "#000000";
|
|
121509
|
-
ctx.font = "16px monospace";
|
|
121510
|
-
const text3 = document.body.innerText || "";
|
|
121511
|
-
const lines = text3.split(`
|
|
121499
|
+
const base64 = await browser3.execute(() => {
|
|
121500
|
+
return new Promise((resolve) => {
|
|
121501
|
+
try {
|
|
121502
|
+
const w2 = window.innerWidth || 800;
|
|
121503
|
+
const h = window.innerHeight || 600;
|
|
121504
|
+
const canvas = document.createElement("canvas");
|
|
121505
|
+
canvas.width = w2;
|
|
121506
|
+
canvas.height = h;
|
|
121507
|
+
const ctx = canvas.getContext("2d");
|
|
121508
|
+
ctx.fillStyle = "#ffffff";
|
|
121509
|
+
ctx.fillRect(0, 0, w2, h);
|
|
121510
|
+
const serializer = new XMLSerializer;
|
|
121511
|
+
const cloned = document.documentElement.cloneNode(true);
|
|
121512
|
+
const html3 = serializer.serializeToString(cloned);
|
|
121513
|
+
const svg = `<svg xmlns="http://www.w3.org/2000/svg" width="${w2}" height="${h}">
|
|
121514
|
+
<foreignObject width="100%" height="100%">
|
|
121515
|
+
${html3}
|
|
121516
|
+
</foreignObject>
|
|
121517
|
+
</svg>`;
|
|
121518
|
+
const blob = new Blob([svg], { type: "image/svg+xml;charset=utf-8" });
|
|
121519
|
+
const url2 = URL.createObjectURL(blob);
|
|
121520
|
+
const img = new Image;
|
|
121521
|
+
const renderText2 = () => {
|
|
121522
|
+
ctx.fillStyle = "#000000";
|
|
121523
|
+
ctx.font = "16px monospace";
|
|
121524
|
+
const text3 = document.body.innerText || "";
|
|
121525
|
+
const lines = text3.split(`
|
|
121512
121526
|
`);
|
|
121513
|
-
|
|
121514
|
-
|
|
121515
|
-
|
|
121516
|
-
const dataUrl = canvas.toDataURL("image/png");
|
|
121517
|
-
window.__canvasResult = dataUrl.replace(/^data:image\/png;base64,/, "");
|
|
121518
|
-
};
|
|
121519
|
-
img.src = url2;
|
|
121520
|
-
setTimeout(() => {
|
|
121521
|
-
if (window.__canvasResult === undefined) {
|
|
121527
|
+
for (let i = 0;i < lines.length && i < 40; i++) {
|
|
121528
|
+
ctx.fillText(lines[i], 10, 20 + i * 20);
|
|
121529
|
+
}
|
|
121522
121530
|
const dataUrl = canvas.toDataURL("image/png");
|
|
121523
|
-
|
|
121524
|
-
}
|
|
121525
|
-
|
|
121526
|
-
|
|
121527
|
-
|
|
121528
|
-
|
|
121531
|
+
resolve(dataUrl.replace(/^data:image\/png;base64,/, ""));
|
|
121532
|
+
};
|
|
121533
|
+
img.onload = () => {
|
|
121534
|
+
try {
|
|
121535
|
+
ctx.drawImage(img, 0, 0);
|
|
121536
|
+
URL.revokeObjectURL(url2);
|
|
121537
|
+
const dataUrl = canvas.toDataURL("image/png");
|
|
121538
|
+
resolve(dataUrl.replace(/^data:image\/png;base64,/, ""));
|
|
121539
|
+
} catch {
|
|
121540
|
+
URL.revokeObjectURL(url2);
|
|
121541
|
+
renderText2();
|
|
121542
|
+
}
|
|
121543
|
+
};
|
|
121544
|
+
img.onerror = () => {
|
|
121545
|
+
URL.revokeObjectURL(url2);
|
|
121546
|
+
renderText2();
|
|
121547
|
+
};
|
|
121548
|
+
img.src = url2;
|
|
121549
|
+
setTimeout(() => {
|
|
121550
|
+
try {
|
|
121551
|
+
const dataUrl = canvas.toDataURL("image/png");
|
|
121552
|
+
resolve(dataUrl.replace(/^data:image\/png;base64,/, ""));
|
|
121553
|
+
} catch {
|
|
121554
|
+
renderText2();
|
|
121555
|
+
}
|
|
121556
|
+
}, 4000);
|
|
121557
|
+
} catch (e) {
|
|
121558
|
+
resolve("");
|
|
121559
|
+
}
|
|
121560
|
+
});
|
|
121529
121561
|
});
|
|
121530
|
-
const base64 = await pollForResult2(browser3, "__canvasResult");
|
|
121531
121562
|
if (!base64) {
|
|
121532
121563
|
throw new Error("Canvas screenshot capture returned empty");
|
|
121533
121564
|
}
|
|
121534
121565
|
return base64;
|
|
121535
121566
|
}
|
|
121536
|
-
|
|
121537
|
-
const
|
|
121538
|
-
|
|
121539
|
-
const val3 = await browser3.execute((k) => window[k], key);
|
|
121540
|
-
if (val3 !== undefined)
|
|
121541
|
-
return val3;
|
|
121542
|
-
await new Promise((r) => setTimeout(r, intervalMs));
|
|
121543
|
-
}
|
|
121544
|
-
const val2 = await browser3.execute((k) => window[k], key);
|
|
121545
|
-
return val2 ?? "";
|
|
121567
|
+
function captureWithX112(display) {
|
|
121568
|
+
const result = execFileSync2("import", ["-display", `:${display}`, "-window", "root", "png:-"], { maxBuffer: 50 * 1024 * 1024, timeout: 1e4 });
|
|
121569
|
+
return result.toString("base64");
|
|
121546
121570
|
}
|
|
121547
121571
|
|
|
121548
121572
|
// src/commands/snapshot.ts
|
|
@@ -122008,35 +122032,24 @@ async function startServer(options) {
|
|
|
122008
122032
|
const { port, appPath, waitTimeout, autoWait } = options;
|
|
122009
122033
|
process.on("SIGINT", shutdown);
|
|
122010
122034
|
process.on("SIGTERM", shutdown);
|
|
122011
|
-
const
|
|
122012
|
-
|
|
122013
|
-
|
|
122014
|
-
|
|
122015
|
-
|
|
122016
|
-
|
|
122017
|
-
const ppid = parseInt(stat.split(") ")[1].split(" ")[1]);
|
|
122018
|
-
if (ppid <= 1)
|
|
122019
|
-
break;
|
|
122020
|
-
pids.push(ppid);
|
|
122021
|
-
pid = ppid;
|
|
122022
|
-
} catch {
|
|
122023
|
-
break;
|
|
122024
|
-
}
|
|
122035
|
+
const getDirectParentPid = () => {
|
|
122036
|
+
try {
|
|
122037
|
+
const stat = readFileSync(`/proc/${process.pid}/stat`, "utf8");
|
|
122038
|
+
return parseInt(stat.split(") ")[1].split(" ")[1]);
|
|
122039
|
+
} catch {
|
|
122040
|
+
return process.ppid;
|
|
122025
122041
|
}
|
|
122026
|
-
return pids;
|
|
122027
122042
|
};
|
|
122028
|
-
const
|
|
122029
|
-
if (
|
|
122043
|
+
const parentPid = getDirectParentPid();
|
|
122044
|
+
if (parentPid > 1) {
|
|
122030
122045
|
setInterval(() => {
|
|
122031
|
-
|
|
122032
|
-
|
|
122033
|
-
|
|
122034
|
-
|
|
122035
|
-
|
|
122036
|
-
return;
|
|
122037
|
-
}
|
|
122046
|
+
try {
|
|
122047
|
+
process.kill(parentPid, 0);
|
|
122048
|
+
} catch {
|
|
122049
|
+
shutdown();
|
|
122050
|
+
return;
|
|
122038
122051
|
}
|
|
122039
|
-
},
|
|
122052
|
+
}, 2000);
|
|
122040
122053
|
}
|
|
122041
122054
|
console.error(`Launching app and waiting for load (timeout: ${waitTimeout}ms)...`);
|
|
122042
122055
|
await connect2({ appPath, waitTimeout });
|