Index: extensions/renderer/user_script_injector.cc |
diff --git a/extensions/renderer/user_script_injector.cc b/extensions/renderer/user_script_injector.cc |
index da0c760e54425c7c329438150ed892501b18c6d5..5d6744022b559974bbb98bcbb1ec2ee17b6ad2c4 100644 |
--- a/extensions/renderer/user_script_injector.cc |
+++ b/extensions/renderer/user_script_injector.cc |
@@ -137,16 +137,33 @@ bool UserScriptInjector::ExpectsResults() const { |
return false; |
} |
+bool UserScriptInjector::ShouldInjectScripts( |
+ const UserScript::FileList& scripts, |
+ const std::set<GURL>& injected_scripts) const { |
+ for (const std::unique_ptr<UserScript::File>& file : scripts) { |
+ const GURL& script_url = file->url(); |
+ // Check if the script is already injected. |
+ if (injected_scripts.count(script_url) == 0) { |
+ return true; |
+ } |
+ } |
+ return false; |
+} |
+ |
bool UserScriptInjector::ShouldInjectJs( |
- UserScript::RunLocation run_location) const { |
+ UserScript::RunLocation run_location, |
+ const std::set<GURL>& injected_scripts) const { |
return script_ && script_->run_location() == run_location && |
- !script_->js_scripts().empty(); |
+ !script_->js_scripts().empty() && |
+ ShouldInjectScripts(script_->js_scripts(), injected_scripts); |
} |
bool UserScriptInjector::ShouldInjectCss( |
- UserScript::RunLocation run_location) const { |
+ UserScript::RunLocation run_location, |
+ const std::set<GURL>& injected_scripts) const { |
return script_ && run_location == UserScript::DOCUMENT_START && |
- !script_->css_scripts().empty(); |
+ !script_->css_scripts().empty() && |
+ ShouldInjectScripts(script_->css_scripts(), injected_scripts); |
} |
PermissionsData::AccessType UserScriptInjector::CanExecuteOnFrame( |
@@ -197,16 +214,21 @@ PermissionsData::AccessType UserScriptInjector::CanExecuteOnFrame( |
} |
std::vector<blink::WebScriptSource> UserScriptInjector::GetJsSources( |
- UserScript::RunLocation run_location) const { |
+ UserScript::RunLocation run_location, |
+ ScriptsRunInfo* scripts_run_info) 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()); |
+ // 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 (scripts_run_info->injected_scripts.count(script_url) != 0) |
+ continue; |
+ |
base::StringPiece script_content = file->GetContent(); |
blink::WebString source; |
if (script_->emulate_greasemonkey()) { |
@@ -228,6 +250,8 @@ std::vector<blink::WebScriptSource> UserScriptInjector::GetJsSources( |
script_content.length()); |
} |
sources.push_back(blink::WebScriptSource(source, file->url())); |
+ |
+ scripts_run_info->injected_scripts.insert(script_url); |
} |
// Emulate Greasemonkey API for scripts that were converted to extension |
@@ -239,22 +263,29 @@ std::vector<blink::WebScriptSource> UserScriptInjector::GetJsSources( |
} |
std::vector<blink::WebString> UserScriptInjector::GetCssSources( |
- UserScript::RunLocation run_location) const { |
+ UserScript::RunLocation run_location, |
+ ScriptsRunInfo* scripts_run_info) 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()); |
+ // const UserScript::FileList& css_scripts = script_->css_scripts(); |
Devlin
2016/08/25 16:52:26
Why this change?
catmullings
2016/08/27 00:23:08
Not meant to be commented. I was debugging. Uncomm
catmullings
2016/08/27 00:23:08
Done.
|
+ // sources.reserve(css_scripts.size()); |
for (const std::unique_ptr<UserScript::File>& file : script_->css_scripts()) { |
+ const GURL& script_url = file->url(); |
+ // Check if the stylesheet is already injected. |
+ if (scripts_run_info->injected_scripts.count(script_url) != 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())); |
+ |
+ scripts_run_info->injected_scripts.insert(script_url); |
} |
return sources; |
} |
@@ -265,7 +296,7 @@ void UserScriptInjector::GetRunInfo( |
if (!script_) |
return; |
- if (ShouldInjectJs(run_location)) { |
+ if (ShouldInjectJs(run_location, scripts_run_info->injected_scripts)) { |
Devlin
2016/08/25 16:52:26
Something we didn't realize last time, but should
catmullings
2016/08/27 00:23:08
Done.
|
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) { |
@@ -274,7 +305,7 @@ void UserScriptInjector::GetRunInfo( |
} |
} |
- if (ShouldInjectCss(run_location)) |
+ if (ShouldInjectCss(run_location, scripts_run_info->injected_scripts)) |
scripts_run_info->num_css += script_->css_scripts().size(); |
} |