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

Unified Diff: extensions/renderer/user_script_injector.cc

Issue 2116923002: Avoid using stale UserScript pointers (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove browser test, see bug for details Created 4 years, 5 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: extensions/renderer/user_script_injector.cc
diff --git a/extensions/renderer/user_script_injector.cc b/extensions/renderer/user_script_injector.cc
index 71b41eb2e1d95b47c4b4b5538455d121a0363fc6..1910548ba24b340d720cd7eb4ea16d8af38e6416 100644
--- a/extensions/renderer/user_script_injector.cc
+++ b/extensions/renderer/user_script_injector.cc
@@ -104,8 +104,10 @@ void UserScriptInjector::OnUserScriptsUpdated(
const std::vector<UserScript*>& scripts) {
// If the host causing this injection changed, then this injection
// will be removed, and there's no guarantee the backing script still exists.
- if (changed_hosts.count(host_id_) > 0)
+ if (changed_hosts.count(host_id_) > 0) {
+ script_ = nullptr;
Devlin 2016/07/06 15:22:22 We should call ScriptInjection::OnHostRemoved() wh
robwu 2016/07/06 16:12:06 I considered it, but because the bug is only relat
Devlin 2016/07/06 16:17:58 I think I'd prefer checking the host in ScriptInje
robwu 2016/07/06 16:26:57 That's a good one. I will submit a separate CL sin
Devlin 2016/07/06 16:40:56 Sounds good, thanks!
return;
+ }
for (std::vector<UserScript*>::const_iterator iter = scripts.begin();
iter != scripts.end();
@@ -137,13 +139,13 @@ bool UserScriptInjector::ExpectsResults() const {
bool UserScriptInjector::ShouldInjectJs(
UserScript::RunLocation run_location) const {
- return script_->run_location() == run_location &&
+ return script_ && script_->run_location() == run_location &&
!script_->js_scripts().empty();
}
bool UserScriptInjector::ShouldInjectCss(
UserScript::RunLocation run_location) const {
- return run_location == UserScript::DOCUMENT_START &&
+ return script_ && run_location == UserScript::DOCUMENT_START &&
!script_->css_scripts().empty();
}
@@ -151,6 +153,11 @@ PermissionsData::AccessType UserScriptInjector::CanExecuteOnFrame(
const InjectionHost* injection_host,
blink::WebLocalFrame* web_frame,
int tab_id) const {
+ // There is no harm in allowing the injection when the script is gone,
+ // because there is nothing to inject.
+ if (!script_)
+ return PermissionsData::ACCESS_ALLOWED;
+
if (script_->consumer_instance_type() ==
UserScript::ConsumerInstanceType::WEBVIEW) {
int routing_id = content::RenderView::FromWebView(web_frame->top()->view())
@@ -191,9 +198,12 @@ PermissionsData::AccessType UserScriptInjector::CanExecuteOnFrame(
std::vector<blink::WebScriptSource> UserScriptInjector::GetJsSources(
UserScript::RunLocation run_location) const {
+ std::vector<blink::WebScriptSource> sources;
+ if (!script_)
+ return sources;
+
DCHECK_EQ(script_->run_location(), run_location);
- std::vector<blink::WebScriptSource> sources;
const UserScript::FileList& js_scripts = script_->js_scripts();
for (UserScript::FileList::const_iterator iter = js_scripts.begin();
@@ -224,6 +234,9 @@ std::vector<std::string> UserScriptInjector::GetCssSources(
DCHECK_EQ(UserScript::DOCUMENT_START, run_location);
std::vector<std::string> sources;
+ if (!script_)
+ return sources;
+
const UserScript::FileList& css_scripts = script_->css_scripts();
for (UserScript::FileList::const_iterator iter = css_scripts.begin();
iter != css_scripts.end();
@@ -236,6 +249,9 @@ std::vector<std::string> UserScriptInjector::GetCssSources(
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();
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698