| // Copyright 2012 The Chromium Authors | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef CHROME_BROWSER_ICON_LOADER_H_ | 
 | #define CHROME_BROWSER_ICON_LOADER_H_ | 
 |  | 
 | #include "base/files/file_path.h" | 
 | #include "base/functional/callback.h" | 
 | #include "base/task/single_thread_task_runner.h" | 
 | #include "base/task/task_traits.h" | 
 | #include "build/build_config.h" | 
 | #include "content/public/browser/browser_thread.h" | 
 | #include "ui/gfx/image/image.h" | 
 |  | 
 | //////////////////////////////////////////////////////////////////////////////// | 
 | // | 
 | // A facility to read a file containing an icon asynchronously in the IO | 
 | // thread. Returns the icon in the form of an ImageSkia. | 
 | // | 
 | //////////////////////////////////////////////////////////////////////////////// | 
 | class IconLoader { | 
 |  public: | 
 |   // An IconGroup is a class of files that all share the same icon. | 
 | #if BUILDFLAG(IS_MAC) | 
 |   // On the Mac, it's the UTType's identifier. (Apps do have unique icons, just | 
 |   // like in Windows, below, but `IconLoader` is never used to get their icons, | 
 |   // so that case isn't handled.) | 
 |   using IconGroup = std::string; | 
 | #else | 
 |   // On all other platforms except Windows, and for most files on Windows, it is | 
 |   // the file type (e.g. all .mp3 files share an icon, all .html files share an | 
 |   // icon). On Windows, for certain file types (.exe, .dll, etc), each file of | 
 |   // that type is assumed to have a unique icon. In that case, each of those | 
 |   // files is a group to itself. | 
 |   using IconGroup = base::FilePath::StringType; | 
 | #endif | 
 |  | 
 |   enum IconSize { | 
 |     SMALL = 0,  // 16x16 | 
 |     NORMAL,     // 32x32 | 
 |     LARGE,      // Windows: 32x32, Linux: 48x48, Mac: Unsupported | 
 |     ALL,        // All sizes available | 
 |   }; | 
 |  | 
 |   // The callback invoked when an icon has been read. The parameters are: | 
 |   // - The icon that was loaded (IsEmpty() will be true on failure to load). | 
 |   // - The determined group from the original requested path. | 
 |   using IconLoadedCallback = | 
 |       base::OnceCallback<void(gfx::Image, const IconGroup&)>; | 
 |  | 
 |   // Starts the process of reading the icon. When the reading of the icon is | 
 |   // complete, the IconLoadedCallback callback will be fulfilled, and the | 
 |   // IconLoader will delete itself. | 
 |   static void LoadIcon(const base::FilePath& file_path, | 
 |                        IconSize size, | 
 |                        float scale, | 
 |                        IconLoadedCallback callback); | 
 |  | 
 |   IconLoader(const IconLoader&) = delete; | 
 |   IconLoader& operator=(const IconLoader&) = delete; | 
 |  | 
 |  private: | 
 |   IconLoader(const base::FilePath& file_path, | 
 |              IconSize size, | 
 |              float scale, | 
 |              IconLoadedCallback callback); | 
 |  | 
 |   ~IconLoader(); | 
 |  | 
 |   void Start(); | 
 |  | 
 |   // Given a file path, get the group for the given file. | 
 |   static IconGroup GroupForFilepath(const base::FilePath& file_path); | 
 |  | 
 |   // The TaskRunner that ReadIcon() must be called on. | 
 |   static scoped_refptr<base::TaskRunner> GetReadIconTaskRunner(); | 
 |  | 
 | #if !BUILDFLAG(IS_CHROMEOS) | 
 |   void ReadGroup(); | 
 |   void ReadIcon(); | 
 | #endif | 
 | #if BUILDFLAG(IS_WIN) | 
 |   // Reads an icon in a sandboxed service. Use this when the file itself must | 
 |   // be parsed. | 
 |   void ReadIconInSandbox(); | 
 | #endif | 
 |  | 
 |   // The traits of the tasks posted to base::ThreadPool by this class. These | 
 |   // operations may block, because they are fetching icons from the disk, yet | 
 |   // the result will be seen by the user so they should be prioritized | 
 |   // accordingly. They should not however block shutdown if long running. | 
 |   static constexpr base::TaskTraits traits() { | 
 |     return {base::MayBlock(), base::TaskPriority::USER_VISIBLE, | 
 |             base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN}; | 
 |   } | 
 |  | 
 |   // The task runner object of the thread in which we notify the delegate. | 
 |   scoped_refptr<base::SingleThreadTaskRunner> target_task_runner_; | 
 |  | 
 |   base::FilePath file_path_; | 
 |  | 
 |   IconGroup group_; | 
 |  | 
 | #if !BUILDFLAG(IS_ANDROID) | 
 |   IconSize icon_size_; | 
 | #endif  // !BUILDFLAG(IS_ANDROID) | 
 |   const float scale_; | 
 |   IconLoadedCallback callback_; | 
 | }; | 
 |  | 
 | #endif  // CHROME_BROWSER_ICON_LOADER_H_ |