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); |