icon_manager.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. // Copyright (c) 2012 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. // Class for finding and caching Windows explorer icons. The IconManager
  6. // lives on the UI thread but performs icon extraction work on the file thread
  7. // to avoid blocking the UI thread with potentially expensive COM and disk
  8. // operations.
  9. //
  10. // Terminology
  11. //
  12. // Windows files have icons associated with them that can be of two types:
  13. // 1. "Per class": the icon used for this file is used for all files with the
  14. // same file extension or class. Examples are PDF or MP3 files, which use
  15. // the same icon for all files of that type.
  16. // 2. "Per instance": the icon used for this file is embedded in the file
  17. // itself and is unique. Executable files are typically "per instance".
  18. //
  19. // Files that end in the following extensions are considered "per instance":
  20. // .exe
  21. // .dll
  22. // .ico
  23. // The IconManager will do explicit icon loads on the full path of these files
  24. // and cache the results per file. All other file types will be looked up by
  25. // file extension and the results will be cached per extension. That way, all
  26. // .mp3 files will share one icon, but all .exe files will have their own icon.
  27. //
  28. // POSIX files don't have associated icons. We query the OS by the file's
  29. // mime type.
  30. //
  31. // The IconManager can be queried in two ways:
  32. // 1. A quick, synchronous check of its caches which does not touch the disk:
  33. // IconManager::LookupIcon()
  34. // 2. An asynchronous icon load from a file on the file thread:
  35. // IconManager::LoadIcon()
  36. //
  37. // When using the second (asynchronous) method, callers must supply a callback
  38. // which will be run once the icon has been extracted. The icon manager will
  39. // cache the results of the icon extraction so that subsequent lookups will be
  40. // fast.
  41. //
  42. // Icon bitmaps returned should be treated as const since they may be referenced
  43. // by other clients. Make a copy of the icon if you need to modify it.
  44. #ifndef CHROME_BROWSER_ICON_MANAGER_H_
  45. #define CHROME_BROWSER_ICON_MANAGER_H_
  46. #include <map>
  47. #include <memory>
  48. #include "base/files/file_path.h"
  49. #include "base/macros.h"
  50. #include "base/memory/weak_ptr.h"
  51. #include "base/task/cancelable_task_tracker.h"
  52. #include "chrome/browser/icon_loader.h"
  53. #include "ui/gfx/image/image.h"
  54. class IconManager {
  55. public:
  56. IconManager();
  57. ~IconManager();
  58. // Synchronous call to examine the internal caches for the icon. Returns the
  59. // icon if we have already loaded it, or null if we don't have it and must
  60. // load it via LoadIcon(). The returned bitmap is owned by the IconManager and
  61. // must not be free'd by the caller. If the caller needs to modify the icon,
  62. // it must make a copy and modify the copy.
  63. gfx::Image* LookupIconFromFilepath(const base::FilePath& file_path,
  64. IconLoader::IconSize size);
  65. using IconRequestCallback = base::Callback<void(gfx::Image*)>;
  66. // Asynchronous call to lookup and return the icon associated with file. The
  67. // work is done on the file thread, with the callbacks running on the thread
  68. // this function is called.
  69. //
  70. // Note:
  71. // 1. This does *not* check the cache.
  72. // 2. The returned bitmap pointer is *not* owned by callback. So callback
  73. // should never keep it or delete it.
  74. // 3. The gfx::Image pointer passed to the callback will be null if decoding
  75. // failed.
  76. base::CancelableTaskTracker::TaskId LoadIcon(
  77. const base::FilePath& file_name,
  78. IconLoader::IconSize size,
  79. const IconRequestCallback& callback,
  80. base::CancelableTaskTracker* tracker);
  81. private:
  82. void OnIconLoaded(IconRequestCallback callback,
  83. base::FilePath file_path,
  84. IconLoader::IconSize size,
  85. std::unique_ptr<gfx::Image> result,
  86. const IconLoader::IconGroup& group);
  87. struct CacheKey {
  88. CacheKey(const IconLoader::IconGroup& group, IconLoader::IconSize size);
  89. // Used as a key in the map below, so we need this comparator.
  90. bool operator<(const CacheKey& other) const;
  91. IconLoader::IconGroup group;
  92. IconLoader::IconSize size;
  93. };
  94. std::map<base::FilePath, IconLoader::IconGroup> group_cache_;
  95. std::map<CacheKey, std::unique_ptr<gfx::Image>> icon_cache_;
  96. base::WeakPtrFactory<IconManager> weak_factory_;
  97. DISALLOW_COPY_AND_ASSIGN(IconManager);
  98. };
  99. #endif // CHROME_BROWSER_ICON_MANAGER_H_