electron_component_extension_resource_manager.cc 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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. #include "shell/browser/extensions/electron_component_extension_resource_manager.h"
  5. #include <string>
  6. #include <utility>
  7. #include "base/containers/contains.h"
  8. #include "base/path_service.h"
  9. #include "base/values.h"
  10. #include "build/build_config.h"
  11. #include "chrome/common/chrome_paths.h"
  12. #include "chrome/grit/component_extension_resources_map.h"
  13. #include "electron/buildflags/buildflags.h"
  14. #if BUILDFLAG(ENABLE_PDF_VIEWER)
  15. #include "chrome/browser/pdf/pdf_extension_util.h" // nogncheck
  16. #include "chrome/grit/pdf_resources_map.h"
  17. #include "extensions/common/constants.h"
  18. #endif
  19. namespace extensions {
  20. ElectronComponentExtensionResourceManager::
  21. ElectronComponentExtensionResourceManager() {
  22. AddComponentResourceEntries(kComponentExtensionResources,
  23. kComponentExtensionResourcesSize);
  24. #if BUILDFLAG(ENABLE_PDF_VIEWER)
  25. AddComponentResourceEntries(kPdfResources, kPdfResourcesSize);
  26. // Register strings for the PDF viewer, so that $i18n{} replacements work.
  27. base::Value::Dict pdf_strings;
  28. pdf_extension_util::AddStrings(
  29. pdf_extension_util::PdfViewerContext::kPdfViewer, &pdf_strings);
  30. pdf_extension_util::AddAdditionalData(false, true, &pdf_strings);
  31. ui::TemplateReplacements pdf_viewer_replacements;
  32. ui::TemplateReplacementsFromDictionaryValue(pdf_strings,
  33. &pdf_viewer_replacements);
  34. extension_template_replacements_[extension_misc::kPdfExtensionId] =
  35. std::move(pdf_viewer_replacements);
  36. #endif
  37. }
  38. ElectronComponentExtensionResourceManager::
  39. ~ElectronComponentExtensionResourceManager() = default;
  40. bool ElectronComponentExtensionResourceManager::IsComponentExtensionResource(
  41. const base::FilePath& extension_path,
  42. const base::FilePath& resource_path,
  43. int* resource_id) const {
  44. base::FilePath directory_path = extension_path;
  45. base::FilePath resources_dir;
  46. base::FilePath relative_path;
  47. if (!base::PathService::Get(chrome::DIR_RESOURCES, &resources_dir) ||
  48. !resources_dir.AppendRelativePath(directory_path, &relative_path)) {
  49. return false;
  50. }
  51. relative_path = relative_path.Append(resource_path);
  52. relative_path = relative_path.NormalizePathSeparators();
  53. auto entry = path_to_resource_id_.find(relative_path);
  54. if (entry != path_to_resource_id_.end()) {
  55. *resource_id = entry->second;
  56. return true;
  57. }
  58. return false;
  59. }
  60. const ui::TemplateReplacements*
  61. ElectronComponentExtensionResourceManager::GetTemplateReplacementsForExtension(
  62. const std::string& extension_id) const {
  63. auto it = extension_template_replacements_.find(extension_id);
  64. if (it == extension_template_replacements_.end()) {
  65. return nullptr;
  66. }
  67. return &it->second;
  68. }
  69. void ElectronComponentExtensionResourceManager::AddComponentResourceEntries(
  70. const webui::ResourcePath* entries,
  71. size_t size) {
  72. base::FilePath gen_folder_path = base::FilePath().AppendASCII(
  73. "@out_folder@/gen/chrome/browser/resources/");
  74. gen_folder_path = gen_folder_path.NormalizePathSeparators();
  75. for (size_t i = 0; i < size; ++i) {
  76. base::FilePath resource_path =
  77. base::FilePath().AppendASCII(entries[i].path);
  78. resource_path = resource_path.NormalizePathSeparators();
  79. if (!gen_folder_path.IsParent(resource_path)) {
  80. DCHECK(!base::Contains(path_to_resource_id_, resource_path));
  81. path_to_resource_id_[resource_path] = entries[i].id;
  82. } else {
  83. // If the resource is a generated file, strip the generated folder's path,
  84. // so that it can be served from a normal URL (as if it were not
  85. // generated).
  86. base::FilePath effective_path =
  87. base::FilePath().AppendASCII(resource_path.AsUTF8Unsafe().substr(
  88. gen_folder_path.value().length()));
  89. DCHECK(!base::Contains(path_to_resource_id_, effective_path));
  90. path_to_resource_id_[effective_path] = entries[i].id;
  91. }
  92. }
  93. }
  94. } // namespace extensions