mirror of
https://github.com/puppeteer/puppeteer
synced 2024-06-14 14:02:48 +00:00
feat: Attribute network requests to frames (#1646)
This patch introduces `request.frame()` method that returns the frame that initiated request. Fixes #1579
This commit is contained in:
committed by
Andrey Lushnikov
parent
5843f6f775
commit
c29822d663
@@ -87,6 +87,14 @@ class FrameManager extends EventEmitter {
|
||||
return Array.from(this._frames.values());
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {!string} frameId
|
||||
* @return {?Frame}
|
||||
*/
|
||||
frame(frameId) {
|
||||
return this._frames.get(frameId) || null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} frameId
|
||||
* @param {?string} parentFrameId
|
||||
|
||||
@@ -19,11 +19,13 @@ const Multimap = require('./Multimap');
|
||||
|
||||
class NetworkManager extends EventEmitter {
|
||||
/**
|
||||
* @param {Puppeteer.Session} client
|
||||
* @param {!Puppeteer.Session} client
|
||||
* @param {!Puppeteer.FrameManager} frameManager
|
||||
*/
|
||||
constructor(client) {
|
||||
constructor(client, frameManager) {
|
||||
super();
|
||||
this._client = client;
|
||||
this._frameManager = frameManager;
|
||||
/** @type {!Map<string, !Request>} */
|
||||
this._requestIdToRequest = new Map();
|
||||
/** @type {!Map<string, !Request>} */
|
||||
@@ -151,17 +153,17 @@ class NetworkManager extends EventEmitter {
|
||||
const request = this._interceptionIdToRequest.get(event.interceptionId);
|
||||
console.assert(request, 'INTERNAL ERROR: failed to find request for interception redirect.');
|
||||
this._handleRequestRedirect(request, event.responseStatusCode, event.responseHeaders);
|
||||
this._handleRequestStart(request._requestId, event.interceptionId, event.redirectUrl, event.resourceType, event.request);
|
||||
this._handleRequestStart(request._requestId, event.interceptionId, event.redirectUrl, event.resourceType, event.request, event.frameId);
|
||||
return;
|
||||
}
|
||||
const requestHash = generateRequestHash(event.request);
|
||||
const requestId = this._requestHashToRequestIds.firstValue(requestHash);
|
||||
if (requestId) {
|
||||
this._requestHashToRequestIds.delete(requestHash, requestId);
|
||||
this._handleRequestStart(requestId, event.interceptionId, event.request.url, event.resourceType, event.request);
|
||||
this._handleRequestStart(requestId, event.interceptionId, event.request.url, event.resourceType, event.request, event.frameId);
|
||||
} else {
|
||||
this._requestHashToInterceptionIds.set(requestHash, event.interceptionId);
|
||||
this._handleRequestStart(null, event.interceptionId, event.request.url, event.resourceType, event.request);
|
||||
this._handleRequestStart(null, event.interceptionId, event.request.url, event.resourceType, event.request, event.frameId);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -186,9 +188,13 @@ class NetworkManager extends EventEmitter {
|
||||
* @param {string} url
|
||||
* @param {string} resourceType
|
||||
* @param {!Object} requestPayload
|
||||
* @param {?string} frameId
|
||||
*/
|
||||
_handleRequestStart(requestId, interceptionId, url, resourceType, requestPayload) {
|
||||
const request = new Request(this._client, requestId, interceptionId, this._userRequestInterceptionEnabled, url, resourceType, requestPayload);
|
||||
_handleRequestStart(requestId, interceptionId, url, resourceType, requestPayload, frameId) {
|
||||
let frame = null;
|
||||
if (frameId)
|
||||
frame = this._frameManager.frame(frameId);
|
||||
const request = new Request(this._client, requestId, interceptionId, this._userRequestInterceptionEnabled, url, resourceType, requestPayload, frame);
|
||||
if (requestId)
|
||||
this._requestIdToRequest.set(requestId, request);
|
||||
if (interceptionId)
|
||||
@@ -222,7 +228,7 @@ class NetworkManager extends EventEmitter {
|
||||
if (request)
|
||||
this._handleRequestRedirect(request, event.redirectResponse.status, event.redirectResponse.headers);
|
||||
}
|
||||
this._handleRequestStart(event.requestId, null, event.request.url, event.type, event.request);
|
||||
this._handleRequestStart(event.requestId, null, event.request.url, event.type, event.request, event.frameId);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -281,8 +287,9 @@ class Request {
|
||||
* @param {string} url
|
||||
* @param {string} resourceType
|
||||
* @param {!Object} payload
|
||||
* @param {?Puppeteer.Frame} frame
|
||||
*/
|
||||
constructor(client, requestId, interceptionId, allowInterception, url, resourceType, payload) {
|
||||
constructor(client, requestId, interceptionId, allowInterception, url, resourceType, payload, frame) {
|
||||
this._client = client;
|
||||
this._requestId = requestId;
|
||||
this._interceptionId = interceptionId;
|
||||
@@ -299,6 +306,7 @@ class Request {
|
||||
this._method = payload.method;
|
||||
this._postData = payload.postData;
|
||||
this._headers = {};
|
||||
this._frame = frame;
|
||||
for (const key of Object.keys(payload.headers))
|
||||
this._headers[key.toLowerCase()] = payload.headers[key];
|
||||
}
|
||||
@@ -345,6 +353,13 @@ class Request {
|
||||
return this._response;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return {?Puppeteer.Frame}
|
||||
*/
|
||||
frame() {
|
||||
return this._frame;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return {?{errorText: string}}
|
||||
*/
|
||||
|
||||
@@ -72,7 +72,7 @@ class Page extends EventEmitter {
|
||||
this._mouse = new Mouse(client, this._keyboard);
|
||||
this._touchscreen = new Touchscreen(client, this._keyboard);
|
||||
this._frameManager = new FrameManager(client, frameTree, this);
|
||||
this._networkManager = new NetworkManager(client);
|
||||
this._networkManager = new NetworkManager(client, this._frameManager);
|
||||
this._emulationManager = new EmulationManager(client);
|
||||
this._tracing = new Tracing(client);
|
||||
/** @type {!Map<string, Function>} */
|
||||
|
||||
Reference in New Issue
Block a user