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

Unified Diff: extensions/renderer/user_script_injector.cc

Issue 2213603002: Prevent duplicate content script injection defined in manifest.json (reland) (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed patch 8 code review comments Created 4 years, 3 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: extensions/renderer/user_script_injector.cc
diff --git a/extensions/renderer/user_script_injector.cc b/extensions/renderer/user_script_injector.cc
index 8ae1c164cb64e2e8b8f3d268065b2871dd103e72..cbad89ae67de8531a40620b8541aa6489df357c7 100644
--- a/extensions/renderer/user_script_injector.cc
+++ b/extensions/renderer/user_script_injector.cc
@@ -85,6 +85,17 @@ blink::WebScriptSource GreasemonkeyApiJsString::GetSource() const {
base::LazyInstance<GreasemonkeyApiJsString> g_greasemonkey_api =
LAZY_INSTANCE_INITIALIZER;
+bool ShouldInjectScripts(const UserScript::FileList& scripts,
+ std::set<std::string>* injected_files) {
Devlin 2016/09/07 18:22:40 nit: const & for injected files
catmullings 2016/09/07 18:56:31 Done.
+ for (const std::unique_ptr<UserScript::File>& file : scripts) {
+ // Check if the script is already injected.
+ if ((*injected_files).count(file->url().path()) == 0) {
+ return true;
+ }
+ }
+ return false;
+}
+
} // namespace
UserScriptInjector::UserScriptInjector(const UserScript* script,
@@ -139,15 +150,19 @@ bool UserScriptInjector::ExpectsResults() const {
}
bool UserScriptInjector::ShouldInjectJs(
- UserScript::RunLocation run_location) const {
+ UserScript::RunLocation run_location,
+ std::set<std::string>* executing_scripts) const {
return script_ && script_->run_location() == run_location &&
- !script_->js_scripts().empty();
+ !script_->js_scripts().empty() &&
+ ShouldInjectScripts(script_->js_scripts(), executing_scripts);
}
bool UserScriptInjector::ShouldInjectCss(
- UserScript::RunLocation run_location) const {
+ UserScript::RunLocation run_location,
+ std::set<std::string>* injected_stylesheets) const {
return script_ && run_location == UserScript::DOCUMENT_START &&
- !script_->css_scripts().empty();
+ !script_->css_scripts().empty() &&
+ ShouldInjectScripts(script_->css_scripts(), injected_stylesheets);
}
PermissionsData::AccessType UserScriptInjector::CanExecuteOnFrame(
@@ -198,16 +213,21 @@ PermissionsData::AccessType UserScriptInjector::CanExecuteOnFrame(
}
std::vector<blink::WebScriptSource> UserScriptInjector::GetJsSources(
- UserScript::RunLocation run_location) const {
+ UserScript::RunLocation run_location,
+ std::set<std::string>* executing_scripts,
+ size_t* num_injected_js_scripts) const {
+ DCHECK(script_);
std::vector<blink::WebScriptSource> sources;
- if (!script_)
- return sources;
DCHECK_EQ(script_->run_location(), run_location);
const UserScript::FileList& js_scripts = script_->js_scripts();
sources.reserve(js_scripts.size());
for (const std::unique_ptr<UserScript::File>& file : js_scripts) {
+ const GURL& script_url = file->url();
+ // Check if the script is already injected.
+ if ((*executing_scripts).count(script_url.path()) != 0)
+ continue;
base::StringPiece script_content = file->GetContent();
blink::WebString source;
if (script_->emulate_greasemonkey()) {
@@ -228,9 +248,10 @@ std::vector<blink::WebScriptSource> UserScriptInjector::GetJsSources(
source = blink::WebString::fromUTF8(script_content.data(),
script_content.length());
}
- sources.push_back(blink::WebScriptSource(source, file->url()));
+ sources.push_back(blink::WebScriptSource(source, script_url));
+ (*num_injected_js_scripts) += 1;
+ (*executing_scripts).insert(script_url.path());
}
-
// Emulate Greasemonkey API for scripts that were converted to extension
// user scripts.
if (script_->emulate_greasemonkey())
@@ -240,45 +261,34 @@ std::vector<blink::WebScriptSource> UserScriptInjector::GetJsSources(
}
std::vector<blink::WebString> UserScriptInjector::GetCssSources(
- UserScript::RunLocation run_location) const {
+ UserScript::RunLocation run_location,
+ std::set<std::string>* injected_stylesheets,
+ size_t* num_injected_stylesheets) const {
+ DCHECK(script_);
DCHECK_EQ(UserScript::DOCUMENT_START, run_location);
std::vector<blink::WebString> sources;
- if (!script_)
- return sources;
const UserScript::FileList& css_scripts = script_->css_scripts();
sources.reserve(css_scripts.size());
for (const std::unique_ptr<UserScript::File>& file : script_->css_scripts()) {
+ const std::string stylesheet_path = file->url().path();
Devlin 2016/09/07 18:22:40 nit: no need to copy here, so const std::string&
catmullings 2016/09/07 18:56:31 Done.
catmullings 2016/09/07 18:56:31 Yup, didn't mean to drop the &.
+ // Check if the stylesheet is already injected.
+ if ((*injected_stylesheets).count(stylesheet_path) != 0)
+ continue;
+
// TODO(lazyboy): |css_content| string is copied into blink::WebString for
// every frame in the current renderer process. Avoid the copy, possibly by
// only performing the copy once.
base::StringPiece css_content = file->GetContent();
sources.push_back(
blink::WebString::fromUTF8(css_content.data(), css_content.length()));
+ (*num_injected_stylesheets) += 1;
+ (*injected_stylesheets).insert(stylesheet_path);
}
return sources;
}
-void UserScriptInjector::GetRunInfo(
- ScriptsRunInfo* scripts_run_info,
- UserScript::RunLocation run_location) const {
- if (!script_)
- return;
-
- if (ShouldInjectJs(run_location)) {
- const UserScript::FileList& js_scripts = script_->js_scripts();
- scripts_run_info->num_js += js_scripts.size();
- for (const std::unique_ptr<UserScript::File>& iter : js_scripts) {
- scripts_run_info->executing_scripts[host_id_.id()].insert(
- iter->url().path());
- }
- }
-
- if (ShouldInjectCss(run_location))
- scripts_run_info->num_css += script_->css_scripts().size();
-}
-
void UserScriptInjector::OnInjectionComplete(
std::unique_ptr<base::Value> execution_result,
UserScript::RunLocation run_location,
« extensions/renderer/script_injector.h ('K') | « extensions/renderer/user_script_injector.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698