| // Copyright 2023 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_ASH_FILE_MANAGER_VIRTUAL_FILE_TASKS_H_ |
| #define CHROME_BROWSER_ASH_FILE_MANAGER_VIRTUAL_FILE_TASKS_H_ |
| |
| #include <vector> |
| |
| #include "chrome/browser/ash/file_manager/file_tasks.h" |
| #include "extensions/browser/entry_info.h" |
| #include "url/gurl.h" |
| |
| class Profile; |
| |
| namespace file_manager::file_tasks { |
| |
| // VirtualTasks are tasks that are not implemented using any 'app' file handling |
| // API, but instead have their implementation in C++. These used to be listed in |
| // the Files app manifest, but they were never implemented in Files app. We |
| // still use the Files app ID (kFileManagerSwaAppId) to store these tasks in |
| // prefs, but this could be migrated in the future. All registered VirtualTasks |
| // are listed in |GetVirtualTasks()|. |
| class VirtualTask { |
| public: |
| VirtualTask(); |
| virtual ~VirtualTask(); |
| |
| // Disallow copy and assign. |
| VirtualTask(const VirtualTask&) = delete; |
| VirtualTask& operator=(const VirtualTask&) = delete; |
| |
| // Execute the task and return an indication of whether it completed, or |
| // started running, if there are async steps. |
| virtual bool Execute(Profile* profile, |
| const TaskDescriptor& task, |
| const std::vector<FileSystemURL>& file_urls) const = 0; |
| // Whether this task should be included in |MatchVirtualTasks()|. This can be |
| // used to disable tasks based on a flag or other runtime conditions. |
| virtual bool IsEnabled(Profile* profile) const = 0; |
| // Whether this task should be available to execute on the supplied files, if |
| // enabled. |Matches()| can return true even if the task is disabled - in this |
| // case the task will not be found by |MatchVirtualTasks()|. Note this has a |
| // default implementation which matches against file extensions and mime types |
| // in |matcher_mime_types_| and |matcher_file_extensions_|. |
| virtual bool Matches(const std::vector<extensions::EntryInfo>& entries, |
| const std::vector<GURL>& file_urls) const; |
| |
| // The ID of this task, which is unique across all virtual tasks. Used for |
| // storing in preferences, and referring to this task in a TaskDescriptor. |
| // These values currently match legacy values from the Files app manifest. |
| virtual std::string id() const = 0; |
| // The user-visible icon in Files app. This can be overridden in Files app |
| // frontend in file_tasks.ts, based on action ID. |
| virtual GURL icon_url() const = 0; |
| // The user-visible title in Files app - make sure it's translated. |
| virtual std::string title() const = 0; |
| // Whether the execution of this task should be blocked by DLP (Data Leak |
| // Prevention). Files app will show the task as greyed out if it otherwise |
| // matches the file URLs and is enabled. |dlp_source_urls| represents the URLs |
| // from which the |entries| passed to |Matches()| were downloaded. The URLs |
| // are empty strings if not tracked by DLP. |
| virtual bool IsDlpBlocked( |
| const std::vector<std::string>& dlp_source_urls) const = 0; |
| |
| protected: |
| std::vector<std::string> matcher_mime_types_; |
| // File extensions without the leading ".". |
| std::vector<std::string> matcher_file_extensions_; |
| }; |
| |
| // Appends any virtual tasks that are enabled and match |entries|/|file_urls| to |
| // |result_list|. |
| void MatchVirtualTasks(Profile* profile, |
| const std::vector<extensions::EntryInfo>& entries, |
| const std::vector<GURL>& file_urls, |
| const std::vector<std::string>& dlp_source_urls, |
| std::vector<FullTaskDescriptor>* result_list); |
| |
| // Run |task| by calling |Execute()| on the associated VirtualTask. |
| bool ExecuteVirtualTask(Profile* profile, |
| const TaskDescriptor& task, |
| const std::vector<FileSystemURL>& file_urls); |
| |
| // Whether |task| is a virtual task and can be executed using |
| // |ExecuteVirtualTask()|. Returns true for disabled tasks, too. |
| bool IsVirtualTask(const TaskDescriptor& task); |
| |
| // Look up/get the VirtualTask for |task| if it exists, or nullptr. |
| VirtualTask* FindVirtualTask(const TaskDescriptor& task); |
| |
| // Tests can insert into this vector and it will be used instead of the real |
| // tasks if it's non-empty. |
| std::vector<VirtualTask*>& GetTestVirtualTasks(); |
| |
| } // namespace file_manager::file_tasks |
| |
| #endif // CHROME_BROWSER_ASH_FILE_MANAGER_VIRTUAL_FILE_TASKS_H_ |