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_set.h" | 5 #include "extensions/renderer/user_script_set.h" |
6 | 6 |
7 #include "base/memory/ref_counted.h" | 7 #include "base/memory/ref_counted.h" |
8 #include "content/public/common/url_constants.h" | 8 #include "content/public/common/url_constants.h" |
9 #include "content/public/renderer/render_thread.h" | 9 #include "content/public/renderer/render_thread.h" |
10 #include "extensions/common/extension.h" | 10 #include "extensions/common/extension.h" |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
61 continue; | 61 continue; |
62 DCHECK(!(*iter)->extension_id().empty()); | 62 DCHECK(!(*iter)->extension_id().empty()); |
63 ids->insert((*iter)->extension_id()); | 63 ids->insert((*iter)->extension_id()); |
64 } | 64 } |
65 } | 65 } |
66 | 66 |
67 void UserScriptSet::GetInjections( | 67 void UserScriptSet::GetInjections( |
68 ScopedVector<ScriptInjection>* injections, | 68 ScopedVector<ScriptInjection>* injections, |
69 blink::WebFrame* web_frame, | 69 blink::WebFrame* web_frame, |
70 int tab_id, | 70 int tab_id, |
71 UserScript::RunLocation run_location) { | 71 UserScript::RunLocation run_location, |
| 72 bool has_guest_content_script) { |
72 GURL document_url = GetDocumentUrlForFrame(web_frame); | 73 GURL document_url = GetDocumentUrlForFrame(web_frame); |
73 for (ScopedVector<UserScript>::const_iterator iter = scripts_.begin(); | 74 for (ScopedVector<UserScript>::const_iterator iter = scripts_.begin(); |
74 iter != scripts_.end(); | 75 iter != scripts_.end(); |
75 ++iter) { | 76 ++iter) { |
76 scoped_ptr<ScriptInjection> injection = GetInjectionForScript( | 77 scoped_ptr<ScriptInjection> injection = GetInjectionForScript( |
77 *iter, | 78 *iter, |
78 web_frame, | 79 web_frame, |
79 tab_id, | 80 tab_id, |
80 run_location, | 81 run_location, |
81 document_url, | 82 document_url, |
82 false /* is_declarative */); | 83 false /* is_declarative */, |
| 84 has_guest_content_script); |
83 if (injection.get()) | 85 if (injection.get()) |
84 injections->push_back(injection.release()); | 86 injections->push_back(injection.release()); |
85 } | 87 } |
86 } | 88 } |
87 | 89 |
88 bool UserScriptSet::UpdateUserScripts(base::SharedMemoryHandle shared_memory, | 90 bool UserScriptSet::UpdateUserScripts(base::SharedMemoryHandle shared_memory, |
89 const std::set<HostID>& changed_hosts) { | 91 const std::set<HostID>& changed_hosts) { |
90 bool only_inject_incognito = | 92 bool only_inject_incognito = |
91 ExtensionsRendererClient::Get()->IsIncognitoProcess(); | 93 ExtensionsRendererClient::Get()->IsIncognitoProcess(); |
92 | 94 |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
157 const GURL& document_url) { | 159 const GURL& document_url) { |
158 for (ScopedVector<UserScript>::const_iterator it = scripts_.begin(); | 160 for (ScopedVector<UserScript>::const_iterator it = scripts_.begin(); |
159 it != scripts_.end(); | 161 it != scripts_.end(); |
160 ++it) { | 162 ++it) { |
161 if ((*it)->id() == script_id) { | 163 if ((*it)->id() == script_id) { |
162 return GetInjectionForScript(*it, | 164 return GetInjectionForScript(*it, |
163 web_frame, | 165 web_frame, |
164 tab_id, | 166 tab_id, |
165 run_location, | 167 run_location, |
166 document_url, | 168 document_url, |
167 true /* is_declarative */); | 169 true /* is_declarative */, |
| 170 false /*has_guest_content_script */); |
168 } | 171 } |
169 } | 172 } |
170 return scoped_ptr<ScriptInjection>(); | 173 return scoped_ptr<ScriptInjection>(); |
171 } | 174 } |
172 | 175 |
173 // TODO(dcheng): Scripts can't be injected on a remote frame, so this function | 176 // TODO(dcheng): Scripts can't be injected on a remote frame, so this function |
174 // signature needs to be updated. | 177 // signature needs to be updated. |
175 scoped_ptr<ScriptInjection> UserScriptSet::GetInjectionForScript( | 178 scoped_ptr<ScriptInjection> UserScriptSet::GetInjectionForScript( |
176 UserScript* script, | 179 UserScript* script, |
177 blink::WebFrame* web_frame, | 180 blink::WebFrame* web_frame, |
178 int tab_id, | 181 int tab_id, |
179 UserScript::RunLocation run_location, | 182 UserScript::RunLocation run_location, |
180 const GURL& document_url, | 183 const GURL& document_url, |
181 bool is_declarative) { | 184 bool is_declarative, |
| 185 bool has_guest_content_script) { |
182 scoped_ptr<ScriptInjection> injection; | 186 scoped_ptr<ScriptInjection> injection; |
183 scoped_ptr<const InjectionHost> injection_host; | 187 scoped_ptr<const InjectionHost> injection_host; |
184 | 188 |
185 const HostID& host_id = script->host_id(); | 189 const HostID& host_id = script->host_id(); |
186 if (host_id.type() == HostID::EXTENSIONS) { | 190 if (host_id.type() == HostID::EXTENSIONS) { |
187 injection_host = ExtensionInjectionHost::Create(host_id.id(), extensions_); | 191 injection_host = ExtensionInjectionHost::Create(host_id.id(), extensions_); |
188 if (!injection_host) | 192 if (!injection_host) |
189 return injection.Pass(); | 193 return injection.Pass(); |
190 } else { | 194 } else { |
191 DCHECK_EQ(host_id.type(), HostID::WEBUI); | 195 DCHECK_EQ(host_id.type(), HostID::WEBUI); |
192 injection_host.reset(new WebUIInjectionHost(host_id)); | 196 injection_host.reset(new WebUIInjectionHost(host_id)); |
193 } | 197 } |
194 | 198 |
195 if (web_frame->parent() && !script->match_all_frames()) | 199 if (web_frame->parent() && !script->match_all_frames()) |
196 return injection.Pass(); // Only match subframes if the script declared it. | 200 return injection.Pass(); // Only match subframes if the script declared it. |
197 | 201 |
198 GURL effective_document_url = ScriptContext::GetEffectiveDocumentURL( | 202 GURL effective_document_url = ScriptContext::GetEffectiveDocumentURL( |
199 web_frame, document_url, script->match_about_blank()); | 203 web_frame, document_url, script->match_about_blank()); |
200 | 204 |
201 if (!script->MatchesURL(effective_document_url)) | 205 if (!script->MatchesURL(effective_document_url)) |
202 return injection.Pass(); | 206 return injection.Pass(); |
203 | 207 |
204 scoped_ptr<ScriptInjector> injector(new UserScriptInjector(script, | 208 scoped_ptr<ScriptInjector> injector(new UserScriptInjector( |
205 this, | 209 script, |
206 is_declarative)); | 210 this, |
| 211 is_declarative, |
| 212 has_guest_content_script)); |
207 | 213 |
208 blink::WebFrame* top_frame = web_frame->top(); | 214 blink::WebFrame* top_frame = web_frame->top(); |
209 // It doesn't make sense to do script injection for remote frames, since they | 215 // It doesn't make sense to do script injection for remote frames, since they |
210 // cannot host any documents or content. | 216 // cannot host any documents or content. |
211 // TODO(kalman): Fix this properly by moving all security checks into the | 217 // TODO(kalman): Fix this properly by moving all security checks into the |
212 // browser. See http://crbug.com/466373 for ongoing work here. | 218 // browser. See http://crbug.com/466373 for ongoing work here. |
213 if (top_frame->isWebRemoteFrame()) | 219 if (top_frame->isWebRemoteFrame()) |
214 return injection.Pass(); | 220 return injection.Pass(); |
215 | 221 |
216 if (injector->CanExecuteOnFrame(injection_host.get(), web_frame, | 222 if (injector->CanExecuteOnFrame(injection_host.get(), web_frame, |
(...skipping 12 matching lines...) Expand all Loading... |
229 injector.Pass(), | 235 injector.Pass(), |
230 web_frame->toWebLocalFrame(), | 236 web_frame->toWebLocalFrame(), |
231 injection_host.Pass(), | 237 injection_host.Pass(), |
232 run_location, | 238 run_location, |
233 tab_id)); | 239 tab_id)); |
234 } | 240 } |
235 return injection.Pass(); | 241 return injection.Pass(); |
236 } | 242 } |
237 | 243 |
238 } // namespace extensions | 244 } // namespace extensions |
OLD | NEW |