mirror of
https://github.com/morluto/rea.git
synced 2026-11-06 06:46:10 +00:00
fix(electron): retain computed literal preference keys
Use the parsed semantic property key instead of treating all bracketed keys as dynamic. Preserve empty and numeric literal keys; unresolved computed expressions remain unknown. Validation: exact named preference and dynamic coverage regressions pass. Fixes #2521. Based on #3105. Co-authored-by: ShuaixinHuang <1836656514@qq.com>
This commit is contained in:
1 parent
7e1c560dd6
commit
bdf865252c
2 files changed
+58
-3
No files matched your search
@@ -25,7 +25,7 @@ import {
|
||||
staticPath,
|
||||
staticPathResolutionContext,
|
||||
} from "./javascriptStaticAnalysisHelpers.js";
|
||||
import { semanticStaticPropertyName } from "./javascriptAstValues.js";
|
||||
import { semanticStaticPropertyKey } from "./javascriptAstValues.js";
|
||||
import type { JavaScriptFindingContext } from "./javascriptStaticAnalysisState.js";
|
||||
|
||||
/** Inspect BrowserWindow, contextBridge, and utility-process syntax. */
|
||||
@@ -126,8 +126,8 @@ const collectWebPreferences = (
|
||||
});
|
||||
continue;
|
||||
}
|
||||
const name = semanticStaticPropertyName(property.key, property.computed);
|
||||
if (name === "" || property.computed) {
|
||||
const name = semanticStaticPropertyKey(property.key, property.computed);
|
||||
if (name === null) {
|
||||
unknown += 1;
|
||||
preferences.push({
|
||||
name: `[dynamic@${String(property.start ?? -1)}]`,
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
|
||||
import { analyzeJavaScriptStaticSource } from "./javascriptStaticAnalysis.js";
|
||||
|
||||
describe("computed Electron web preference keys", () => {
|
||||
it("retains exact string, numeric, and empty literal keys", () => {
|
||||
const analysis = analyzeJavaScriptStaticSource(`
|
||||
const { BrowserWindow } = require("electron");
|
||||
new BrowserWindow({ webPreferences: {
|
||||
["sandbox"]: true,
|
||||
["preload"]: "./preload.js",
|
||||
[1]: "numeric",
|
||||
[""]: false
|
||||
} });
|
||||
`);
|
||||
|
||||
expect(analysis.parse_status).toBe("complete");
|
||||
expect(analysis.electron.browser_windows[0]).toMatchObject({
|
||||
preload_path: "./preload.js",
|
||||
web_preferences: [
|
||||
{ name: "", value: { status: "literal", value: false } },
|
||||
{ name: "1", value: { status: "literal", value: "numeric" } },
|
||||
{
|
||||
name: "preload",
|
||||
value: { status: "literal", value: "./preload.js" },
|
||||
},
|
||||
{ name: "sandbox", value: { status: "literal", value: true } },
|
||||
],
|
||||
});
|
||||
});
|
||||
|
||||
it("keeps genuinely dynamic computed keys unknown", () => {
|
||||
const analysis = analyzeJavaScriptStaticSource(`
|
||||
const { BrowserWindow } = require("electron");
|
||||
new BrowserWindow({ webPreferences: {
|
||||
[getKey()]: true,
|
||||
["sandbox"]: true
|
||||
} });
|
||||
`);
|
||||
|
||||
expect(analysis.parse_status).toBe("partial");
|
||||
expect(analysis.electron.browser_windows[0]?.web_preferences).toEqual(
|
||||
expect.arrayContaining([
|
||||
expect.objectContaining({
|
||||
name: expect.stringMatching(/^\[dynamic@/u),
|
||||
value: expect.objectContaining({ status: "dynamic" }),
|
||||
}),
|
||||
{
|
||||
name: "sandbox",
|
||||
value: { status: "literal", value: true, expression: null },
|
||||
},
|
||||
]),
|
||||
);
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user