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/dispatcher.h" | 5 #include "extensions/renderer/dispatcher.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/callback.h" | 8 #include "base/callback.h" |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/debug/alias.h" | 10 #include "base/debug/alias.h" |
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
212 } | 212 } |
213 | 213 |
214 bool Dispatcher::IsExtensionActive(const std::string& extension_id) const { | 214 bool Dispatcher::IsExtensionActive(const std::string& extension_id) const { |
215 bool is_active = | 215 bool is_active = |
216 active_extension_ids_.find(extension_id) != active_extension_ids_.end(); | 216 active_extension_ids_.find(extension_id) != active_extension_ids_.end(); |
217 if (is_active) | 217 if (is_active) |
218 CHECK(extensions_.Contains(extension_id)); | 218 CHECK(extensions_.Contains(extension_id)); |
219 return is_active; | 219 return is_active; |
220 } | 220 } |
221 | 221 |
222 std::string Dispatcher::GetExtensionID(const WebFrame* frame, int world_id) { | 222 std::string Dispatcher::GetExtensionID(const WebFrame* frame, |
223 int world_id, | |
224 bool use_effective_url) { | |
223 if (world_id != 0) { | 225 if (world_id != 0) { |
224 // Isolated worlds (content script). | 226 // Isolated worlds (content script). |
225 return ScriptInjection::GetExtensionIdForIsolatedWorld(world_id); | 227 return ScriptInjection::GetExtensionIdForIsolatedWorld(world_id); |
226 } | 228 } |
227 | 229 |
228 // TODO(kalman): Delete this check. | 230 // TODO(kalman): Delete this check. |
229 if (frame->document().securityOrigin().isUnique()) | 231 if (frame->document().securityOrigin().isUnique()) |
230 return std::string(); | 232 return std::string(); |
231 | 233 |
232 // Extension pages (chrome-extension:// URLs). | 234 // Extension pages (chrome-extension:// URLs). |
233 GURL frame_url = ScriptContext::GetDataSourceURLForFrame(frame); | 235 GURL frame_url = ScriptContext::GetDataSourceURLForFrame(frame); |
236 frame_url = ScriptContext::GetEffectiveDocumentURL( | |
237 frame, frame_url, use_effective_url); | |
234 return extensions_.GetExtensionOrAppIDByURL(frame_url); | 238 return extensions_.GetExtensionOrAppIDByURL(frame_url); |
235 } | 239 } |
236 | 240 |
237 void Dispatcher::DidCreateScriptContext( | 241 void Dispatcher::DidCreateScriptContext( |
238 WebFrame* frame, | 242 WebFrame* frame, |
239 const v8::Handle<v8::Context>& v8_context, | 243 const v8::Handle<v8::Context>& v8_context, |
240 int extension_group, | 244 int extension_group, |
241 int world_id) { | 245 int world_id) { |
242 #if !defined(ENABLE_EXTENSIONS) | 246 #if !defined(ENABLE_EXTENSIONS) |
243 return; | 247 return; |
244 #endif | 248 #endif |
245 | 249 |
246 std::string extension_id = GetExtensionID(frame, world_id); | 250 std::string extension_id = GetExtensionID(frame, world_id, false); |
247 | 251 |
248 const Extension* extension = extensions_.GetByID(extension_id); | 252 const Extension* extension = extensions_.GetByID(extension_id); |
Devlin
2014/09/03 22:09:16
This is unnecessarily complicated. We should just
Marijn Kruisselbrink
2014/09/03 23:54:07
Done, although I'm not entirely sure if it really
Devlin
2014/09/04 19:15:10
Good point, so I don't really feel too strongly ei
Marijn Kruisselbrink
2014/09/04 23:41:11
Actually I kind of like having this GetExtensionFr
| |
249 if (!extension && !extension_id.empty()) { | 253 if (!extension && !extension_id.empty()) { |
250 // There are conditions where despite a context being associated with an | 254 // There are conditions where despite a context being associated with an |
251 // extension, no extension actually gets found. Ignore "invalid" because | 255 // extension, no extension actually gets found. Ignore "invalid" because |
252 // CSP blocks extension page loading by switching the extension ID to | 256 // CSP blocks extension page loading by switching the extension ID to |
253 // "invalid". This isn't interesting. | 257 // "invalid". This isn't interesting. |
254 if (extension_id != "invalid") { | 258 if (extension_id != "invalid") { |
255 LOG(ERROR) << "Extension \"" << extension_id << "\" not found"; | 259 LOG(ERROR) << "Extension \"" << extension_id << "\" not found"; |
256 RenderThread::Get()->RecordAction( | 260 RenderThread::Get()->RecordAction( |
257 UserMetricsAction("ExtensionNotFound_ED")); | 261 UserMetricsAction("ExtensionNotFound_ED")); |
258 } | 262 } |
259 | 263 |
260 extension_id = ""; | 264 extension_id = ""; |
261 } | 265 } |
262 | 266 |
267 extension_id = GetExtensionID(frame, world_id, true); | |
268 const Extension* effective_extension = extensions_.GetByID(extension_id); | |
Devlin
2014/09/03 22:09:16
If I recall correctly, GetEffectiveDocumentURL() o
Marijn Kruisselbrink
2014/09/03 23:54:07
Yes, the ideal end state is to get rid of extensio
Devlin
2014/09/04 19:15:10
Ah. That's too bad. Okay.
| |
269 | |
270 GURL frame_url = ScriptContext::GetDataSourceURLForFrame(frame); | |
263 Feature::Context context_type = | 271 Feature::Context context_type = |
264 ClassifyJavaScriptContext(extension, | 272 ClassifyJavaScriptContext(extension, |
265 extension_group, | 273 extension_group, |
266 ScriptContext::GetDataSourceURLForFrame(frame), | 274 frame_url, |
267 frame->document().securityOrigin()); | 275 frame->document().securityOrigin()); |
276 Feature::Context effective_context_type = ClassifyJavaScriptContext( | |
277 effective_extension, | |
278 extension_group, | |
279 ScriptContext::GetEffectiveDocumentURL(frame, frame_url, true), | |
280 frame->document().securityOrigin()); | |
268 | 281 |
269 ScriptContext* context = | 282 ScriptContext* context = |
270 delegate_->CreateScriptContext(v8_context, frame, extension, context_type) | 283 delegate_->CreateScriptContext(v8_context, |
271 .release(); | 284 frame, |
285 extension, | |
286 context_type, | |
287 effective_extension, | |
288 effective_context_type).release(); | |
272 script_context_set_.Add(context); | 289 script_context_set_.Add(context); |
273 | 290 |
274 // Initialize origin permissions for content scripts, which can't be | 291 // Initialize origin permissions for content scripts, which can't be |
275 // initialized in |OnActivateExtension|. | 292 // initialized in |OnActivateExtension|. |
276 if (context_type == Feature::CONTENT_SCRIPT_CONTEXT) | 293 if (context_type == Feature::CONTENT_SCRIPT_CONTEXT) |
277 InitOriginPermissions(extension); | 294 InitOriginPermissions(extension); |
278 | 295 |
279 { | 296 { |
280 scoped_ptr<ModuleSystem> module_system( | 297 scoped_ptr<ModuleSystem> module_system( |
281 new ModuleSystem(context, &source_map_)); | 298 new ModuleSystem(context, &source_map_)); |
(...skipping 1018 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1300 return v8::Handle<v8::Object>(); | 1317 return v8::Handle<v8::Object>(); |
1301 | 1318 |
1302 if (bind_name) | 1319 if (bind_name) |
1303 *bind_name = split.back(); | 1320 *bind_name = split.back(); |
1304 | 1321 |
1305 return bind_object.IsEmpty() ? AsObjectOrEmpty(GetOrCreateChrome(context)) | 1322 return bind_object.IsEmpty() ? AsObjectOrEmpty(GetOrCreateChrome(context)) |
1306 : bind_object; | 1323 : bind_object; |
1307 } | 1324 } |
1308 | 1325 |
1309 } // namespace extensions | 1326 } // namespace extensions |
OLD | NEW |