mirror of
https://github.com/microsoft/playwright.git
synced 2025-06-26 21:40:17 +00:00
feat(firefox): roll firefox to r1137 (#3095)
This commit is contained in:
parent
2a08883ef8
commit
80c0711d98
@ -7,7 +7,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "firefox",
|
"name": "firefox",
|
||||||
"revision": "1134"
|
"revision": "1137"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "webkit",
|
"name": "webkit",
|
||||||
|
@ -3486,6 +3486,7 @@ If request gets a 'redirect' response, the request is successfully finished with
|
|||||||
- [request.isNavigationRequest()](#requestisnavigationrequest)
|
- [request.isNavigationRequest()](#requestisnavigationrequest)
|
||||||
- [request.method()](#requestmethod)
|
- [request.method()](#requestmethod)
|
||||||
- [request.postData()](#requestpostdata)
|
- [request.postData()](#requestpostdata)
|
||||||
|
- [request.postDataBuffer()](#requestpostdatabuffer)
|
||||||
- [request.postDataJSON()](#requestpostdatajson)
|
- [request.postDataJSON()](#requestpostdatajson)
|
||||||
- [request.redirectedFrom()](#requestredirectedfrom)
|
- [request.redirectedFrom()](#requestredirectedfrom)
|
||||||
- [request.redirectedTo()](#requestredirectedto)
|
- [request.redirectedTo()](#requestredirectedto)
|
||||||
@ -3526,6 +3527,9 @@ Whether this request is driving frame's navigation.
|
|||||||
#### request.postData()
|
#### request.postData()
|
||||||
- returns: <?[string]> Request's post body, if any.
|
- returns: <?[string]> Request's post body, if any.
|
||||||
|
|
||||||
|
#### request.postDataBuffer()
|
||||||
|
- returns: <?[Buffer]> Request's post body in a binary form, if any.
|
||||||
|
|
||||||
#### request.postDataJSON()
|
#### request.postDataJSON()
|
||||||
- returns: <?[Object]> Parsed request's body for `form-urlencoded` and JSON as a fallback if any.
|
- returns: <?[Object]> Parsed request's body for `form-urlencoded` and JSON as a fallback if any.
|
||||||
|
|
||||||
|
@ -342,10 +342,14 @@ class InterceptableRequest implements network.RouteDelegate {
|
|||||||
headers,
|
headers,
|
||||||
method,
|
method,
|
||||||
url,
|
url,
|
||||||
postData = null,
|
postDataEntries = null,
|
||||||
} = requestPausedEvent ? requestPausedEvent.request : requestWillBeSentEvent.request;
|
} = requestPausedEvent ? requestPausedEvent.request : requestWillBeSentEvent.request;
|
||||||
const type = (requestWillBeSentEvent.type || '').toLowerCase();
|
const type = (requestWillBeSentEvent.type || '').toLowerCase();
|
||||||
this.request = new network.Request(allowInterception ? this : null, frame, redirectedFrom, documentId, url, type, method, postData, headersObject(headers));
|
let postDataBuffer = null;
|
||||||
|
if (postDataEntries && postDataEntries.length && postDataEntries[0].bytes)
|
||||||
|
postDataBuffer = Buffer.from(postDataEntries[0].bytes, 'base64');
|
||||||
|
|
||||||
|
this.request = new network.Request(allowInterception ? this : null, frame, redirectedFrom, documentId, url, type, method, postDataBuffer, headersObject(headers));
|
||||||
}
|
}
|
||||||
|
|
||||||
async continue(overrides: types.NormalizedContinueOverrides) {
|
async continue(overrides: types.NormalizedContinueOverrides) {
|
||||||
|
@ -153,9 +153,11 @@ class InterceptableRequest implements network.RouteDelegate {
|
|||||||
const headers: types.Headers = {};
|
const headers: types.Headers = {};
|
||||||
for (const {name, value} of payload.headers)
|
for (const {name, value} of payload.headers)
|
||||||
headers[name.toLowerCase()] = value;
|
headers[name.toLowerCase()] = value;
|
||||||
|
let postDataBuffer = null;
|
||||||
|
if (payload.postData)
|
||||||
|
postDataBuffer = Buffer.from(payload.postData, 'base64');
|
||||||
this.request = new network.Request(payload.isIntercepted ? this : null, frame, redirectedFrom ? redirectedFrom.request : null, payload.navigationId,
|
this.request = new network.Request(payload.isIntercepted ? this : null, frame, redirectedFrom ? redirectedFrom.request : null, payload.navigationId,
|
||||||
payload.url, internalCauseToResourceType[payload.internalCause] || causeToResourceType[payload.cause] || 'other', payload.method, payload.postData || null, headers);
|
payload.url, internalCauseToResourceType[payload.internalCause] || causeToResourceType[payload.cause] || 'other', payload.method, postDataBuffer, headers);
|
||||||
}
|
}
|
||||||
|
|
||||||
async continue(overrides: types.NormalizedContinueOverrides) {
|
async continue(overrides: types.NormalizedContinueOverrides) {
|
||||||
|
@ -78,14 +78,14 @@ export class Request {
|
|||||||
private _url: string;
|
private _url: string;
|
||||||
private _resourceType: string;
|
private _resourceType: string;
|
||||||
private _method: string;
|
private _method: string;
|
||||||
private _postData: string | null;
|
private _postData: Buffer | null;
|
||||||
private _headers: types.Headers;
|
private _headers: types.Headers;
|
||||||
private _frame: frames.Frame;
|
private _frame: frames.Frame;
|
||||||
private _waitForResponsePromise: Promise<Response | null>;
|
private _waitForResponsePromise: Promise<Response | null>;
|
||||||
private _waitForResponsePromiseCallback: (value: Response | null) => void = () => {};
|
private _waitForResponsePromiseCallback: (value: Response | null) => void = () => {};
|
||||||
|
|
||||||
constructor(routeDelegate: RouteDelegate | null, frame: frames.Frame, redirectedFrom: Request | null, documentId: string | undefined,
|
constructor(routeDelegate: RouteDelegate | null, frame: frames.Frame, redirectedFrom: Request | null, documentId: string | undefined,
|
||||||
url: string, resourceType: string, method: string, postData: string | null, headers: types.Headers) {
|
url: string, resourceType: string, method: string, postData: Buffer | null, headers: types.Headers) {
|
||||||
assert(!url.startsWith('data:'), 'Data urls should not fire requests');
|
assert(!url.startsWith('data:'), 'Data urls should not fire requests');
|
||||||
assert(!(routeDelegate && redirectedFrom), 'Should not be able to intercept redirects');
|
assert(!(routeDelegate && redirectedFrom), 'Should not be able to intercept redirects');
|
||||||
this._routeDelegate = routeDelegate;
|
this._routeDelegate = routeDelegate;
|
||||||
@ -121,11 +121,16 @@ export class Request {
|
|||||||
}
|
}
|
||||||
|
|
||||||
postData(): string | null {
|
postData(): string | null {
|
||||||
|
return this._postData ? this._postData.toString('utf8') : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
postDataBuffer(): Buffer | null {
|
||||||
return this._postData;
|
return this._postData;
|
||||||
}
|
}
|
||||||
|
|
||||||
postDataJSON(): Object | null {
|
postDataJSON(): Object | null {
|
||||||
if (!this._postData)
|
const postData = this.postData();
|
||||||
|
if (!postData)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
const contentType = this.headers()['content-type'];
|
const contentType = this.headers()['content-type'];
|
||||||
@ -134,13 +139,13 @@ export class Request {
|
|||||||
|
|
||||||
if (contentType === 'application/x-www-form-urlencoded') {
|
if (contentType === 'application/x-www-form-urlencoded') {
|
||||||
const entries: Record<string, string> = {};
|
const entries: Record<string, string> = {};
|
||||||
const parsed = new URLSearchParams(this._postData);
|
const parsed = new URLSearchParams(postData);
|
||||||
for (const [k, v] of parsed.entries())
|
for (const [k, v] of parsed.entries())
|
||||||
entries[k] = v;
|
entries[k] = v;
|
||||||
return entries;
|
return entries;
|
||||||
}
|
}
|
||||||
|
|
||||||
return JSON.parse(this._postData);
|
return JSON.parse(postData);
|
||||||
}
|
}
|
||||||
|
|
||||||
headers(): {[key: string]: string} {
|
headers(): {[key: string]: string} {
|
||||||
|
@ -1400,7 +1400,7 @@ export type RequestInitializer = {
|
|||||||
url: string,
|
url: string,
|
||||||
resourceType: string,
|
resourceType: string,
|
||||||
method: string,
|
method: string,
|
||||||
postData?: string,
|
postData?: Binary,
|
||||||
headers: {
|
headers: {
|
||||||
name: string,
|
name: string,
|
||||||
value: string,
|
value: string,
|
||||||
|
@ -49,6 +49,7 @@ export class Request extends ChannelOwner<RequestChannel, RequestInitializer> {
|
|||||||
private _redirectedTo: Request | null = null;
|
private _redirectedTo: Request | null = null;
|
||||||
_failureText: string | null = null;
|
_failureText: string | null = null;
|
||||||
private _headers: types.Headers;
|
private _headers: types.Headers;
|
||||||
|
private _postData: Buffer | null;
|
||||||
|
|
||||||
static from(request: RequestChannel): Request {
|
static from(request: RequestChannel): Request {
|
||||||
return (request as any)._object;
|
return (request as any)._object;
|
||||||
@ -64,6 +65,7 @@ export class Request extends ChannelOwner<RequestChannel, RequestInitializer> {
|
|||||||
if (this._redirectedFrom)
|
if (this._redirectedFrom)
|
||||||
this._redirectedFrom._redirectedTo = this;
|
this._redirectedFrom._redirectedTo = this;
|
||||||
this._headers = headersArrayToObject(initializer.headers);
|
this._headers = headersArrayToObject(initializer.headers);
|
||||||
|
this._postData = initializer.postData ? Buffer.from(initializer.postData, 'base64') : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
url(): string {
|
url(): string {
|
||||||
@ -79,11 +81,16 @@ export class Request extends ChannelOwner<RequestChannel, RequestInitializer> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
postData(): string | null {
|
postData(): string | null {
|
||||||
return this._initializer.postData || null;
|
return this._postData ? this._postData.toString('utf8') : null;
|
||||||
|
}
|
||||||
|
|
||||||
|
postDataBuffer(): Buffer | null {
|
||||||
|
return this._postData;
|
||||||
}
|
}
|
||||||
|
|
||||||
postDataJSON(): Object | null {
|
postDataJSON(): Object | null {
|
||||||
if (!this._initializer.postData)
|
const postData = this.postData();
|
||||||
|
if (!postData)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
const contentType = this.headers()['content-type'];
|
const contentType = this.headers()['content-type'];
|
||||||
@ -92,13 +99,13 @@ export class Request extends ChannelOwner<RequestChannel, RequestInitializer> {
|
|||||||
|
|
||||||
if (contentType === 'application/x-www-form-urlencoded') {
|
if (contentType === 'application/x-www-form-urlencoded') {
|
||||||
const entries: Record<string, string> = {};
|
const entries: Record<string, string> = {};
|
||||||
const parsed = new URLSearchParams(this._initializer.postData);
|
const parsed = new URLSearchParams(postData);
|
||||||
for (const [k, v] of parsed.entries())
|
for (const [k, v] of parsed.entries())
|
||||||
entries[k] = v;
|
entries[k] = v;
|
||||||
return entries;
|
return entries;
|
||||||
}
|
}
|
||||||
|
|
||||||
return JSON.parse(this._initializer.postData);
|
return JSON.parse(postData);
|
||||||
}
|
}
|
||||||
|
|
||||||
headers(): types.Headers {
|
headers(): types.Headers {
|
||||||
|
@ -1291,7 +1291,7 @@ interface Request
|
|||||||
url: string
|
url: string
|
||||||
resourceType: string
|
resourceType: string
|
||||||
method: string
|
method: string
|
||||||
postData?: string
|
postData?: binary
|
||||||
headers: object[]
|
headers: object[]
|
||||||
name: string
|
name: string
|
||||||
value: string
|
value: string
|
||||||
|
@ -33,13 +33,13 @@ export class RequestDispatcher extends Dispatcher<Request, RequestInitializer> i
|
|||||||
}
|
}
|
||||||
|
|
||||||
private constructor(scope: DispatcherScope, request: Request) {
|
private constructor(scope: DispatcherScope, request: Request) {
|
||||||
const postData = request.postData();
|
const postData = request.postDataBuffer();
|
||||||
super(scope, request, 'Request', {
|
super(scope, request, 'Request', {
|
||||||
frame: FrameDispatcher.from(scope, request.frame()),
|
frame: FrameDispatcher.from(scope, request.frame()),
|
||||||
url: request.url(),
|
url: request.url(),
|
||||||
resourceType: request.resourceType(),
|
resourceType: request.resourceType(),
|
||||||
method: request.method(),
|
method: request.method(),
|
||||||
postData: postData === null ? undefined : postData,
|
postData: postData === null ? undefined : postData.toString('base64'),
|
||||||
headers: headersObjectToArray(request.headers()),
|
headers: headersObjectToArray(request.headers()),
|
||||||
isNavigationRequest: request.isNavigationRequest(),
|
isNavigationRequest: request.isNavigationRequest(),
|
||||||
redirectedFrom: RequestDispatcher.fromNullable(scope, request.redirectedFrom()),
|
redirectedFrom: RequestDispatcher.fromNullable(scope, request.redirectedFrom()),
|
||||||
|
@ -53,8 +53,11 @@ export class WKInterceptableRequest implements network.RouteDelegate {
|
|||||||
this._requestId = event.requestId;
|
this._requestId = event.requestId;
|
||||||
this._allowInterception = allowInterception;
|
this._allowInterception = allowInterception;
|
||||||
const resourceType = event.type ? event.type.toLowerCase() : (redirectedFrom ? redirectedFrom.resourceType() : 'other');
|
const resourceType = event.type ? event.type.toLowerCase() : (redirectedFrom ? redirectedFrom.resourceType() : 'other');
|
||||||
|
let postDataBuffer = null;
|
||||||
|
if (event.request.postData)
|
||||||
|
postDataBuffer = Buffer.from(event.request.postData, 'binary');
|
||||||
this.request = new network.Request(allowInterception ? this : null, frame, redirectedFrom, documentId, event.request.url,
|
this.request = new network.Request(allowInterception ? this : null, frame, redirectedFrom, documentId, event.request.url,
|
||||||
resourceType, event.request.method, event.request.postData || null, headersObject(event.request.headers));
|
resourceType, event.request.method, postDataBuffer, headersObject(event.request.headers));
|
||||||
this._interceptedPromise = new Promise(f => this._interceptedCallback = f);
|
this._interceptedPromise = new Promise(f => this._interceptedCallback = f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,13 +133,39 @@ describe('Request.postData', function() {
|
|||||||
expect(request).toBeTruthy();
|
expect(request).toBeTruthy();
|
||||||
expect(request.postData()).toBe('{"foo":"bar"}');
|
expect(request.postData()).toBe('{"foo":"bar"}');
|
||||||
});
|
});
|
||||||
|
it('should work with binary', async({page, server}) => {
|
||||||
|
await page.goto(server.EMPTY_PAGE);
|
||||||
|
server.setRoute('/post', (req, res) => res.end());
|
||||||
|
let request = null;
|
||||||
|
page.on('request', r => request = r);
|
||||||
|
await page.evaluate(async () => {
|
||||||
|
await fetch('./post', { method: 'POST', body: new Uint8Array(Array.from(Array(256).keys())) })
|
||||||
|
});
|
||||||
|
expect(request).toBeTruthy();
|
||||||
|
const buffer = request.postDataBuffer();
|
||||||
|
expect(buffer.length).toBe(256);
|
||||||
|
for (let i = 0; i < 256; ++i)
|
||||||
|
expect(buffer[i]).toBe(i);
|
||||||
|
});
|
||||||
|
it('should work with binary and interception', async({page, server}) => {
|
||||||
|
await page.goto(server.EMPTY_PAGE);
|
||||||
|
server.setRoute('/post', (req, res) => res.end());
|
||||||
|
let request = null;
|
||||||
|
await page.route('/post', route => route.continue());
|
||||||
|
page.on('request', r => request = r);
|
||||||
|
await page.evaluate(async () => {
|
||||||
|
await fetch('./post', { method: 'POST', body: new Uint8Array(Array.from(Array(256).keys())) })
|
||||||
|
});
|
||||||
|
expect(request).toBeTruthy();
|
||||||
|
const buffer = request.postDataBuffer();
|
||||||
|
expect(buffer.length).toBe(256);
|
||||||
|
for (let i = 0; i < 256; ++i)
|
||||||
|
expect(buffer[i]).toBe(i);
|
||||||
|
});
|
||||||
it('should be |undefined| when there is no post data', async({page, server}) => {
|
it('should be |undefined| when there is no post data', async({page, server}) => {
|
||||||
const response = await page.goto(server.EMPTY_PAGE);
|
const response = await page.goto(server.EMPTY_PAGE);
|
||||||
expect(response.request().postData()).toBe(null);
|
expect(response.request().postData()).toBe(null);
|
||||||
});
|
});
|
||||||
});
|
|
||||||
|
|
||||||
describe('Request.postDataJSON', function () {
|
|
||||||
it('should parse the JSON payload', async ({ page, server }) => {
|
it('should parse the JSON payload', async ({ page, server }) => {
|
||||||
await page.goto(server.EMPTY_PAGE);
|
await page.goto(server.EMPTY_PAGE);
|
||||||
server.setRoute('/post', (req, res) => res.end());
|
server.setRoute('/post', (req, res) => res.end());
|
||||||
@ -149,7 +175,6 @@ describe('Request.postDataJSON', function () {
|
|||||||
expect(request).toBeTruthy();
|
expect(request).toBeTruthy();
|
||||||
expect(request.postDataJSON()).toEqual({ "foo": "bar" });
|
expect(request.postDataJSON()).toEqual({ "foo": "bar" });
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should parse the data if content-type is application/x-www-form-urlencoded', async({page, server}) => {
|
it('should parse the data if content-type is application/x-www-form-urlencoded', async({page, server}) => {
|
||||||
await page.goto(server.EMPTY_PAGE);
|
await page.goto(server.EMPTY_PAGE);
|
||||||
server.setRoute('/post', (req, res) => res.end());
|
server.setRoute('/post', (req, res) => res.end());
|
||||||
@ -160,7 +185,6 @@ describe('Request.postDataJSON', function () {
|
|||||||
expect(request).toBeTruthy();
|
expect(request).toBeTruthy();
|
||||||
expect(request.postDataJSON()).toEqual({'foo':'bar','baz':'123'});
|
expect(request.postDataJSON()).toEqual({'foo':'bar','baz':'123'});
|
||||||
})
|
})
|
||||||
|
|
||||||
it('should be |undefined| when there is no post data', async ({ page, server }) => {
|
it('should be |undefined| when there is no post data', async ({ page, server }) => {
|
||||||
const response = await page.goto(server.EMPTY_PAGE);
|
const response = await page.goto(server.EMPTY_PAGE);
|
||||||
expect(response.request().postDataJSON()).toBe(null);
|
expect(response.request().postDataJSON()).toBe(null);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user