Commit 249c490d authored by Bailey Berro's avatar Bailey Berro Committed by Commit Bot

fix crash for native providers

This change fixes a crash when Native Filesystem Providers call the
Service::RequestMount() function via the providers_menu in the CrOS
Files App.

Bug: chromium:827023
Test: manually verified on eve
Change-Id: I25ba6fb33fe9c9ae1a360368c0d8bb45728fc7a1
Reviewed-on: https://chromium-review.googlesource.com/972421Reviewed-by: default avatarNaoki Fukino <fukino@chromium.org>
Reviewed-by: default avatarTomasz Mikolajewski <mtomasz@chromium.org>
Reviewed-by: default avatarZentaro Kavanagh <zentaro@chromium.org>
Commit-Queue: Bailey Berro <baileyberro@chromium.org>
Cr-Commit-Position: refs/heads/master@{#546741}
parent 334db5a1
......@@ -13,6 +13,7 @@
#include "chrome/browser/chromeos/file_system_provider/provided_file_system.h"
#include "chrome/browser/chromeos/file_system_provider/throttled_file_system.h"
#include "chrome/browser/profiles/profile.h"
#include "extensions/browser/event_router.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/common/permissions/permissions_data.h"
......@@ -88,6 +89,27 @@ const IconSet& ExtensionProvider::GetIconSet() const {
return icon_set_;
}
bool ExtensionProvider::RequestMount(Profile* profile) {
extensions::EventRouter* const event_router =
extensions::EventRouter::Get(profile);
DCHECK(event_router);
if (!event_router->ExtensionHasEventListener(
provider_id_.GetExtensionId(), extensions::api::file_system_provider::
OnMountRequested::kEventName)) {
return false;
}
event_router->DispatchEventToExtension(
provider_id_.GetExtensionId(),
std::make_unique<extensions::Event>(
extensions::events::FILE_SYSTEM_PROVIDER_ON_MOUNT_REQUESTED,
extensions::api::file_system_provider::OnMountRequested::kEventName,
std::unique_ptr<base::ListValue>(new base::ListValue())));
return true;
}
ExtensionProvider::ExtensionProvider(
const extensions::ExtensionId& extension_id,
const ProvidingExtensionInfo& info)
......
......@@ -51,6 +51,7 @@ class ExtensionProvider : public ProviderInterface {
const ProviderId& GetId() const override;
const std::string& GetName() const override;
const IconSet& GetIconSet() const override;
bool RequestMount(Profile* profile) override;
private:
ExtensionProvider(const extensions::ExtensionId& extension_id,
......
......@@ -53,6 +53,10 @@ const IconSet& FakeExtensionProvider::GetIconSet() const {
return icon_set_;
}
bool FakeExtensionProvider::RequestMount(Profile* profile) {
return true;
}
FakeExtensionProvider::FakeExtensionProvider(
const extensions::ExtensionId& extension_id,
const Capabilities& capabilities)
......
......@@ -36,6 +36,7 @@ class FakeExtensionProvider : public ProviderInterface {
const ProviderId& GetId() const override;
const std::string& GetName() const override;
const IconSet& GetIconSet() const override;
bool RequestMount(Profile* profile) override;
protected:
FakeExtensionProvider(const extensions::ExtensionId& extension_id,
......
......@@ -67,6 +67,10 @@ class ProviderInterface {
// Returns an icon URL set for the provider.
virtual const IconSet& GetIconSet() const = 0;
// Requests mounting a new file system. Returns false if the request could not
// be created, true otherwise.
virtual bool RequestMount(Profile* profile) = 0;
};
} // namespace file_system_provider
......
......@@ -20,7 +20,6 @@
#include "chrome/browser/chromeos/file_system_provider/throttled_file_system.h"
#include "components/prefs/pref_service.h"
#include "components/prefs/scoped_user_pref_update.h"
#include "extensions/browser/event_router.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_system.h"
#include "extensions/common/extension_id.h"
......@@ -262,24 +261,8 @@ bool Service::RequestUnmount(const ProviderId& provider_id,
bool Service::RequestMount(const ProviderId& provider_id) {
DCHECK(thread_checker_.CalledOnValidThread());
extensions::EventRouter* const event_router =
extensions::EventRouter::Get(profile_);
DCHECK(event_router);
if (!event_router->ExtensionHasEventListener(
provider_id.GetExtensionId(), extensions::api::file_system_provider::
OnMountRequested::kEventName)) {
return false;
}
event_router->DispatchEventToExtension(
provider_id.GetExtensionId(),
std::make_unique<extensions::Event>(
extensions::events::FILE_SYSTEM_PROVIDER_ON_MOUNT_REQUESTED,
extensions::api::file_system_provider::OnMountRequested::kEventName,
std::unique_ptr<base::ListValue>(new base::ListValue())));
return true;
ProviderInterface* const provider = GetProvider(provider_id);
return provider->RequestMount(profile_);
}
std::vector<ProvidedFileSystemInfo> Service::GetProvidedFileSystemInfoList() {
......
......@@ -57,5 +57,9 @@ const IconSet& SmbProvider::GetIconSet() const {
return icon_set_;
}
bool SmbProvider::RequestMount(Profile* profile) {
return false;
}
} // namespace smb_client
} // namespace chromeos
......@@ -43,6 +43,7 @@ class SmbProvider : public ProviderInterface {
const ProviderId& GetId() const override;
const std::string& GetName() const override;
const IconSet& GetIconSet() const override;
bool RequestMount(Profile* profile) override;
private:
ProviderId provider_id_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment