Home | History | Annotate | Download | only in extensions
      1 // Copyright (c) 2012 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.
      4 
      5 #include "chrome/common/extensions/extension_icon_set.h"
      6 
      7 #include "base/logging.h"
      8 
      9 ExtensionIconSet::ExtensionIconSet() {}
     10 
     11 ExtensionIconSet::~ExtensionIconSet() {}
     12 
     13 void ExtensionIconSet::Clear() {
     14   map_.clear();
     15 }
     16 
     17 void ExtensionIconSet::Add(int size, const std::string& path) {
     18   DCHECK(!path.empty() && path[0] != '/');
     19   map_[size] = path;
     20 }
     21 
     22 std::string ExtensionIconSet::Get(int size, MatchType match_type) const {
     23   // The searches for MATCH_BIGGER and MATCH_SMALLER below rely on the fact that
     24   // std::map is sorted. This is per the spec, so it should be safe to rely on.
     25   if (match_type == MATCH_EXACTLY) {
     26     IconMap::const_iterator result = map_.find(size);
     27     return result == map_.end() ? std::string() : result->second;
     28   } else if (match_type == MATCH_SMALLER) {
     29     IconMap::const_reverse_iterator result = map_.rend();
     30     for (IconMap::const_reverse_iterator iter = map_.rbegin();
     31          iter != map_.rend(); ++iter) {
     32       if (iter->first <= size) {
     33         result = iter;
     34         break;
     35       }
     36     }
     37     return result == map_.rend() ? std::string() : result->second;
     38   } else {
     39     DCHECK(match_type == MATCH_BIGGER);
     40     IconMap::const_iterator result = map_.end();
     41     for (IconMap::const_iterator iter = map_.begin(); iter != map_.end();
     42          ++iter) {
     43       if (iter->first >= size) {
     44         result = iter;
     45         break;
     46       }
     47     }
     48     return result == map_.end() ? std::string() : result->second;
     49   }
     50 }
     51 
     52 bool ExtensionIconSet::ContainsPath(const std::string& path) const {
     53   return GetIconSizeFromPath(path) != 0;
     54 }
     55 
     56 int ExtensionIconSet::GetIconSizeFromPath(const std::string& path) const {
     57   if (path.empty())
     58     return 0;
     59 
     60   DCHECK(path[0] != '/') <<
     61       "ExtensionIconSet stores icon paths without leading slash.";
     62 
     63   for (IconMap::const_iterator iter = map_.begin(); iter != map_.end();
     64        ++iter) {
     65     if (iter->second == path)
     66       return iter->first;
     67   }
     68 
     69   return 0;
     70 }
     71