| Index: extensions/browser/web_ui_user_script_loader.cc
|
| diff --git a/extensions/browser/web_ui_user_script_loader.cc b/extensions/browser/web_ui_user_script_loader.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..c6e5d04d6e9878cbc1c4eb66bba37d29cc83d905
|
| --- /dev/null
|
| +++ b/extensions/browser/web_ui_user_script_loader.cc
|
| @@ -0,0 +1,89 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "extensions/browser/web_ui_user_script_loader.h"
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/pickle.h"
|
| +#include "content/public/browser/browser_context.h"
|
| +#include "content/public/browser/browser_thread.h"
|
| +#include "extensions/browser/content_verifier.h"
|
| +
|
| +namespace {
|
| +using LoadScriptsCallback =
|
| + base::Callback<void(scoped_ptr<extensions::UserScriptList>,
|
| + scoped_ptr<base::SharedMemory>)>;
|
| +
|
| +void SerializeOnFileThread(scoped_ptr<extensions::UserScriptList> user_scripts,
|
| + LoadScriptsCallback callback) {
|
| + scoped_ptr<base::SharedMemory> memory =
|
| + extensions::UserScriptLoader::Serialize(*user_scripts);
|
| + content::BrowserThread::PostTask(
|
| + content::BrowserThread::UI, FROM_HERE,
|
| + base::Bind(callback, base::Passed(&user_scripts), base::Passed(&memory)));
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +WebUIUserScriptLoader::WebUIUserScriptLoader(
|
| + content::BrowserContext* browser_context,
|
| + const HostID& host_id)
|
| + : UserScriptLoader(browser_context, host_id), weak_factory_(this) {
|
| + SetReady(true);
|
| +}
|
| +
|
| +WebUIUserScriptLoader::~WebUIUserScriptLoader() {
|
| + fetcher_groups_.clear();
|
| +}
|
| +
|
| +void WebUIUserScriptLoader::LoadScripts(const std::set<HostID>& changed_hosts,
|
| + const std::set<int>& added_script_ids) {
|
| + ClearScripts(false);
|
| + scoped_ptr<extensions::UserScriptList> user_scripts(user_scripts_.Pass());
|
| + user_scripts_.reset(nullptr);
|
| +
|
| + std::set<extensions::UserScript::File*> file_set;
|
| + bool find_render_info = false;
|
| + UserScriptRenderInfo info;
|
| +
|
| + for (extensions::UserScriptList::iterator script = user_scripts->begin();
|
| + script != user_scripts->end(); ++script) {
|
| + if (added_script_ids.count(script->id()) == 0)
|
| + continue;
|
| +
|
| + if (!find_render_info)
|
| + find_render_info = GetScriptRenderInfo(script->id(), &info);
|
| +
|
| + for (size_t k = 0; k < script->js_scripts().size(); ++k) {
|
| + extensions::UserScript::File& script_file = script->js_scripts()[k];
|
| + if (script_file.GetContent().empty()) {
|
| + file_set.insert(&script_file);
|
| + }
|
| + }
|
| + for (size_t k = 0; k < script->css_scripts().size(); ++k) {
|
| + extensions::UserScript::File& script_file = script->css_scripts()[k];
|
| + if (script_file.GetContent().empty()) {
|
| + file_set.insert(&script_file);
|
| + }
|
| + }
|
| +
|
| + RemoveScriptRenderInfo(script->id());
|
| + }
|
| + scoped_refptr<WebUIURLFetcherGroup> fetcher_group(new WebUIURLFetcherGroup(
|
| + browser_context(),
|
| + base::Bind(&WebUIUserScriptLoader::OnWebUIURLFetchComplete,
|
| + weak_factory_.GetWeakPtr(), base::Passed(&user_scripts))));
|
| +
|
| + fetcher_group->Start(file_set, info.render_process_id, info.render_view_id);
|
| + fetcher_groups_.insert(fetcher_group.get());
|
| +}
|
| +
|
| +void WebUIUserScriptLoader::OnWebUIURLFetchComplete(
|
| + scoped_ptr<extensions::UserScriptList> user_scripts) {
|
| + content::BrowserThread::PostTask(
|
| + content::BrowserThread::FILE, FROM_HERE,
|
| + base::Bind(&SerializeOnFileThread, base::Passed(&user_scripts),
|
| + base::Bind(&WebUIUserScriptLoader::OnScriptsLoaded,
|
| + weak_factory_.GetWeakPtr())));
|
| +}
|
|
|