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