Commit d6b0a81f authored by Lukasz Anforowicz's avatar Lukasz Anforowicz Committed by Commit Bot

Introduce NonNetworkURLLoaderFactoryBase class.

This CL deduplicates code that used to be repeated in
FileURLLoaderFactory and ContentURLLoaderFactory: the overridden Clone,
private OnDisconnect method and |receivers_| field.

In the future, other aspects of URLLoaderFactory implementation (e.g.
handling of CORS and/or helpers for responding with file contents) may
hopefully also be moved into NonNetworkURLLoaderFactoryBase.

Bug: 1106995, 1105256
Change-Id: I7b8783bc4020d914fb7bdd9f56e2e9698fd9a615
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2357559
Commit-Queue: Łukasz Anforowicz <lukasza@chromium.org>
Reviewed-by: default avatarAlex Moshchuk <alexmos@chromium.org>
Cr-Commit-Position: refs/heads/master@{#805549}
parent d6b09b47
......@@ -1067,6 +1067,8 @@ source_set("browser") {
"loader/navigation_url_loader_factory.h",
"loader/navigation_url_loader_impl.cc",
"loader/navigation_url_loader_impl.h",
"loader/non_network_url_loader_factory_base.cc",
"loader/non_network_url_loader_factory_base.h",
"loader/prefetch_url_loader.cc",
"loader/prefetch_url_loader.h",
"loader/prefetch_url_loader_service.cc",
......
......@@ -299,11 +299,8 @@ class ContentURLLoader : public network::mojom::URLLoader {
ContentURLLoaderFactory::ContentURLLoaderFactory(
scoped_refptr<base::SequencedTaskRunner> task_runner,
mojo::PendingReceiver<network::mojom::URLLoaderFactory> factory_receiver)
: task_runner_(std::move(task_runner)) {
receivers_.set_disconnect_handler(base::BindRepeating(
&ContentURLLoaderFactory::OnDisconnect, base::Unretained(this)));
receivers_.Add(this, std::move(factory_receiver));
}
: NonNetworkURLLoaderFactoryBase(std::move(factory_receiver)),
task_runner_(std::move(task_runner)) {}
ContentURLLoaderFactory::~ContentURLLoaderFactory() = default;
......@@ -320,23 +317,13 @@ void ContentURLLoaderFactory::CreateLoaderAndStart(
std::move(loader), std::move(client)));
}
void ContentURLLoaderFactory::Clone(
mojo::PendingReceiver<network::mojom::URLLoaderFactory> loader) {
receivers_.Add(this, std::move(loader));
}
void ContentURLLoaderFactory::OnDisconnect() {
if (receivers_.empty())
delete this;
}
// static
mojo::PendingRemote<network::mojom::URLLoaderFactory>
ContentURLLoaderFactory::Create() {
mojo::PendingRemote<network::mojom::URLLoaderFactory> pending_remote;
// The ContentURLLoaderFactory will delete itself when there are no more
// receivers - see the ContentURLLoaderFactory::OnDisconnect method.
// receivers - see the NonNetworkURLLoaderFactoryBase::OnDisconnect method.
new ContentURLLoaderFactory(
base::ThreadPool::CreateSequencedTaskRunner(
{base::MayBlock(), base::TaskPriority::BEST_EFFORT,
......
......@@ -6,19 +6,19 @@
#define CONTENT_BROWSER_ANDROID_CONTENT_URL_LOADER_FACTORY_H_
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/sequenced_task_runner.h"
#include "content/browser/loader/non_network_url_loader_factory_base.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 "services/network/public/mojom/url_loader_factory.mojom.h"
namespace content {
// A URLLoaderFactory used for the content:// scheme used when Network Service
// is enabled.
class CONTENT_EXPORT ContentURLLoaderFactory
: public network::mojom::URLLoaderFactory {
: public NonNetworkURLLoaderFactoryBase {
public:
// Returns mojo::PendingRemote to a newly constructed ContentURLLoadedFactory.
// The factory is self-owned - it will delete itself once there are no more
......@@ -44,13 +44,8 @@ class CONTENT_EXPORT ContentURLLoaderFactory
mojo::PendingRemote<network::mojom::URLLoaderClient> client,
const net::MutableNetworkTrafficAnnotationTag& traffic_annotation)
override;
void Clone(
mojo::PendingReceiver<network::mojom::URLLoaderFactory> loader) override;
void OnDisconnect();
const scoped_refptr<base::SequencedTaskRunner> task_runner_;
mojo::ReceiverSet<network::mojom::URLLoaderFactory> receivers_;
DISALLOW_COPY_AND_ASSIGN(ContentURLLoaderFactory);
};
......
......@@ -790,16 +790,13 @@ FileURLLoaderFactory::FileURLLoaderFactory(
scoped_refptr<SharedCorsOriginAccessList> shared_cors_origin_access_list,
base::TaskPriority task_priority,
mojo::PendingReceiver<network::mojom::URLLoaderFactory> factory_receiver)
: profile_path_(profile_path),
: NonNetworkURLLoaderFactoryBase(std::move(factory_receiver)),
profile_path_(profile_path),
shared_cors_origin_access_list_(
std::move(shared_cors_origin_access_list)),
task_runner_(base::ThreadPool::CreateSequencedTaskRunner(
{base::MayBlock(), task_priority,
base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})) {
receivers_.set_disconnect_handler(base::BindRepeating(
&FileURLLoaderFactory::OnDisconnect, base::Unretained(this)));
receivers_.Add(this, std::move(factory_receiver));
}
base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})) {}
FileURLLoaderFactory::~FileURLLoaderFactory() = default;
......@@ -897,18 +894,6 @@ void FileURLLoaderFactory::CreateLoaderAndStartInternal(
}
}
void FileURLLoaderFactory::Clone(
mojo::PendingReceiver<network::mojom::URLLoaderFactory> loader) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
receivers_.Add(this, std::move(loader));
}
void FileURLLoaderFactory::OnDisconnect() {
if (receivers_.empty())
delete this;
}
// static
mojo::PendingRemote<network::mojom::URLLoaderFactory>
FileURLLoaderFactory::Create(
......@@ -918,7 +903,7 @@ FileURLLoaderFactory::Create(
mojo::PendingRemote<network::mojom::URLLoaderFactory> pending_remote;
// The FileURLLoaderFactory will delete itself when there are no more
// receivers - see the FileURLLoaderFactory::OnDisconnect method.
// receivers - see the NonNetworkURLLoaderFactoryBase::OnDisconnect method.
new FileURLLoaderFactory(
profile_path, std::move(shared_cors_origin_access_list), task_priority,
pending_remote.InitWithNewPipeAndPassReceiver());
......
......@@ -8,15 +8,12 @@
#include "base/files/file_path.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/sequenced_task_runner.h"
#include "base/task/task_traits.h"
#include "base/threading/thread_checker.h"
#include "content/browser/loader/non_network_url_loader_factory_base.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 "services/network/public/mojom/url_loader_factory.mojom.h"
namespace content {
......@@ -27,8 +24,7 @@ class SharedCorsOriginAccessList;
// If a caller needs a request that has a fetch request mode other than
// "no-cors", this class should be used on the UI thread.
class CONTENT_EXPORT FileURLLoaderFactory
: public network::mojom::URLLoaderFactory,
public base::SupportsWeakPtr<FileURLLoaderFactory> {
: public NonNetworkURLLoaderFactoryBase {
public:
// Returns mojo::PendingRemote to a newly constructed FileURLLoaderFactory.
// The factory is self-owned - it will delete itself once there are no more
......@@ -63,8 +59,6 @@ class CONTENT_EXPORT FileURLLoaderFactory
mojo::PendingRemote<network::mojom::URLLoaderClient> client,
const net::MutableNetworkTrafficAnnotationTag& traffic_annotation)
override;
void Clone(
mojo::PendingReceiver<network::mojom::URLLoaderFactory> loader) override;
void CreateLoaderAndStartInternal(
const network::ResourceRequest request,
......@@ -72,15 +66,10 @@ class CONTENT_EXPORT FileURLLoaderFactory
mojo::PendingReceiver<network::mojom::URLLoader> loader,
mojo::PendingRemote<network::mojom::URLLoaderClient> client);
void OnDisconnect();
const base::FilePath profile_path_;
const scoped_refptr<SharedCorsOriginAccessList>
shared_cors_origin_access_list_;
const scoped_refptr<base::SequencedTaskRunner> task_runner_;
mojo::ReceiverSet<network::mojom::URLLoaderFactory> receivers_;
THREAD_CHECKER(thread_checker_);
DISALLOW_COPY_AND_ASSIGN(FileURLLoaderFactory);
};
......
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/loader/non_network_url_loader_factory_base.h"
#include <utility>
namespace content {
NonNetworkURLLoaderFactoryBase::NonNetworkURLLoaderFactoryBase(
mojo::PendingReceiver<network::mojom::URLLoaderFactory> factory_receiver) {
receivers_.set_disconnect_handler(base::BindRepeating(
&NonNetworkURLLoaderFactoryBase::OnDisconnect, base::Unretained(this)));
receivers_.Add(this, std::move(factory_receiver));
}
NonNetworkURLLoaderFactoryBase::~NonNetworkURLLoaderFactoryBase() = default;
void NonNetworkURLLoaderFactoryBase::Clone(
mojo::PendingReceiver<network::mojom::URLLoaderFactory> loader) {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
receivers_.Add(this, std::move(loader));
}
void NonNetworkURLLoaderFactoryBase::OnDisconnect() {
DCHECK_CALLED_ON_VALID_THREAD(thread_checker_);
if (receivers_.empty())
delete this;
}
} // namespace content
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_BROWSER_LOADER_NON_NETWORK_URL_LOADER_FACTORY_BASE_H_
#define CONTENT_BROWSER_LOADER_NON_NETWORK_URL_LOADER_FACTORY_BASE_H_
#include "base/macros.h"
#include "base/threading/thread_checker.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 "services/network/public/mojom/url_loader_factory.mojom.h"
namespace content {
// A base class for URLLoaderFactory implementations that takes care of the
// following aspects that most implementations need to take care of:
//
// - Managing the lifetime of the URLLoaderFactory implementation
// (owned by the set of its receivers). See: the final Clone override,
// OnDisconnect and |receivers_|.
//
// - TODO(toyoshim, lukasza): https://crbug.com/1105256: Checking CORS before
// handing off to the derived class.
//
// - TODO(lukasza): Responding with file contents: duplicated across
// FileURLLoaderFactory, ContentURLLoaderFactory (with some additional
// code sharing probably possible with ExtensionURLLoaderFactory).
class NonNetworkURLLoaderFactoryBase : public network::mojom::URLLoaderFactory {
protected:
// Constructs NonNetworkURLLoaderFactoryBase object that will self-delete once
// all receivers disconnect (including |factory_receiver| below as well as
// receivers that connect via the Clone method).
explicit NonNetworkURLLoaderFactoryBase(
mojo::PendingReceiver<network::mojom::URLLoaderFactory> factory_receiver);
~NonNetworkURLLoaderFactoryBase() override;
THREAD_CHECKER(thread_checker_);
private:
// The override below is marked as |final| to make sure derived classes do not
// accidentally side-step lifetime management.
void Clone(
mojo::PendingReceiver<network::mojom::URLLoaderFactory> loader) final;
void OnDisconnect();
mojo::ReceiverSet<network::mojom::URLLoaderFactory> receivers_;
DISALLOW_COPY_AND_ASSIGN(NonNetworkURLLoaderFactoryBase);
};
} // namespace content
#endif // CONTENT_BROWSER_LOADER_NON_NETWORK_URL_LOADER_FACTORY_BASE_H_
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment