Compare commits

...

2 Commits

Author SHA1 Message Date
Samuel Maddock
3a18e564f5 test: webRequest no crash 2024-12-23 12:50:33 -05:00
Sam Maddock
4e0acd65e0 fix: checks in extensions webRequest when using net.fetch
Several DCHECKs require `frame_host` data to proceed with proxying.
https://source.chromium.org/chromium/chromium/src/+/main:extensions/browser/api/web_request/web_request_api.cc;l=446-450;drc=f5e280b6c11f41545154266cd2317d3c730e9b30

Note that even if our URLLoader is updated to not use `content::ContentBrowserClient::URLLoaderFactoryType::kNavigation`, further checks are still thrown.
dc74092a09/shell/browser/electron_browser_context.cc (L547)
2024-12-17 00:05:53 -05:00
4 changed files with 31 additions and 2 deletions

View File

@@ -1310,7 +1310,11 @@ void ElectronBrowserClient::WillCreateURLLoaderFactory(
DCHECK(web_request.get());
#if BUILDFLAG(ENABLE_ELECTRON_EXTENSIONS)
if (!web_request->HasListener()) {
// If Electron's webRequest API has no listeners, proxy requests using
// chrome.webRequest extension APIs.
// Note that Electron's net.fetch and protocol.handle APIs do not include the
// frame host which is required for proxying requests.
if (!web_request->HasListener() && frame_host) {
auto* web_request_api = extensions::BrowserContextKeyedAPIFactory<
extensions::WebRequestAPI>::Get(browser_context);

View File

@@ -1,4 +1,4 @@
import { app, session, BrowserWindow, ipcMain, WebContents, Extension, Session } from 'electron/main';
import { app, session, BrowserWindow, ipcMain, net, WebContents, Extension, Session } from 'electron/main';
import { expect } from 'chai';
import * as WebSocket from 'ws';
@@ -434,6 +434,12 @@ describe('chrome extensions', () => {
});
});
});
it('does not crash when net.fetch is called', async () => {
await session.defaultSession.loadExtension(path.join(fixtures, 'extensions', 'chrome-webRequest-non-blocking'));
const requestUrl = `${url}/test.zip`;
await net.fetch(requestUrl);
});
});
describe('chrome.tabs', () => {

View File

@@ -0,0 +1,9 @@
/* global chrome */
chrome.webRequest.onBeforeRequest.addListener(
// eslint-disable-next-line @typescript-eslint/no-unused-vars
(details) => {
console.log(details);
},
{ urls: ['<all_urls>'] }
);

View File

@@ -0,0 +1,10 @@
{
"name": "chrome-webRequest-non-blocking",
"version": "1.0",
"background": {
"service_worker": "background.js"
},
"permissions": ["webRequest"],
"manifest_version": 3,
"host_permissions": ["<all_urls>"]
}