Index: extensions/browser/user_script_loader.cc |
diff --git a/extensions/browser/user_script_loader.cc b/extensions/browser/user_script_loader.cc |
index 80d464089dcfc751314c0f1427981f0349c81b1a..94b2c070a34d52e08dcd5067027c2ed4c994fe64 100644 |
--- a/extensions/browser/user_script_loader.cc |
+++ b/extensions/browser/user_script_loader.cc |
@@ -7,21 +7,15 @@ |
#include <set> |
#include <string> |
-#include "base/bind.h" |
-#include "base/bind_helpers.h" |
-#include "base/files/file_path.h" |
-#include "base/files/file_util.h" |
#include "base/version.h" |
#include "content/public/browser/browser_context.h" |
#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/notification_service.h" |
#include "content/public/browser/notification_types.h" |
#include "content/public/browser/render_process_host.h" |
-#include "extensions/browser/content_verifier.h" |
#include "extensions/browser/extensions_browser_client.h" |
#include "extensions/browser/notification_types.h" |
#include "extensions/common/extension_messages.h" |
-#include "extensions/common/file_util.h" |
using content::BrowserThread; |
using content::BrowserContext; |
@@ -30,111 +24,6 @@ namespace extensions { |
namespace { |
-using LoadScriptsCallback = |
- base::Callback<void(scoped_ptr<UserScriptList>, |
- scoped_ptr<base::SharedMemory>)>; |
- |
-UserScriptLoader::SubstitutionMap* GetLocalizationMessages( |
- const UserScriptLoader::HostsInfo& hosts_info, |
- const HostID& host_id) { |
- UserScriptLoader::HostsInfo::const_iterator iter = hosts_info.find(host_id); |
- if (iter == hosts_info.end()) |
- return nullptr; |
- return file_util::LoadMessageBundleSubstitutionMap( |
- iter->second.first, host_id.id(), iter->second.second); |
-} |
- |
-void LoadUserScripts( |
- UserScriptList* user_scripts, |
- const UserScriptLoader::HostsInfo& hosts_info, |
- const std::set<int>& added_script_ids, |
- const scoped_refptr<ContentVerifier>& verifier, |
- UserScriptLoader::LoadUserScriptsContentFunction callback) { |
- for (UserScriptList::iterator script = user_scripts->begin(); |
- script != user_scripts->end(); |
- ++script) { |
- if (added_script_ids.count(script->id()) == 0) |
- continue; |
- scoped_ptr<UserScriptLoader::SubstitutionMap> localization_messages( |
- GetLocalizationMessages(hosts_info, script->host_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()) |
- callback.Run(script->host_id(), &script_file, NULL, verifier); |
- } |
- for (size_t k = 0; k < script->css_scripts().size(); ++k) { |
- UserScript::File& script_file = script->css_scripts()[k]; |
- if (script_file.GetContent().empty()) |
- callback.Run(script->host_id(), &script_file, |
- localization_messages.get(), verifier); |
- } |
- } |
-} |
- |
-// Pickle user scripts and return pointer to the shared memory. |
-scoped_ptr<base::SharedMemory> Serialize(const UserScriptList& scripts) { |
- Pickle pickle; |
- pickle.WriteSizeT(scripts.size()); |
- for (UserScriptList::const_iterator script = scripts.begin(); |
- script != scripts.end(); |
- ++script) { |
- // TODO(aa): This can be replaced by sending content script metadata to |
- // renderers along with other extension data in ExtensionMsg_Loaded. |
- // See crbug.com/70516. |
- script->Pickle(&pickle); |
- // Write scripts as 'data' so that we can read it out in the slave without |
- // allocating a new string. |
- for (size_t j = 0; j < script->js_scripts().size(); j++) { |
- base::StringPiece contents = script->js_scripts()[j].GetContent(); |
- pickle.WriteData(contents.data(), contents.length()); |
- } |
- for (size_t j = 0; j < script->css_scripts().size(); j++) { |
- base::StringPiece contents = script->css_scripts()[j].GetContent(); |
- pickle.WriteData(contents.data(), contents.length()); |
- } |
- } |
- |
- // Create the shared memory object. |
- base::SharedMemory shared_memory; |
- |
- base::SharedMemoryCreateOptions options; |
- options.size = pickle.size(); |
- options.share_read_only = true; |
- if (!shared_memory.Create(options)) |
- return scoped_ptr<base::SharedMemory>(); |
- |
- if (!shared_memory.Map(pickle.size())) |
- return scoped_ptr<base::SharedMemory>(); |
- |
- // Copy the pickle to shared memory. |
- memcpy(shared_memory.memory(), pickle.data(), pickle.size()); |
- |
- base::SharedMemoryHandle readonly_handle; |
- if (!shared_memory.ShareReadOnlyToProcess(base::GetCurrentProcessHandle(), |
- &readonly_handle)) |
- return scoped_ptr<base::SharedMemory>(); |
- |
- return make_scoped_ptr(new base::SharedMemory(readonly_handle, |
- /*read_only=*/true)); |
-} |
- |
-void LoadScriptsOnFileThread( |
- scoped_ptr<UserScriptList> user_scripts, |
- const UserScriptLoader::HostsInfo& hosts_info, |
- const std::set<int>& added_script_ids, |
- const scoped_refptr<ContentVerifier>& verifier, |
- UserScriptLoader::LoadUserScriptsContentFunction function, |
- LoadScriptsCallback callback) { |
- DCHECK(user_scripts.get()); |
- LoadUserScripts(user_scripts.get(), hosts_info, added_script_ids, |
- verifier, function); |
- scoped_ptr<base::SharedMemory> memory = Serialize(*user_scripts); |
- BrowserThread::PostTask( |
- BrowserThread::UI, |
- FROM_HERE, |
- base::Bind(callback, base::Passed(&user_scripts), base::Passed(&memory))); |
-} |
- |
// Helper function to parse greasesmonkey headers |
bool GetDeclarationValue(const base::StringPiece& line, |
const base::StringPiece& prefix, |
@@ -250,30 +139,14 @@ bool UserScriptLoader::ParseMetadataHeader(const base::StringPiece& script_text, |
return true; |
} |
-void UserScriptLoader::LoadScriptsForTest(UserScriptList* user_scripts) { |
- HostsInfo info; |
- std::set<int> added_script_ids; |
- for (UserScriptList::iterator it = user_scripts->begin(); |
- it != user_scripts->end(); |
- ++it) { |
- added_script_ids.insert(it->id()); |
- } |
- LoadUserScripts(user_scripts, info, added_script_ids, |
- NULL /* no verifier for testing */, |
- GetLoadUserScriptsFunction()); |
-} |
- |
-UserScriptLoader::UserScriptLoader( |
- BrowserContext* browser_context, |
- const HostID& host_id, |
- const scoped_refptr<ContentVerifier>& content_verifier) |
+UserScriptLoader::UserScriptLoader(BrowserContext* browser_context, |
+ const HostID& host_id) |
: user_scripts_(new UserScriptList()), |
clear_scripts_(false), |
ready_(false), |
pending_load_(false), |
browser_context_(browser_context), |
host_id_(host_id), |
- content_verifier_(content_verifier), |
weak_factory_(this) { |
registrar_.Add(this, |
content::NOTIFICATION_RENDERER_PROCESS_CREATED, |
@@ -293,6 +166,12 @@ void UserScriptLoader::AddScripts(const std::set<UserScript>& scripts) { |
AttemptLoad(); |
} |
+void UserScriptLoader::AddScripts(const std::set<UserScript>& scripts, |
+ int render_process_id, |
+ int render_view_id) { |
+ AddScripts(scripts); |
+} |
+ |
void UserScriptLoader::RemoveScripts(const std::set<UserScript>& scripts) { |
for (std::set<UserScript>::const_iterator it = scripts.begin(); |
it != scripts.end(); |
@@ -382,32 +261,60 @@ void UserScriptLoader::StartLoad() { |
for (const UserScript& script : changed_scripts) |
changed_hosts_.insert(script.host_id()); |
- // |changed_hosts_| before passing it to LoadScriptsOnFileThread. |
- UpdateHostsInfo(changed_hosts_); |
- |
- BrowserThread::PostTask( |
- BrowserThread::FILE, FROM_HERE, |
- base::Bind(&LoadScriptsOnFileThread, base::Passed(&user_scripts_), |
- hosts_info_, added_script_ids, content_verifier_, |
- GetLoadUserScriptsFunction(), |
- base::Bind(&UserScriptLoader::OnScriptsLoaded, |
- weak_factory_.GetWeakPtr()))); |
+ LoadScripts(user_scripts_.Pass(), changed_hosts_, added_script_ids, |
+ base::Bind(&UserScriptLoader::OnScriptsLoaded, |
+ weak_factory_.GetWeakPtr())); |
clear_scripts_ = false; |
added_scripts_.clear(); |
removed_scripts_.clear(); |
- user_scripts_.reset(NULL); |
+ user_scripts_.reset(); |
} |
-void UserScriptLoader::AddHostInfo(const HostID& host_id, |
- const PathAndDefaultLocale& location) { |
- if (hosts_info_.find(host_id) != hosts_info_.end()) |
- return; |
- hosts_info_[host_id] = location; |
-} |
+// static |
+scoped_ptr<base::SharedMemory> UserScriptLoader::Serialize( |
+ const UserScriptList& scripts) { |
+ Pickle pickle; |
+ pickle.WriteSizeT(scripts.size()); |
+ for (const UserScript& script : scripts) { |
+ // TODO(aa): This can be replaced by sending content script metadata to |
+ // renderers along with other extension data in ExtensionMsg_Loaded. |
+ // See crbug.com/70516. |
+ script.Pickle(&pickle); |
+ // Write scripts as 'data' so that we can read it out in the slave without |
+ // allocating a new string. |
+ for (const UserScript::File& script_file : script.js_scripts()) { |
+ base::StringPiece contents = script_file.GetContent(); |
+ pickle.WriteData(contents.data(), contents.length()); |
+ } |
+ for (const UserScript::File& script_file : script.css_scripts()) { |
+ base::StringPiece contents = script_file.GetContent(); |
+ pickle.WriteData(contents.data(), contents.length()); |
+ } |
+ } |
+ |
+ // Create the shared memory object. |
+ base::SharedMemory shared_memory; |
+ |
+ base::SharedMemoryCreateOptions options; |
+ options.size = pickle.size(); |
+ options.share_read_only = true; |
+ if (!shared_memory.Create(options)) |
+ return scoped_ptr<base::SharedMemory>(); |
-void UserScriptLoader::RemoveHostInfo(const HostID& host_id) { |
- hosts_info_.erase(host_id); |
+ if (!shared_memory.Map(pickle.size())) |
+ return scoped_ptr<base::SharedMemory>(); |
+ |
+ // Copy the pickle to shared memory. |
+ memcpy(shared_memory.memory(), pickle.data(), pickle.size()); |
+ |
+ base::SharedMemoryHandle readonly_handle; |
+ if (!shared_memory.ShareReadOnlyToProcess(base::GetCurrentProcessHandle(), |
+ &readonly_handle)) |
+ return scoped_ptr<base::SharedMemory>(); |
+ |
+ return make_scoped_ptr(new base::SharedMemory(readonly_handle, |
+ /*read_only=*/true)); |
} |
void UserScriptLoader::SetReady(bool ready) { |