mirror of
https://github.com/diegosouzapw/OmniRoute.git
synced 2026-08-23 23:52:18 +03:00
Merged — locally validated (73/73 focused electron tests, typecheck:core clean, gates green) after resolving base-drift against #10327 (both landed today, real interleaved logic in createWindow/showMainWindow/window-all-closed — combined so the hidden-start lazy-open path from #10327 and the unload-on-close path from this PR both stay intact; verified by the existing test 'keeps the non-macOS app alive when unloading its last renderer'). Nice pair of electron perf PRs, thanks!
88 lines
3.3 KiB
TypeScript
88 lines
3.3 KiB
TypeScript
import { describe, it } from "node:test";
|
|
import assert from "node:assert/strict";
|
|
import { readFileSync } from "node:fs";
|
|
import { join } from "node:path";
|
|
import { createRequire } from "node:module";
|
|
|
|
const require = createRequire(import.meta.url);
|
|
const {
|
|
CLOSE_BEHAVIOR_KEEP_LOADED,
|
|
CLOSE_BEHAVIOR_UNLOAD,
|
|
normalizeCloseBehavior,
|
|
resolveRendererUrl,
|
|
} = require("../../electron/lib/windowClosePolicy");
|
|
|
|
describe("Electron window close policy", () => {
|
|
it("accepts only the two deliberate close behaviors", () => {
|
|
assert.equal(normalizeCloseBehavior("keep-loaded"), CLOSE_BEHAVIOR_KEEP_LOADED);
|
|
assert.equal(normalizeCloseBehavior("unload"), CLOSE_BEHAVIOR_UNLOAD);
|
|
assert.equal(normalizeCloseBehavior("destroy"), null);
|
|
assert.equal(normalizeCloseBehavior(undefined), null);
|
|
});
|
|
|
|
it("preserves same-origin dashboard navigation when recreating the renderer", () => {
|
|
assert.equal(
|
|
resolveRendererUrl(
|
|
"http://localhost:20128/dashboard/settings?tab=providers",
|
|
"http://localhost:20128"
|
|
),
|
|
"http://localhost:20128/dashboard/settings?tab=providers"
|
|
);
|
|
});
|
|
|
|
it("falls back to the active server for invalid or cross-origin URLs", () => {
|
|
assert.equal(
|
|
resolveRendererUrl("https://example.com/dashboard", "http://localhost:20128"),
|
|
"http://localhost:20128/"
|
|
);
|
|
assert.equal(
|
|
resolveRendererUrl("not a url", "http://localhost:20128"),
|
|
"http://localhost:20128"
|
|
);
|
|
});
|
|
});
|
|
|
|
describe("Electron main-process close policy wiring", () => {
|
|
const mainSrc = readFileSync(join(import.meta.dirname, "../../electron/main.js"), "utf8");
|
|
|
|
it("defaults to keeping the renderer loaded and exposes both policies in the tray", () => {
|
|
assert.match(mainSrc, /electronPreferences\.closeBehavior/);
|
|
assert.match(mainSrc, /Keep Loaded \(Faster Reopen\)/);
|
|
assert.match(mainSrc, /Unload Renderer \(Lower Memory\)/);
|
|
assert.match(mainSrc, /writeCloseBehavior\(REMOTE_SERVER_PREFS_PATH, closeBehavior\)/);
|
|
});
|
|
|
|
it("destroys only the renderer in unload mode and otherwise hides the window", () => {
|
|
const closeHandler = mainSrc.slice(
|
|
mainSrc.indexOf('window.on("close"'),
|
|
mainSrc.indexOf('window.on("closed"')
|
|
);
|
|
assert.ok(closeHandler.includes("closeBehavior === CLOSE_BEHAVIOR_UNLOAD"));
|
|
assert.ok(closeHandler.includes("window.destroy()"));
|
|
assert.ok(closeHandler.includes("window.hide()"));
|
|
assert.ok(!closeHandler.includes("stopNextServer"));
|
|
});
|
|
|
|
it("recreates the renderer from every explicit reopen path", () => {
|
|
const secondInstanceHandler = mainSrc.slice(
|
|
mainSrc.indexOf('app.on("second-instance"'),
|
|
mainSrc.indexOf("// ── Environment Detection")
|
|
);
|
|
assert.ok(secondInstanceHandler.includes("showMainWindow()"));
|
|
assert.ok(secondInstanceHandler.includes("if (isHeadless) return"));
|
|
assert.match(mainSrc, /label: "Open OmniRoute",\s*click: \(\) => showMainWindow\(\)/);
|
|
assert.match(mainSrc, /tray\.on\("double-click", \(\) => showMainWindow\(\)\)/);
|
|
assert.match(
|
|
mainSrc,
|
|
/app\.on\("activate", \(\) => \{\s*if \(isHeadless\) return;\s*showMainWindow\(\);/
|
|
);
|
|
});
|
|
|
|
it("keeps the non-macOS app alive when unloading its last renderer", () => {
|
|
assert.match(
|
|
mainSrc,
|
|
/process\.platform !== "darwin"[\s\S]*closeBehavior !== CLOSE_BEHAVIOR_UNLOAD[\s\S]*app\.quit\(\)/
|
|
);
|
|
});
|
|
});
|