summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/chromeos/extensions/file_manager/private_api_misc.cc37
-rw-r--r--chrome/browser/chromeos/extensions/file_manager/private_api_misc.h17
-rw-r--r--chrome/browser/chromeos/file_system_provider/service.cc42
-rw-r--r--chrome/browser/chromeos/file_system_provider/service.h15
-rw-r--r--chrome/common/extensions/api/file_manager_private.idl21
-rw-r--r--extensions/browser/extension_function_histogram_value.h1
-rw-r--r--tools/metrics/histograms/histograms.xml1
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">