feat: add excludeUrls and modify urls in WebRequestFilter for better URL filtering (#44692)

* feat: add excludeUrls to web request filter

* refactor: add deprecated field

* test: update tests

* lint: newline

* docs: improve API doc

* fix: add is filter defined property to match all urls

* refactor: remove includeUrls

* refactor: remove typescript binding

* refactor: all_url

* refactor: remove isDefined methods

* refactor: remove comment

* fix: logic

* docs: add to breaking changes
This commit is contained in:
Alice Zhao 2025-02-17 12:40:47 -08:00 committed by GitHub
parent 7dfcec931a
commit 02be7c1185
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 150 additions and 32 deletions

View file

@ -101,6 +101,12 @@ describe('webRequest module', () => {
await expect(ajax(defaultURL)).to.eventually.be.rejected();
});
it('matches all requests when no filters are defined', async () => {
ses.webRequest.onBeforeRequest(cancel);
await expect(ajax(`${defaultURL}nofilter/test`)).to.eventually.be.rejected();
await expect(ajax(`${defaultURL}nofilter2/test`)).to.eventually.be.rejected();
});
it('can filter URLs', async () => {
const filter = { urls: [defaultURL + 'filter/*'] };
ses.webRequest.onBeforeRequest(filter, cancel);
@ -109,6 +115,36 @@ describe('webRequest module', () => {
await expect(ajax(`${defaultURL}filter/test`)).to.eventually.be.rejected();
});
it('can filter all URLs with syntax <all_urls>', async () => {
const filter = { urls: ['<all_urls>'] };
ses.webRequest.onBeforeRequest(filter, cancel);
await expect(ajax(`${defaultURL}filter/test`)).to.eventually.be.rejected();
await expect(ajax(`${defaultURL}nofilter/test`)).to.eventually.be.rejected();
});
it('can filter URLs with overlapping patterns of urls and excludeUrls', async () => {
// If filter matches both urls and excludeUrls, it should be excluded.
const filter = { urls: [defaultURL + 'filter/*'], excludeUrls: [defaultURL + 'filter/test'] };
ses.webRequest.onBeforeRequest(filter, cancel);
const { data } = await ajax(`${defaultURL}filter/test`);
expect(data).to.equal('/filter/test');
});
it('can filter URLs with multiple excludeUrls patterns', async () => {
const filter = { urls: [defaultURL + 'filter/*'], excludeUrls: [defaultURL + 'filter/exclude1/*', defaultURL + 'filter/exclude2/*'] };
ses.webRequest.onBeforeRequest(filter, cancel);
expect((await ajax(`${defaultURL}filter/exclude1/test`)).data).to.equal('/filter/exclude1/test');
expect((await ajax(`${defaultURL}filter/exclude2/test`)).data).to.equal('/filter/exclude2/test');
// expect non-excluded URL to pass filter
await expect(ajax(`${defaultURL}filter/test`)).to.eventually.be.rejected();
});
it('can filter URLs with empty excludeUrls', async () => {
const filter = { urls: [defaultURL + 'filter/*'], excludeUrls: [] };
ses.webRequest.onBeforeRequest(filter, cancel);
await expect(ajax(`${defaultURL}filter/test`)).to.eventually.be.rejected();
});
it('can filter URLs and types', async () => {
const filter1: Electron.WebRequestFilter = { urls: [defaultURL + 'filter/*'], types: ['xhr'] };
ses.webRequest.onBeforeRequest(filter1, cancel);
@ -122,6 +158,21 @@ describe('webRequest module', () => {
expect((await ajax(`${defaultURL}filter/test`)).data).to.equal('/filter/test');
});
it('can filter URLs, excludeUrls and types', async () => {
const filter1: Electron.WebRequestFilter = { urls: [defaultURL + 'filter/*'], excludeUrls: [defaultURL + 'exclude/*'], types: ['xhr'] };
ses.webRequest.onBeforeRequest(filter1, cancel);
expect((await ajax(`${defaultURL}nofilter/test`)).data).to.equal('/nofilter/test');
expect((await ajax(`${defaultURL}exclude/test`)).data).to.equal('/exclude/test');
await expect(ajax(`${defaultURL}filter/test`)).to.eventually.be.rejected();
const filter2: Electron.WebRequestFilter = { urls: [defaultURL + 'filter/*'], excludeUrls: [defaultURL + 'exclude/*'], types: ['stylesheet'] };
ses.webRequest.onBeforeRequest(filter2, cancel);
expect((await ajax(`${defaultURL}nofilter/test`)).data).to.equal('/nofilter/test');
expect((await ajax(`${defaultURL}filter/test`)).data).to.equal('/filter/test');
expect((await ajax(`${defaultURL}exclude/test`)).data).to.equal('/exclude/test');
});
it('receives details object', async () => {
ses.webRequest.onBeforeRequest((details, callback) => {
expect(details.id).to.be.a('number');