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 "chrome/browser/extensions/chrome_component_extension_resource_manager.h"
6
7#include "base/logging.h"
8#include "base/path_service.h"
9#include "chrome/common/chrome_paths.h"
10#include "grit/chrome_unscaled_resources.h"
11#include "grit/component_extension_resources_map.h"
12#include "grit/theme_resources.h"
13
14#if defined(OS_CHROMEOS)
15#include "ui/file_manager/file_manager_resource_util.h"
16#endif
17
18#if defined(USE_AURA)
19#include "ui/keyboard/keyboard_util.h"
20#endif
21
22namespace extensions {
23
24ChromeComponentExtensionResourceManager::
25ChromeComponentExtensionResourceManager() {
26  static const GritResourceMap kExtraComponentExtensionResources[] = {
27    {"web_store/webstore_icon_128.png", IDR_WEBSTORE_ICON},
28    {"web_store/webstore_icon_16.png", IDR_WEBSTORE_ICON_16},
29    {"chrome_app/product_logo_128.png", IDR_PRODUCT_LOGO_128},
30    {"chrome_app/product_logo_16.png", IDR_PRODUCT_LOGO_16},
31#if defined(ENABLE_SETTINGS_APP)
32    {"settings_app/settings_app_icon_128.png", IDR_SETTINGS_APP_ICON_128},
33    {"settings_app/settings_app_icon_16.png", IDR_SETTINGS_APP_ICON_16},
34    {"settings_app/settings_app_icon_32.png", IDR_SETTINGS_APP_ICON_32},
35    {"settings_app/settings_app_icon_48.png", IDR_SETTINGS_APP_ICON_48},
36#endif
37  };
38
39  AddComponentResourceEntries(
40      kComponentExtensionResources,
41      kComponentExtensionResourcesSize);
42  AddComponentResourceEntries(
43      kExtraComponentExtensionResources,
44      arraysize(kExtraComponentExtensionResources));
45#if defined(OS_CHROMEOS)
46  size_t file_manager_resource_size;
47  const GritResourceMap* file_manager_resources =
48      file_manager::GetFileManagerResources(&file_manager_resource_size);
49  AddComponentResourceEntries(
50      file_manager_resources,
51      file_manager_resource_size);
52
53  size_t keyboard_resource_size;
54  const GritResourceMap* keyboard_resources =
55      keyboard::GetKeyboardExtensionResources(&keyboard_resource_size);
56  AddComponentResourceEntries(
57      keyboard_resources,
58      keyboard_resource_size);
59#endif
60}
61
62ChromeComponentExtensionResourceManager::
63~ChromeComponentExtensionResourceManager() {}
64
65bool ChromeComponentExtensionResourceManager::IsComponentExtensionResource(
66    const base::FilePath& extension_path,
67    const base::FilePath& resource_path,
68    int* resource_id) {
69  base::FilePath directory_path = extension_path;
70  base::FilePath resources_dir;
71  base::FilePath relative_path;
72  if (!PathService::Get(chrome::DIR_RESOURCES, &resources_dir) ||
73      !resources_dir.AppendRelativePath(directory_path, &relative_path)) {
74    return false;
75  }
76  relative_path = relative_path.Append(resource_path);
77  relative_path = relative_path.NormalizePathSeparators();
78
79  std::map<base::FilePath, int>::const_iterator entry =
80      path_to_resource_id_.find(relative_path);
81  if (entry != path_to_resource_id_.end())
82    *resource_id = entry->second;
83
84  return entry != path_to_resource_id_.end();
85}
86
87void ChromeComponentExtensionResourceManager::AddComponentResourceEntries(
88    const GritResourceMap* entries,
89    size_t size) {
90  for (size_t i = 0; i < size; ++i) {
91    base::FilePath resource_path = base::FilePath().AppendASCII(
92        entries[i].name);
93    resource_path = resource_path.NormalizePathSeparators();
94
95    DCHECK(path_to_resource_id_.find(resource_path) ==
96        path_to_resource_id_.end());
97    path_to_resource_id_[resource_path] = entries[i].value;
98  }
99}
100
101}  // namespace extensions
102