blob: 0a7934ea59af0ae221854c9f02e55a2e8f39304b [file] [log] [blame]
// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_BROWSER_EXTENSIONS_API_FILE_SYSTEM_CONSENT_PROVIDER_H_
#define CHROME_BROWSER_EXTENSIONS_API_FILE_SYSTEM_CONSENT_PROVIDER_H_
#include "base/callback_forward.h"
#include "base/macros.h"
#include "base/memory/weak_ptr.h"
#include "build/build_config.h"
#include "extensions/browser/api/file_system/file_system_delegate.h"
#include "ui/base/ui_base_types.h"
class Profile;
namespace content {
class RenderFrameHost;
} // content
namespace file_manager {
class Volume;
} // namespace file_manager
namespace extensions {
class Extension;
class ScopedSkipRequestFileSystemDialog;
namespace file_system_api {
// Requests consent for the chrome.fileSystem.requestFileSystem() method.
// Interaction with UI and environmental checks (kiosk mode, whitelist) are
// provided by a delegate: ConsentProviderDelegate. For testing, it is
// TestingConsentProviderDelegate.
// This class may post callbacks given to it, but does not asynchronously call
// itself. It is generally safe to use a temporary ConsentProvider.
// TODO(michaelpg): Make this easier to use by replacing member functions with
// static methods.
class ConsentProvider {
public:
enum Consent { CONSENT_GRANTED, CONSENT_REJECTED, CONSENT_IMPOSSIBLE };
typedef base::Callback<void(Consent)> ConsentCallback;
typedef base::Callback<void(ui::DialogButton)> ShowDialogCallback;
// Interface for delegating user interaction for granting permissions.
class DelegateInterface {
public:
// Shows a dialog for granting permissions.
virtual void ShowDialog(const Extension& extension,
content::RenderFrameHost* host,
const base::WeakPtr<file_manager::Volume>& volume,
bool writable,
const ShowDialogCallback& callback) = 0;
// Shows a notification about permissions automatically granted access.
virtual void ShowNotification(
const Extension& extension,
const base::WeakPtr<file_manager::Volume>& volume,
bool writable) = 0;
// Checks if the extension was launched in auto-launch kiosk mode.
virtual bool IsAutoLaunched(const Extension& extension) = 0;
// Checks if the extension is a whitelisted component extension or app.
virtual bool IsWhitelistedComponent(const Extension& extension) = 0;
// Checks if the extension has the permission to access Downloads.
virtual bool HasRequestDownloadsPermission(const Extension& extension) = 0;
};
explicit ConsentProvider(DelegateInterface* delegate);
~ConsentProvider();
// Requests consent for granting |writable| permissions to the |volume|
// volume by the |extension|. Must be called only if the extension is
// grantable, which can be checked with GetGrantVolumesMode() and
// IsGrantableForVolume().
void RequestConsent(const Extension& extension,
content::RenderFrameHost* host,
const base::WeakPtr<file_manager::Volume>& volume,
bool writable,
const ConsentCallback& callback);
// Returns granted access mode for the |extension|.
FileSystemDelegate::GrantVolumesMode GetGrantVolumesMode(
const Extension& extension);
// Checks whether the |extension| can be granted |volume| access.
bool IsGrantableForVolume(const Extension& extension,
const base::WeakPtr<file_manager::Volume>& volume);
private:
DelegateInterface* const delegate_;
DISALLOW_COPY_AND_ASSIGN(ConsentProvider);
};
// Handles interaction with user as well as environment checks (whitelists,
// context of running extensions) for ConsentProvider.
class ConsentProviderDelegate : public ConsentProvider::DelegateInterface {
public:
explicit ConsentProviderDelegate(Profile* profile);
~ConsentProviderDelegate();
private:
friend ScopedSkipRequestFileSystemDialog;
// Sets a fake result for the user consent dialog. If ui::DIALOG_BUTTON_NONE
// then disabled.
static void SetAutoDialogButtonForTest(ui::DialogButton button);
// ConsentProvider::DelegateInterface overrides:
void ShowDialog(const Extension& extension,
content::RenderFrameHost* host,
const base::WeakPtr<file_manager::Volume>& volume,
bool writable,
const file_system_api::ConsentProvider::ShowDialogCallback&
callback) override;
void ShowNotification(const Extension& extension,
const base::WeakPtr<file_manager::Volume>& volume,
bool writable) override;
bool IsAutoLaunched(const Extension& extension) override;
bool IsWhitelistedComponent(const Extension& extension) override;
bool HasRequestDownloadsPermission(const Extension& extension) override;
Profile* const profile_;
DISALLOW_COPY_AND_ASSIGN(ConsentProviderDelegate);
};
} // namespace file_system_api
} // namespace extensions
#endif // CHROME_BROWSER_EXTENSIONS_API_FILE_SYSTEM_CONSENT_PROVIDER_H_