whopper 0.5.7 → 0.6.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.
Files changed (48) hide show
  1. package/dist/browser/index.d.ts.map +1 -1
  2. package/dist/browser/index.js +93 -11
  3. package/dist/browser/index.js.map +1 -1
  4. package/dist/browser/index.test.js +135 -1
  5. package/dist/browser/index.test.js.map +1 -1
  6. package/dist/browser/types.d.ts +2 -0
  7. package/dist/browser/types.d.ts.map +1 -1
  8. package/dist/commands/detect.d.ts.map +1 -1
  9. package/dist/commands/detect.js +4 -0
  10. package/dist/commands/detect.js.map +1 -1
  11. package/dist/commands/detect.test.js +6 -0
  12. package/dist/commands/detect.test.js.map +1 -1
  13. package/dist/commands/detect_utils.d.ts.map +1 -1
  14. package/dist/commands/detect_utils.js +23 -5
  15. package/dist/commands/detect_utils.js.map +1 -1
  16. package/dist/commands/detect_utils.test.js +86 -9
  17. package/dist/commands/detect_utils.test.js.map +1 -1
  18. package/dist/signatures/_types.d.ts +1 -0
  19. package/dist/signatures/_types.d.ts.map +1 -1
  20. package/dist/signatures/index.d.ts.map +1 -1
  21. package/dist/signatures/index.js +4 -0
  22. package/dist/signatures/index.js.map +1 -1
  23. package/dist/signatures/signatures.test.js +16 -0
  24. package/dist/signatures/signatures.test.js.map +1 -1
  25. package/dist/signatures/technologies/drupal.d.ts.map +1 -1
  26. package/dist/signatures/technologies/drupal.js +17 -0
  27. package/dist/signatures/technologies/drupal.js.map +1 -1
  28. package/dist/signatures/technologies/drupal.test.d.ts +2 -0
  29. package/dist/signatures/technologies/drupal.test.d.ts.map +1 -0
  30. package/dist/signatures/technologies/drupal.test.js +76 -0
  31. package/dist/signatures/technologies/drupal.test.js.map +1 -0
  32. package/dist/signatures/technologies/movable_type.d.ts +3 -0
  33. package/dist/signatures/technologies/movable_type.d.ts.map +1 -0
  34. package/dist/signatures/technologies/movable_type.js +56 -0
  35. package/dist/signatures/technologies/movable_type.js.map +1 -0
  36. package/dist/signatures/technologies/movable_type.test.d.ts +2 -0
  37. package/dist/signatures/technologies/movable_type.test.d.ts.map +1 -0
  38. package/dist/signatures/technologies/movable_type.test.js +114 -0
  39. package/dist/signatures/technologies/movable_type.test.js.map +1 -0
  40. package/dist/signatures/technologies/power_cms.d.ts +3 -0
  41. package/dist/signatures/technologies/power_cms.d.ts.map +1 -0
  42. package/dist/signatures/technologies/power_cms.js +51 -0
  43. package/dist/signatures/technologies/power_cms.js.map +1 -0
  44. package/dist/signatures/technologies/power_cms.test.d.ts +2 -0
  45. package/dist/signatures/technologies/power_cms.test.d.ts.map +1 -0
  46. package/dist/signatures/technologies/power_cms.test.js +83 -0
  47. package/dist/signatures/technologies/power_cms.test.js.map +1 -0
  48. package/package.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAsB,MAAM,YAAY,CAAC;AA0C/E,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,uBAAuB,EAAE,MAAM,EAAE,EACjC,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,OAAO,CAAC,CA6YlB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,eAAe,EAAsB,MAAM,YAAY,CAAC;AAiD/E,wBAAsB,QAAQ,CAC5B,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,uBAAuB,EAAE,MAAM,EAAE,EACjC,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,OAAO,CAAC,CAqelB"}
@@ -12,6 +12,13 @@ const MAX_REDIRECT_HOPS = 20;
12
12
  const NETWORK_IDLE_THRESHOLD_MS = 2000;
13
13
  // Polling interval (ms) for the idle-decision loop.
14
14
  const NETWORK_IDLE_POLL_INTERVAL_MS = 200;
