Index: extensions/renderer/dispatcher.cc |
diff --git a/extensions/renderer/dispatcher.cc b/extensions/renderer/dispatcher.cc |
index d52d1505c06bfe2a7da38acde2639c831bf5fa29..945160bda1e1ebc04849b94eea59d80bf688fd7f 100644 |
--- a/extensions/renderer/dispatcher.cc |
+++ b/extensions/renderer/dispatcher.cc |
@@ -219,19 +219,38 @@ bool Dispatcher::IsExtensionActive(const std::string& extension_id) const { |
return is_active; |
} |
-std::string Dispatcher::GetExtensionID(const WebFrame* frame, int world_id) { |
+const Extension* Dispatcher::GetExtensionFromFrameAndWorld( |
+ const WebFrame* frame, |
+ int world_id, |
+ bool use_effective_url) { |
if (world_id != 0) { |
// Isolated worlds (content script). |
- return ScriptInjection::GetExtensionIdForIsolatedWorld(world_id); |
+ std::string extension_id = |
+ ScriptInjection::GetExtensionIdForIsolatedWorld(world_id); |
+ const Extension* extension = extensions_.GetByID(extension_id); |
+ if (!extension && !extension_id.empty()) { |
+ // There are conditions where despite a context being associated with an |
+ // extension, no extension actually gets found. Ignore "invalid" because |
+ // CSP blocks extension page loading by switching the extension ID to |
+ // "invalid". This isn't interesting. |
+ if (extension_id != "invalid") { |
+ LOG(ERROR) << "Extension \"" << extension_id << "\" not found"; |
+ RenderThread::Get()->RecordAction( |
+ UserMetricsAction("ExtensionNotFound_ED")); |
+ } |
+ } |
+ return extension; |
} |
// TODO(kalman): Delete this check. |
if (frame->document().securityOrigin().isUnique()) |
- return std::string(); |
+ return 0; |
// Extension pages (chrome-extension:// URLs). |
GURL frame_url = ScriptContext::GetDataSourceURLForFrame(frame); |
- return extensions_.GetExtensionOrAppIDByURL(frame_url); |
+ frame_url = ScriptContext::GetEffectiveDocumentURL( |
+ frame, frame_url, use_effective_url); |
+ return extensions_.GetExtensionOrAppByURL(frame_url); |
} |
void Dispatcher::DidCreateScriptContext( |
@@ -243,32 +262,30 @@ void Dispatcher::DidCreateScriptContext( |
return; |
#endif |
- std::string extension_id = GetExtensionID(frame, world_id); |
- |
- const Extension* extension = extensions_.GetByID(extension_id); |
- if (!extension && !extension_id.empty()) { |
- // There are conditions where despite a context being associated with an |
- // extension, no extension actually gets found. Ignore "invalid" because |
- // CSP blocks extension page loading by switching the extension ID to |
- // "invalid". This isn't interesting. |
- if (extension_id != "invalid") { |
- LOG(ERROR) << "Extension \"" << extension_id << "\" not found"; |
- RenderThread::Get()->RecordAction( |
- UserMetricsAction("ExtensionNotFound_ED")); |
- } |
- |
- extension_id = ""; |
- } |
+ const Extension* extension = |
+ GetExtensionFromFrameAndWorld(frame, world_id, false); |
+ const Extension* effective_extension = |
+ GetExtensionFromFrameAndWorld(frame, world_id, true); |
+ GURL frame_url = ScriptContext::GetDataSourceURLForFrame(frame); |
Feature::Context context_type = |
ClassifyJavaScriptContext(extension, |
extension_group, |
- ScriptContext::GetDataSourceURLForFrame(frame), |
+ frame_url, |
frame->document().securityOrigin()); |
+ Feature::Context effective_context_type = ClassifyJavaScriptContext( |
+ effective_extension, |
+ extension_group, |
+ ScriptContext::GetEffectiveDocumentURL(frame, frame_url, true), |
+ frame->document().securityOrigin()); |
ScriptContext* context = |
- delegate_->CreateScriptContext(v8_context, frame, extension, context_type) |
- .release(); |
+ delegate_->CreateScriptContext(v8_context, |
+ frame, |
+ extension, |
+ context_type, |
+ effective_extension, |
+ effective_context_type).release(); |
script_context_set_.Add(context); |
// Initialize origin permissions for content scripts, which can't be |