1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "extensions/common/extension_icon_set.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
86e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "base/strings/string_util.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionIconSet::ExtensionIconSet() {}
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionIconSet::~ExtensionIconSet() {}
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionIconSet::Clear() {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  map_.clear();
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionIconSet::Add(int size, const std::string& path) {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(!path.empty() && path[0] != '/');
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  map_[size] = path;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)const std::string& ExtensionIconSet::Get(int size, MatchType match_type) const {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The searches for MATCH_BIGGER and MATCH_SMALLER below rely on the fact that
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // std::map is sorted. This is per the spec, so it should be safe to rely on.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (match_type == MATCH_EXACTLY) {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IconMap::const_iterator result = map_.find(size);
286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return result == map_.end() ? base::EmptyString() : result->second;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (match_type == MATCH_SMALLER) {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IconMap::const_reverse_iterator result = map_.rend();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (IconMap::const_reverse_iterator iter = map_.rbegin();
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         iter != map_.rend(); ++iter) {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (iter->first <= size) {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        result = iter;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
386e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return result == map_.rend() ? base::EmptyString() : result->second;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(match_type == MATCH_BIGGER);
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IconMap::const_iterator result = map_.end();
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (IconMap::const_iterator iter = map_.begin(); iter != map_.end();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         ++iter) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (iter->first >= size) {
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        result = iter;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        break;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      }
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)    return result == map_.end() ? base::EmptyString() : result->second;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExtensionIconSet::ContainsPath(const std::string& path) const {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetIconSizeFromPath(path) != 0;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int ExtensionIconSet::GetIconSizeFromPath(const std::string& path) const {
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (path.empty())
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  DCHECK_NE(path[0], '/') <<
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "ExtensionIconSet stores icon paths without leading slash.";
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (IconMap::const_iterator iter = map_.begin(); iter != map_.end();
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)       ++iter) {
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (iter->second == path)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return iter->first;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
72