15
+ // Default hard budget (ms) for the post-load extraction phase (cookies + JS
16
+ // variables). Heavy SPA pages (e.g. continuous WebGL / requestAnimationFrame
17
+ // loops, autoplaying video) can keep page.evaluate() blocked for many times
18
+ // the navigation timeout. Without a separate budget here, the overall scan
19
+ // can run for several minutes even after `goto` has already exhausted its
20
+ // own timeout. Overridable via OpenPageOptions.extractionTimeoutMs.
21
+ const DEFAULT_EXTRACTION_TIMEOUT_MS = 10000;
15
22
  function colorizeStatusCode(statusCode) {
16
23
  const code = String(statusCode);
17
24
  if (statusCode >= 100 && statusCode < 200) {
@@ -32,7 +39,7 @@ function colorizeStatusCode(statusCode) {
32
39
  return chalk.gray(code);
33
40
  }
34
41
  export async function openPage(url, timeoutMs, javascriptVariableNames, options = {}) {
35
- const { userAgent, locale, extraHTTPHeaders, blockCrossDomainRedirect = false, networkIdleThresholdMs = NETWORK_IDLE_THRESHOLD_MS, } = options;
42
+ const { userAgent, locale, extraHTTPHeaders, blockCrossDomainRedirect = false, networkIdleThresholdMs = NETWORK_IDLE_THRESHOLD_MS, extractionTimeoutMs = DEFAULT_EXTRACTION_TIMEOUT_MS, blockMedia = true, } = options;
36
43
  const pageHost = getHostFromUrl(url);
37
44
  if (!pageHost) {
38
45
  throw new Error(`Invalid URL: ${url}`);
@@ -46,12 +53,59 @@ export async function openPage(url, timeoutMs, javascriptVariableNames, options
46
53
  });
47
54
  const page = await context.newPage();
48
55
  let blockedByRedirectPolicy = false;
56
+ // Once the capture phase ends we keep the route handler installed (so media
57
+ // is still aborted for the rest of the scan) but stop appending to the
58
+ // frozen urls/responses snapshot. Guards the media branch's pushes below.
59
+ let captureFrozen = false;
49
60
  let lastNavigationUrl = url;
50
61
  let inspectedUrls = new Set();
51
62
  let reentryCount = 0;
52
63
  const preInspectedUrls = new Set();
64
+ // Declared before the route handler so its media-block branch can push to
65
+ // them (the handler is a closure over these; the network-idle listeners
66
+ // below also share them).
67
+ const urls = [];
68
+ const responses = [];
53
69
  await page.route("**/*", async (route) => {
54
70
  const request = route.request();
71
+ // Drop media (video / audio) requests up front when enabled. These
72
+ // rarely contribute to technology detection (signatures match on URLs,
73
+ // bodies, headers, cookies, or JS variables) but can dominate the
74
+ // page's main-thread / network budget — autoplaying videos in
75
+ // particular keep the scan running long after the meaningful
76
+ // resources have loaded. Recording the URL in `urls` preserves the
77
+ // audit trail of what would have been fetched.
78
+ if (blockMedia && request.resourceType() === "media") {
79
+ const blockedUrl = request.url();
80
+ // Always abort media, even after the capture phase is frozen: autoplay
81
+ // or lazy media that starts during the post-load cookie / JS extraction
82
+ // phase would otherwise reintroduce the main-thread / network cost this
83
+ // blocking is meant to avoid. We only *record* the block while capture
84
+ // is live — once frozen, pushing would mutate the returned snapshot
85
+ // (see the capture-freeze point below) non-deterministically.
86
+ if (!captureFrozen) {
87
+ logger.debug(`Blocked media resource: ${blockedUrl}`);
88
+ urls.push({ url: blockedUrl, error: "blocked: media" });
89
+ // URL signatures are matched only against `context.responses[].url`
90
+ // (see analyzer/apply.ts), not the `urls` audit log. Aborting the
91
+ // request would otherwise drop it from `responses` and turn any
92
+ // media-URL-based detection into a false negative. Record a body-less
93
+ // response so URL matching is preserved while we still skip the
94
+ // (irrelevant and costly) media body.
95
+ const blockedHost = getHostFromUrl(blockedUrl) ?? "";
96
+ responses.push({
97
+ url: blockedUrl,
98
+ host: blockedHost,
99
+ isFirstParty: blockedHost
100
+ ? isFirstPartyHost(pageHost, blockedHost)
101
+ : false,
102
+ status: 0,
103
+ headers: {},
104
+ });
105
+ }
106
+ await route.abort("blockedbyclient");
107
+ return;
108
+ }
55
109
  if (!request.isNavigationRequest() ||
56
110
  request.frame() !== page.mainFrame()) {
57
111
  await route.continue();
@@ -169,8 +223,6 @@ export async function openPage(url, timeoutMs, javascriptVariableNames, options
169
223
  }
170
224
  await route.fulfill({ response: firstResponse });
171
225
  });
172
- const urls = [];
173
- const responses = [];
174
226
  // Timestamp of the most recent network activity (request sent or
175
227
  // response received). Used by the custom idle-decision loop below.
176
228
  let lastNetworkActivityAt = Date.now();
@@ -246,7 +298,12 @@ export async function openPage(url, timeoutMs, javascriptVariableNames, options
246
298
  // so resolve goto at the `load` event (onload fired) and wait for
247
299
  // secondary requests triggered by deferred scripts using our own
248
300
  // idle-decision loop below.
249
- const goto = page.goto(url, { waitUntil: "load" });
301
+ //
302
+ // Pass `timeout` explicitly so goto stops trying once our budget is up;
303
+ // otherwise it would continue in the background until Playwright's default
304
+ // 30s navigation timeout, leaving subsequent page.* calls blocked on an
305
+ // unresolved navigation.
306
+ const goto = page.goto(url, { waitUntil: "load", timeout: timeoutMs });
250
307
  const result = await Promise.race([
251
308
  goto.then(() => "loaded").catch((e) => e.message),
252
309
  sleep(timeoutMs).then(() => "timeout"),
@@ -302,11 +359,19 @@ export async function openPage(url, timeoutMs, javascriptVariableNames, options
302
359
  page.off("requestfinished", onRequestFinished);
303
360
  page.off("requestfailed", onRequestFailed);
304
361
  page.off("response", onResponse);
362
+ // Freeze the capture. We intentionally keep the route handler installed so
363
+ // media requests are still aborted for the remainder of the scan (cookie / JS
364
+ // extraction can trigger autoplay / lazy media, whose main-thread / network
365
+ // cost is exactly what this blocking avoids). The `captureFrozen` guard stops
366
+ // the media branch from appending to the now-frozen `urls`/`responses`
367
+ // snapshot, so late/lazy requests can neither bloat memory nor make the
368
+ // returned capture non-deterministic.
369
+ captureFrozen = true;
305
370
  logger.info(`${responses.length} responses captured`);
306
371
  if (result === "loaded") {
307
372
  if (idleWaitTimedOut) {
308
373
  timeoutOccurred = true;
309
- logger.warn(`Timeout of ${timeoutMs}ms exceeded while waiting for network idle after load on ${url}`);
374
+ logger.warn(`Timeout of ${timeoutMs.toLocaleString("en-US")}ms exceeded while waiting for network idle after load on ${url}`);
310
375
  }
311
376
  else {
312
377
  logger.info("Page loaded successfully");
@@ -314,7 +379,7 @@ export async function openPage(url, timeoutMs, javascriptVariableNames, options
314
379
  }
315
380
  else if (result === "timeout") {
316
381
  timeoutOccurred = true;
317
- logger.warn(`Timeout of ${timeoutMs}ms exceeded while loading ${url}`);
382
+ logger.warn(`Timeout of ${timeoutMs.toLocaleString("en-US")}ms exceeded while loading ${url}`);
318
383
  }
319
384
  else if (blockedByRedirectPolicy) {
320
385
  // Already logged by the route handler as "Blocked redirect by policy"
@@ -332,8 +397,24 @@ export async function openPage(url, timeoutMs, javascriptVariableNames, options
332
397
  }
333
398
  let cookies = [];
334
399
  let javascriptVariables = {};
400
+ // Bound the extraction phase with a hard budget. page.evaluate() in
401
+ // particular can block for far longer than the navigation timeout on
402
+ // pages with a saturated main thread (heavy animation, video decoding),
403
+ // so without this race the overall scan can hang for minutes after the
404
+ // navigation budget has already been exhausted.
405
+ const extractionDeadline = Date.now() + extractionTimeoutMs;
406
+ const withDeadline = async (p, label) => {
407
+ const remaining = Math.max(0, extractionDeadline - Date.now());
408
+ return Promise.race([
409
+ p,
410
+ sleep(remaining).then(() => {
411
+ throw new Error(`${label} timeout (${extractionTimeoutMs.toLocaleString("en-US")}ms)`);
412
+ }),
413
+ ]);
414
+ };
335
415
  try {
336
- cookies = (await page.context().cookies()).map((cookie) => {
416
+ const rawCookies = await withDeadline(page.context().cookies(), "cookies");
417
+ cookies = rawCookies.map((cookie) => {
337
418
  const cookieHost = cookie.domain.replace(/^\./, "").toLowerCase();
338
419
  return {
339
420
  host: cookieHost,
@@ -348,17 +429,18 @@ export async function openPage(url, timeoutMs, javascriptVariableNames, options
348
429
  sameSite: cookie.sameSite,
349
430
  };
350
431
  });
351
- javascriptVariables = await page.evaluate(({ varNames, extractFn }) => {
432
+ javascriptVariables = await withDeadline(page.evaluate(({ varNames, extractFn }) => {
352
433
  // Re-create the function in browser context
353
434
  const fn = new Function("return " + extractFn)();
354
435
  return fn(window, varNames);
355
436
  }, {
356
437
  varNames: javascriptVariableNames,
357
438
  extractFn: extractJsVariables.toString(),
358
- });
439
+ }), "js variables");
359
440
  }
360
- catch {
361
- logger.warn("Failed to extract cookies or JavaScript variables (page context may have been destroyed)");
441
+ catch (e) {
442
+ const message = e instanceof Error ? e.message : String(e);
443
+ logger.warn(`Extraction failed: ${message.split("\n")[0]}`);
362
444
  }
363
445
  return {
364
446
  browser,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAuC,MAAM,YAAY,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,KAAK,GACN,MAAM,YAAY,CAAC;AAEpB,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,+DAA+D;AAC/D,yEAAyE;AACzE,yEAAyE;AACzE,uEAAuE;AACvE,uEAAuE;AACvE,2CAA2C;AAC3C,MAAM,yBAAyB,GAAG,IAAI,CAAC;AACvC,oDAAoD;AACpD,MAAM,6BAA6B,GAAG,GAAG,CAAC;AAE1C,SAAS,kBAAkB,CAAC,UAAkB;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;IAEhC,IAAI,UAAU,IAAI,GAAG,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,IAAI,UAAU,IAAI,GAAG,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,UAAU,IAAI,GAAG,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IACD,IAAI,UAAU,IAAI,GAAG,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,UAAU,IAAI,GAAG,IAAI,UAAU,GAAG,GAAG,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,GAAW,EACX,SAAiB,EACjB,uBAAiC,EACjC,UAA2B,EAAE;IAE7B,MAAM,EACJ,SAAS,EACT,MAAM,EACN,gBAAgB,EAChB,wBAAwB,GAAG,KAAK,EAChC,sBAAsB,GAAG,yBAAyB,GACnD,GAAG,OAAO,CAAC;IAEZ,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,gBAAgB,GAAG,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;QACvC,iBAAiB,EAAE,IAAI;QACvB,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClD,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;IAErC,IAAI,uBAAuB,GAAG,KAAK,CAAC;IACpC,IAAI,iBAAiB,GAAG,GAAG,CAAC;IAC5B,IAAI,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;IAE3C,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;QACvC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;QAChC,IACE,CAAC,OAAO,CAAC,mBAAmB,EAAE;YAC9B,OAAO,CAAC,KAAK,EAAE,KAAK,IAAI,CAAC,SAAS,EAAE,EACpC,CAAC;YACD,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,cAAc,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,oEAAoE;QACpE,qEAAqE;QACrE,iEAAiE;QACjE,+DAA+D;QAC/D,IAAI,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACjC,YAAY,EAAE,CAAC;YACf,IAAI,YAAY,GAAG,iBAAiB,EAAE,CAAC;gBACrC,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;gBACtD,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC5B,OAAO;YACT,CAAC;YACD,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,IAAI,wBAAwB,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,CAAC;YAClE,MAAM,CAAC,IAAI,CAAC,kCAAkC,SAAS,EAAE,CAAC,CAAC;YAC3D,uBAAuB,GAAG,IAAI,CAAC;YAC/B,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC,CAAC;YACtE,MAAM,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;QAED,gDAAgD;QAChD,IAAI,SAAS,KAAK,iBAAiB,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,CAAC,uBAAuB,iBAAiB,OAAO,SAAS,EAAE,CAAC,CAAC;QAC1E,CAAC;QACD,iBAAiB,GAAG,SAAS,CAAC;QAE9B,6DAA6D;QAC7D,+DAA+D;QAC/D,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,YAAY,GAAG,CAAC,CAAC;QAEjB,+DAA+D;QAC/D,IAAI,UAAU,GAAG,SAAS,CAAC;QAC3B,IAAI,QAAQ,CAAC;QACb,IAAI,CAAC;YACH,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;QACpD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,OAAO,GACX,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACpE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YAC9C,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QAED,qEAAqE;QACrE,mEAAmE;QACnE,oEAAoE;QACpE,sEAAsE;QACtE,+DAA+D;QAC/D,mEAAmE;QACnE,MAAM,aAAa,GAAG,QAAQ,CAAC;QAC/B,KACE,IAAI,GAAG,GAAG,CAAC,EACX,GAAG,GAAG,iBAAiB;YACvB,QAAQ,CAAC,MAAM,EAAE,IAAI,GAAG;YACxB,QAAQ,CAAC,MAAM,EAAE,GAAG,GAAG,EACvB,GAAG,EAAE,EACL,CAAC;YACD,oEAAoE;YACpE,mEAAmE;YACnE,uCAAuC;YACvC,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;YACjD,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACjC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YACxD,MAAM,WAAW,GAAa;gBAC5B,GAAG,EAAE,UAAU;gBACf,IAAI,EAAE,OAAO;gBACb,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK;gBACnE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE;gBACzB,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE;aAC5B,CAAC;YACF,IAAI,OAAO,EAAE,CAAC;gBACZ,WAAW,CAAC,IAAI,GAAG,OAAO,CAAC;YAC7B,CAAC;YACD,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YAC5B,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAE1D,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,CAAC;YAChD,IAAI,CAAC,QAAQ;gBAAE,MAAM;YAErB,IAAI,WAAmB,CAAC;YACxB,IAAI,CAAC;gBACH,WAAW,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC;YACnD,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM;YACR,CAAC;YAED,MAAM,YAAY,GAAG,cAAc,CAAC,WAAW,CAAC,CAAC;YACjD,IACE,wBAAwB;gBACxB,YAAY;gBACZ,CAAC,UAAU,CAAC,QAAQ,EAAE,YAAY,CAAC,EACnC,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,kCAAkC,WAAW,EAAE,CAAC,CAAC;gBAC7D,uBAAuB,GAAG,IAAI,CAAC;gBAC/B,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,+BAA+B,EAAE,CAAC,CAAC;gBACxE,MAAM,KAAK,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;gBACrC,OAAO;YACT,CAAC;YAED,MAAM,CAAC,IAAI,CAAC,uBAAuB,UAAU,OAAO,WAAW,EAAE,CAAC,CAAC;YACnE,iBAAiB,GAAG,WAAW,CAAC;YAChC,UAAU,GAAG,WAAW,CAAC;YACzB,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAE/B,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,EAAE,CAAC,CAAC;YACtE,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,MAAM,OAAO,GACX,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACpE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;gBAChD,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC5B,OAAO;YACT,CAAC;QACH,CAAC;QAED,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAe,EAAE,CAAC;IAC5B,MAAM,SAAS,GAAe,EAAE,CAAC;IACjC,iEAAiE;IACjE,mEAAmE;IACnE,IAAI,qBAAqB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvC,sEAAsE;IACtE,mEAAmE;IACnE,kEAAkE;IAClE,wBAAwB;IACxB,IAAI,oBAAoB,GAAG,CAAC,CAAC;IAC7B,iEAAiE;IACjE,uEAAuE;IACvE,oEAAoE;IACpE,6CAA6C;IAC7C,MAAM,mBAAmB,GAAG,IAAI,GAAG,EAAiB,CAAC;IAErD,MAAM,SAAS,GAAG,GAAG,EAAE;QACrB,oBAAoB,EAAE,CAAC;QACvB,qBAAqB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACrC,CAAC,CAAC;IACF,MAAM,iBAAiB,GAAG,GAAG,EAAE;QAC7B,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,oBAAoB,GAAG,CAAC,CAAC,CAAC;QAC7D,qBAAqB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACrC,CAAC,CAAC;IACF,MAAM,eAAe,GAAG,GAAG,EAAE;QAC3B,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,oBAAoB,GAAG,CAAC,CAAC,CAAC;QAC7D,qBAAqB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACrC,CAAC,CAAC;IACF,MAAM,UAAU,GAAG,CAAC,QAA4B,EAAE,EAAE;QAClD,qBAAqB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE;YACvB,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC;YACnC,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;YAErC,gEAAgE;YAChE,oBAAoB;YACpB,IACE,gBAAgB,CAAC,GAAG,CAAC,WAAW,CAAC;gBACjC,UAAU,IAAI,GAAG;gBACjB,UAAU,GAAG,GAAG,EAChB,CAAC;gBACD,MAAM,CAAC,KAAK,CACV,uCAAuC,kBAAkB,CAAC,UAAU,CAAC,KAAK,WAAW,EAAE,CACxF,CAAC;gBACF,OAAO;YACT,CAAC;YAED,MAAM,YAAY,GAAG,cAAc,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YACvD,MAAM,CAAC,KAAK,CACV,sBAAsB,kBAAkB,CAAC,UAAU,CAAC,KAAK,WAAW,EAAE,CACvE,CAAC;YACF,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;YACnC,IACE,OAAO,CAAC,mBAAmB,EAAE;gBAC7B,OAAO,CAAC,KAAK,EAAE,KAAK,IAAI,CAAC,SAAS,EAAE,EACpC,CAAC;gBACD,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;YACtD,CAAC;YAED,MAAM,GAAG,GAAa;gBACpB,GAAG,EAAE,WAAW;gBAChB,IAAI,EAAE,YAAY;gBAClB,YAAY,EAAE,YAAY;oBACxB,CAAC,CAAC,gBAAgB,CAAC,QAAQ,EAAE,YAAY,CAAC;oBAC1C,CAAC,CAAC,KAAK;gBACT,MAAM,EAAE,UAAU;gBAClB,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE;aAC5B,CAAC;YAEF,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YACrD,IAAI,IAAI,EAAE,CAAC;gBACT,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;YAClB,CAAC;YAED,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACtB,CAAC,CAAC,EAAE,CAAC;QACL,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;YAChB,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IACF,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC9B,IAAI,CAAC,EAAE,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;IAC9C,IAAI,CAAC,EAAE,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;IAC1C,IAAI,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAEhC,IAAI,eAAe,GAAG,KAAK,CAAC;IAC5B,MAAM,mBAAmB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvC,wEAAwE;IACxE,kEAAkE;IAClE,iEAAiE;IACjE,4BAA4B;IAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;IAEnD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QACjD,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC;KACvC,CAAC,CAAC;IAEH,sEAAsE;IACtE,uEAAuE;IACvE,uEAAuE;IACvE,mEAAmE;IACnE,uDAAuD;IACvD,+CAA+C;IAC/C,EAAE;IACF,mEAAmE;IACnE,oEAAoE;IACpE,oEAAoE;IACpE,iDAAiD;IACjD,IAAI,gBAAgB,GAAG,KAAK,CAAC;IAC7B,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,MAAM,OAAO,GAAG,GAAG,GAAG,mBAAmB,CAAC;YAC1C,IAAI,OAAO,IAAI,SAAS,EAAE,CAAC;gBACzB,gBAAgB,GAAG,IAAI,CAAC;gBACxB,MAAM;YACR,CAAC;YACD,MAAM,OAAO,GAAG,GAAG,GAAG,qBAAqB,CAAC;YAC5C,IAAI,oBAAoB,KAAK,CAAC,IAAI,OAAO,IAAI,sBAAsB,EAAE,CAAC;gBACpE,MAAM;YACR,CAAC;YACD,MAAM,eAAe,GAAG,SAAS,GAAG,OAAO,CAAC;YAC5C,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,6BAA6B,EAAE,eAAe,CAAC,CAAC,CAAC;QACxE,CAAC;QACD,gEAAgE;QAChE,kEAAkE;QAClE,oEAAoE;QACpE,qEAAqE;QACrE,mEAAmE;QACnE,kEAAkE;QAClE,IAAI,mBAAmB,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;YACjC,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAC9B,CAAC,EACD,SAAS,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,mBAAmB,CAAC,CAC/C,CAAC;YACF,IAAI,eAAe,GAAG,CAAC,EAAE,CAAC;gBACxB,MAAM,OAAO,CAAC,IAAI,CAAC;oBACjB,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;oBACnD,KAAK,CAAC,eAAe,CAAC;iBACvB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,sEAAsE;IACtE,uEAAuE;IACvE,uEAAuE;IACvE,qEAAqE;IACrE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC/B,IAAI,CAAC,GAAG,CAAC,iBAAiB,EAAE,iBAAiB,CAAC,CAAC;IAC/C,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;IAC3C,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAEjC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,MAAM,qBAAqB,CAAC,CAAC;IACtD,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;QACxB,IAAI,gBAAgB,EAAE,CAAC;YACrB,eAAe,GAAG,IAAI,CAAC;YACvB,MAAM,CAAC,IAAI,CACT,cAAc,SAAS,4DAA4D,GAAG,EAAE,CACzF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;SAAM,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,eAAe,GAAG,IAAI,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,cAAc,SAAS,6BAA6B,GAAG,EAAE,CAAC,CAAC;IACzE,CAAC;SAAM,IAAI,uBAAuB,EAAE,CAAC;QACnC,sEAAsE;IACxE,CAAC;SAAM,CAAC;QACN,MAAM,YAAY,GAAG,sBAAsB,GAAG,KAAK,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QAC3B,mEAAmE;QACnE,sEAAsE;QACtE,mEAAmE;QACnE,4DAA4D;QAC5D,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,IAAI,OAAO,GAAuB,EAAE,CAAC;IACrC,IAAI,mBAAmB,GAA4B,EAAE,CAAC;IAEtD,IAAI,CAAC;QACH,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YACxD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;YAClE,OAAO;gBACL,IAAI,EAAE,UAAU;gBAChB,YAAY,EAAE,gBAAgB,CAAC,QAAQ,EAAE,UAAU,CAAC;gBACpD,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;gBACzB,MAAM,EAAE,MAAM,CAAC,MAAM;gBACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;aAC1B,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,mBAAmB,GAAG,MAAM,IAAI,CAAC,QAAQ,CACvC,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE;YAC1B,4CAA4C;YAC5C,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,SAAS,GAAG,SAAS,CAAC,EAAE,CAAC;YACjD,OAAO,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC9B,CAAC,EACD;YACE,QAAQ,EAAE,uBAAuB;YACjC,SAAS,EAAE,kBAAkB,CAAC,QAAQ,EAAE;SACzC,CACF,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,CAAC,IAAI,CACT,0FAA0F,CAC3F,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO;QACP,IAAI;QACJ,IAAI;QACJ,SAAS;QACT,mBAAmB;QACnB,OAAO;QACP,SAAS;QACT,eAAe;KAChB,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/browser/index.ts"],"names":[],"mappings":"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"}
@@ -120,6 +120,7 @@ describe("openPage", () => {
120
120
  await openPage("https://example.com", 10000, []);
121
121
  expect(mockPage.goto).toHaveBeenCalledWith("https://example.com", {
122
122
  waitUntil: "load",
123
+ timeout: 10000,
123
124
  });
124
125
  });
125
126
  it("should log success message on successful load", async () => {
@@ -161,6 +162,7 @@ describe("openPage", () => {
161
162
  const fulfillMock = vi.fn(() => Promise.resolve());
162
163
  await routeHandler({
163
164
  request: () => ({
165
+ resourceType: () => "document",
164
166
  isNavigationRequest: () => true,
165
167
  frame: () => mockMainFrame,
166
168
  url: () => "https://www.example.com",
@@ -190,6 +192,7 @@ describe("openPage", () => {
190
192
  const fulfillMock = vi.fn(() => Promise.resolve());
191
193
  await routeHandler({
192
194
  request: () => ({
195
+ resourceType: () => "document",
193
196
  isNavigationRequest: () => true,
194
197
  frame: () => mockMainFrame,
195
198
  url: () => "https://example.net",
@@ -215,6 +218,7 @@ describe("openPage", () => {
215
218
  const abortMock = vi.fn(() => Promise.resolve());
216
219
  await routeHandler({
217
220
  request: () => ({
221
+ resourceType: () => "document",
218
222
  isNavigationRequest: () => false,
219
223
  frame: () => mockMainFrame,
220
224
  url: () => "https://example.net/script.js",
@@ -225,6 +229,102 @@ describe("openPage", () => {
225
229
  expect(continueMock).toHaveBeenCalledTimes(1);
226
230
  expect(abortMock).not.toHaveBeenCalled();
227
231
  });
232
+ it("should abort media requests by default and record them in urls", async () => {
233
+ const continueMock = vi.fn(() => Promise.resolve());
234
+ const abortMock = vi.fn(() => Promise.resolve());
235
+ // Invoke the handler during route registration, i.e. while the capture
236
+ // phase is still live (before the snapshot is frozen), matching the
237
+ // timing of a real media request.
238
+ mockPage.route.mockImplementation(async (_pattern, handler) => {
239
+ await handler({
240
+ request: () => ({
241
+ resourceType: () => "media",
242
+ isNavigationRequest: () => false,
243
+ frame: () => mockMainFrame,
244
+ url: () => "https://example.com/intro.mov",
245
+ }),
246
+ continue: continueMock,
247
+ abort: abortMock,
248
+ });
249
+ });
250
+ const result = await openPage("https://example.com", 10000, []);
251
+ expect(abortMock).toHaveBeenCalledWith("blockedbyclient");
252
+ expect(continueMock).not.toHaveBeenCalled();
253
+ expect(result.urls).toContainEqual({
254
+ url: "https://example.com/intro.mov",
255
+ error: "blocked: media",
256
+ });
257
+ });
258
+ it("should record blocked media as a body-less response to preserve URL detection", async () => {
259
+ mockPage.route.mockImplementation(async (_pattern, handler) => {
260
+ await handler({
261
+ request: () => ({
262
+ resourceType: () => "media",
263
+ isNavigationRequest: () => false,
264
+ frame: () => mockMainFrame,
265
+ url: () => "https://example.com/intro.mov",
266
+ }),
267
+ continue: vi.fn(() => Promise.resolve()),
268
+ abort: vi.fn(() => Promise.resolve()),
269
+ });
270
+ });
271
+ const result = await openPage("https://example.com", 10000, []);
272
+ // URL signatures match against responses[].url (analyzer/apply.ts), so the
273
+ // blocked media URL must still appear in responses (body-less) so that
274
+ // URL-based detection on a media URL is not silently lost.
275
+ const blocked = result.responses.find((response) => response.url === "https://example.com/intro.mov");
276
+ expect(blocked).toBeDefined();
277
+ expect(blocked?.body).toBeUndefined();
278
+ expect(blocked?.isFirstParty).toBe(true);
279
+ });
280
+ it("should keep aborting media after capture but stop recording it", async () => {
281
+ // After the capture snapshot is frozen the route handler stays installed
282
+ // so media is still aborted (autoplay / lazy media during cookie / JS
283
+ // extraction would otherwise reintroduce the cost this blocking avoids),
284
+ // but it must no longer append to the now-frozen urls/responses set.
285
+ let routeHandler = async () => { };
286
+ mockPage.route.mockImplementation(async (_pattern, handler) => {
287
+ routeHandler = handler;
288
+ });
289
+ const result = await openPage("https://example.com", 10000, []);
290
+ const urlsBefore = result.urls.length;
291
+ const responsesBefore = result.responses.length;
292
+ const abortMock = vi.fn(() => Promise.resolve());
293
+ await routeHandler({
294
+ request: () => ({
295
+ resourceType: () => "media",
296
+ isNavigationRequest: () => false,
297
+ frame: () => mockMainFrame,
298
+ url: () => "https://example.com/late.mov",
299
+ }),
300
+ continue: vi.fn(() => Promise.resolve()),
301
+ abort: abortMock,
302
+ });
303
+ expect(abortMock).toHaveBeenCalledWith("blockedbyclient");
304
+ expect(result.urls.length).toBe(urlsBefore);
305
+ expect(result.responses.length).toBe(responsesBefore);
306
+ });
307
+ it("should not abort media requests when blockMedia is false", async () => {
308
+ let routeHandler = async () => { };
309
+ mockPage.route.mockImplementation(async (_pattern, handler) => {
310
+ routeHandler = handler;
311
+ });
312
+ await openPage("https://example.com", 10000, [], { blockMedia: false });
313
+ const continueMock = vi.fn(() => Promise.resolve());
314
+ const abortMock = vi.fn(() => Promise.resolve());
315
+ await routeHandler({
316
+ request: () => ({
317
+ resourceType: () => "media",
318
+ isNavigationRequest: () => false,
319
+ frame: () => mockMainFrame,
320
+ url: () => "https://example.com/intro.mov",
321
+ }),
322
+ continue: continueMock,
323
+ abort: abortMock,
324
+ });
325
+ expect(continueMock).toHaveBeenCalledTimes(1);
326
+ expect(abortMock).not.toHaveBeenCalled();
327
+ });
228
328
  it("should continue for non-main-frame navigation requests", async () => {
229
329
  let routeHandler = async () => { };
230
330
  mockPage.route.mockImplementation(async (_pattern, handler) => {
@@ -237,6 +337,7 @@ describe("openPage", () => {
237
337
  const abortMock = vi.fn(() => Promise.resolve());
238
338
  await routeHandler({
239
339
  request: () => ({
340
+ resourceType: () => "document",
240
341
  isNavigationRequest: () => true,
241
342
  frame: () => ({ id: "iframe-1" }),
242
343
  url: () => "https://example.net/embedded",
@@ -263,6 +364,7 @@ describe("openPage", () => {
263
364
  // first top-level navigation
264
365
  await routeHandler({
265
366
  request: () => ({
367
+ resourceType: () => "document",
266
368
  isNavigationRequest: () => true,
267
369
  frame: () => mockMainFrame,
268
370
  url: () => "https://example.com",
@@ -275,6 +377,7 @@ describe("openPage", () => {
275
377
  // second top-level navigation with invalid URL should still continue
276
378
  await routeHandler({
277
379
  request: () => ({
380
+ resourceType: () => "document",
278
381
  isNavigationRequest: () => true,
279
382
  frame: () => mockMainFrame,
280
383
  url: () => "not-a-url",
@@ -305,6 +408,7 @@ describe("openPage", () => {
305
408
  const fulfillMock = vi.fn(() => Promise.resolve());
306
409
  await routeHandler({
307
410
  request: () => ({
411
+ resourceType: () => "document",
308
412
  isNavigationRequest: () => true,
309
413
  frame: () => mockMainFrame,
310
414
  url: () => "https://app.example.com",
@@ -316,6 +420,7 @@ describe("openPage", () => {
316
420
  });
317
421
  await routeHandler({
318
422
  request: () => ({
423
+ resourceType: () => "document",
319
424
  isNavigationRequest: () => true,
320
425
  frame: () => mockMainFrame,
321
426
  url: () => "https://cdn.example.com",
@@ -348,6 +453,7 @@ describe("openPage", () => {
348
453
  const fulfillMock = vi.fn(() => Promise.resolve());
349
454
  await routeHandler({
350
455
  request: () => ({
456
+ resourceType: () => "document",
351
457
  isNavigationRequest: () => true,
352
458
  frame: () => mockMainFrame,
353
459
  url: () => "https://www.example.com",
@@ -382,6 +488,7 @@ describe("openPage", () => {
382
488
  const fulfillMock = vi.fn(() => Promise.resolve());
383
489
  await routeHandler({
384
490
  request: () => ({
491
+ resourceType: () => "document",
385
492
  isNavigationRequest: () => true,
386
493
  frame: () => mockMainFrame,
387
494
  url: () => "https://example.com",
@@ -415,6 +522,7 @@ describe("openPage", () => {
415
522
  const fulfillMock = vi.fn(() => Promise.resolve());
416
523
  await routeHandler({
417
524
  request: () => ({
525
+ resourceType: () => "document",
418
526
  isNavigationRequest: () => true,
419
527
  frame: () => mockMainFrame,
420
528
  url: () => "https://example.com",
@@ -448,6 +556,7 @@ describe("openPage", () => {
448
556
  const fulfillMock = vi.fn(() => Promise.resolve());
449
557
  await routeHandler({
450
558
  request: () => ({
559
+ resourceType: () => "document",
451
560
  isNavigationRequest: () => true,
452
561
  frame: () => mockMainFrame,
453
562
  url: () => "https://example.com",
@@ -477,6 +586,7 @@ describe("openPage", () => {
477
586
  const fulfillMock = vi.fn(() => Promise.resolve());
478
587
  await routeHandler({
479
588
  request: () => ({
589
+ resourceType: () => "document",
480
590
  isNavigationRequest: () => true,
481
591
  frame: () => mockMainFrame,
482
592
  url: () => "https://example.com",
@@ -501,6 +611,7 @@ describe("openPage", () => {
501
611
  const fetchMock = vi.fn(() => Promise.reject("string error"));
502
612
  await routeHandler({
503
613
  request: () => ({
614
+ resourceType: () => "document",
504
615
  isNavigationRequest: () => true,
505
616
  frame: () => mockMainFrame,
506
617
  url: () => "https://example.com",
@@ -541,6 +652,7 @@ describe("openPage", () => {
541
652
  const abortMock = vi.fn(() => Promise.resolve());
542
653
  await routeHandler({
543
654
  request: () => ({
655
+ resourceType: () => "document",
544
656
  isNavigationRequest: () => true,
545
657
  frame: () => mockMainFrame,
546
658
  url: () => "https://example.com",
@@ -554,6 +666,7 @@ describe("openPage", () => {
554
666
  const continueMock = vi.fn(() => Promise.resolve());
555
667
  await routeHandler({
556
668
  request: () => ({
669
+ resourceType: () => "document",
557
670
  isNavigationRequest: () => true,
558
671
  frame: () => mockMainFrame,
559
672
  url: () => "https://example.com/page",
@@ -590,6 +703,7 @@ describe("openPage", () => {
590
703
  .mockResolvedValueOnce(mock200Response);
591
704
  await routeHandler({
592
705
  request: () => ({
706
+ resourceType: () => "document",
593
707
  isNavigationRequest: () => true,
594
708
  frame: () => mockMainFrame,
595
709
  url: () => "https://example.com",
@@ -603,6 +717,7 @@ describe("openPage", () => {
603
717
  for (let i = 0; i < 20; i++) {
604
718
  await routeHandler({
605
719
  request: () => ({
720
+ resourceType: () => "document",
606
721
  isNavigationRequest: () => true,
607
722
  frame: () => mockMainFrame,
608
723
  url: () => "https://example.com/page",
@@ -617,6 +732,7 @@ describe("openPage", () => {
617
732
  const abortMock = vi.fn(() => Promise.resolve());
618
733
  await routeHandler({
619
734
  request: () => ({
735
+ resourceType: () => "document",
620
736
  isNavigationRequest: () => true,
621
737
  frame: () => mockMainFrame,
622
738
  url: () => "https://example.com/page",
@@ -651,6 +767,7 @@ describe("openPage", () => {
651
767
  const fulfillMock = vi.fn(() => Promise.resolve());
652
768
  await routeHandler({
653
769
  request: () => ({
770
+ resourceType: () => "document",
654
771
  isNavigationRequest: () => true,
655
772
  frame: () => mockMainFrame,
656
773
  url: () => "https://example.com",
@@ -683,6 +800,7 @@ describe("openPage", () => {
683
800
  .mockRejectedValueOnce("string error");
684
801
  await routeHandler({
685
802
  request: () => ({
803
+ resourceType: () => "document",
686
804
  isNavigationRequest: () => true,
687
805
  frame: () => mockMainFrame,
688
806
  url: () => "https://example.com",
@@ -718,6 +836,7 @@ describe("openPage", () => {
718
836
  const fulfillMock = vi.fn(() => Promise.resolve());
719
837
  await routeHandler({
720
838
  request: () => ({
839
+ resourceType: () => "document",
721
840
  isNavigationRequest: () => true,
722
841
  frame: () => mockMainFrame,
723
842
  url: () => "https://example.com",
@@ -757,6 +876,7 @@ describe("openPage", () => {
757
876
  const fulfillMock = vi.fn(() => Promise.resolve());
758
877
  await routeHandler({
759
878
  request: () => ({
879
+ resourceType: () => "document",
760
880
  isNavigationRequest: () => true,
761
881
  frame: () => mockMainFrame,
762
882
  url: () => "https://example.com",
@@ -811,6 +931,7 @@ describe("openPage", () => {
811
931
  const fulfillMock = vi.fn(() => Promise.resolve());
812
932
  await routeHandler({
813
933
  request: () => ({
934
+ resourceType: () => "document",
814
935
  isNavigationRequest: () => true,
815
936
  frame: () => mockMainFrame,
816
937
  url: () => "https://example.com",
@@ -864,6 +985,7 @@ describe("openPage", () => {
864
985
  .mockResolvedValueOnce(mock200Response);
865
986
  await routeHandler({
866
987
  request: () => ({
988
+ resourceType: () => "document",
867
989
  isNavigationRequest: () => true,
868
990
  frame: () => mockMainFrame,
869
991
  url: () => "https://example.com",
@@ -909,6 +1031,7 @@ describe("openPage", () => {
909
1031
  .mockResolvedValueOnce(mock200Response);
910
1032
  await routeHandler({
911
1033
  request: () => ({
1034
+ resourceType: () => "document",
912
1035
  isNavigationRequest: () => true,
913
1036
  frame: () => mockMainFrame,
914
1037
  url: () => "https://example.com",
@@ -939,6 +1062,7 @@ describe("openPage", () => {
939
1062
  const fulfillMock = vi.fn(() => Promise.resolve());
940
1063
  await routeHandler({
941
1064
  request: () => ({
1065
+ resourceType: () => "document",
942
1066
  isNavigationRequest: () => true,
943
1067
  frame: () => mockMainFrame,
944
1068
  url: () => "https://example.com",
@@ -982,6 +1106,7 @@ describe("openPage", () => {
982
1106
  // Use a data: URL that getHostFromUrl returns null for
983
1107
  await routeHandler({
984
1108
  request: () => ({
1109
+ resourceType: () => "document",
985
1110
  isNavigationRequest: () => true,
986
1111
  frame: () => mockMainFrame,
987
1112
  url: () => "https://example.com",
@@ -1093,6 +1218,7 @@ describe("openPage", () => {
1093
1218
  headers: () => ({}),
1094
1219
  text: () => textPromise,
1095
1220
  request: () => ({
1221
+ resourceType: () => "document",
1096
1222
  isNavigationRequest: () => false,
1097
1223
  frame: () => null,
1098
1224
  }),
@@ -1123,6 +1249,7 @@ describe("openPage", () => {
1123
1249
  headers: () => ({}),
1124
1250
  text: () => neverResolves,
1125
1251
  request: () => ({
1252
+ resourceType: () => "document",
1126
1253
  isNavigationRequest: () => false,
1127
1254
  frame: () => null,
1128
1255
  }),
@@ -1158,6 +1285,7 @@ describe("openPage", () => {
1158
1285
  // Route handler records a fetch error
1159
1286
  await routeHandler({
1160
1287
  request: () => ({
1288
+ resourceType: () => "document",
1161
1289
  isNavigationRequest: () => true,
1162
1290
  frame: () => mockMainFrame,
1163
1291
  url: () => "https://example.com",
@@ -1184,6 +1312,7 @@ describe("openPage", () => {
1184
1312
  // Simulate the route handler blocking a cross-host redirect
1185
1313
  await routeHandler({
1186
1314
  request: () => ({
1315
+ resourceType: () => "document",
1187
1316
  isNavigationRequest: () => true,
1188
1317
  frame: () => mockMainFrame,
1189
1318
  url: () => "https://other.example",
@@ -1206,7 +1335,7 @@ describe("openPage", () => {
1206
1335
  mockBrowserContext.cookies.mockRejectedValue(new Error("Context destroyed"));
1207
1336
  vi.mocked(sleep).mockImplementation(() => new Promise((resolve) => setTimeout(resolve, 100)));
1208
1337
  const result = await openPage("https://example.com", 10000, []);
1209
- expect(logger.warn).toHaveBeenCalledWith(expect.stringContaining("Failed to extract cookies"));
1338
+ expect(logger.warn).toHaveBeenCalledWith(expect.stringContaining("Extraction failed"));
1210
1339
  expect(result.cookies).toEqual([]);
1211
1340
  });
1212
1341
  });
@@ -1296,6 +1425,7 @@ describe("openPage", () => {
1296
1425
  headers: () => ({ "content-type": "application/json" }),
1297
1426
  text: () => Promise.resolve('{"data": "test"}'),
1298
1427
  request: () => ({
1428
+ resourceType: () => "document",
1299
1429
  isNavigationRequest: () => false,
1300
1430
  frame: () => null,
1301
1431
  }),
@@ -1328,6 +1458,7 @@ describe("openPage", () => {
1328
1458
  headers: () => ({ "content-type": "application/octet-stream" }),
1329
1459
  text: () => Promise.reject(new Error("Cannot read binary")),
1330
1460
  request: () => ({
1461
+ resourceType: () => "document",
1331
1462
  isNavigationRequest: () => false,
1332
1463
  frame: () => null,
1333
1464
  }),
@@ -1359,6 +1490,7 @@ describe("openPage", () => {
1359
1490
  headers: () => ({ "content-type": "text/javascript" }),
1360
1491
  text: () => Promise.resolve("console.log('ok')"),
1361
1492
  request: () => ({
1493
+ resourceType: () => "document",
1362
1494
  isNavigationRequest: () => false,
1363
1495
  frame: () => null,
1364
1496
  }),
@@ -1387,6 +1519,7 @@ describe("openPage", () => {
1387
1519
  headers: () => ({ "content-type": "text/html" }),
1388
1520
  text: () => Promise.resolve("<html></html>"),
1389
1521
  request: () => ({
1522
+ resourceType: () => "document",
1390
1523
  isNavigationRequest: () => true,
1391
1524
  frame: () => mockMainFrame,
1392
1525
  }),
@@ -1412,6 +1545,7 @@ describe("openPage", () => {
1412
1545
  headers: () => ({ "content-type": "text/css" }),
1413
1546
  text: () => Promise.resolve("body {}"),
1414
1547
  request: () => ({
1548
+ resourceType: () => "document",
1415
1549
  isNavigationRequest: () => false,
1416
1550
  frame: () => null,
1417
1551
  }),