Index: extensions/renderer/dispatcher.cc |
diff --git a/extensions/renderer/dispatcher.cc b/extensions/renderer/dispatcher.cc |
index 984a48deae46d84624e417a790503599333b2069..f7eefdfba0832769056b28cd5762682bc7b6fbb2 100644 |
--- a/extensions/renderer/dispatcher.cc |
+++ b/extensions/renderer/dispatcher.cc |
@@ -31,6 +31,7 @@ |
#include "extensions/common/manifest.h" |
#include "extensions/common/manifest_constants.h" |
#include "extensions/common/manifest_handlers/background_info.h" |
+#include "extensions/common/manifest_handlers/content_capabilities_handler.h" |
#include "extensions/common/manifest_handlers/externally_connectable.h" |
#include "extensions/common/manifest_handlers/options_page_info.h" |
#include "extensions/common/manifest_handlers/sandboxed_page_info.h" |
@@ -1094,33 +1095,17 @@ void Dispatcher::UpdateBindingsForContext(ScriptContext* context) { |
switch (context->context_type()) { |
case Feature::UNSPECIFIED_CONTEXT: |
case Feature::WEB_PAGE_CONTEXT: |
- case Feature::BLESSED_WEB_PAGE_CONTEXT: { |
+ case Feature::BLESSED_WEB_PAGE_CONTEXT: |
// Web page context; it's too expensive to run the full bindings code. |
// Hard-code that the app and webstore APIs are available... |
if (context->GetAvailability("app").is_available()) |
RegisterBinding("app", context); |
- |
if (context->GetAvailability("webstore").is_available()) |
RegisterBinding("webstore", context); |
- |
- // ... and that the runtime API might be available if any extension can |
- // connect to it. |
- bool runtime_is_available = false; |
- for (ExtensionSet::const_iterator it = extensions_.begin(); |
- it != extensions_.end(); |
- ++it) { |
- ExternallyConnectableInfo* info = |
- static_cast<ExternallyConnectableInfo*>( |
- (*it)->GetManifestData(manifest_keys::kExternallyConnectable)); |
- if (info && info->matches.MatchesURL(context->GetURL())) { |
- runtime_is_available = true; |
- break; |
- } |
- } |
- if (runtime_is_available) |
+ if (IsRuntimeAvailableToContext(context)) |
RegisterBinding("runtime", context); |
+ UpdateContentCapabilities(context); |
break; |
- } |
case Feature::BLESSED_EXTENSION_CONTEXT: |
case Feature::UNBLESSED_EXTENSION_CONTEXT: |
@@ -1232,6 +1217,31 @@ void Dispatcher::RegisterNativeHandlers(ModuleSystem* module_system, |
delegate_->RegisterNativeHandlers(this, module_system, context); |
} |
+bool Dispatcher::IsRuntimeAvailableToContext(ScriptContext* context) { |
+ for (const auto& extension : extensions_) { |
+ ExternallyConnectableInfo* info = |
+ static_cast<ExternallyConnectableInfo*>( |
+ extension->GetManifestData(manifest_keys::kExternallyConnectable)); |
+ if (info && info->matches.MatchesURL(context->GetURL())) |
+ return true; |
+ } |
+ return false; |
+} |
+ |
+void Dispatcher::UpdateContentCapabilities(ScriptContext* context) { |
+ APIPermissionSet permissions; |
+ for (const auto& extension : extensions_) { |
+ const ContentCapabilitiesInfo& info = ContentCapabilitiesInfo::Get( |
+ extension.get()); |
+ if (info.url_patterns.MatchesURL(context->GetURL())) { |
+ APIPermissionSet new_permissions; |
+ APIPermissionSet::Union(permissions, info.permissions, &new_permissions); |
+ permissions = new_permissions; |
+ } |
+ } |
+ context->SetContentCapabilities(permissions); |
+} |
+ |
void Dispatcher::PopulateSourceMap() { |
const std::vector<std::pair<std::string, int> > resources = GetJsResources(); |
for (std::vector<std::pair<std::string, int> >::const_iterator resource = |