mirror of
https://github.com/microsoft/playwright.git
synced 2025-06-26 21:40:17 +00:00
fix(oopif): get response body from adopting frame (#21324)
Fixes https://github.com/microsoft/playwright/issues/20809
This commit is contained in:
parent
a1ba6757e0
commit
3b800344b0
@ -259,6 +259,7 @@ export class CRNetworkManager {
|
|||||||
const isNavigationRequest = requestWillBeSentEvent.requestId === requestWillBeSentEvent.loaderId && requestWillBeSentEvent.type === 'Document';
|
const isNavigationRequest = requestWillBeSentEvent.requestId === requestWillBeSentEvent.loaderId && requestWillBeSentEvent.type === 'Document';
|
||||||
const documentId = isNavigationRequest ? requestWillBeSentEvent.loaderId : undefined;
|
const documentId = isNavigationRequest ? requestWillBeSentEvent.loaderId : undefined;
|
||||||
const request = new InterceptableRequest({
|
const request = new InterceptableRequest({
|
||||||
|
owningNetworkManager: this,
|
||||||
context: (this._page || this._serviceWorker)!._browserContext,
|
context: (this._page || this._serviceWorker)!._browserContext,
|
||||||
frame: frame || null,
|
frame: frame || null,
|
||||||
serviceWorker: this._serviceWorker || null,
|
serviceWorker: this._serviceWorker || null,
|
||||||
@ -284,18 +285,19 @@ export class CRNetworkManager {
|
|||||||
const contentLengthHeader = Object.entries(responsePayload.headers).find(header => header[0].toLowerCase() === 'content-length');
|
const contentLengthHeader = Object.entries(responsePayload.headers).find(header => header[0].toLowerCase() === 'content-length');
|
||||||
const expectedLength = contentLengthHeader ? +contentLengthHeader[1] : undefined;
|
const expectedLength = contentLengthHeader ? +contentLengthHeader[1] : undefined;
|
||||||
|
|
||||||
const response = await this._client.send('Network.getResponseBody', { requestId: request._requestId });
|
const client = request._owningNetworkManager._client;
|
||||||
|
const response = await client.send('Network.getResponseBody', { requestId: request._requestId });
|
||||||
if (response.body || !expectedLength)
|
if (response.body || !expectedLength)
|
||||||
return Buffer.from(response.body, response.base64Encoded ? 'base64' : 'utf8');
|
return Buffer.from(response.body, response.base64Encoded ? 'base64' : 'utf8');
|
||||||
|
|
||||||
// For <link prefetch we are going to receive empty body with non-emtpy content-length expectation. Reach out for the actual content.
|
// For <link prefetch we are going to receive empty body with non-emtpy content-length expectation. Reach out for the actual content.
|
||||||
const resource = await this._client.send('Network.loadNetworkResource', { url: request.request.url(), frameId: this._serviceWorker ? undefined : request.request.frame()!._id, options: { disableCache: false, includeCredentials: true } });
|
const resource = await client.send('Network.loadNetworkResource', { url: request.request.url(), frameId: this._serviceWorker ? undefined : request.request.frame()!._id, options: { disableCache: false, includeCredentials: true } });
|
||||||
const chunks: Buffer[] = [];
|
const chunks: Buffer[] = [];
|
||||||
while (resource.resource.stream) {
|
while (resource.resource.stream) {
|
||||||
const chunk = await this._client.send('IO.read', { handle: resource.resource.stream });
|
const chunk = await client.send('IO.read', { handle: resource.resource.stream });
|
||||||
chunks.push(Buffer.from(chunk.data, chunk.base64Encoded ? 'base64' : 'utf-8'));
|
chunks.push(Buffer.from(chunk.data, chunk.base64Encoded ? 'base64' : 'utf-8'));
|
||||||
if (chunk.eof) {
|
if (chunk.eof) {
|
||||||
await this._client.send('IO.close', { handle: resource.resource.stream });
|
await client.send('IO.close', { handle: resource.resource.stream });
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -456,6 +458,7 @@ export class CRNetworkManager {
|
|||||||
if (!request || request._documentId !== requestId)
|
if (!request || request._documentId !== requestId)
|
||||||
return;
|
return;
|
||||||
this._requestIdToRequest.set(requestId, request);
|
this._requestIdToRequest.set(requestId, request);
|
||||||
|
request._owningNetworkManager = this;
|
||||||
this._parentManager._requestIdToRequest.delete(requestId);
|
this._parentManager._requestIdToRequest.delete(requestId);
|
||||||
if (request._interceptionId && this._parentManager._attemptedAuthentications.has(request._interceptionId)) {
|
if (request._interceptionId && this._parentManager._attemptedAuthentications.has(request._interceptionId)) {
|
||||||
this._parentManager._attemptedAuthentications.delete(request._interceptionId);
|
this._parentManager._attemptedAuthentications.delete(request._interceptionId);
|
||||||
@ -474,8 +477,10 @@ class InterceptableRequest {
|
|||||||
readonly _wallTime: number;
|
readonly _wallTime: number;
|
||||||
private _route: RouteImpl | null;
|
private _route: RouteImpl | null;
|
||||||
private _redirectedFrom: InterceptableRequest | null;
|
private _redirectedFrom: InterceptableRequest | null;
|
||||||
|
_owningNetworkManager: CRNetworkManager;
|
||||||
|
|
||||||
constructor(options: {
|
constructor(options: {
|
||||||
|
owningNetworkManager: CRNetworkManager,
|
||||||
context: contexts.BrowserContext;
|
context: contexts.BrowserContext;
|
||||||
frame: frames.Frame | null;
|
frame: frames.Frame | null;
|
||||||
serviceWorker: CRServiceWorker | null;
|
serviceWorker: CRServiceWorker | null;
|
||||||
@ -485,7 +490,8 @@ class InterceptableRequest {
|
|||||||
requestPausedEvent: Protocol.Fetch.requestPausedPayload | null;
|
requestPausedEvent: Protocol.Fetch.requestPausedPayload | null;
|
||||||
redirectedFrom: InterceptableRequest | null;
|
redirectedFrom: InterceptableRequest | null;
|
||||||
}) {
|
}) {
|
||||||
const { context, frame, documentId, route, requestWillBeSentEvent, requestPausedEvent, redirectedFrom, serviceWorker } = options;
|
const { owningNetworkManager, context, frame, documentId, route, requestWillBeSentEvent, requestPausedEvent, redirectedFrom, serviceWorker } = options;
|
||||||
|
this._owningNetworkManager = owningNetworkManager;
|
||||||
this._timestamp = requestWillBeSentEvent.timestamp;
|
this._timestamp = requestWillBeSentEvent.timestamp;
|
||||||
this._wallTime = requestWillBeSentEvent.wallTime;
|
this._wallTime = requestWillBeSentEvent.wallTime;
|
||||||
this._requestId = requestWillBeSentEvent.requestId;
|
this._requestId = requestWillBeSentEvent.requestId;
|
||||||
|
@ -336,6 +336,15 @@ it('should not throw on exposeFunction when oopif detaches', async ({ page, brow
|
|||||||
expect(await page.evaluate(() => (window as any).myFunc())).toBe(2022);
|
expect(await page.evaluate(() => (window as any).myFunc())).toBe(2022);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should intercept response body from oopif', async function({ page, browser, server }) {
|
||||||
|
it.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright/issues/20809' });
|
||||||
|
const [response] = await Promise.all([
|
||||||
|
page.waitForResponse('**/grid.html'),
|
||||||
|
page.goto(server.PREFIX + '/dynamic-oopif.html')
|
||||||
|
]);
|
||||||
|
expect(await response.text()).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
async function countOOPIFs(browser) {
|
async function countOOPIFs(browser) {
|
||||||
const browserSession = await browser.newBrowserCDPSession();
|
const browserSession = await browser.newBrowserCDPSession();
|
||||||
const oopifs = [];
|
const oopifs = [];
|
||||||
|
Loading…
x
Reference in New Issue
Block a user