@glubean/browser 0.8.4 → 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/evidence.d.ts +207 -11
- package/dist/evidence.d.ts.map +1 -1
- package/dist/evidence.js +393 -15
- package/dist/evidence.js.map +1 -1
- package/dist/frame.d.ts +83 -0
- package/dist/frame.d.ts.map +1 -0
- package/dist/frame.js +183 -0
- package/dist/frame.js.map +1 -0
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/locator.d.ts +73 -2
- package/dist/locator.d.ts.map +1 -1
- package/dist/locator.js +127 -2
- package/dist/locator.js.map +1 -1
- package/dist/page.d.ts +147 -3
- package/dist/page.d.ts.map +1 -1
- package/dist/page.js +409 -9
- package/dist/page.js.map +1 -1
- package/package.json +2 -2
package/dist/evidence.d.ts
CHANGED
|
@@ -8,12 +8,17 @@
|
|
|
8
8
|
* trace event (see {@link ./network.ts}).
|
|
9
9
|
* - **Request mock** (`Fetch` domain) — fulfill matching requests with a canned
|
|
10
10
|
* response; non-matching requests are continued untouched.
|
|
11
|
-
* - **Emulation** (`Emulation` domain) — timezone / geolocation / viewport.
|
|
11
|
+
* - **Emulation** (`Emulation` domain) — timezone / geolocation / viewport / user agent.
|
|
12
|
+
* - **Storage state** — restore cookies / localStorage before the page's
|
|
13
|
+
* first script runs, and capture them back out on demand (a thin "login
|
|
14
|
+
* once, reuse the session" primitive). Cookies go through this session's
|
|
15
|
+
* `Network.setCookies` (browser-context scoped, session-agnostic in CDP).
|
|
16
|
+
* localStorage does **not** — see guardrail ③.
|
|
12
17
|
*
|
|
13
18
|
* The keystone spike disproved the "Fetch is near-exclusive" hypothesis: a
|
|
14
19
|
* self-opened session running `Fetch.enable`/`fulfillRequest` is stable **as
|
|
15
20
|
* long as the user has not enabled Puppeteer's own request interception**.
|
|
16
|
-
*
|
|
21
|
+
* Three coexistence hazards exist, each handled below:
|
|
17
22
|
*
|
|
18
23
|
* **Guardrail ① — viewport ownership.** Our `Emulation.setDeviceMetricsOverride`
|
|
19
24
|
* and Puppeteer's `page.setViewport()` both drive device metrics and clobber
|
|
@@ -28,6 +33,45 @@
|
|
|
28
33
|
* `page.setRequestInterception(true)` with a clear error. When no mocks are
|
|
29
34
|
* configured we never enable `Fetch`, so the user's own interception is free.
|
|
30
35
|
*
|
|
36
|
+
* **Guardrail ③ — new-document scripts need Puppeteer's OWN session.**
|
|
37
|
+
* Verified empirically: sending `Page.addScriptToEvaluateOnNewDocument` on
|
|
38
|
+
* our *auxiliary* `page.createCDPSession()` session registers without error
|
|
39
|
+
* (a real `identifier` comes back) but the script never actually fires on
|
|
40
|
+
* subsequent navigations — only the session Puppeteer itself uses for the
|
|
41
|
+
* page's frame-lifecycle bookkeeping gets its new-document scripts run.
|
|
42
|
+
* `storageState.localStorage` therefore seeds via Puppeteer's own
|
|
43
|
+
* `page.evaluateOnNewDocument()`, not a raw CDP call on this session.
|
|
44
|
+
*
|
|
45
|
+
* **Downloads** (`Browser` domain, BT1-M5) — `Browser.setDownloadBehavior`
|
|
46
|
+
* with `eventsEnabled: true`, called on this same auxiliary session, both
|
|
47
|
+
* configures the save directory AND (unlike guardrail ③'s Page-domain
|
|
48
|
+
* finding) reliably delivers `Browser.downloadWillBegin` /
|
|
49
|
+
* `Browser.downloadProgress` back on THIS session — verified empirically
|
|
50
|
+
* (spike script) against puppeteer-core ^24; `Browser.*` is genuinely
|
|
51
|
+
* session-agnostic where `Page.addScriptToEvaluateOnNewDocument` was not.
|
|
52
|
+
* The deprecated `Page.setDownloadBehavior` / `Page.downloadWillBegin` also
|
|
53
|
+
* work on the same spike but `Browser.*` is the protocol's forward path, so
|
|
54
|
+
* that's what's wired here. One caveat verified in the same spike: the file
|
|
55
|
+
* on disk is saved as `suggestedFilename`, not `guid` (despite some CDP docs
|
|
56
|
+
* implying the latter) — `DownloadEntry.path` is built from that name, which
|
|
57
|
+
* is only exact when Chrome didn't have to de-duplicate a collision.
|
|
58
|
+
* Always wired when a page is created (like dialog/popup) — a download IS
|
|
59
|
+
* evidence the moment it happens, not an opt-in capability.
|
|
60
|
+
*
|
|
61
|
+
* **Guardrail ④ — download events are browser-context-global.** Unlike the
|
|
62
|
+
* page-scoped `Network`/`Fetch` domains, `Browser.setDownloadBehavior` sets a
|
|
63
|
+
* single context-wide save path (last caller wins) and its `downloadWillBegin`/
|
|
64
|
+
* `downloadProgress` events fire on *every* session that turned events on, for
|
|
65
|
+
* *every* download in the context. So two instrumented pages in one Chrome
|
|
66
|
+
* would otherwise cross-observe and cross-repoint each other's downloads. Two
|
|
67
|
+
* mitigations: (a) the page layer uses ONE browser-wide download dir (not
|
|
68
|
+
* per-test) so the last-wins path is a no-op; (b) this session enables the
|
|
69
|
+
* `Page` domain, tracks its target's frame ids (`Page.getFrameTree` +
|
|
70
|
+
* `frameAttached`/`frameDetached`), and only records downloads whose
|
|
71
|
+
* originating `frameId` it owns — so a page never resolves another page's
|
|
72
|
+
* download. Both degrade safely: an unreadable frame tree falls back to
|
|
73
|
+
* accepting all events (single-page runs are unaffected).
|
|
74
|
+
*
|
|
31
75
|
* @module evidence
|
|
32
76
|
*/
|
|
33
77
|
import type { CDPSession, Page } from "puppeteer-core";
|
|
@@ -136,8 +180,8 @@ export interface ViewportOverride {
|
|
|
136
180
|
/**
|
|
137
181
|
* Environment emulation applied on the shared evidence session.
|
|
138
182
|
*
|
|
139
|
-
* Timezone and
|
|
140
|
-
* Viewport is special: see guardrail ① — do **not** also call
|
|
183
|
+
* Timezone, geolocation, and user agent are pure overrides with no Puppeteer
|
|
184
|
+
* conflict. Viewport is special: see guardrail ① — do **not** also call
|
|
141
185
|
* `page.setViewport()`, it will race with this override.
|
|
142
186
|
*/
|
|
143
187
|
export interface EmulationOptions {
|
|
@@ -147,6 +191,71 @@ export interface EmulationOptions {
|
|
|
147
191
|
geolocation?: GeolocationOverride;
|
|
148
192
|
/** Viewport / device metrics. Glubean becomes the sole viewport owner. */
|
|
149
193
|
viewport?: ViewportOverride;
|
|
194
|
+
/** User-agent string override (`Emulation.setUserAgentOverride`). */
|
|
195
|
+
userAgent?: string;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* A cookie as accepted by {@link EvidenceSession.attach}'s `storageState.cookies`
|
|
199
|
+
* and returned by {@link EvidenceSession.captureStorageState}. Mirrors the CDP
|
|
200
|
+
* `Network.CookieParam` / `Network.Cookie` shapes closely enough to round-trip:
|
|
201
|
+
* a captured cookie can be fed straight back in as an applied one.
|
|
202
|
+
*/
|
|
203
|
+
export interface StorageCookie {
|
|
204
|
+
name: string;
|
|
205
|
+
value: string;
|
|
206
|
+
/** Either `domain` or `url` must be resolvable for CDP to place the cookie. */
|
|
207
|
+
domain?: string;
|
|
208
|
+
path?: string;
|
|
209
|
+
url?: string;
|
|
210
|
+
/** Unix time in seconds, or `-1` for a session cookie. */
|
|
211
|
+
expires?: number;
|
|
212
|
+
httpOnly?: boolean;
|
|
213
|
+
secure?: boolean;
|
|
214
|
+
sameSite?: "Strict" | "Lax" | "None";
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Cookies + localStorage for one page — a thin "login once, reuse the
|
|
218
|
+
* session" primitive (à la Playwright's `storageState`). Cookies apply via
|
|
219
|
+
* CDP `Network.setCookies`; localStorage applies via Puppeteer's own
|
|
220
|
+
* `page.evaluateOnNewDocument()` (see guardrail ③) so it is present before
|
|
221
|
+
* the page's own scripts run on every navigation of this page.
|
|
222
|
+
*/
|
|
223
|
+
export interface StorageState {
|
|
224
|
+
cookies?: StorageCookie[];
|
|
225
|
+
/** Key/value pairs seeded into `localStorage` on every new document. */
|
|
226
|
+
localStorage?: Record<string, string>;
|
|
227
|
+
}
|
|
228
|
+
/** Lifecycle state of a browser download (mirrors CDP `Browser.downloadProgress.state`). */
|
|
229
|
+
export type DownloadState = "inProgress" | "completed" | "canceled";
|
|
230
|
+
/**
|
|
231
|
+
* A browser download captured via CDP `Browser.downloadWillBegin` /
|
|
232
|
+
* `Browser.downloadProgress`.
|
|
233
|
+
*/
|
|
234
|
+
export interface DownloadEntry {
|
|
235
|
+
/** CDP-assigned globally-unique download id. */
|
|
236
|
+
guid: string;
|
|
237
|
+
/** URL the download was initiated from (may be `data:`/`blob:`). */
|
|
238
|
+
url: string;
|
|
239
|
+
/** Filename suggested by the server/anchor at download start. */
|
|
240
|
+
suggestedFilename: string;
|
|
241
|
+
/**
|
|
242
|
+
* Best-effort on-disk path: `${dir}/${suggestedFilename}`. Exact only when
|
|
243
|
+
* Chrome didn't have to de-duplicate a filename collision in `dir` — see
|
|
244
|
+
* the module doc's Downloads note.
|
|
245
|
+
*/
|
|
246
|
+
path: string;
|
|
247
|
+
}
|
|
248
|
+
/** Options wiring the shared session's download capture. */
|
|
249
|
+
export interface DownloadOptions {
|
|
250
|
+
/** Directory downloads are saved to. Must already exist — the caller creates it. */
|
|
251
|
+
dir: string;
|
|
252
|
+
/**
|
|
253
|
+
* Called on every state transition (`inProgress` fires once per progress
|
|
254
|
+
* tick — usually more than once per download; `completed`/`canceled` fire
|
|
255
|
+
* exactly once). Mainly for evidence emission; {@link EvidenceSession.waitForDownload}
|
|
256
|
+
* is the ergonomic way to correlate a triggering action with its result.
|
|
257
|
+
*/
|
|
258
|
+
onDownload?: (entry: DownloadEntry, state: DownloadState) => void;
|
|
150
259
|
}
|
|
151
260
|
/** Options for {@link EvidenceSession.attach}. */
|
|
152
261
|
export interface EvidenceSessionOptions {
|
|
@@ -159,8 +268,15 @@ export interface EvidenceSessionOptions {
|
|
|
159
268
|
network?: Pick<NetworkTracerOptions, "include" | "excludePaths" | "filter">;
|
|
160
269
|
/** Request-mock rules. When non-empty, the `Fetch` domain is enabled (guardrail ②). */
|
|
161
270
|
mocks?: MockRule[];
|
|
162
|
-
/** Environment emulation (timezone / geolocation / viewport). */
|
|
271
|
+
/** Environment emulation (timezone / geolocation / viewport / user agent). */
|
|
163
272
|
emulate?: EmulationOptions;
|
|
273
|
+
/**
|
|
274
|
+
* Cookies / localStorage to restore before the page's first script runs
|
|
275
|
+
* (`storageState.cookies` via `Network.setCookies`, `storageState.localStorage`
|
|
276
|
+
* via Puppeteer's `page.evaluateOnNewDocument()` — see guardrail ③).
|
|
277
|
+
* Capture the current state with {@link EvidenceSession.captureStorageState}.
|
|
278
|
+
*/
|
|
279
|
+
storageState?: StorageState;
|
|
164
280
|
/**
|
|
165
281
|
* Screenshot capture policy and I/O delegate.
|
|
166
282
|
*
|
|
@@ -169,6 +285,12 @@ export interface EvidenceSessionOptions {
|
|
|
169
285
|
* Omit (or set `mode: "off"`) to disable all automatic screenshot capture.
|
|
170
286
|
*/
|
|
171
287
|
screenshots?: EvidenceScreenshotOptions;
|
|
288
|
+
/**
|
|
289
|
+
* Download capture (`Browser.setDownloadBehavior` + `downloadWillBegin`/
|
|
290
|
+
* `downloadProgress`). When provided, every download on this page is
|
|
291
|
+
* allowed (not blocked) and reported via `onDownload` / {@link EvidenceSession.waitForDownload}.
|
|
292
|
+
*/
|
|
293
|
+
downloads?: DownloadOptions;
|
|
172
294
|
}
|
|
173
295
|
/** A single CDP call: `{ method, params }`. Kept pure for testing. */
|
|
174
296
|
export interface CdpCall {
|
|
@@ -201,10 +323,18 @@ export declare function buildFulfillParams(rule: MockRule, requestId: string): {
|
|
|
201
323
|
/**
|
|
202
324
|
* @internal Build the ordered list of `Emulation.*` CDP calls.
|
|
203
325
|
*
|
|
204
|
-
* Timezone and
|
|
205
|
-
*
|
|
326
|
+
* Timezone, geolocation, and user agent come first (order-independent among
|
|
327
|
+
* themselves); the viewport override is applied **last** (guardrail ①) so it
|
|
328
|
+
* is the final word on device metrics at setup time.
|
|
206
329
|
*/
|
|
207
330
|
export declare function buildEmulationCalls(emulate: EmulationOptions): CdpCall[];
|
|
331
|
+
/**
|
|
332
|
+
* @internal Build `Network.setCookies` params from `storageState.cookies`.
|
|
333
|
+
* Returns `undefined` when there is nothing to set (caller skips the call).
|
|
334
|
+
*/
|
|
335
|
+
export declare function buildSetCookiesParams(cookies: StorageCookie[] | undefined): {
|
|
336
|
+
cookies: StorageCookie[];
|
|
337
|
+
} | undefined;
|
|
208
338
|
/**
|
|
209
339
|
* @internal Replace `page[method]` with a guard, returning a restore function.
|
|
210
340
|
*
|
|
@@ -226,6 +356,28 @@ export declare class EvidenceSession {
|
|
|
226
356
|
private _screenshotOpts;
|
|
227
357
|
private _screenshotSeq;
|
|
228
358
|
private _screenshotLog;
|
|
359
|
+
private _downloadsEnabled;
|
|
360
|
+
private _downloadDir;
|
|
361
|
+
private _onDownload;
|
|
362
|
+
/**
|
|
363
|
+
* Frame ids owned by THIS page's target. `Browser.setDownloadBehavior`'s
|
|
364
|
+
* events are browser-context-global — every session that turned events on
|
|
365
|
+
* receives every download in the context. We only record downloads whose
|
|
366
|
+
* originating `frameId` belongs to this page, so two instrumented pages
|
|
367
|
+
* sharing one Chrome never cross-observe each other's downloads.
|
|
368
|
+
*/
|
|
369
|
+
private _ownedFrames;
|
|
370
|
+
/**
|
|
371
|
+
* True only once the initial `Page.getFrameTree` seeded {@link _ownedFrames}.
|
|
372
|
+
* The frame filter engages ONLY when this is set — otherwise we accept all
|
|
373
|
+
* download events (fallback mode). Without this flag, a later
|
|
374
|
+
* `Page.frameAttached` would grow `_ownedFrames` from empty to non-empty and
|
|
375
|
+
* silently flip fallback mode into a PARTIAL filter that drops the page's own
|
|
376
|
+
* top-frame downloads (codex R2 P2).
|
|
377
|
+
*/
|
|
378
|
+
private _frameTreeSeeded;
|
|
379
|
+
private _pendingDownloads;
|
|
380
|
+
private _downloadWaiters;
|
|
229
381
|
private constructor();
|
|
230
382
|
/** The underlying CDP session, for advanced/raw use. */
|
|
231
383
|
get cdp(): CDPSession;
|
|
@@ -255,13 +407,57 @@ export declare class EvidenceSession {
|
|
|
255
407
|
captureShot(label: string, trigger: ScreenshotTrigger): Promise<void>;
|
|
256
408
|
/**
|
|
257
409
|
* Open one CDP session on `page` and wire up the requested capabilities:
|
|
258
|
-
* Network trace, Fetch mock (guardrail ②),
|
|
259
|
-
* viewport)
|
|
260
|
-
*
|
|
261
|
-
* interception untouched.
|
|
410
|
+
* Network trace, Fetch mock (guardrail ②), Emulation (guardrail ① for
|
|
411
|
+
* viewport), and storage state (cookies + localStorage). Capabilities are
|
|
412
|
+
* only enabled when their config is present, so a page with no mocks never
|
|
413
|
+
* enables `Fetch` and leaves the user's own request interception untouched.
|
|
262
414
|
*/
|
|
263
415
|
static attach(page: Page, options: EvidenceSessionOptions): Promise<EvidenceSession>;
|
|
264
416
|
private _installMocks;
|
|
417
|
+
private _applyStorageState;
|
|
418
|
+
/**
|
|
419
|
+
* @internal Wire `Browser.setDownloadBehavior` (`eventsEnabled: true`) plus
|
|
420
|
+
* the `downloadWillBegin` / `downloadProgress` listeners on this session.
|
|
421
|
+
* See the module doc's Downloads note for why `Browser.*` (not the
|
|
422
|
+
* deprecated `Page.*` pair) and why it works on an auxiliary session.
|
|
423
|
+
*
|
|
424
|
+
* `Browser.*` download events are browser-context-global, so we also enable
|
|
425
|
+
* the `Page` domain and track this target's frame ids, then only record
|
|
426
|
+
* downloads originating from a frame we own — two instrumented pages in one
|
|
427
|
+
* Chrome must not cross-observe each other's downloads.
|
|
428
|
+
*/
|
|
429
|
+
private _enableDownloads;
|
|
430
|
+
/** @internal Best-effort onDownload callback — never let it wedge the waiter machine. */
|
|
431
|
+
private _notifyDownload;
|
|
432
|
+
/**
|
|
433
|
+
* Wait for the NEXT download (one that completes after this call) to finish,
|
|
434
|
+
* and resolve with its metadata. Register the wait *before* triggering the
|
|
435
|
+
* action that starts the download — `GlubeanPage.waitForDownload(action)` in
|
|
436
|
+
* `page.ts` does exactly this and is the ergonomic wrapper most callers
|
|
437
|
+
* should use instead of this lower-level method.
|
|
438
|
+
*
|
|
439
|
+
* Rejects if the next download is canceled, after `timeoutMs`, if `signal`
|
|
440
|
+
* aborts (e.g. the triggering action threw), or if the session has detached.
|
|
441
|
+
* Does **not** resolve from downloads that already completed before the call —
|
|
442
|
+
* each wait is scoped to a fresh, future download.
|
|
443
|
+
*/
|
|
444
|
+
waitForDownload(timeoutMs: number, signal?: AbortSignal): Promise<DownloadEntry>;
|
|
445
|
+
/**
|
|
446
|
+
* Capture the current page's cookies + localStorage as a {@link StorageState}
|
|
447
|
+
* snapshot — the counterpart to {@link EvidenceSessionOptions.storageState}.
|
|
448
|
+
* Cookies are scoped to the page's current URL (`Network.getCookies`), not
|
|
449
|
+
* every cookie the browser holds, so unrelated tabs/origins never leak in.
|
|
450
|
+
*
|
|
451
|
+
* @example
|
|
452
|
+
* ```ts
|
|
453
|
+
* await page.goto("/login");
|
|
454
|
+
* // ... perform login ...
|
|
455
|
+
* const state = await page.getStorageState();
|
|
456
|
+
* // Reuse on a fresh page to skip the login flow:
|
|
457
|
+
* const chrome2 = browser({ launch: true, storageState: state });
|
|
458
|
+
* ```
|
|
459
|
+
*/
|
|
460
|
+
captureStorageState(page: Page): Promise<StorageState>;
|
|
265
461
|
private _guardViewport;
|
|
266
462
|
/**
|
|
267
463
|
* Remove all listeners/overrides, restore guarded page methods, and detach
|
package/dist/evidence.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../src/evidence.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"evidence.d.ts","sourceRoot":"","sources":["../src/evidence.ts"],"names":[],"mappings":"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"}
|