1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "extensions/common/extension_set.h"
7 #include "base/callback.h"
8 #include "base/logging.h"
9 #include "base/stl_util.h"
10 #include "extensions/common/constants.h"
11 #include "extensions/common/extension.h"
12 #include "extensions/common/manifest_handlers/sandboxed_page_info.h"
14 namespace extensions
{
16 ExtensionSet::const_iterator::const_iterator() {}
18 ExtensionSet::const_iterator::const_iterator(const const_iterator
& other
)
22 ExtensionSet::const_iterator::const_iterator(ExtensionMap::const_iterator it
)
26 ExtensionSet::const_iterator::~const_iterator() {}
28 ExtensionSet::ExtensionSet() {
31 ExtensionSet::~ExtensionSet() {
34 size_t ExtensionSet::size() const {
35 return extensions_
.size();
38 bool ExtensionSet::is_empty() const {
39 return extensions_
.empty();
42 bool ExtensionSet::Contains(const std::string
& extension_id
) const {
43 return extensions_
.find(extension_id
) != extensions_
.end();
46 bool ExtensionSet::Insert(const scoped_refptr
<const Extension
>& extension
) {
47 bool was_present
= ContainsKey(extensions_
, extension
->id());
48 extensions_
[extension
->id()] = extension
;
49 if (!was_present
&& !modification_callback_
.is_null())
50 modification_callback_
.Run(GetIDs());
54 bool ExtensionSet::InsertAll(const ExtensionSet
& extensions
) {
55 size_t before
= size();
56 for (ExtensionSet::const_iterator iter
= extensions
.begin();
57 iter
!= extensions
.end(); ++iter
) {
60 return size() != before
;
63 bool ExtensionSet::Remove(const std::string
& id
) {
64 bool was_present
= extensions_
.erase(id
) > 0;
65 if (was_present
&& !modification_callback_
.is_null())
66 modification_callback_
.Run(GetIDs());
70 void ExtensionSet::Clear() {
74 std::string
ExtensionSet::GetExtensionOrAppIDByURL(const GURL
& url
) const {
75 if (url
.SchemeIs(kExtensionScheme
))
78 const Extension
* extension
= GetHostedAppByURL(url
);
82 return extension
->id();
85 const Extension
* ExtensionSet::GetExtensionOrAppByURL(const GURL
& url
) const {
86 if (url
.SchemeIs(kExtensionScheme
))
87 return GetByID(url
.host());
89 return GetHostedAppByURL(url
);
92 const Extension
* ExtensionSet::GetAppByURL(const GURL
& url
) const {
93 const Extension
* extension
= GetExtensionOrAppByURL(url
);
94 return (extension
&& extension
->is_app()) ? extension
: NULL
;
97 const Extension
* ExtensionSet::GetHostedAppByURL(const GURL
& url
) const {
98 for (ExtensionMap::const_iterator iter
= extensions_
.begin();
99 iter
!= extensions_
.end(); ++iter
) {
100 if (iter
->second
->web_extent().MatchesURL(url
))
101 return iter
->second
.get();
107 const Extension
* ExtensionSet::GetHostedAppByOverlappingWebExtent(
108 const URLPatternSet
& extent
) const {
109 for (ExtensionMap::const_iterator iter
= extensions_
.begin();
110 iter
!= extensions_
.end(); ++iter
) {
111 if (iter
->second
->web_extent().OverlapsWith(extent
))
112 return iter
->second
.get();
118 bool ExtensionSet::InSameExtent(const GURL
& old_url
,
119 const GURL
& new_url
) const {
120 return GetExtensionOrAppByURL(old_url
) ==
121 GetExtensionOrAppByURL(new_url
);
124 const Extension
* ExtensionSet::GetByID(const std::string
& id
) const {
125 ExtensionMap::const_iterator i
= extensions_
.find(id
);
126 if (i
!= extensions_
.end())
127 return i
->second
.get();
132 ExtensionIdSet
ExtensionSet::GetIDs() const {
134 for (ExtensionMap::const_iterator it
= extensions_
.begin();
135 it
!= extensions_
.end(); ++it
) {
136 ids
.insert(it
->first
);
141 bool ExtensionSet::ExtensionBindingsAllowed(const GURL
& url
) const {
142 if (url
.SchemeIs(kExtensionScheme
))
145 for (ExtensionMap::const_iterator it
= extensions_
.begin();
146 it
!= extensions_
.end(); ++it
) {
147 if (it
->second
->location() == Manifest::COMPONENT
&&
148 it
->second
->web_extent().MatchesURL(url
))
155 } // namespace extensions