Index: extensions/renderer/script_injection.cc |
diff --git a/extensions/renderer/script_injection.cc b/extensions/renderer/script_injection.cc |
index 69cfc526c797f2cd7b9407495b34290765210d9e..2cf43366fd7896c0c36ac22a3313f1a0bb5eb63c 100644 |
--- a/extensions/renderer/script_injection.cc |
+++ b/extensions/renderer/script_injection.cc |
@@ -213,15 +213,22 @@ ScriptInjection::InjectionResult ScriptInjection::Inject( |
DCHECK(injection_host_); |
DCHECK(scripts_run_info); |
DCHECK(!complete_); |
- |
- bool should_inject_js = injector_->ShouldInjectJs(run_location_); |
- bool should_inject_css = injector_->ShouldInjectCss(run_location_); |
- DCHECK(should_inject_js || should_inject_css); |
+ bool should_inject_js = injector_->ShouldInjectJs( |
+ run_location_, scripts_run_info->injected_scripts); |
+ bool should_inject_css = injector_->ShouldInjectCss( |
+ run_location_, scripts_run_info->injected_scripts); |
+ |
+ // This can happen if the extension specified a script to |
+ // be run in multiple rules, and the script has already run. |
+ // See crbug.com/nnn. |
+ if (!should_inject_js && !should_inject_css) { |
+ return INJECTION_FINISHED; |
+ } |
if (should_inject_js) |
- InjectJs(); |
+ InjectJs(scripts_run_info); |
if (should_inject_css) |
- InjectCss(); |
+ InjectCss(scripts_run_info); |
complete_ = did_inject_js_ || !should_inject_js; |
@@ -237,11 +244,12 @@ ScriptInjection::InjectionResult ScriptInjection::Inject( |
return complete_ ? INJECTION_FINISHED : INJECTION_BLOCKED; |
} |
-void ScriptInjection::InjectJs() { |
+void ScriptInjection::InjectJs(ScriptsRunInfo* scripts_run_info) { |
DCHECK(!did_inject_js_); |
blink::WebLocalFrame* web_frame = render_frame_->GetWebFrame(); |
std::vector<blink::WebScriptSource> sources = |
- injector_->GetJsSources(run_location_); |
+ injector_->GetJsSources(run_location_, scripts_run_info); |
+ DCHECK(!sources.empty()); |
bool in_main_world = injector_->ShouldExecuteInMainWorld(); |
int world_id = in_main_world |
? DOMActivityLogger::kMainWorldId |
@@ -311,9 +319,9 @@ void ScriptInjection::OnJsInjectionCompleted( |
} |
} |
-void ScriptInjection::InjectCss() { |
+void ScriptInjection::InjectCss(ScriptsRunInfo* scripts_run_info) { |
std::vector<blink::WebString> css_sources = |
- injector_->GetCssSources(run_location_); |
+ injector_->GetCssSources(run_location_, scripts_run_info); |
blink::WebLocalFrame* web_frame = render_frame_->GetWebFrame(); |
for (const blink::WebString& css : css_sources) |
web_frame->document().insertStyleSheet(css); |