diff options
7 files changed, 130 insertions, 4 deletions
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc index 0b2b731..25c830a 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc @@ -15,6 +15,7 @@ #include "chrome/browser/chromeos/file_manager/app_installer.h" #include "chrome/browser/chromeos/file_manager/fileapi_util.h" #include "chrome/browser/chromeos/file_manager/zip_file_creator.h" +#include "chrome/browser/chromeos/file_system_provider/service.h" #include "chrome/browser/chromeos/profiles/profile_helper.h" #include "chrome/browser/chromeos/settings/cros_settings.h" #include "chrome/browser/devtools/devtools_window.h" @@ -463,12 +464,40 @@ void FileManagerPrivateGetMimeTypeFunction::OnGetMimeType( ExtensionFunction::ResponseAction FileManagerPrivateIsPiexLoaderEnabledFunction::Run() { #if defined(OFFICIAL_BUILD) - return RespondNow(OneArgument( - new base::FundamentalValue(true))); + return RespondNow(OneArgument(new base::FundamentalValue(true))); #else - return RespondNow(OneArgument( - new base::FundamentalValue(false))); + return RespondNow(OneArgument(new base::FundamentalValue(false))); #endif } +FileManagerPrivateGetProvidingExtensionsFunction:: + FileManagerPrivateGetProvidingExtensionsFunction() + : chrome_details_(this) { +} + +ExtensionFunction::ResponseAction +FileManagerPrivateGetProvidingExtensionsFunction::Run() { + using chromeos::file_system_provider::Service; + using chromeos::file_system_provider::ProvidingExtensionInfo; + const Service* const service = Service::Get(chrome_details_.GetProfile()); + const std::vector<ProvidingExtensionInfo> info_list = + service->GetProvidingExtensionInfoList(); + + using api::file_manager_private::ProvidingExtension; + std::vector<linked_ptr<ProvidingExtension>> providing_extensions; + for (const auto& info : info_list) { + const linked_ptr<ProvidingExtension> providing_extension( + new ProvidingExtension); + providing_extension->extension_id = info.extension_id; + providing_extension->name = info.name; + providing_extension->can_configure = info.can_configure; + providing_extension->can_add = info.can_add; + providing_extensions.push_back(providing_extension); + } + + return RespondNow(ArgumentList( + api::file_manager_private::GetProvidingExtensions::Results::Create( + providing_extensions).Pass())); +} + } // namespace extensions diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.h b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.h index c6d7cbb..e11e11b 100644 --- a/chrome/browser/chromeos/extensions/file_manager/private_api_misc.h +++ b/chrome/browser/chromeos/extensions/file_manager/private_api_misc.h @@ -9,6 +9,8 @@ #define CHROME_BROWSER_CHROMEOS_EXTENSIONS_FILE_MANAGER_PRIVATE_API_MISC_H_ #include "chrome/browser/chromeos/extensions/file_manager/private_api_base.h" +#include "chrome/browser/extensions/chrome_extension_function.h" +#include "chrome/browser/extensions/chrome_extension_function_details.h" #include "chrome/common/extensions/webstore_install_result.h" #include "google_apis/drive/drive_api_error_codes.h" @@ -196,6 +198,21 @@ class FileManagerPrivateIsPiexLoaderEnabledFunction DISALLOW_COPY_AND_ASSIGN(FileManagerPrivateIsPiexLoaderEnabledFunction); }; +// Implements the chrome.fileManagerPrivate.getProvidingExtensions method. +class FileManagerPrivateGetProvidingExtensionsFunction + : public UIThreadExtensionFunction { + public: + FileManagerPrivateGetProvidingExtensionsFunction(); + DECLARE_EXTENSION_FUNCTION("fileManagerPrivate.getProvidingExtensions", + FILEMANAGERPRIVATE_GETPROVIDINGEXTENSIONS) + protected: + ~FileManagerPrivateGetProvidingExtensionsFunction() override {} + + private: + ResponseAction Run() override; + const ChromeExtensionFunctionDetails chrome_details_; + DISALLOW_COPY_AND_ASSIGN(FileManagerPrivateGetProvidingExtensionsFunction); +}; } // namespace extensions #endif // CHROME_BROWSER_CHROMEOS_EXTENSIONS_FILE_MANAGER_PRIVATE_API_MISC_H_ diff --git a/chrome/browser/chromeos/file_system_provider/service.cc b/chrome/browser/chromeos/file_system_provider/service.cc index 08f0985..b764523 100644 --- a/chrome/browser/chromeos/file_system_provider/service.cc +++ b/chrome/browser/chromeos/file_system_provider/service.cc @@ -20,6 +20,8 @@ #include "extensions/browser/event_router.h" #include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_system.h" +#include "extensions/common/permissions/api_permission.h" +#include "extensions/common/permissions/permissions_data.h" #include "storage/browser/fileapi/external_mount_points.h" #include "storage/common/fileapi/file_system_mount_option.h" @@ -41,6 +43,13 @@ ProvidedFileSystemInterface* CreateProvidedFileSystem( } // namespace +ProvidingExtensionInfo::ProvidingExtensionInfo() + : can_configure(false), can_add(false) { +} + +ProvidingExtensionInfo::~ProvidingExtensionInfo() { +} + Service::Service(Profile* profile, extensions::ExtensionRegistry* extension_registry) : profile_(profile), @@ -294,6 +303,39 @@ ProvidedFileSystemInterface* Service::GetProvidedFileSystem( return file_system_it->second; } +std::vector<ProvidingExtensionInfo> Service::GetProvidingExtensionInfoList() + const { + extensions::ExtensionRegistry* const registry = + extensions::ExtensionRegistry::Get(profile_); + DCHECK(registry); + + extensions::EventRouter* const router = + extensions::EventRouter::Get(profile_); + DCHECK(router); + + std::vector<ProvidingExtensionInfo> result; + for (const auto& extension : registry->enabled_extensions()) { + if (!extension->permissions_data()->HasAPIPermission( + extensions::APIPermission::kFileSystemProvider)) { + continue; + } + + ProvidingExtensionInfo info; + info.extension_id = extension->id(); + info.name = extension->name(); + info.can_configure = router->ExtensionHasEventListener( + extension->id(), extensions::api::file_system_provider:: + OnConfigureRequested::kEventName); + info.can_add = router->ExtensionHasEventListener( + extension->id(), + extensions::api::file_system_provider::OnMountRequested::kEventName); + + result.push_back(info); + } + + return result; +} + void Service::OnExtensionUnloaded( content::BrowserContext* browser_context, const extensions::Extension* extension, diff --git a/chrome/browser/chromeos/file_system_provider/service.h b/chrome/browser/chromeos/file_system_provider/service.h index 61dd0ed..d2477f5 100644 --- a/chrome/browser/chromeos/file_system_provider/service.h +++ b/chrome/browser/chromeos/file_system_provider/service.h @@ -50,6 +50,17 @@ struct MountOptions; // Registers preferences to remember registered file systems between reboots. void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); +// Holds information for a providing extension. +struct ProvidingExtensionInfo { + ProvidingExtensionInfo(); + ~ProvidingExtensionInfo(); + + std::string extension_id; + std::string name; + bool can_configure; + bool can_add; +}; + // Manages and registers the file system provider service. Maintains provided // file systems. class Service : public KeyedService, @@ -118,6 +129,10 @@ class Service : public KeyedService, ProvidedFileSystemInterface* GetProvidedFileSystem( const std::string& mount_point_name); + // Returns a list of information of all currently installed providing + // extensions. + std::vector<ProvidingExtensionInfo> GetProvidingExtensionInfoList() const; + // Adds and removes observers. void AddObserver(Observer* observer); void RemoveObserver(Observer* observer); diff --git a/chrome/common/extensions/api/file_manager_private.idl b/chrome/common/extensions/api/file_manager_private.idl index be6cd53..8cdea54 100644 --- a/chrome/common/extensions/api/file_manager_private.idl +++ b/chrome/common/extensions/api/file_manager_private.idl @@ -518,6 +518,21 @@ dictionary DeviceEvent { DOMString devicePath; }; +// Describes an installed providing extension. +dictionary ProvidingExtension { + // ID of the providing extension. + DOMString extensionId; + + // Name of the providing extension. + DOMString name; + + // Whether supports configuration dialog. + boolean canConfigure; + + // Whether supports adding new instances. + boolean canAdd; +}; + // Callback that does not take arguments. callback SimpleCallback = void(); @@ -611,6 +626,9 @@ callback ResolveEntriesCallback = // |checksum| Result checksum. callback ComputeChecksumCallback = void(DOMString checksum); +// |extensions| List of providing extensions. +callback GetProvidingExtensionsCallback = void(ProvidingExtension[] extensions); + interface Functions { // Logout the current user for navigating to the re-authentication screen for // the Google account. @@ -888,6 +906,9 @@ interface Functions { // Returns if Piex loader is enabled. static void isPiexLoaderEnabled(BooleanCallback callback); + + // Returns list of available providing extensions. + static void getProvidingExtensions(GetProvidingExtensionsCallback callback); }; interface Events { diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h index c182e48..ac0412a 100644 --- a/extensions/browser/extension_function_histogram_value.h +++ b/extensions/browser/extension_function_histogram_value.h @@ -1061,6 +1061,7 @@ enum HistogramValue { DEVELOPERPRIVATE_GETPROFILECONFIGURATION, DEVELOPERPRIVATE_UPDATEPROFILECONFIGURATION, SOCKETS_UDP_SETBROADCAST, + FILEMANAGERPRIVATE_GETPROVIDINGEXTENSIONS, // Last entry: Add new entries above and ensure to update // tools/metrics/histograms/histograms.xml. ENUM_BOUNDARY diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 6b4ce5b..eee68bd 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml @@ -50645,6 +50645,7 @@ Therefore, the affected-histogram name has to have at least one dot in it. <int value="1000" label="DEVELOPERPRIVATE_GETPROFILECONFIGURATION"/> <int value="1001" label="DEVELOPERPRIVATE_UPDATEPROFILECONFIGURATION"/> <int value="1002" label="SOCKETS_UDP_SETBROADCAST"/> + <int value="1003" label="FILEMANAGERPRIVATE_GETPROVIDINGEXTENSIONS"/> </enum> <enum name="ExtensionInstallCause" type="int"> |