Commit 294ef5f8 authored by Devlin Cronin's avatar Devlin Cronin Committed by Commit Bot

[Extensions] Only localize script files if necessary

Short-circuit our localization logic to only attempt to localize a file
if it may be required.

Bug: None
Change-Id: I0b418dbad004a6cc890ae02713f9ebeeed9c92fb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2518199Reviewed-by: default avatarKaran Bhatia <karandeepb@chromium.org>
Commit-Queue: Devlin <rdevlin.cronin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#825725}
parent 09e8afac
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "base/task/task_traits.h" #include "base/task/task_traits.h"
#include "base/task/thread_pool.h" #include "base/task/thread_pool.h"
#include "base/threading/scoped_blocking_call.h" #include "base/threading/scoped_blocking_call.h"
#include "base/threading/thread_task_runner_handle.h"
#include "extensions/browser/component_extension_resource_manager.h" #include "extensions/browser/component_extension_resource_manager.h"
#include "extensions/browser/extensions_browser_client.h" #include "extensions/browser/extensions_browser_client.h"
#include "extensions/browser/file_reader.h" #include "extensions/browser/file_reader.h"
...@@ -29,22 +30,14 @@ void MaybeLocalizeInBackground( ...@@ -29,22 +30,14 @@ void MaybeLocalizeInBackground(
const base::FilePath& extension_path, const base::FilePath& extension_path,
const std::string& extension_default_locale, const std::string& extension_default_locale,
extension_l10n_util::GzippedMessagesPermission gzip_permission, extension_l10n_util::GzippedMessagesPermission gzip_permission,
bool localize_file,
std::string* data) { std::string* data) {
// TODO(karandeepb): Limit scope of ScopedBlockingCall.
base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
base::BlockingType::MAY_BLOCK);
// TODO(devlin): Don't call the localization function if no localization is
// potentially required.
if (!localize_file)
return;
bool needs_message_substituion = bool needs_message_substituion =
data->find(extensions::MessageBundle::kMessageBegin) != std::string::npos; data->find(extensions::MessageBundle::kMessageBegin) != std::string::npos;
if (!needs_message_substituion) if (!needs_message_substituion)
return; return;
base::ScopedBlockingCall scoped_blocking_call(FROM_HERE,
base::BlockingType::MAY_BLOCK);
std::unique_ptr<MessageBundle::SubstitutionMap> localization_messages( std::unique_ptr<MessageBundle::SubstitutionMap> localization_messages(
file_util::LoadMessageBundleSubstitutionMap(extension_path, extension_id, file_util::LoadMessageBundleSubstitutionMap(extension_path, extension_id,
extension_default_locale, extension_default_locale,
...@@ -62,11 +55,10 @@ std::unique_ptr<std::string> LocalizeComponentResourceInBackground( ...@@ -62,11 +55,10 @@ std::unique_ptr<std::string> LocalizeComponentResourceInBackground(
const ExtensionId& extension_id, const ExtensionId& extension_id,
const base::FilePath& extension_path, const base::FilePath& extension_path,
const std::string& extension_default_locale, const std::string& extension_default_locale,
extension_l10n_util::GzippedMessagesPermission gzip_permission, extension_l10n_util::GzippedMessagesPermission gzip_permission) {
bool localize_file) {
MaybeLocalizeInBackground(extension_id, extension_path, MaybeLocalizeInBackground(extension_id, extension_path,
extension_default_locale, gzip_permission, extension_default_locale, gzip_permission,
localize_file, data.get()); data.get());
return data; return data;
} }
...@@ -100,20 +92,30 @@ void LoadAndLocalizeResource(const Extension& extension, ...@@ -100,20 +92,30 @@ void LoadAndLocalizeResource(const Extension& extension,
ui::ResourceBundle::GetSharedInstance().LoadDataResourceString( ui::ResourceBundle::GetSharedInstance().LoadDataResourceString(
resource_id)); resource_id));
base::ThreadPool::PostTaskAndReplyWithResult( // We assume this call always succeeds.
FROM_HERE, constexpr bool kSuccess = true;
{base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, if (!localize_file) {
base::BindOnce(&LocalizeComponentResourceInBackground, std::move(data), // Even if no localization is necessary, we post the task asynchronously
extension.id(), extension.path(), // so that |callback| is not run re-entrantly.
extension_default_locale, gzip_permission, base::ThreadTaskRunnerHandle::Get()->PostTask(
localize_file), FROM_HERE,
base::BindOnce(std::move(callback), base::BindOnce(std::move(callback), kSuccess, std::move(data)));
true /* We assume this call always succeeds */)); } else {
base::ThreadPool::PostTaskAndReplyWithResult(
FROM_HERE,
{base::MayBlock(), base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN},
base::BindOnce(&LocalizeComponentResourceInBackground,
std::move(data), extension.id(), extension.path(),
extension_default_locale, gzip_permission),
base::BindOnce(std::move(callback), kSuccess));
}
} else { } else {
FileReader::OptionalFileSequenceTask get_file_and_l10n_callback = FileReader::OptionalFileSequenceTask get_file_and_l10n_callback;
base::BindOnce(&MaybeLocalizeInBackground, extension.id(), if (localize_file) {
extension.path(), extension_default_locale, get_file_and_l10n_callback = base::BindOnce(
gzip_permission, localize_file); &MaybeLocalizeInBackground, extension.id(), extension.path(),
extension_default_locale, gzip_permission);
}
auto file_reader = base::MakeRefCounted<FileReader>( auto file_reader = base::MakeRefCounted<FileReader>(
resource, std::move(get_file_and_l10n_callback), std::move(callback)); resource, std::move(get_file_and_l10n_callback), std::move(callback));
......
...@@ -24,7 +24,8 @@ using LoadAndLocalizeResourceCallback = ...@@ -24,7 +24,8 @@ using LoadAndLocalizeResourceCallback =
// Loads |resource| from |extension|, optionally localizing the content, and // Loads |resource| from |extension|, optionally localizing the content, and
// invokes |callback| with the result. Handles both component and non-component // invokes |callback| with the result. Handles both component and non-component
// extension resources. |resource| must be valid. // extension resources. |resource| must be valid. Note: |callback| is always
// invoked asynchronously.
void LoadAndLocalizeResource(const Extension& extension, void LoadAndLocalizeResource(const Extension& extension,
const ExtensionResource& resource, const ExtensionResource& resource,
bool localize_file, bool localize_file,
......
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