Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "extensions/renderer/user_script_injector.h" | 5 #include "extensions/renderer/user_script_injector.h" |
| 6 | 6 |
| 7 #include <tuple> | 7 #include <tuple> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/lazy_instance.h" | 10 #include "base/lazy_instance.h" |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 97 } | 97 } |
| 98 | 98 |
| 99 UserScriptInjector::~UserScriptInjector() { | 99 UserScriptInjector::~UserScriptInjector() { |
| 100 } | 100 } |
| 101 | 101 |
| 102 void UserScriptInjector::OnUserScriptsUpdated( | 102 void UserScriptInjector::OnUserScriptsUpdated( |
| 103 const std::set<HostID>& changed_hosts, | 103 const std::set<HostID>& changed_hosts, |
| 104 const std::vector<UserScript*>& scripts) { | 104 const std::vector<UserScript*>& scripts) { |
| 105 // If the host causing this injection changed, then this injection | 105 // If the host causing this injection changed, then this injection |
| 106 // will be removed, and there's no guarantee the backing script still exists. | 106 // will be removed, and there's no guarantee the backing script still exists. |
| 107 if (changed_hosts.count(host_id_) > 0) | 107 if (changed_hosts.count(host_id_) > 0) { |
| 108 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!
| |
| 108 return; | 109 return; |
| 110 } | |
| 109 | 111 |
| 110 for (std::vector<UserScript*>::const_iterator iter = scripts.begin(); | 112 for (std::vector<UserScript*>::const_iterator iter = scripts.begin(); |
| 111 iter != scripts.end(); | 113 iter != scripts.end(); |
| 112 ++iter) { | 114 ++iter) { |
| 113 // We need to compare to |script_id_| (and not to script_->id()) because the | 115 // We need to compare to |script_id_| (and not to script_->id()) because the |
| 114 // old |script_| may be deleted by now. | 116 // old |script_| may be deleted by now. |
| 115 if ((*iter)->id() == script_id_) { | 117 if ((*iter)->id() == script_id_) { |
| 116 script_ = *iter; | 118 script_ = *iter; |
| 117 break; | 119 break; |
| 118 } | 120 } |
| (...skipping 11 matching lines...) Expand all Loading... | |
| 130 bool UserScriptInjector::IsUserGesture() const { | 132 bool UserScriptInjector::IsUserGesture() const { |
| 131 return false; | 133 return false; |
| 132 } | 134 } |
| 133 | 135 |
| 134 bool UserScriptInjector::ExpectsResults() const { | 136 bool UserScriptInjector::ExpectsResults() const { |
| 135 return false; | 137 return false; |
| 136 } | 138 } |
| 137 | 139 |
| 138 bool UserScriptInjector::ShouldInjectJs( | 140 bool UserScriptInjector::ShouldInjectJs( |
| 139 UserScript::RunLocation run_location) const { | 141 UserScript::RunLocation run_location) const { |
| 140 return script_->run_location() == run_location && | 142 return script_ && script_->run_location() == run_location && |
| 141 !script_->js_scripts().empty(); | 143 !script_->js_scripts().empty(); |
| 142 } | 144 } |
| 143 | 145 |
| 144 bool UserScriptInjector::ShouldInjectCss( | 146 bool UserScriptInjector::ShouldInjectCss( |
| 145 UserScript::RunLocation run_location) const { | 147 UserScript::RunLocation run_location) const { |
| 146 return run_location == UserScript::DOCUMENT_START && | 148 return script_ && run_location == UserScript::DOCUMENT_START && |
| 147 !script_->css_scripts().empty(); | 149 !script_->css_scripts().empty(); |
| 148 } | 150 } |
| 149 | 151 |
| 150 PermissionsData::AccessType UserScriptInjector::CanExecuteOnFrame( | 152 PermissionsData::AccessType UserScriptInjector::CanExecuteOnFrame( |
| 151 const InjectionHost* injection_host, | 153 const InjectionHost* injection_host, |
| 152 blink::WebLocalFrame* web_frame, | 154 blink::WebLocalFrame* web_frame, |
| 153 int tab_id) const { | 155 int tab_id) const { |
| 156 // There is no harm in allowing the injection when the script is gone, | |
| 157 // because there is nothing to inject. | |
| 158 if (!script_) | |
| 159 return PermissionsData::ACCESS_ALLOWED; | |
| 160 | |
| 154 if (script_->consumer_instance_type() == | 161 if (script_->consumer_instance_type() == |
| 155 UserScript::ConsumerInstanceType::WEBVIEW) { | 162 UserScript::ConsumerInstanceType::WEBVIEW) { |
| 156 int routing_id = content::RenderView::FromWebView(web_frame->top()->view()) | 163 int routing_id = content::RenderView::FromWebView(web_frame->top()->view()) |
| 157 ->GetRoutingID(); | 164 ->GetRoutingID(); |
| 158 | 165 |
| 159 RoutingInfoKey key(routing_id, script_->id()); | 166 RoutingInfoKey key(routing_id, script_->id()); |
| 160 | 167 |
| 161 RoutingInfoMap& map = g_routing_info_map.Get(); | 168 RoutingInfoMap& map = g_routing_info_map.Get(); |
| 162 auto iter = map.find(key); | 169 auto iter = map.find(key); |
| 163 | 170 |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 184 | 191 |
| 185 return injection_host->CanExecuteOnFrame( | 192 return injection_host->CanExecuteOnFrame( |
| 186 effective_document_url, | 193 effective_document_url, |
| 187 content::RenderFrame::FromWebFrame(web_frame), | 194 content::RenderFrame::FromWebFrame(web_frame), |
| 188 tab_id, | 195 tab_id, |
| 189 is_declarative_); | 196 is_declarative_); |
| 190 } | 197 } |
| 191 | 198 |
| 192 std::vector<blink::WebScriptSource> UserScriptInjector::GetJsSources( | 199 std::vector<blink::WebScriptSource> UserScriptInjector::GetJsSources( |
| 193 UserScript::RunLocation run_location) const { | 200 UserScript::RunLocation run_location) const { |
| 201 std::vector<blink::WebScriptSource> sources; | |
| 202 if (!script_) | |
| 203 return sources; | |
| 204 | |
| 194 DCHECK_EQ(script_->run_location(), run_location); | 205 DCHECK_EQ(script_->run_location(), run_location); |
| 195 | 206 |
| 196 std::vector<blink::WebScriptSource> sources; | |
| 197 const UserScript::FileList& js_scripts = script_->js_scripts(); | 207 const UserScript::FileList& js_scripts = script_->js_scripts(); |
| 198 | 208 |
| 199 for (UserScript::FileList::const_iterator iter = js_scripts.begin(); | 209 for (UserScript::FileList::const_iterator iter = js_scripts.begin(); |
| 200 iter != js_scripts.end(); | 210 iter != js_scripts.end(); |
| 201 ++iter) { | 211 ++iter) { |
| 202 std::string content = iter->GetContent().as_string(); | 212 std::string content = iter->GetContent().as_string(); |
| 203 | 213 |
| 204 // We add this dumb function wrapper for user scripts to emulate what | 214 // We add this dumb function wrapper for user scripts to emulate what |
| 205 // Greasemonkey does. | 215 // Greasemonkey does. |
| 206 if (script_->emulate_greasemonkey()) { | 216 if (script_->emulate_greasemonkey()) { |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 217 sources.insert(sources.begin(), g_greasemonkey_api.Get().GetSource()); | 227 sources.insert(sources.begin(), g_greasemonkey_api.Get().GetSource()); |
| 218 | 228 |
| 219 return sources; | 229 return sources; |
| 220 } | 230 } |
| 221 | 231 |
| 222 std::vector<std::string> UserScriptInjector::GetCssSources( | 232 std::vector<std::string> UserScriptInjector::GetCssSources( |
| 223 UserScript::RunLocation run_location) const { | 233 UserScript::RunLocation run_location) const { |
| 224 DCHECK_EQ(UserScript::DOCUMENT_START, run_location); | 234 DCHECK_EQ(UserScript::DOCUMENT_START, run_location); |
| 225 | 235 |
| 226 std::vector<std::string> sources; | 236 std::vector<std::string> sources; |
| 237 if (!script_) | |
| 238 return sources; | |
| 239 | |
| 227 const UserScript::FileList& css_scripts = script_->css_scripts(); | 240 const UserScript::FileList& css_scripts = script_->css_scripts(); |
| 228 for (UserScript::FileList::const_iterator iter = css_scripts.begin(); | 241 for (UserScript::FileList::const_iterator iter = css_scripts.begin(); |
| 229 iter != css_scripts.end(); | 242 iter != css_scripts.end(); |
| 230 ++iter) { | 243 ++iter) { |
| 231 sources.push_back(iter->GetContent().as_string()); | 244 sources.push_back(iter->GetContent().as_string()); |
| 232 } | 245 } |
| 233 return sources; | 246 return sources; |
| 234 } | 247 } |
| 235 | 248 |
| 236 void UserScriptInjector::GetRunInfo( | 249 void UserScriptInjector::GetRunInfo( |
| 237 ScriptsRunInfo* scripts_run_info, | 250 ScriptsRunInfo* scripts_run_info, |
| 238 UserScript::RunLocation run_location) const { | 251 UserScript::RunLocation run_location) const { |
| 252 if (!script_) | |
| 253 return; | |
| 254 | |
| 239 if (ShouldInjectJs(run_location)) { | 255 if (ShouldInjectJs(run_location)) { |
| 240 const UserScript::FileList& js_scripts = script_->js_scripts(); | 256 const UserScript::FileList& js_scripts = script_->js_scripts(); |
| 241 scripts_run_info->num_js += js_scripts.size(); | 257 scripts_run_info->num_js += js_scripts.size(); |
| 242 for (UserScript::FileList::const_iterator iter = js_scripts.begin(); | 258 for (UserScript::FileList::const_iterator iter = js_scripts.begin(); |
| 243 iter != js_scripts.end(); | 259 iter != js_scripts.end(); |
| 244 ++iter) { | 260 ++iter) { |
| 245 scripts_run_info->executing_scripts[host_id_.id()].insert( | 261 scripts_run_info->executing_scripts[host_id_.id()].insert( |
| 246 iter->url().path()); | 262 iter->url().path()); |
| 247 } | 263 } |
| 248 } | 264 } |
| 249 | 265 |
| 250 if (ShouldInjectCss(run_location)) | 266 if (ShouldInjectCss(run_location)) |
| 251 scripts_run_info->num_css += script_->css_scripts().size(); | 267 scripts_run_info->num_css += script_->css_scripts().size(); |
| 252 } | 268 } |
| 253 | 269 |
| 254 void UserScriptInjector::OnInjectionComplete( | 270 void UserScriptInjector::OnInjectionComplete( |
| 255 std::unique_ptr<base::Value> execution_result, | 271 std::unique_ptr<base::Value> execution_result, |
| 256 UserScript::RunLocation run_location, | 272 UserScript::RunLocation run_location, |
| 257 content::RenderFrame* render_frame) {} | 273 content::RenderFrame* render_frame) {} |
| 258 | 274 |
| 259 void UserScriptInjector::OnWillNotInject(InjectFailureReason reason, | 275 void UserScriptInjector::OnWillNotInject(InjectFailureReason reason, |
| 260 content::RenderFrame* render_frame) { | 276 content::RenderFrame* render_frame) { |
| 261 } | 277 } |
| 262 | 278 |
| 263 } // namespace extensions | 279 } // namespace extensions |
| OLD | NEW |