Commit 704320aa authored by Luum Habtemariam's avatar Luum Habtemariam Committed by Commit Bot

Releasing cached URLLoaderFactory* in PpdProvider

The URLLoaderFactory interface grabbed from g_process can become
invalidated, like on network changes, so we can't save it. This change
modifies PpdProvider to grab it fresh before every fetch.

Test: chromeos_unittests passes
Bug: chromium:1123567
Change-Id: I2718548c45b61b34d78c17966037e8ccb91d654f
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2389020Reviewed-by: default avatarPiotr Pawliczek <pawliczek@chromium.org>
Reviewed-by: default avatarSean Kau <skau@chromium.org>
Commit-Queue: Luum Habtemariam <luum@chromium.org>
Cr-Commit-Position: refs/heads/master@{#805835}
parent a3dcf9ef
...@@ -11,17 +11,26 @@ ...@@ -11,17 +11,26 @@
#include "chromeos/printing/ppd_cache.h" #include "chromeos/printing/ppd_cache.h"
#include "chromeos/printing/ppd_provider.h" #include "chromeos/printing/ppd_provider.h"
#include "components/version_info/version_info.h" #include "components/version_info/version_info.h"
#include "content/public/browser/browser_thread.h"
#include "google_apis/google_api_keys.h" #include "google_apis/google_api_keys.h"
namespace chromeos { namespace chromeos {
namespace {
network::mojom::URLLoaderFactory* GetURLLoaderFactory() {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
return g_browser_process->system_network_context_manager()
->GetURLLoaderFactory();
}
} // namespace
scoped_refptr<PpdProvider> CreatePpdProvider(Profile* profile) { scoped_refptr<PpdProvider> CreatePpdProvider(Profile* profile) {
base::FilePath ppd_cache_path = base::FilePath ppd_cache_path =
profile->GetPath().Append(FILE_PATH_LITERAL("PPDCache")); profile->GetPath().Append(FILE_PATH_LITERAL("PPDCache"));
return PpdProvider::Create(g_browser_process->GetApplicationLocale(), return PpdProvider::Create(g_browser_process->GetApplicationLocale(),
g_browser_process->system_network_context_manager() base::BindRepeating(&GetURLLoaderFactory),
->GetURLLoaderFactory(),
PpdCache::Create(ppd_cache_path), PpdCache::Create(ppd_cache_path),
version_info::GetVersion()); version_info::GetVersion());
} }
......
...@@ -367,12 +367,12 @@ class PpdProviderImpl : public PpdProvider { ...@@ -367,12 +367,12 @@ class PpdProviderImpl : public PpdProvider {
}; };
PpdProviderImpl(const std::string& browser_locale, PpdProviderImpl(const std::string& browser_locale,
network::mojom::URLLoaderFactory* loader_factory, LoaderFactoryGetter loader_factory_getter,
scoped_refptr<PpdCache> ppd_cache, scoped_refptr<PpdCache> ppd_cache,
const base::Version& current_version, const base::Version& current_version,
const PpdProvider::Options& options) const PpdProvider::Options& options)
: browser_locale_(browser_locale), : browser_locale_(browser_locale),
loader_factory_(loader_factory), loader_factory_getter_(loader_factory_getter),
ppd_cache_(ppd_cache), ppd_cache_(ppd_cache),
disk_task_runner_(base::ThreadPool::CreateSequencedTaskRunner( disk_task_runner_(base::ThreadPool::CreateSequencedTaskRunner(
{base::TaskPriority::USER_VISIBLE, base::MayBlock(), {base::TaskPriority::USER_VISIBLE, base::MayBlock(),
...@@ -786,7 +786,7 @@ class PpdProviderImpl : public PpdProvider { ...@@ -786,7 +786,7 @@ class PpdProviderImpl : public PpdProvider {
// TODO(luum): consider using unbounded size // TODO(luum): consider using unbounded size
fetcher_->DownloadToString( fetcher_->DownloadToString(
loader_factory_, loader_factory_getter_.Run(),
base::BindOnce(&PpdProviderImpl::OnURLFetchComplete, this), base::BindOnce(&PpdProviderImpl::OnURLFetchComplete, this),
network::SimpleURLLoader::kMaxBoundedStringDownloadSize); network::SimpleURLLoader::kMaxBoundedStringDownloadSize);
...@@ -1734,7 +1734,7 @@ class PpdProviderImpl : public PpdProvider { ...@@ -1734,7 +1734,7 @@ class PpdProviderImpl : public PpdProvider {
// BrowserContext::GetApplicationLocale(); // BrowserContext::GetApplicationLocale();
const std::string browser_locale_; const std::string browser_locale_;
network::mojom::URLLoaderFactory* loader_factory_; LoaderFactoryGetter loader_factory_getter_;
// For file:// fetches, a staging buffer and result flag for loading the file. // For file:// fetches, a staging buffer and result flag for loading the file.
std::string file_fetch_contents_; std::string file_fetch_contents_;
...@@ -1780,11 +1780,12 @@ PrinterSearchData::~PrinterSearchData() = default; ...@@ -1780,11 +1780,12 @@ PrinterSearchData::~PrinterSearchData() = default;
// static // static
scoped_refptr<PpdProvider> PpdProvider::Create( scoped_refptr<PpdProvider> PpdProvider::Create(
const std::string& browser_locale, const std::string& browser_locale,
network::mojom::URLLoaderFactory* loader_factory, LoaderFactoryGetter loader_factory_getter,
scoped_refptr<PpdCache> ppd_cache, scoped_refptr<PpdCache> ppd_cache,
const base::Version& current_version, const base::Version& current_version,
const PpdProvider::Options& options) { const PpdProvider::Options& options) {
return scoped_refptr<PpdProvider>(new PpdProviderImpl( return scoped_refptr<PpdProvider>(
browser_locale, loader_factory, ppd_cache, current_version, options)); new PpdProviderImpl(browser_locale, loader_factory_getter, ppd_cache,
current_version, options));
} }
} // namespace chromeos } // namespace chromeos
...@@ -176,11 +176,16 @@ class CHROMEOS_EXPORT PpdProvider : public base::RefCounted<PpdProvider> { ...@@ -176,11 +176,16 @@ class CHROMEOS_EXPORT PpdProvider : public base::RefCounted<PpdProvider> {
const std::string& manufacturer, const std::string& manufacturer,
const std::string& model)>; const std::string& model)>;
// Called to get the current URLLoaderFactory on demand. Needs to be
// Repeating since it gets called once per fetch.
using LoaderFactoryGetter =
base::RepeatingCallback<network::mojom::URLLoaderFactory*()>;
// Create and return a new PpdProvider with the given cache and options. // Create and return a new PpdProvider with the given cache and options.
// A references to |url_context_getter| is taken. // A references to |url_context_getter| is taken.
static scoped_refptr<PpdProvider> Create( static scoped_refptr<PpdProvider> Create(
const std::string& browser_locale, const std::string& browser_locale,
network::mojom::URLLoaderFactory* loader_factory, LoaderFactoryGetter loader_factory_getter,
scoped_refptr<PpdCache> cache, scoped_refptr<PpdCache> cache,
const base::Version& current_version, const base::Version& current_version,
const Options& options = Options()); const Options& options = Options());
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "base/run_loop.h" #include "base/run_loop.h"
#include "base/single_thread_task_runner.h" #include "base/single_thread_task_runner.h"
#include "base/strings/stringprintf.h" #include "base/strings/stringprintf.h"
#include "base/test/bind_test_util.h"
#include "base/test/task_environment.h" #include "base/test/task_environment.h"
#include "base/test/test_message_loop.h" #include "base/test/test_message_loop.h"
#include "base/threading/sequenced_task_runner_handle.h" #include "base/threading/sequenced_task_runner_handle.h"
...@@ -94,8 +95,15 @@ class PpdProviderTest : public ::testing::Test { ...@@ -94,8 +95,15 @@ class PpdProviderTest : public ::testing::Test {
} else { } else {
ppd_cache_ = PpdCache::Create(ppd_cache_temp_dir_.GetPath()); ppd_cache_ = PpdCache::Create(ppd_cache_temp_dir_.GetPath());
} }
return PpdProvider::Create(locale, &loader_factory_, ppd_cache_, return PpdProvider::Create(
base::Version("40.8.6753.09"), provider_options); locale, base::BindLambdaForTesting([this]() {
// Casting here is necessary b/c RepeatingCallback needs help
// coercing types.
// Casting is safe since its a guaranteed upcast.
return dynamic_cast<network::mojom::URLLoaderFactory*>(
&loader_factory_);
}),
ppd_cache_, base::Version("40.8.6753.09"), provider_options);
} }
// Fill loader_factory_ with preset contents for test URLs // Fill loader_factory_ with preset contents for test URLs
......
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