summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions/extension_info_map.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/extensions/extension_info_map.cc')
-rw-r--r--chrome/browser/extensions/extension_info_map.cc22
1 files changed, 22 insertions, 0 deletions
diff --git a/chrome/browser/extensions/extension_info_map.cc b/chrome/browser/extensions/extension_info_map.cc
index d2126c5..ed3fd7d 100644
--- a/chrome/browser/extensions/extension_info_map.cc
+++ b/chrome/browser/extensions/extension_info_map.cc
@@ -5,6 +5,8 @@
#include "chrome/browser/extensions/extension_info_map.h"
#include "chrome/common/extensions/extension.h"
+#include "chrome/common/extensions/extension_set.h"
+#include "chrome/common/url_constants.h"
#include "content/public/browser/browser_thread.h"
using content::BrowserThread;
@@ -124,3 +126,23 @@ bool ExtensionInfoMap::IsExtensionInProcess(
ExtensionProcessIDMap::value_type(extension_id, process_id)) !=
extension_process_ids_.end();
}
+
+bool ExtensionInfoMap::SecurityOriginHasAPIPermission(
+ const GURL& origin, int process_id,
+ ExtensionAPIPermission::ID permission) const {
+ if (origin.SchemeIs(chrome::kExtensionScheme)) {
+ const std::string& id = origin.host();
+ return extensions_.GetByID(id)->HasAPIPermission(permission) &&
+ IsExtensionInProcess(id, process_id);
+ }
+
+ ExtensionSet::ExtensionMap::const_iterator i = extensions_.begin();
+ for (; i != extensions_.end(); ++i) {
+ if (i->second->web_extent().MatchesSecurityOrigin(origin) &&
+ IsExtensionInProcess(i->first, process_id) &&
+ i->second->HasAPIPermission(permission)) {
+ return true;
+ }
+ }
+ return false;
+}