icons_handler.cc revision c5cede9ae108bb15f6b7a8aea21c7e1fefa2834c
1// Copyright 2014 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 "extensions/common/manifest_handlers/icons_handler.h"
6
7#include "base/file_util.h"
8#include "base/lazy_instance.h"
9#include "base/memory/scoped_ptr.h"
10#include "base/strings/string_number_conversions.h"
11#include "base/strings/utf_string_conversions.h"
12#include "base/values.h"
13#include "extensions/common/constants.h"
14#include "extensions/common/extension.h"
15#include "extensions/common/file_util.h"
16#include "extensions/common/manifest_constants.h"
17#include "extensions/common/manifest_handler_helpers.h"
18#include "grit/generated_resources.h"
19#include "grit/theme_resources.h"
20#include "ui/base/resource/resource_bundle.h"
21#include "ui/gfx/size.h"
22
23namespace extensions {
24
25namespace keys = manifest_keys;
26
27static base::LazyInstance<ExtensionIconSet> g_empty_icon_set =
28    LAZY_INSTANCE_INITIALIZER;
29
30// static
31const ExtensionIconSet& IconsInfo::GetIcons(const Extension* extension) {
32  IconsInfo* info = static_cast<IconsInfo*>(
33      extension->GetManifestData(keys::kIcons));
34  return info ? info->icons : g_empty_icon_set.Get();
35}
36
37// static
38const gfx::ImageSkia& IconsInfo::GetDefaultAppIcon() {
39  return *ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
40      IDR_APP_DEFAULT_ICON);
41}
42
43// static
44const gfx::ImageSkia& IconsInfo::GetDefaultExtensionIcon() {
45  return *ResourceBundle::GetSharedInstance().GetImageSkiaNamed(
46      IDR_EXTENSION_DEFAULT_ICON);
47}
48
49// static
50ExtensionResource IconsInfo::GetIconResource(
51    const Extension* extension,
52    int size,
53    ExtensionIconSet::MatchType match_type) {
54  std::string path = GetIcons(extension).Get(size, match_type);
55  return path.empty() ? ExtensionResource() : extension->GetResource(path);
56}
57
58// static
59GURL IconsInfo::GetIconURL(const Extension* extension,
60                           int size,
61                           ExtensionIconSet::MatchType match_type) {
62  std::string path = GetIcons(extension).Get(size, match_type);
63  return path.empty() ? GURL() : extension->GetResourceURL(path);
64}
65
66IconsHandler::IconsHandler() {
67}
68
69IconsHandler::~IconsHandler() {
70}
71
72bool IconsHandler::Parse(Extension* extension, base::string16* error) {
73  scoped_ptr<IconsInfo> icons_info(new IconsInfo);
74  const base::DictionaryValue* icons_dict = NULL;
75  if (!extension->manifest()->GetDictionary(keys::kIcons, &icons_dict)) {
76    *error = base::ASCIIToUTF16(manifest_errors::kInvalidIcons);
77    return false;
78  }
79
80  if (!manifest_handler_helpers::LoadIconsFromDictionary(
81          icons_dict,
82          extension_misc::kExtensionIconSizes,
83          extension_misc::kNumExtensionIconSizes,
84          &icons_info->icons,
85          error)) {
86    return false;
87  }
88
89  extension->SetManifestData(keys::kIcons, icons_info.release());
90  return true;
91}
92
93bool IconsHandler::Validate(const Extension* extension,
94                            std::string* error,
95                            std::vector<InstallWarning>* warnings) const {
96  return file_util::ValidateExtensionIconSet(IconsInfo::GetIcons(extension),
97                                             extension,
98                                             IDS_EXTENSION_LOAD_ICON_FAILED,
99                                             error);
100}
101
102const std::vector<std::string> IconsHandler::Keys() const {
103  return SingleKey(keys::kIcons);
104}
105
106}  // namespace extensions
107