fix: webRequest module should work with file:// protocol (#22903)
* fix: override file:// instead of intercepting * test: webRequest module should work with file:// * fix: service work with file:// url * fix: original_response_headers can be null * fix: only register file:// when necessary
This commit is contained in:
parent
bac1c7f532
commit
e6f2605ad0
6 changed files with 101 additions and 7 deletions
|
@ -3,12 +3,46 @@
|
|||
// found in the LICENSE file.
|
||||
|
||||
#include <memory>
|
||||
#include <utility>
|
||||
|
||||
#include "shell/browser/electron_browser_context.h"
|
||||
#include "shell/browser/net/asar/asar_url_loader.h"
|
||||
#include "shell/browser/protocol_registry.h"
|
||||
|
||||
namespace electron {
|
||||
|
||||
namespace {
|
||||
|
||||
// Provide support for accessing asar archives in file:// protocol.
|
||||
class AsarURLLoaderFactory : public network::mojom::URLLoaderFactory {
|
||||
public:
|
||||
AsarURLLoaderFactory() {}
|
||||
|
||||
private:
|
||||
// network::mojom::URLLoaderFactory:
|
||||
void CreateLoaderAndStart(
|
||||
mojo::PendingReceiver<network::mojom::URLLoader> loader,
|
||||
int32_t routing_id,
|
||||
int32_t request_id,
|
||||
uint32_t options,
|
||||
const network::ResourceRequest& request,
|
||||
mojo::PendingRemote<network::mojom::URLLoaderClient> client,
|
||||
const net::MutableNetworkTrafficAnnotationTag& traffic_annotation)
|
||||
override {
|
||||
asar::CreateAsarURLLoader(request, std::move(loader), std::move(client),
|
||||
new net::HttpResponseHeaders(""));
|
||||
}
|
||||
|
||||
void Clone(
|
||||
mojo::PendingReceiver<network::mojom::URLLoaderFactory> loader) override {
|
||||
receivers_.Add(this, std::move(loader));
|
||||
}
|
||||
|
||||
mojo::ReceiverSet<network::mojom::URLLoaderFactory> receivers_;
|
||||
};
|
||||
|
||||
} // namespace
|
||||
|
||||
// static
|
||||
ProtocolRegistry* ProtocolRegistry::FromBrowserContext(
|
||||
content::BrowserContext* context) {
|
||||
|
@ -20,7 +54,25 @@ ProtocolRegistry::ProtocolRegistry() {}
|
|||
ProtocolRegistry::~ProtocolRegistry() = default;
|
||||
|
||||
void ProtocolRegistry::RegisterURLLoaderFactories(
|
||||
URLLoaderFactoryType type,
|
||||
content::ContentBrowserClient::NonNetworkURLLoaderFactoryMap* factories) {
|
||||
// Override the default FileURLLoaderFactory to support asar archives.
|
||||
if (type == URLLoaderFactoryType::kNavigation) {
|
||||
// Always allow navigating to file:// URLs.
|
||||
//
|
||||
// Note that Chromium calls |emplace| to create the default file factory
|
||||
// after this call, so it won't override our asar factory.
|
||||
DCHECK(!base::Contains(*factories, url::kFileScheme));
|
||||
factories->emplace(url::kFileScheme,
|
||||
std::make_unique<AsarURLLoaderFactory>());
|
||||
} else if (type == URLLoaderFactoryType::kDocumentSubResource) {
|
||||
// Only support requesting file:// subresource URLs when Chromium does so,
|
||||
// it is usually supported under file:// or about:blank documents.
|
||||
auto file_factory = factories->find(url::kFileScheme);
|
||||
if (file_factory != factories->end())
|
||||
file_factory->second = std::make_unique<AsarURLLoaderFactory>();
|
||||
}
|
||||
|
||||
for (const auto& it : handlers_) {
|
||||
factories->emplace(it.first, std::make_unique<ElectronURLLoaderFactory>(
|
||||
it.second.first, it.second.second));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue