Index: chrome/common/extensions/manifest_handlers/externally_connectable.cc |
diff --git a/chrome/common/extensions/manifest_handlers/externally_connectable.cc b/chrome/common/extensions/manifest_handlers/externally_connectable.cc |
index 10bdc7f35ada6b510d1d50fce2a9b8ed189a29b2..ab811688d17260e21b2a07226ffda0f0b2573ee7 100644 |
--- a/chrome/common/extensions/manifest_handlers/externally_connectable.cc |
+++ b/chrome/common/extensions/manifest_handlers/externally_connectable.cc |
@@ -4,6 +4,9 @@ |
#include "chrome/common/extensions/manifest_handlers/externally_connectable.h" |
+#include <algorithm> |
+ |
+#include "base/stl_util.h" |
#include "base/strings/utf_string_conversions.h" |
#include "chrome/common/extensions/api/manifest_types.h" |
#include "chrome/common/extensions/extension_manifest_constants.h" |
@@ -34,9 +37,18 @@ namespace errors = externally_connectable_errors; |
using api::manifest_types::ExternallyConnectable; |
namespace { |
+ |
const char kAllIds[] = "*"; |
+ |
+template <typename T> |
+std::vector<T> Sorted(const std::vector<T>& in) { |
+ std::vector<T> out = in; |
+ std::sort(out.begin(), out.end()); |
+ return out; |
} |
+} // namespace |
+ |
ExternallyConnectableHandler::ExternallyConnectableHandler() {} |
ExternallyConnectableHandler::~ExternallyConnectableHandler() {} |
@@ -135,14 +147,14 @@ scoped_ptr<ExternallyConnectableInfo> ExternallyConnectableInfo::FromValue( |
} |
std::vector<std::string> ids; |
- bool matches_all_ids = false; |
+ bool all_ids = false; |
if (externally_connectable->ids) { |
for (std::vector<std::string>::iterator it = |
externally_connectable->ids->begin(); |
it != externally_connectable->ids->end(); ++it) { |
if (*it == kAllIds) { |
- matches_all_ids = true; |
+ all_ids = true; |
} else if (Extension::IdIsValid(*it)) { |
ids.push_back(*it); |
} else { |
@@ -154,7 +166,7 @@ scoped_ptr<ExternallyConnectableInfo> ExternallyConnectableInfo::FromValue( |
} |
return make_scoped_ptr( |
- new ExternallyConnectableInfo(matches, ids, matches_all_ids)); |
+ new ExternallyConnectableInfo(matches, ids, all_ids)); |
} |
ExternallyConnectableInfo::~ExternallyConnectableInfo() {} |
@@ -162,7 +174,14 @@ ExternallyConnectableInfo::~ExternallyConnectableInfo() {} |
ExternallyConnectableInfo::ExternallyConnectableInfo( |
const URLPatternSet& matches, |
const std::vector<std::string>& ids, |
- bool matches_all_ids) |
- : matches(matches), ids(ids), matches_all_ids(matches_all_ids) {} |
+ bool all_ids) |
+ : matches(matches), ids(Sorted(ids)), all_ids(all_ids) {} |
+ |
+bool ExternallyConnectableInfo::IdCanConnect(const std::string& id) { |
+ if (all_ids) |
+ return true; |
+ DCHECK(base::STLIsSorted(ids)); |
+ return std::binary_search(ids.begin(), ids.end(), id); |
+} |
} // namespace extensions |