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..06a7ff6af81354cbf87a8159be4dc0f69de3cf5d 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,67 @@ 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()); |
| + } |
| + |
| + const std::string default_locale = |
|
Devlin
2017/02/16 16:20:56
nit: const std::string&
atuchin
2017/02/17 06:22:02
Done.
|
| + extensions::LocaleInfo::GetDefaultLocale(extension); |
| + if (default_locale.empty()) { |
| + // A little optimization: send the answer here to avoid an extra thread |
| + // hope. |
|
Devlin
2017/02/16 16:20:56
typo: s/hope/hop.
atuchin
2017/02/17 06:22:02
Done.
|
| + std::unique_ptr<extensions::MessageBundle::SubstitutionMap> dictionary_map( |
| + extensions::file_util::LoadNonLocalizedMessageBundleSubstitutionMap( |
| + extension_id)); |
| + ExtensionHostMsg_GetMessageBundle::WriteReplyParams(reply_msg, |
| + *dictionary_map); |
| + Send(reply_msg); |
| + return; |
| + } |
| + |
| BrowserThread::PostBlockingPoolTask( |
| FROM_HERE, |
| base::Bind( |
| &ChromeExtensionMessageFilter::OnGetExtMessageBundleOnBlockingPool, |
| - this, extension_id, reply_msg)); |
| + this, paths_to_load, extension_id, default_locale, reply_msg)); |
| } |
| 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); |