Chromium Code Reviews| 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(); |
| } |