Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(268)

Unified Diff: chrome/browser/extensions/user_script_master.cc

Issue 7552028: Injected CSS localization fix (see bug no.) (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Cleaned up old unused function. Created 9 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/user_script_master.cc
diff --git a/chrome/browser/extensions/user_script_master.cc b/chrome/browser/extensions/user_script_master.cc
index 5e680980cd7cb94e6b3a4356884540f9d6bda263..6c74d7a81c61b03de60da505887f56ed7aa03d6b 100644
--- a/chrome/browser/extensions/user_script_master.cc
+++ b/chrome/browser/extensions/user_script_master.cc
@@ -4,6 +4,7 @@
#include "chrome/browser/extensions/user_script_master.h"
+#include <map>
#include <string>
#include <vector>
@@ -18,8 +19,10 @@
#include "chrome/browser/profiles/profile.h"
#include "chrome/common/chrome_notification_types.h"
#include "chrome/common/extensions/extension.h"
-#include "chrome/common/extensions/extension_messages.h"
+#include "chrome/common/extensions/extension_file_util.h"
+#include "chrome/common/extensions/extension_message_bundle.h"
#include "chrome/common/extensions/extension_resource.h"
+#include "chrome/common/extensions/extension_set.h"
#include "content/browser/renderer_host/render_process_host.h"
#include "content/common/notification_service.h"
@@ -137,10 +140,13 @@ bool UserScriptMaster::ScriptReloader::ParseMetadataHeader(
}
void UserScriptMaster::ScriptReloader::StartLoad(
- const UserScriptList& user_scripts) {
+ const UserScriptList& user_scripts,
+ const ExtensionsInfo& extensions_info_) {
// Add a reference to ourselves to keep ourselves alive while we're running.
// Balanced by NotifyMaster().
AddRef();
+
+ this->extensions_info_ = extensions_info_;
BrowserThread::PostTask(
BrowserThread::FILE, FROM_HERE,
NewRunnableMethod(
@@ -160,7 +166,8 @@ void UserScriptMaster::ScriptReloader::NotifyMaster(
Release();
}
-static bool LoadScriptContent(UserScript::File* script_file) {
+static bool LoadScriptContent(UserScript::File* script_file,
+ const SubstitutionMap* localization_messages) {
std::string content;
const FilePath& path = ExtensionResource::GetFilePath(
script_file->extension_root(), script_file->relative_path());
@@ -175,6 +182,16 @@ static bool LoadScriptContent(UserScript::File* script_file) {
return false;
}
+ // Localize the content.
+ if (localization_messages) {
+ std::string error;
+ ExtensionMessageBundle::ReplaceMessagesWithExternalDictionary(
+ *localization_messages, &content, &error);
+ if (!error.empty()) {
+ LOG(WARNING) << "Failed to replace messages in script: " << error;
+ }
+ }
+
// Remove BOM from the content.
std::string::size_type index = content.find(kUtf8ByteOrderMark);
if (index == 0) {
@@ -186,24 +203,37 @@ static bool LoadScriptContent(UserScript::File* script_file) {
return true;
}
-// static
void UserScriptMaster::ScriptReloader::LoadUserScripts(
UserScriptList* user_scripts) {
for (size_t i = 0; i < user_scripts->size(); ++i) {
UserScript& script = user_scripts->at(i);
+ scoped_ptr<SubstitutionMap> localization_messages(
+ GetLocalizationMessages(script.extension_id()));
for (size_t k = 0; k < script.js_scripts().size(); ++k) {
UserScript::File& script_file = script.js_scripts()[k];
if (script_file.GetContent().empty())
- LoadScriptContent(&script_file);
+ LoadScriptContent(&script_file, NULL);
}
for (size_t k = 0; k < script.css_scripts().size(); ++k) {
UserScript::File& script_file = script.css_scripts()[k];
if (script_file.GetContent().empty())
- LoadScriptContent(&script_file);
+ LoadScriptContent(&script_file, localization_messages.get());
}
}
}
+SubstitutionMap* UserScriptMaster::ScriptReloader::GetLocalizationMessages(
+ std::string extension_id) {
+ if (extensions_info_.find(extension_id) == extensions_info_.end()) {
+ return NULL;
+ }
+
+ return extension_file_util::LoadExtensionMessageBundleSubstitutionMap(
+ extensions_info_[extension_id].first,
+ extension_id,
+ extensions_info_[extension_id].second);
+}
+
// Pickle user scripts and return pointer to the shared memory.
static base::SharedMemory* Serialize(const UserScriptList& scripts) {
Pickle pickle;
@@ -238,14 +268,14 @@ static base::SharedMemory* Serialize(const UserScriptList& scripts) {
return shared_memory.release();
}
-// This method will be called from the file thread
+// This method will be called on the file thread.
void UserScriptMaster::ScriptReloader::RunLoad(
const UserScriptList& user_scripts) {
LoadUserScripts(const_cast<UserScriptList*>(&user_scripts));
// Scripts now contains list of up-to-date scripts. Load the content in the
// shared memory and let the master know it's ready. We need to post the task
- // back even if no scripts ware found to balance the AddRef/Release calls
+ // back even if no scripts ware found to balance the AddRef/Release calls.
BrowserThread::PostTask(
master_thread_id_, FROM_HERE,
NewRunnableMethod(
@@ -311,6 +341,9 @@ void UserScriptMaster::Observe(int type,
case chrome::NOTIFICATION_EXTENSION_LOADED: {
// Add any content scripts inside the extension.
const Extension* extension = Details<const Extension>(details).ptr();
+ extensions_info_[extension->id()] =
+ ExtensionSet::ExtensionPathAndDefaultLocale(
+ extension->path(), extension->default_locale());
bool incognito_enabled = profile_->GetExtensionService()->
IsIncognitoEnabled(extension->id());
const UserScriptList& scripts = extension->content_scripts();
@@ -327,6 +360,7 @@ void UserScriptMaster::Observe(int type,
// Remove any content scripts.
const Extension* extension =
Details<UnloadedExtensionInfo>(details)->extension;
+ extensions_info_.erase(extension->id());
UserScriptList new_user_scripts;
for (UserScriptList::iterator iter = user_scripts_.begin();
iter != user_scripts_.end(); ++iter) {
@@ -364,7 +398,7 @@ void UserScriptMaster::StartLoad() {
if (!script_reloader_)
script_reloader_ = new ScriptReloader(this);
- script_reloader_->StartLoad(user_scripts_);
+ script_reloader_->StartLoad(user_scripts_, extensions_info_);
}
void UserScriptMaster::SendUpdate(RenderProcessHost* process,
« no previous file with comments | « chrome/browser/extensions/user_script_master.h ('k') | chrome/browser/extensions/user_script_master_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698