79 lines
2.9 KiB
TypeScript
79 lines
2.9 KiB
TypeScript
import { expect, it, onTestFinished } from "vitest";
|
|
|
|
import { CdpCaptureEvents } from "../../../src/browser/CdpCaptureEvents.js";
|
|
import { inspectWebPageInputSchema } from "../../../src/domain/browserObservation.js";
|
|
import { CdpBrowserProvider } from "../../../src/browser/CdpBrowserProvider.js";
|
|
import { startFakeCdpBrowser } from "../../fixtures/fakeCdpBrowser.js";
|
|
import type { CdpEvent } from "../../../src/browser/CdpConnection.js";
|
|
|
|
const events = (): CdpCaptureEvents =>
|
|
new CdpCaptureEvents(
|
|
inspectWebPageInputSchema.parse({
|
|
cdp_endpoint: "http://127.0.0.1:9222",
|
|
allowed_origins: ["https://example.test"],
|
|
target_id: "page-1",
|
|
}),
|
|
new Set(["https://example.test"]),
|
|
);
|
|
|
|
const frameNavigated = (url: string, loaderId: string): CdpEvent => ({
|
|
method: "Page.frameNavigated",
|
|
params: {
|
|
frame: { id: "main", url, loaderId },
|
|
},
|
|
});
|
|
|
|
it("ignores a repeated frameNavigated for the document already committed", () => {
|
|
const state = events();
|
|
state.beginAuthorizedFrame("main");
|
|
state.ingest(frameNavigated("https://example.test/page", "loader-1"));
|
|
expect(state.navigationDuringCapture).toBe(true);
|
|
state.navigationDuringCapture = false;
|
|
|
|
// A re-fire with the same URL and loader is not a navigation.
|
|
state.ingest(frameNavigated("https://example.test/page", "loader-1"));
|
|
expect(state.navigationDuringCapture).toBe(false);
|
|
});
|
|
|
|
it("still reports a genuine change of document", () => {
|
|
const state = events();
|
|
state.beginAuthorizedFrame("main");
|
|
state.ingest(frameNavigated("https://example.test/page", "loader-1"));
|
|
state.navigationDuringCapture = false;
|
|
state.ingest(frameNavigated("https://example.test/other", "loader-2"));
|
|
expect(state.navigationDuringCapture).toBe(true);
|
|
});
|
|
|
|
it("does not forget a navigation that happened during the observation window", () => {
|
|
const state = events();
|
|
state.beginAuthorizedFrame("main");
|
|
state.ingest(frameNavigated("https://example.test/page", "loader-1"));
|
|
// The final capture re-attaches to the resolved frame; clearing the flag here
|
|
// used to report a clean capture while carrying pre-navigation state.
|
|
state.beginFinalCapture("main");
|
|
expect(state.navigationDuringCapture).toBe(true);
|
|
});
|
|
|
|
it("keeps a settled observation window clean", () => {
|
|
const state = events();
|
|
state.beginAuthorizedFrame("main");
|
|
state.beginFinalCapture("main");
|
|
expect(state.navigationDuringCapture).toBe(false);
|
|
});
|
|
|
|
it("captures a page without aborting on a duplicate frame event", async () => {
|
|
const browser = await startFakeCdpBrowser({ sessionTimeline: "same_origin" });
|
|
onTestFinished(async () => {
|
|
await browser.close();
|
|
});
|
|
const result = await new CdpBrowserProvider().inspectPage(
|
|
inspectWebPageInputSchema.parse({
|
|
cdp_endpoint: browser.endpoint,
|
|
allowed_origins: [browser.allowedOrigin],
|
|
target_id: "allowed-page",
|
|
observation_ms: 0,
|
|
}),
|
|
);
|
|
expect(result.ok).toBe(true);
|
|
});
|