diff options
Diffstat (limited to 'extensions/common/extension_icon_set.cc')
-rw-r--r-- | extensions/common/extension_icon_set.cc | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/extensions/common/extension_icon_set.cc b/extensions/common/extension_icon_set.cc new file mode 100644 index 0000000..a91b9bc --- /dev/null +++ b/extensions/common/extension_icon_set.cc @@ -0,0 +1,70 @@ +// Copyright 2014 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "extensions/common/extension_icon_set.h" + +#include "base/logging.h" + +ExtensionIconSet::ExtensionIconSet() {} + +ExtensionIconSet::~ExtensionIconSet() {} + +void ExtensionIconSet::Clear() { + map_.clear(); +} + +void ExtensionIconSet::Add(int size, const std::string& path) { + DCHECK(!path.empty() && path[0] != '/'); + map_[size] = path; +} + +std::string ExtensionIconSet::Get(int size, MatchType match_type) const { + // The searches for MATCH_BIGGER and MATCH_SMALLER below rely on the fact that + // std::map is sorted. This is per the spec, so it should be safe to rely on. + if (match_type == MATCH_EXACTLY) { + IconMap::const_iterator result = map_.find(size); + return result == map_.end() ? std::string() : result->second; + } else if (match_type == MATCH_SMALLER) { + IconMap::const_reverse_iterator result = map_.rend(); + for (IconMap::const_reverse_iterator iter = map_.rbegin(); + iter != map_.rend(); ++iter) { + if (iter->first <= size) { + result = iter; + break; + } + } + return result == map_.rend() ? std::string() : result->second; + } else { + DCHECK(match_type == MATCH_BIGGER); + IconMap::const_iterator result = map_.end(); + for (IconMap::const_iterator iter = map_.begin(); iter != map_.end(); + ++iter) { + if (iter->first >= size) { + result = iter; + break; + } + } + return result == map_.end() ? std::string() : result->second; + } +} + +bool ExtensionIconSet::ContainsPath(const std::string& path) const { + return GetIconSizeFromPath(path) != 0; +} + +int ExtensionIconSet::GetIconSizeFromPath(const std::string& path) const { + if (path.empty()) + return 0; + + DCHECK(path[0] != '/') << + "ExtensionIconSet stores icon paths without leading slash."; + + for (IconMap::const_iterator iter = map_.begin(); iter != map_.end(); + ++iter) { + if (iter->second == path) + return iter->first; + } + + return 0; +} |