用户引导
This commit is contained in:
1 parent
c6fcf51e0c
commit
33b719d460
5 files changed
+456
-42
No files matched your search
@@ -0,0 +1,164 @@
|
||||
/**
|
||||
* embed-session.ts 浏览上下文隔离单测。
|
||||
* 运行方式(项目无 vitest):
|
||||
* npx esbuild src/core/embed/embed-session.test.ts --bundle --format=esm \
|
||||
* --platform=node --outfile=.tmp-tests/embed-session.test.mjs
|
||||
* node --test .tmp-tests/embed-session.test.mjs
|
||||
*/
|
||||
import assert from "node:assert/strict";
|
||||
import test from "node:test";
|
||||
|
||||
import {
|
||||
isChromeHidden,
|
||||
isEmbedActive,
|
||||
isIsolatedSession,
|
||||
readEmbedSession,
|
||||
syncEmbedSessionFromSearch,
|
||||
} from "./embed-session";
|
||||
|
||||
class MemoryStorage {
|
||||
#map = new Map<string, string>();
|
||||
getItem(key: string): string | null {
|
||||
return this.#map.has(key) ? this.#map.get(key)! : null;
|
||||
}
|
||||
setItem(key: string, value: string): void {
|
||||
this.#map.set(key, String(value));
|
||||
}
|
||||
removeItem(key: string): void {
|
||||
this.#map.delete(key);
|
||||
}
|
||||
}
|
||||
|
||||
type FakeWindow = {
|
||||
self: FakeWindow;
|
||||
top: FakeWindow;
|
||||
sessionStorage: MemoryStorage;
|
||||
location: { hash: string; search: string };
|
||||
__deerflowTopChromeEmbed?: boolean;
|
||||
};
|
||||
|
||||
const originalWindow = (globalThis as { window?: unknown }).window;
|
||||
|
||||
function withSharedTab<T>(run: (ctx: {
|
||||
storage: MemoryStorage;
|
||||
asTop: () => void;
|
||||
asIframe: () => void;
|
||||
}) => T): T {
|
||||
const storage = new MemoryStorage();
|
||||
const top = {
|
||||
sessionStorage: storage,
|
||||
location: { hash: "", search: "" },
|
||||
} as FakeWindow;
|
||||
top.self = top;
|
||||
top.top = top;
|
||||
const iframe = {
|
||||
sessionStorage: storage,
|
||||
location: { hash: "#/login/guest?embed=1&theme=blue&hideJump=0", search: "" },
|
||||
} as FakeWindow;
|
||||
iframe.self = iframe;
|
||||
iframe.top = top;
|
||||
|
||||
const asTop = () => {
|
||||
(globalThis as { window: FakeWindow }).window = top;
|
||||
};
|
||||
const asIframe = () => {
|
||||
(globalThis as { window: FakeWindow }).window = iframe;
|
||||
};
|
||||
|
||||
asTop();
|
||||
try {
|
||||
return run({ storage, asTop, asIframe });
|
||||
} finally {
|
||||
if (originalWindow === undefined) {
|
||||
delete (globalThis as { window?: unknown }).window;
|
||||
} else {
|
||||
(globalThis as { window: unknown }).window = originalWindow;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
test("nested embed=1 does not hide chrome on the same-origin top window", () => {
|
||||
withSharedTab(({ storage, asTop, asIframe }) => {
|
||||
asTop();
|
||||
syncEmbedSessionFromSearch("");
|
||||
assert.equal(isEmbedActive(), false);
|
||||
assert.equal(isChromeHidden(), false);
|
||||
|
||||
asIframe();
|
||||
syncEmbedSessionFromSearch("?embed=1&theme=blue&hideJump=0");
|
||||
assert.equal(isEmbedActive(), true);
|
||||
assert.equal(isChromeHidden(), true);
|
||||
assert.ok(storage.getItem("embed.session.nested"));
|
||||
assert.equal(storage.getItem("embed.session"), null);
|
||||
|
||||
asTop();
|
||||
assert.equal(isEmbedActive(), false);
|
||||
assert.equal(isChromeHidden(), false);
|
||||
});
|
||||
});
|
||||
|
||||
test("nested iframe reclaims a polluted shared embed.session key", () => {
|
||||
withSharedTab(({ storage, asTop, asIframe }) => {
|
||||
asTop();
|
||||
storage.setItem(
|
||||
"embed.session",
|
||||
JSON.stringify({
|
||||
embed: true,
|
||||
theme: "light",
|
||||
hideJump: false,
|
||||
hideHeader: false,
|
||||
hideChrome: false,
|
||||
isolate: false,
|
||||
}),
|
||||
);
|
||||
assert.equal(isEmbedActive(), true);
|
||||
|
||||
asIframe();
|
||||
syncEmbedSessionFromSearch("?embed=1");
|
||||
|
||||
asTop();
|
||||
assert.equal(isEmbedActive(), false);
|
||||
assert.equal(isChromeHidden(), false);
|
||||
assert.equal(storage.getItem("embed.session"), null);
|
||||
});
|
||||
});
|
||||
|
||||
test("nested iframe keeps the top window's own embed session", () => {
|
||||
withSharedTab(({ asTop, asIframe }) => {
|
||||
asTop();
|
||||
syncEmbedSessionFromSearch("?embed=1&theme=dark");
|
||||
syncEmbedSessionFromSearch("");
|
||||
assert.equal(isEmbedActive(), true);
|
||||
|
||||
asIframe();
|
||||
syncEmbedSessionFromSearch("?embed=1");
|
||||
|
||||
asTop();
|
||||
assert.equal(isEmbedActive(), true);
|
||||
assert.equal(readEmbedSession()?.theme, "dark");
|
||||
});
|
||||
});
|
||||
|
||||
test("nested reclaim strips embed but keeps top isolate", () => {
|
||||
withSharedTab(({ storage, asTop, asIframe }) => {
|
||||
asTop();
|
||||
storage.setItem(
|
||||
"embed.session",
|
||||
JSON.stringify({
|
||||
embed: true,
|
||||
theme: "light",
|
||||
hideJump: false,
|
||||
hideHeader: false,
|
||||
hideChrome: false,
|
||||
isolate: true,
|
||||
}),
|
||||
);
|
||||
|
||||
asIframe();
|
||||
syncEmbedSessionFromSearch("?embed=1");
|
||||
|
||||
asTop();
|
||||
assert.equal(isEmbedActive(), false);
|
||||
assert.equal(isIsolatedSession(), true);
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user