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") { ...@@ -1067,6 +1067,8 @@ source_set("browser") {
"loader/navigation_url_loader_factory.h", "loader/navigation_url_loader_factory.h",
"loader/navigation_url_loader_impl.cc", "loader/navigation_url_loader_impl.cc",
"loader/navigation_url_loader_impl.h", "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.cc",
"loader/prefetch_url_loader.h", "loader/prefetch_url_loader.h",
"loader/prefetch_url_loader_service.cc", "loader/prefetch_url_loader_service.cc",
......
...@@ -299,11 +299,8 @@ class ContentURLLoader : public network::mojom::URLLoader { ...@@ -299,11 +299,8 @@ class ContentURLLoader : public network::mojom::URLLoader {
ContentURLLoaderFactory::ContentURLLoaderFactory( ContentURLLoaderFactory::ContentURLLoaderFactory(
scoped_refptr<base::SequencedTaskRunner> task_runner, scoped_refptr<base::SequencedTaskRunner> task_runner,
mojo::PendingReceiver<network::mojom::URLLoaderFactory> factory_receiver) mojo::PendingReceiver<network::mojom::URLLoaderFactory> factory_receiver)
: task_runner_(std::move(task_runner)) { : NonNetworkURLLoaderFactoryBase(std::move(factory_receiver)),
receivers_.set_disconnect_handler(base::BindRepeating( task_runner_(std::move(task_runner)) {}
&ContentURLLoaderFactory::OnDisconnect, base::Unretained(this)));
receivers_.Add(this, std::move(factory_receiver));
}
ContentURLLoaderFactory::~ContentURLLoaderFactory() = default; ContentURLLoaderFactory::~ContentURLLoaderFactory() = default;
...@@ -320,23 +317,13 @@ void ContentURLLoaderFactory::CreateLoaderAndStart( ...@@ -320,23 +317,13 @@ void ContentURLLoaderFactory::CreateLoaderAndStart(
std::move(loader), std::move(client))); 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 // static
mojo::PendingRemote<network::mojom::URLLoaderFactory> mojo::PendingRemote<network::mojom::URLLoaderFactory>
ContentURLLoaderFactory::Create() { ContentURLLoaderFactory::Create() {
mojo::PendingRemote<network::mojom::URLLoaderFactory> pending_remote; mojo::PendingRemote<network::mojom::URLLoaderFactory> pending_remote;
// The ContentURLLoaderFactory will delete itself when there are no more // The ContentURLLoaderFactory will delete itself when there are no more
// receivers - see the ContentURLLoaderFactory::OnDisconnect method. // receivers - see the NonNetworkURLLoaderFactoryBase::OnDisconnect method.
new ContentURLLoaderFactory( new ContentURLLoaderFactory(
base::ThreadPool::CreateSequencedTaskRunner( base::ThreadPool::CreateSequencedTaskRunner(
{base::MayBlock(), base::TaskPriority::BEST_EFFORT, {base::MayBlock(), base::TaskPriority::BEST_EFFORT,
......
...@@ -6,19 +6,19 @@ ...@@ -6,19 +6,19 @@
#define CONTENT_BROWSER_ANDROID_CONTENT_URL_LOADER_FACTORY_H_ #define CONTENT_BROWSER_ANDROID_CONTENT_URL_LOADER_FACTORY_H_
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/sequenced_task_runner.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 "content/common/content_export.h"
#include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.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 { namespace content {
// A URLLoaderFactory used for the content:// scheme used when Network Service // A URLLoaderFactory used for the content:// scheme used when Network Service
// is enabled. // is enabled.
class CONTENT_EXPORT ContentURLLoaderFactory class CONTENT_EXPORT ContentURLLoaderFactory
: public network::mojom::URLLoaderFactory { : public NonNetworkURLLoaderFactoryBase {
public: public:
// Returns mojo::PendingRemote to a newly constructed ContentURLLoadedFactory. // Returns mojo::PendingRemote to a newly constructed ContentURLLoadedFactory.
// The factory is self-owned - it will delete itself once there are no more // The factory is self-owned - it will delete itself once there are no more
...@@ -44,13 +44,8 @@ class CONTENT_EXPORT ContentURLLoaderFactory ...@@ -44,13 +44,8 @@ class CONTENT_EXPORT ContentURLLoaderFactory
mojo::PendingRemote<network::mojom::URLLoaderClient> client, mojo::PendingRemote<network::mojom::URLLoaderClient> client,
const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) const net::MutableNetworkTrafficAnnotationTag& traffic_annotation)
override; override;
void Clone(
mojo::PendingReceiver<network::mojom::URLLoaderFactory> loader) override;
void OnDisconnect();
const scoped_refptr<base::SequencedTaskRunner> task_runner_; const scoped_refptr<base::SequencedTaskRunner> task_runner_;
mojo::ReceiverSet<network::mojom::URLLoaderFactory> receivers_;
DISALLOW_COPY_AND_ASSIGN(ContentURLLoaderFactory); DISALLOW_COPY_AND_ASSIGN(ContentURLLoaderFactory);
}; };
......
...@@ -790,16 +790,13 @@ FileURLLoaderFactory::FileURLLoaderFactory( ...@@ -790,16 +790,13 @@ FileURLLoaderFactory::FileURLLoaderFactory(
scoped_refptr<SharedCorsOriginAccessList> shared_cors_origin_access_list, scoped_refptr<SharedCorsOriginAccessList> shared_cors_origin_access_list,
base::TaskPriority task_priority, base::TaskPriority task_priority,
mojo::PendingReceiver<network::mojom::URLLoaderFactory> factory_receiver) 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_( shared_cors_origin_access_list_(
std::move(shared_cors_origin_access_list)), std::move(shared_cors_origin_access_list)),
task_runner_(base::ThreadPool::CreateSequencedTaskRunner( task_runner_(base::ThreadPool::CreateSequencedTaskRunner(
{base::MayBlock(), task_priority, {base::MayBlock(), task_priority,
base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})) { base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN})) {}
receivers_.set_disconnect_handler(base::BindRepeating(
&FileURLLoaderFactory::OnDisconnect, base::Unretained(this)));
receivers_.Add(this, std::move(factory_receiver));
}
FileURLLoaderFactory::~FileURLLoaderFactory() = default; FileURLLoaderFactory::~FileURLLoaderFactory() = default;
...@@ -897,18 +894,6 @@ void FileURLLoaderFactory::CreateLoaderAndStartInternal( ...@@ -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 // static
mojo::PendingRemote<network::mojom::URLLoaderFactory> mojo::PendingRemote<network::mojom::URLLoaderFactory>
FileURLLoaderFactory::Create( FileURLLoaderFactory::Create(
...@@ -918,7 +903,7 @@ FileURLLoaderFactory::Create( ...@@ -918,7 +903,7 @@ FileURLLoaderFactory::Create(
mojo::PendingRemote<network::mojom::URLLoaderFactory> pending_remote; mojo::PendingRemote<network::mojom::URLLoaderFactory> pending_remote;
// The FileURLLoaderFactory will delete itself when there are no more // The FileURLLoaderFactory will delete itself when there are no more
// receivers - see the FileURLLoaderFactory::OnDisconnect method. // receivers - see the NonNetworkURLLoaderFactoryBase::OnDisconnect method.
new FileURLLoaderFactory( new FileURLLoaderFactory(
profile_path, std::move(shared_cors_origin_access_list), task_priority, profile_path, std::move(shared_cors_origin_access_list), task_priority,
pending_remote.InitWithNewPipeAndPassReceiver()); pending_remote.InitWithNewPipeAndPassReceiver());
......
...@@ -8,15 +8,12 @@ ...@@ -8,15 +8,12 @@
#include "base/files/file_path.h" #include "base/files/file_path.h"
#include "base/macros.h" #include "base/macros.h"
#include "base/memory/ref_counted.h" #include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/sequenced_task_runner.h" #include "base/sequenced_task_runner.h"
#include "base/task/task_traits.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 "content/common/content_export.h"
#include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/pending_receiver.h"
#include "mojo/public/cpp/bindings/pending_remote.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 { namespace content {
...@@ -27,8 +24,7 @@ class SharedCorsOriginAccessList; ...@@ -27,8 +24,7 @@ class SharedCorsOriginAccessList;
// If a caller needs a request that has a fetch request mode other than // 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. // "no-cors", this class should be used on the UI thread.
class CONTENT_EXPORT FileURLLoaderFactory class CONTENT_EXPORT FileURLLoaderFactory
: public network::mojom::URLLoaderFactory, : public NonNetworkURLLoaderFactoryBase {
public base::SupportsWeakPtr<FileURLLoaderFactory> {
public: public:
// Returns mojo::PendingRemote to a newly constructed FileURLLoaderFactory. // Returns mojo::PendingRemote to a newly constructed FileURLLoaderFactory.
// The factory is self-owned - it will delete itself once there are no more // The factory is self-owned - it will delete itself once there are no more
...@@ -63,8 +59,6 @@ class CONTENT_EXPORT FileURLLoaderFactory ...@@ -63,8 +59,6 @@ class CONTENT_EXPORT FileURLLoaderFactory
mojo::PendingRemote<network::mojom::URLLoaderClient> client, mojo::PendingRemote<network::mojom::URLLoaderClient> client,
const net::MutableNetworkTrafficAnnotationTag& traffic_annotation) const net::MutableNetworkTrafficAnnotationTag& traffic_annotation)
override; override;
void Clone(
mojo::PendingReceiver<network::mojom::URLLoaderFactory> loader) override;
void CreateLoaderAndStartInternal( void CreateLoaderAndStartInternal(
const network::ResourceRequest request, const network::ResourceRequest request,
...@@ -72,15 +66,10 @@ class CONTENT_EXPORT FileURLLoaderFactory ...@@ -72,15 +66,10 @@ class CONTENT_EXPORT FileURLLoaderFactory
mojo::PendingReceiver<network::mojom::URLLoader> loader, mojo::PendingReceiver<network::mojom::URLLoader> loader,
mojo::PendingRemote<network::mojom::URLLoaderClient> client); mojo::PendingRemote<network::mojom::URLLoaderClient> client);
void OnDisconnect();
const base::FilePath profile_path_; const base::FilePath profile_path_;
const scoped_refptr<SharedCorsOriginAccessList> const scoped_refptr<SharedCorsOriginAccessList>
shared_cors_origin_access_list_; shared_cors_origin_access_list_;
const scoped_refptr<base::SequencedTaskRunner> task_runner_; const scoped_refptr<base::SequencedTaskRunner> task_runner_;
mojo::ReceiverSet<network::mojom::URLLoaderFactory> receivers_;
THREAD_CHECKER(thread_checker_);
DISALLOW_COPY_AND_ASSIGN(FileURLLoaderFactory); 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