blob: 33b4a1461e6f5cdf65f9a9d37f49b8279848f1ad [file] [log] [blame]
// Copyright (c) 2012 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_MEDIA_WEBRTC_MEDIA_STREAM_DEVICES_CONTROLLER_H_
#define CHROME_BROWSER_MEDIA_WEBRTC_MEDIA_STREAM_DEVICES_CONTROLLER_H_
#include <map>
#include <string>
#include "base/callback.h"
#include "base/macros.h"
#include "build/build_config.h"
#include "components/content_settings/core/common/content_settings.h"
#include "content/public/common/media_stream_request.h"
class MediaStreamDevicesController;
class Profile;
class TabSpecificContentSettings;
enum class PermissionStatusSource;
namespace content {
class WebContents;
}
namespace user_prefs {
class PrefRegistrySyncable;
}
namespace policy {
class MediaStreamDevicesControllerBrowserTest;
}
namespace test {
class MediaStreamDevicesControllerTestApi;
}
class MediaStreamDevicesController {
public:
static void RequestPermissions(const content::MediaStreamRequest& request,
content::MediaResponseCallback callback);
static void RequestAndroidPermissionsIfNeeded(
content::WebContents* web_contents,
std::unique_ptr<MediaStreamDevicesController> controller,
bool did_prompt_for_audio,
bool did_prompt_for_video,
const std::vector<ContentSetting>& responses);
#if defined(OS_ANDROID)
// Called when the Android OS-level prompt is answered.
static void AndroidOSPromptAnswered(
std::unique_ptr<MediaStreamDevicesController> controller,
std::vector<ContentSetting> responses,
bool android_prompt_granted);
#endif // defined(OS_ANDROID)
// Registers the prefs backing the audio and video policies.
static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
~MediaStreamDevicesController();
// Called when a permission prompt is answered through the PermissionManager.
void PromptAnsweredGroupedRequest(
const std::vector<ContentSetting>& responses);
private:
friend class MediaStreamDevicesControllerTest;
friend class test::MediaStreamDevicesControllerTestApi;
friend class policy::MediaStreamDevicesControllerBrowserTest;
MediaStreamDevicesController(content::WebContents* web_contents,
const content::MediaStreamRequest& request,
content::MediaResponseCallback callback);
// Returns true if audio/video should be requested through the
// PermissionManager. We won't try to request permission if the request is
// already blocked for some other reason, e.g. there are no devices available.
bool ShouldRequestAudio() const;
bool ShouldRequestVideo() const;
// Returns a list of devices available for the request for the given
// audio/video permission settings.
content::MediaStreamDevices GetDevices(ContentSetting audio_setting,
ContentSetting video_setting);
// Runs |callback_| with the current audio/video permission settings.
void RunCallback(bool blocked_by_feature_policy);
// Called when the permission has been set to update the
// TabSpecificContentSettings.
void UpdateTabSpecificContentSettings(ContentSetting audio_setting,
ContentSetting video_setting) const;
// Returns the content settings for the given content type and request.
ContentSetting GetContentSetting(
ContentSettingsType content_type,
const content::MediaStreamRequest& request,
content::MediaStreamRequestResult* denial_reason) const;
// Returns true if clicking allow on the dialog should give access to the
// requested devices.
bool IsUserAcceptAllowed(ContentSettingsType content_type) const;
bool PermissionIsBlockedForReason(ContentSettingsType content_type,
PermissionStatusSource reason) const;
// The current state of the audio/video content settings which may be updated
// through the lifetime of the request.
ContentSetting audio_setting_;
ContentSetting video_setting_;
content::MediaStreamRequestResult denial_reason_;
content::WebContents* web_contents_;
// The owner of this class needs to make sure it does not outlive the profile.
Profile* profile_;
// Weak pointer to the tab specific content settings of the tab for which the
// MediaStreamDevicesController was created. The tab specific content
// settings are associated with a the web contents of the tab. The
// MediaStreamDeviceController must not outlive the web contents for which it
// was created.
TabSpecificContentSettings* content_settings_;
// The original request for access to devices.
const content::MediaStreamRequest request_;
// The callback that needs to be Run to notify WebRTC of whether access to
// audio/video devices was granted or not.
content::MediaResponseCallback callback_;
DISALLOW_COPY_AND_ASSIGN(MediaStreamDevicesController);
};
#endif // CHROME_BROWSER_MEDIA_WEBRTC_MEDIA_STREAM_DEVICES_CONTROLLER_H_