Chromium Code Reviews| Index: chrome/browser/renderer_host/chrome_extension_message_filter.cc |
| diff --git a/chrome/browser/renderer_host/chrome_extension_message_filter.cc b/chrome/browser/renderer_host/chrome_extension_message_filter.cc |
| index 85891b1d32db5d30812f3d1b1c4933fd5278438d..bab8a6c72a7d99bc9a4d950d05adb5849bfe7a33 100644 |
| --- a/chrome/browser/renderer_host/chrome_extension_message_filter.cc |
| +++ b/chrome/browser/renderer_host/chrome_extension_message_filter.cc |
| @@ -28,8 +28,10 @@ |
| #include "extensions/browser/extension_system.h" |
| #include "extensions/common/api/messaging/message.h" |
| #include "extensions/common/extension_messages.h" |
| +#include "extensions/common/extension_set.h" |
| #include "extensions/common/file_util.h" |
| #include "extensions/common/manifest_handlers/default_locale_handler.h" |
| +#include "extensions/common/manifest_handlers/shared_module_info.h" |
| #include "extensions/common/message_bundle.h" |
| using content::BrowserThread; |
| @@ -199,24 +201,54 @@ void ChromeExtensionMessageFilter::OnPostMessage( |
| void ChromeExtensionMessageFilter::OnGetExtMessageBundle( |
| const std::string& extension_id, IPC::Message* reply_msg) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| + |
| + const extensions::ExtensionSet& extension_set = |
| + extension_info_map_->extensions(); |
| + const extensions::Extension* extension = extension_set.GetByID(extension_id); |
| + |
| + if (!extension) { // The extension has gone. |
| + ExtensionHostMsg_GetMessageBundle::WriteReplyParams( |
| + reply_msg, extensions::MessageBundle::SubstitutionMap()); |
| + Send(reply_msg); |
| + return; |
| + } |
| + |
| + std::vector<base::FilePath> paths_to_load; |
| + paths_to_load.push_back(extension->path()); |
| + |
| + auto imports = extensions::SharedModuleInfo::GetImports(extension); |
| + // Iterate through the imports in reverse. This will allow later imported |
| + // modules to override earlier imported modules, as the list order is |
| + // maintained from the definition in manifest.json of the imports. |
| + for (auto it = imports.rbegin(); it != imports.rend(); ++it) { |
| + const extensions::Extension* imported_extension = |
| + extension_set.GetByID(it->extension_id); |
| + if (!imported_extension) { |
| + NOTREACHED() << "Missing shared module " << it->extension_id; |
| + continue; |
| + } |
| + paths_to_load.push_back(imported_extension->path()); |
| + } |
| + |
| BrowserThread::PostBlockingPoolTask( |
| FROM_HERE, |
| base::Bind( |
| &ChromeExtensionMessageFilter::OnGetExtMessageBundleOnBlockingPool, |
| - this, extension_id, reply_msg)); |
| + this, paths_to_load, extension_id, |
| + extensions::LocaleInfo::GetDefaultLocale(extension), reply_msg)); |
|
Devlin
2017/02/14 17:45:49
If the extension isn't localized, we only return t
atuchin
2017/02/15 08:17:29
Done, take a look.
I thought about that before. It
|
| } |
| void ChromeExtensionMessageFilter::OnGetExtMessageBundleOnBlockingPool( |
| - const std::string& extension_id, |
| + const std::vector<base::FilePath>& extension_paths, |
| + const std::string& main_extension_id, |
| + const std::string& default_locale, |
| IPC::Message* reply_msg) { |
| DCHECK(BrowserThread::GetBlockingPool()->RunsTasksOnCurrentThread()); |
| - const extensions::ExtensionSet& extension_set = |
| - extension_info_map_->extensions(); |
| - |
| std::unique_ptr<extensions::MessageBundle::SubstitutionMap> dictionary_map( |
| - extensions::file_util::LoadMessageBundleSubstitutionMapWithImports( |
| - extension_id, extension_set)); |
| + extensions::file_util::LoadMessageBundleSubstitutionMapFromPaths( |
| + extension_paths, main_extension_id, default_locale)); |
| ExtensionHostMsg_GetMessageBundle::WriteReplyParams(reply_msg, |
| *dictionary_map); |