#ifndef CONTENT_RENDERER_LOCAL_RESOURCE_URL_LOADER_FACTORY_H_
#define CONTENT_RENDERER_LOCAL_RESOURCE_URL_LOADER_FACTORY_H_
#include <cstdint>
#include <memory>
#include "base/memory/ref_counted.h"
#include "base/memory/ref_counted_memory.h"
#include "base/memory/scoped_refptr.h"
#include "base/task/sequenced_task_runner.h"
#include "base/threading/sequence_bound.h"
#include "content/common/content_export.h"
#include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.h"
#include "mojo/public/cpp/bindings/receiver_set.h"
#include "mojo/public/cpp/bindings/remote.h"
#include "net/socket/socket.h"
#include "services/network/public/cpp/resource_request.h"
#include "services/network/public/mojom/url_loader.mojom.h"
#include "services/network/public/mojom/url_loader_factory.mojom.h"
#include "third_party/blink/public/mojom/loader/local_resource_loader_config.mojom.h"
#include "url/origin.h"
namespace content {
class CONTENT_EXPORT LocalResourceURLLoaderFactory
: public network::mojom::URLLoaderFactory {
public:
struct Source {
Source(blink::mojom::LocalResourceSourcePtr source,
std::map<std::string, std::string> replacement_strings);
Source(Source&& other);
Source& operator=(Source&& other);
~Source();
blink::mojom::LocalResourceSourcePtr source;
std::map<std::string, std::string> replacement_strings;
};
LocalResourceURLLoaderFactory(
blink::mojom::LocalResourceLoaderConfigPtr config,
mojo::PendingRemote<network::mojom::URLLoaderFactory> fallback);
~LocalResourceURLLoaderFactory() override;
void CreateLoaderAndStart(
mojo::PendingReceiver<network::mojom::URLLoader> loader,
int32_t request_id,
uint32_t options,
const network::ResourceRequest& request,
mojo::PendingRemote<network::mojom::URLLoaderClient> client,
const net::MutableNetworkTrafficAnnotationTag& traffic_annotation)
override;
void Clone(mojo::PendingReceiver<network::mojom::URLLoaderFactory> receiver)
override;
static scoped_refptr<base::RefCountedMemory> GetResource(
const GURL& url,
const blink::mojom::LocalResourceSourcePtr& source,
const std::map<std::string, std::string>& replacement_strings,
const std::string& mime_type);
private:
bool CanServe(const network::ResourceRequest& request) const;
static void GetResourceAndRespond(
const scoped_refptr<base::RefCountedData<std::map<url::Origin, Source>>>
sources,
const network::ResourceRequest& request,
mojo::PendingRemote<network::mojom::URLLoaderClient> client);
const scoped_refptr<base::RefCountedData<std::map<url::Origin, Source>>>
sources_;
const mojo::Remote<network::mojom::URLLoaderFactory> fallback_;
mojo::ReceiverSet<network::mojom::URLLoaderFactory> receivers_;
};
}
#endif