mirror of
https://github.com/microsoft/playwright.git
synced 2025-06-26 21:40:17 +00:00
fix: ignore timing data when request served from memory cache (#17595)
`Response.timing` contains stale data when the request is served from memory cache, in that we should ignore it and return -1 where we don't know the value. Fixes https://github.com/microsoft/playwright-java/issues/1080
This commit is contained in:
parent
b9e126b3e6
commit
72a24973f3
@ -126,8 +126,7 @@ export class BrowserContext extends ChannelOwner<channels.BrowserContextChannel>
|
||||
|
||||
private _onRequestFailed(request: network.Request, responseEndTiming: number, failureText: string | undefined, page: Page | null) {
|
||||
request._failureText = failureText || null;
|
||||
if (request._timing)
|
||||
request._timing.responseEnd = responseEndTiming;
|
||||
request._setResponseEndTiming(responseEndTiming);
|
||||
this.emit(Events.BrowserContext.RequestFailed, request);
|
||||
if (page)
|
||||
page.emit(Events.Page.RequestFailed, request);
|
||||
@ -138,8 +137,7 @@ export class BrowserContext extends ChannelOwner<channels.BrowserContextChannel>
|
||||
const request = network.Request.from(params.request);
|
||||
const response = network.Response.fromNullable(params.response);
|
||||
const page = Page.fromNullable(params.page);
|
||||
if (request._timing)
|
||||
request._timing.responseEnd = responseEndTiming;
|
||||
request._setResponseEndTiming(responseEndTiming);
|
||||
this.emit(Events.BrowserContext.RequestFinished, request);
|
||||
if (page)
|
||||
page.emit(Events.Page.RequestFinished, request);
|
||||
|
||||
@ -240,6 +240,12 @@ export class Request extends ChannelOwner<channels.RequestChannel> implements ap
|
||||
return (await response._channel.sizes()).sizes;
|
||||
}
|
||||
|
||||
_setResponseEndTiming(responseEndTiming: number) {
|
||||
this._timing.responseEnd = responseEndTiming;
|
||||
if (this._timing.responseStart === -1)
|
||||
this._timing.responseStart = responseEndTiming;
|
||||
}
|
||||
|
||||
_finalRequest(): Request {
|
||||
return this._redirectedTo ? this._redirectedTo._finalRequest() : this;
|
||||
}
|
||||
|
||||
@ -303,7 +303,7 @@ export class CRNetworkManager {
|
||||
};
|
||||
const timingPayload = responsePayload.timing!;
|
||||
let timing: network.ResourceTiming;
|
||||
if (timingPayload) {
|
||||
if (timingPayload && !this._responseExtraInfoTracker.servedFromCache(request._requestId)) {
|
||||
timing = {
|
||||
startTime: (timingPayload.requestTime - request._timestamp + request._wallTime) * 1000,
|
||||
domainLookupStart: timingPayload.dnsStart,
|
||||
@ -638,6 +638,11 @@ class ResponseExtraInfoTracker {
|
||||
info.servedFromCache = true;
|
||||
}
|
||||
|
||||
servedFromCache(requestId: string): boolean {
|
||||
const info = this._requests.get(requestId);
|
||||
return !!info?.servedFromCache;
|
||||
}
|
||||
|
||||
responseReceivedExtraInfo(event: Protocol.Network.responseReceivedExtraInfoPayload) {
|
||||
const info = this._getOrCreateEntry(event.requestId);
|
||||
info.responseReceivedExtraInfo.push(event);
|
||||
|
||||
@ -415,6 +415,9 @@ export class Response extends SdkObject {
|
||||
|
||||
_requestFinished(responseEndTiming: number) {
|
||||
this._request._responseEndTiming = Math.max(responseEndTiming, this._timing.responseStart);
|
||||
// Set start time equal to end when request is served from memory cache.
|
||||
if (this._timing.requestStart === -1)
|
||||
this._timing.requestStart = this._request._responseEndTiming;
|
||||
this._finishedPromise.resolve();
|
||||
}
|
||||
|
||||
|
||||
@ -96,6 +96,34 @@ it('should work for redirect', async ({ contextFactory, browserName, server }) =
|
||||
await context.close();
|
||||
});
|
||||
|
||||
it('should work when serving from memory cache', async ({ contextFactory, server, browserName }) => {
|
||||
it.info().annotations.push({ type: 'issue', description: 'https://github.com/microsoft/playwright-java/issues/1080' });
|
||||
it.fixme(browserName === 'firefox', 'Response event is not fired in Firefox');
|
||||
server.setRoute('/one-style.css', (req, res) => {
|
||||
res.writeHead(200, {
|
||||
'Content-Type': 'text/css',
|
||||
'Cache-Control': 'public, max-age=10031518'
|
||||
});
|
||||
res.end(`body { background: red }`);
|
||||
});
|
||||
|
||||
const context = await contextFactory();
|
||||
const page = await context.newPage();
|
||||
await page.goto(server.PREFIX + '/one-style.html');
|
||||
const [response] = await Promise.all([
|
||||
page.waitForResponse('**/one-style.css'),
|
||||
page.reload()
|
||||
]);
|
||||
await response.finished();
|
||||
|
||||
const timing = response.request().timing();
|
||||
verifyConnectionTimingConsistency(timing);
|
||||
|
||||
expect(timing.responseStart).toBe(timing.responseEnd);
|
||||
expect(timing.responseEnd).toBeLessThan(1000);
|
||||
await context.close();
|
||||
});
|
||||
|
||||
function verifyTimingValue(value: number, previous: number) {
|
||||
expect(value === -1 || value > 0 && value >= previous);
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user