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.
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +93 -11
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/index.test.js +135 -1
- package/dist/browser/index.test.js.map +1 -1
- package/dist/browser/types.d.ts +2 -0
- package/dist/browser/types.d.ts.map +1 -1
- package/dist/commands/detect.d.ts.map +1 -1
- package/dist/commands/detect.js +4 -0
- package/dist/commands/detect.js.map +1 -1
- package/dist/commands/detect.test.js +6 -0
- package/dist/commands/detect.test.js.map +1 -1
- package/dist/commands/detect_utils.d.ts.map +1 -1
- package/dist/commands/detect_utils.js +23 -5
- package/dist/commands/detect_utils.js.map +1 -1
- package/dist/commands/detect_utils.test.js +86 -9
- package/dist/commands/detect_utils.test.js.map +1 -1
- package/dist/signatures/_types.d.ts +1 -0
- package/dist/signatures/_types.d.ts.map +1 -1
- package/dist/signatures/index.d.ts.map +1 -1
- package/dist/signatures/index.js +4 -0
- package/dist/signatures/index.js.map +1 -1
- package/dist/signatures/signatures.test.js +16 -0
- package/dist/signatures/signatures.test.js.map +1 -1
- package/dist/signatures/technologies/drupal.d.ts.map +1 -1
- package/dist/signatures/technologies/drupal.js +17 -0
- package/dist/signatures/technologies/drupal.js.map +1 -1
- package/dist/signatures/technologies/drupal.test.d.ts +2 -0
- package/dist/signatures/technologies/drupal.test.d.ts.map +1 -0
- package/dist/signatures/technologies/drupal.test.js +76 -0
- package/dist/signatures/technologies/drupal.test.js.map +1 -0
- package/dist/signatures/technologies/movable_type.d.ts +3 -0
- package/dist/signatures/technologies/movable_type.d.ts.map +1 -0
- package/dist/signatures/technologies/movable_type.js +56 -0
- package/dist/signatures/technologies/movable_type.js.map +1 -0
- package/dist/signatures/technologies/movable_type.test.d.ts +2 -0
- package/dist/signatures/technologies/movable_type.test.d.ts.map +1 -0
- package/dist/signatures/technologies/movable_type.test.js +114 -0
- package/dist/signatures/technologies/movable_type.test.js.map +1 -0
- package/dist/signatures/technologies/power_cms.d.ts +3 -0
- package/dist/signatures/technologies/power_cms.d.ts.map +1 -0
- package/dist/signatures/technologies/power_cms.js +51 -0
- package/dist/signatures/technologies/power_cms.js.map +1 -0
- package/dist/signatures/technologies/power_cms.test.d.ts +2 -0
- package/dist/signatures/technologies/power_cms.test.d.ts.map +1 -0
- package/dist/signatures/technologies/power_cms.test.js +83 -0
- package/dist/signatures/technologies/power_cms.test.js.map +1 -0
- 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;
|
|
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"}
|
package/dist/browser/index.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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":"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"}
|
|
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("
|
|
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
|
}),
|