Index: chrome/browser/media/media_stream_devices_controller_browsertest.cc |
diff --git a/chrome/browser/media/media_stream_devices_controller_browsertest.cc b/chrome/browser/media/media_stream_devices_controller_browsertest.cc |
deleted file mode 100644 |
index 93bd2fb1b228729b796aa66a32332c3413a6ca30..0000000000000000000000000000000000000000 |
--- a/chrome/browser/media/media_stream_devices_controller_browsertest.cc |
+++ /dev/null |
@@ -1,734 +0,0 @@ |
-// Copyright 2014 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. |
- |
-#include <string> |
- |
-#include "base/bind.h" |
-#include "base/metrics/field_trial.h" |
-#include "chrome/browser/content_settings/host_content_settings_map_factory.h" |
-#include "chrome/browser/content_settings/tab_specific_content_settings.h" |
-#include "chrome/browser/media/media_capture_devices_dispatcher.h" |
-#include "chrome/browser/media/media_stream_capture_indicator.h" |
-#include "chrome/browser/media/media_stream_device_permissions.h" |
-#include "chrome/browser/media/media_stream_devices_controller.h" |
-#include "chrome/browser/media/webrtc_browsertest_base.h" |
-#include "chrome/browser/permissions/permission_context_base.h" |
-#include "chrome/browser/permissions/permission_util.h" |
-#include "chrome/browser/profiles/profile.h" |
-#include "chrome/browser/ui/browser.h" |
-#include "chrome/browser/ui/tabs/tab_strip_model.h" |
-#include "chrome/common/pref_names.h" |
-#include "chrome/test/base/ui_test_utils.h" |
-#include "components/content_settings/core/browser/host_content_settings_map.h" |
-#include "components/prefs/pref_service.h" |
-#include "components/variations/variations_associated_data.h" |
-#include "content/public/common/media_stream_request.h" |
-#include "content/public/test/mock_render_process_host.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace { |
- |
-// Causes the controller to update the TabSpecificContentSettings associated |
-// with the same WebContents with the current permissions. This should be the |
-// last change made to the controller in the test. |
-void NotifyTabSpecificContentSettings( |
- MediaStreamDevicesController* controller) { |
- // Note that calling Deny() would have the same effect of passing the current |
- // permissions state to the TabSpecificContentSettings. Deny() and Accept() |
- // differ in their effect on the controller itself, but that is not important |
- // in the tests calling this. |
- if (controller->IsAskingForAudio() || controller->IsAskingForVideo()) |
- controller->PermissionGranted(); |
-} |
- |
-} // namespace |
- |
-class MediaStreamDevicesControllerTest : public WebRtcTestBase { |
- public: |
- MediaStreamDevicesControllerTest() |
- : example_audio_id_("fake_audio_dev"), |
- example_video_id_("fake_video_dev"), |
- media_stream_result_(content::NUM_MEDIA_REQUEST_RESULTS) {} |
- |
- // Dummy callback for when we deny the current request directly. |
- void OnMediaStreamResponse(const content::MediaStreamDevices& devices, |
- content::MediaStreamRequestResult result, |
- std::unique_ptr<content::MediaStreamUI> ui) { |
- media_stream_devices_ = devices; |
- media_stream_result_ = result; |
- } |
- |
- protected: |
- enum DeviceType { DEVICE_TYPE_AUDIO, DEVICE_TYPE_VIDEO }; |
- enum Access { ACCESS_ALLOWED, ACCESS_DENIED }; |
- |
- const GURL& example_url() const { return example_url_; } |
- |
- TabSpecificContentSettings* GetContentSettings() { |
- return TabSpecificContentSettings::FromWebContents(GetWebContents()); |
- } |
- |
- const std::string& example_audio_id() const { return example_audio_id_; } |
- const std::string& example_video_id() const { return example_video_id_; } |
- |
- content::MediaStreamRequestResult media_stream_result() const { |
- return media_stream_result_; |
- } |
- |
- // Sets the device policy-controlled |access| for |example_url_| to be for the |
- // selected |device_type|. |
- void SetDevicePolicy(DeviceType device_type, Access access) { |
- PrefService* prefs = Profile::FromBrowserContext( |
- GetWebContents()->GetBrowserContext())->GetPrefs(); |
- const char* policy_name = NULL; |
- switch (device_type) { |
- case DEVICE_TYPE_AUDIO: |
- policy_name = prefs::kAudioCaptureAllowed; |
- break; |
- case DEVICE_TYPE_VIDEO: |
- policy_name = prefs::kVideoCaptureAllowed; |
- break; |
- } |
- prefs->SetBoolean(policy_name, access == ACCESS_ALLOWED); |
- } |
- |
- // Set the content settings for mic/cam. |
- void SetContentSettings(ContentSetting mic_setting, |
- ContentSetting cam_setting) { |
- HostContentSettingsMap* content_settings = |
- HostContentSettingsMapFactory::GetForProfile( |
- Profile::FromBrowserContext(GetWebContents()->GetBrowserContext())); |
- content_settings->SetContentSettingDefaultScope( |
- example_url_, GURL(), CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC, |
- std::string(), mic_setting); |
- content_settings->SetContentSettingDefaultScope( |
- example_url_, GURL(), CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA, |
- std::string(), cam_setting); |
- } |
- |
- // Checks whether the devices returned in OnMediaStreamResponse contains a |
- // microphone and/or camera device. |
- bool DevicesContains(bool needs_mic, bool needs_cam) { |
- bool has_mic = false; |
- bool has_cam = false; |
- for (const auto& device : media_stream_devices_) { |
- if (device.type == content::MEDIA_DEVICE_AUDIO_CAPTURE) |
- has_mic = true; |
- if (device.type == content::MEDIA_DEVICE_VIDEO_CAPTURE) |
- has_cam = true; |
- } |
- |
- return needs_mic == has_mic && needs_cam == has_cam; |
- } |
- |
- content::WebContents* GetWebContents() { |
- return browser()->tab_strip_model()->GetActiveWebContents(); |
- } |
- |
- // Creates a MediaStreamRequest, asking for those media types, which have a |
- // non-empty id string. |
- content::MediaStreamRequest CreateRequestWithType( |
- const std::string& audio_id, |
- const std::string& video_id, |
- content::MediaStreamRequestType request_type) { |
- content::MediaStreamType audio_type = |
- audio_id.empty() ? content::MEDIA_NO_SERVICE |
- : content::MEDIA_DEVICE_AUDIO_CAPTURE; |
- content::MediaStreamType video_type = |
- video_id.empty() ? content::MEDIA_NO_SERVICE |
- : content::MEDIA_DEVICE_VIDEO_CAPTURE; |
- return content::MediaStreamRequest(0, 0, 0, example_url(), false, |
- request_type, audio_id, video_id, |
- audio_type, video_type); |
- } |
- |
- content::MediaStreamRequest CreateRequest(const std::string& audio_id, |
- const std::string& video_id) { |
- return CreateRequestWithType(audio_id, video_id, |
- content::MEDIA_DEVICE_ACCESS); |
- } |
- |
- void InitWithUrl(const GURL& url) { |
- DCHECK(example_url_.is_empty()); |
- example_url_ = url; |
- ui_test_utils::NavigateToURL(browser(), example_url_); |
- EXPECT_EQ(TabSpecificContentSettings::MICROPHONE_CAMERA_NOT_ACCESSED, |
- GetContentSettings()->GetMicrophoneCameraState()); |
- } |
- |
- private: |
- void SetUpOnMainThread() override { |
- WebRtcTestBase::SetUpOnMainThread(); |
- |
- // Cleanup. |
- media_stream_devices_.clear(); |
- media_stream_result_ = content::NUM_MEDIA_REQUEST_RESULTS; |
- |
- content::MediaStreamDevices audio_devices; |
- content::MediaStreamDevice fake_audio_device( |
- content::MEDIA_DEVICE_AUDIO_CAPTURE, example_audio_id_, |
- "Fake Audio Device"); |
- audio_devices.push_back(fake_audio_device); |
- MediaCaptureDevicesDispatcher::GetInstance()->SetTestAudioCaptureDevices( |
- audio_devices); |
- |
- content::MediaStreamDevices video_devices; |
- content::MediaStreamDevice fake_video_device( |
- content::MEDIA_DEVICE_VIDEO_CAPTURE, example_video_id_, |
- "Fake Video Device"); |
- video_devices.push_back(fake_video_device); |
- MediaCaptureDevicesDispatcher::GetInstance()->SetTestVideoCaptureDevices( |
- video_devices); |
- } |
- |
- GURL example_url_; |
- const std::string example_audio_id_; |
- const std::string example_video_id_; |
- |
- content::MediaStreamDevices media_stream_devices_; |
- content::MediaStreamRequestResult media_stream_result_; |
-}; |
- |
-// Request and allow microphone access. |
-IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest, RequestAndAllowMic) { |
- InitWithUrl(GURL("https://www.example.com")); |
- SetDevicePolicy(DEVICE_TYPE_AUDIO, ACCESS_ALLOWED); |
- MediaStreamDevicesController controller( |
- GetWebContents(), CreateRequest(example_audio_id(), std::string()), |
- base::Bind(&MediaStreamDevicesControllerTest::OnMediaStreamResponse, |
- base::Unretained(this))); |
- NotifyTabSpecificContentSettings(&controller); |
- |
- EXPECT_TRUE(GetContentSettings()->IsContentAllowed( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); |
- EXPECT_FALSE(GetContentSettings()->IsContentBlocked( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); |
- EXPECT_EQ(TabSpecificContentSettings::MICROPHONE_ACCESSED, |
- GetContentSettings()->GetMicrophoneCameraState()); |
- EXPECT_EQ(example_audio_id(), |
- GetContentSettings()->media_stream_requested_audio_device()); |
- EXPECT_EQ(example_audio_id(), |
- GetContentSettings()->media_stream_selected_audio_device()); |
- EXPECT_EQ(std::string(), |
- GetContentSettings()->media_stream_requested_video_device()); |
- EXPECT_EQ(std::string(), |
- GetContentSettings()->media_stream_selected_video_device()); |
-} |
- |
-// Request and allow camera access. |
-IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest, RequestAndAllowCam) { |
- InitWithUrl(GURL("https://www.example.com")); |
- SetDevicePolicy(DEVICE_TYPE_VIDEO, ACCESS_ALLOWED); |
- MediaStreamDevicesController controller( |
- GetWebContents(), CreateRequest(std::string(), example_video_id()), |
- base::Bind(&MediaStreamDevicesControllerTest::OnMediaStreamResponse, |
- base::Unretained(this))); |
- NotifyTabSpecificContentSettings(&controller); |
- |
- EXPECT_TRUE(GetContentSettings()->IsContentAllowed( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); |
- EXPECT_FALSE(GetContentSettings()->IsContentBlocked( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); |
- EXPECT_EQ(TabSpecificContentSettings::CAMERA_ACCESSED, |
- GetContentSettings()->GetMicrophoneCameraState()); |
- EXPECT_EQ(std::string(), |
- GetContentSettings()->media_stream_requested_audio_device()); |
- EXPECT_EQ(std::string(), |
- GetContentSettings()->media_stream_selected_audio_device()); |
- EXPECT_EQ(example_video_id(), |
- GetContentSettings()->media_stream_requested_video_device()); |
- EXPECT_EQ(example_video_id(), |
- GetContentSettings()->media_stream_selected_video_device()); |
-} |
- |
-// Request and block microphone access. |
-IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest, RequestAndBlockMic) { |
- InitWithUrl(GURL("https://www.example.com")); |
- SetDevicePolicy(DEVICE_TYPE_AUDIO, ACCESS_DENIED); |
- MediaStreamDevicesController controller( |
- GetWebContents(), CreateRequest(example_audio_id(), std::string()), |
- base::Bind(&MediaStreamDevicesControllerTest::OnMediaStreamResponse, |
- base::Unretained(this))); |
- NotifyTabSpecificContentSettings(&controller); |
- |
- EXPECT_FALSE(GetContentSettings()->IsContentAllowed( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); |
- EXPECT_TRUE(GetContentSettings()->IsContentBlocked( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); |
- EXPECT_EQ(TabSpecificContentSettings::MICROPHONE_ACCESSED | |
- TabSpecificContentSettings::MICROPHONE_BLOCKED, |
- GetContentSettings()->GetMicrophoneCameraState()); |
- EXPECT_EQ(example_audio_id(), |
- GetContentSettings()->media_stream_requested_audio_device()); |
- EXPECT_EQ(example_audio_id(), |
- GetContentSettings()->media_stream_selected_audio_device()); |
- EXPECT_EQ(std::string(), |
- GetContentSettings()->media_stream_requested_video_device()); |
- EXPECT_EQ(std::string(), |
- GetContentSettings()->media_stream_selected_video_device()); |
-} |
- |
-// Request and block camera access. |
-IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest, RequestAndBlockCam) { |
- InitWithUrl(GURL("https://www.example.com")); |
- SetDevicePolicy(DEVICE_TYPE_VIDEO, ACCESS_DENIED); |
- MediaStreamDevicesController controller( |
- GetWebContents(), CreateRequest(std::string(), example_video_id()), |
- base::Bind(&MediaStreamDevicesControllerTest::OnMediaStreamResponse, |
- base::Unretained(this))); |
- NotifyTabSpecificContentSettings(&controller); |
- |
- EXPECT_FALSE(GetContentSettings()->IsContentAllowed( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); |
- EXPECT_TRUE(GetContentSettings()->IsContentBlocked( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); |
- EXPECT_EQ(TabSpecificContentSettings::CAMERA_ACCESSED | |
- TabSpecificContentSettings::CAMERA_BLOCKED, |
- GetContentSettings()->GetMicrophoneCameraState()); |
- EXPECT_EQ(std::string(), |
- GetContentSettings()->media_stream_requested_audio_device()); |
- EXPECT_EQ(std::string(), |
- GetContentSettings()->media_stream_selected_audio_device()); |
- EXPECT_EQ(example_video_id(), |
- GetContentSettings()->media_stream_requested_video_device()); |
- EXPECT_EQ(example_video_id(), |
- GetContentSettings()->media_stream_selected_video_device()); |
-} |
- |
-// Request and allow microphone and camera access. |
-IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest, |
- RequestAndAllowMicCam) { |
- InitWithUrl(GURL("https://www.example.com")); |
- SetDevicePolicy(DEVICE_TYPE_AUDIO, ACCESS_ALLOWED); |
- SetDevicePolicy(DEVICE_TYPE_VIDEO, ACCESS_ALLOWED); |
- MediaStreamDevicesController controller( |
- GetWebContents(), CreateRequest(example_audio_id(), example_video_id()), |
- base::Bind(&MediaStreamDevicesControllerTest::OnMediaStreamResponse, |
- base::Unretained(this))); |
- NotifyTabSpecificContentSettings(&controller); |
- |
- EXPECT_TRUE(GetContentSettings()->IsContentAllowed( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); |
- EXPECT_FALSE(GetContentSettings()->IsContentBlocked( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); |
- EXPECT_TRUE(GetContentSettings()->IsContentAllowed( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); |
- EXPECT_FALSE(GetContentSettings()->IsContentBlocked( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); |
- EXPECT_EQ(TabSpecificContentSettings::MICROPHONE_ACCESSED | |
- TabSpecificContentSettings::CAMERA_ACCESSED, |
- GetContentSettings()->GetMicrophoneCameraState()); |
- EXPECT_EQ(example_audio_id(), |
- GetContentSettings()->media_stream_requested_audio_device()); |
- EXPECT_EQ(example_audio_id(), |
- GetContentSettings()->media_stream_selected_audio_device()); |
- EXPECT_EQ(example_video_id(), |
- GetContentSettings()->media_stream_requested_video_device()); |
- EXPECT_EQ(example_video_id(), |
- GetContentSettings()->media_stream_selected_video_device()); |
-} |
- |
-// Request and block microphone and camera access. |
-IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest, |
- RequestAndBlockMicCam) { |
- InitWithUrl(GURL("https://www.example.com")); |
- SetDevicePolicy(DEVICE_TYPE_AUDIO, ACCESS_DENIED); |
- SetDevicePolicy(DEVICE_TYPE_VIDEO, ACCESS_DENIED); |
- MediaStreamDevicesController controller( |
- GetWebContents(), CreateRequest(example_audio_id(), example_video_id()), |
- base::Bind(&MediaStreamDevicesControllerTest::OnMediaStreamResponse, |
- base::Unretained(this))); |
- NotifyTabSpecificContentSettings(&controller); |
- |
- EXPECT_FALSE(GetContentSettings()->IsContentAllowed( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); |
- EXPECT_TRUE(GetContentSettings()->IsContentBlocked( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); |
- EXPECT_FALSE(GetContentSettings()->IsContentAllowed( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); |
- EXPECT_TRUE(GetContentSettings()->IsContentBlocked( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); |
- EXPECT_EQ(TabSpecificContentSettings::MICROPHONE_ACCESSED | |
- TabSpecificContentSettings::MICROPHONE_BLOCKED | |
- TabSpecificContentSettings::CAMERA_ACCESSED | |
- TabSpecificContentSettings::CAMERA_BLOCKED, |
- GetContentSettings()->GetMicrophoneCameraState()); |
- EXPECT_EQ(example_audio_id(), |
- GetContentSettings()->media_stream_requested_audio_device()); |
- EXPECT_EQ(example_audio_id(), |
- GetContentSettings()->media_stream_selected_audio_device()); |
- EXPECT_EQ(example_video_id(), |
- GetContentSettings()->media_stream_requested_video_device()); |
- EXPECT_EQ(example_video_id(), |
- GetContentSettings()->media_stream_selected_video_device()); |
-} |
- |
-// Request microphone and camera access. Allow microphone, block camera. |
-IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest, |
- RequestMicCamBlockCam) { |
- InitWithUrl(GURL("https://www.example.com")); |
- SetDevicePolicy(DEVICE_TYPE_AUDIO, ACCESS_ALLOWED); |
- SetDevicePolicy(DEVICE_TYPE_VIDEO, ACCESS_DENIED); |
- MediaStreamDevicesController controller( |
- GetWebContents(), CreateRequest(example_audio_id(), example_video_id()), |
- base::Bind(&MediaStreamDevicesControllerTest::OnMediaStreamResponse, |
- base::Unretained(this))); |
- NotifyTabSpecificContentSettings(&controller); |
- |
- EXPECT_TRUE(GetContentSettings()->IsContentAllowed( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); |
- EXPECT_FALSE(GetContentSettings()->IsContentBlocked( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); |
- EXPECT_FALSE(GetContentSettings()->IsContentAllowed( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); |
- EXPECT_TRUE(GetContentSettings()->IsContentBlocked( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); |
- EXPECT_EQ(TabSpecificContentSettings::MICROPHONE_ACCESSED | |
- TabSpecificContentSettings::CAMERA_ACCESSED | |
- TabSpecificContentSettings::CAMERA_BLOCKED, |
- GetContentSettings()->GetMicrophoneCameraState()); |
- EXPECT_EQ(example_audio_id(), |
- GetContentSettings()->media_stream_requested_audio_device()); |
- EXPECT_EQ(example_audio_id(), |
- GetContentSettings()->media_stream_selected_audio_device()); |
- EXPECT_EQ(example_video_id(), |
- GetContentSettings()->media_stream_requested_video_device()); |
- EXPECT_EQ(example_video_id(), |
- GetContentSettings()->media_stream_selected_video_device()); |
-} |
- |
-// Request microphone and camera access. Block microphone, allow camera. |
-IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest, |
- RequestMicCamBlockMic) { |
- InitWithUrl(GURL("https://www.example.com")); |
- SetDevicePolicy(DEVICE_TYPE_AUDIO, ACCESS_DENIED); |
- SetDevicePolicy(DEVICE_TYPE_VIDEO, ACCESS_ALLOWED); |
- MediaStreamDevicesController controller( |
- GetWebContents(), CreateRequest(example_audio_id(), example_video_id()), |
- base::Bind(&MediaStreamDevicesControllerTest::OnMediaStreamResponse, |
- base::Unretained(this))); |
- NotifyTabSpecificContentSettings(&controller); |
- |
- EXPECT_FALSE(GetContentSettings()->IsContentAllowed( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); |
- EXPECT_TRUE(GetContentSettings()->IsContentBlocked( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); |
- EXPECT_TRUE(GetContentSettings()->IsContentAllowed( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); |
- EXPECT_FALSE(GetContentSettings()->IsContentBlocked( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); |
- EXPECT_EQ(TabSpecificContentSettings::MICROPHONE_ACCESSED | |
- TabSpecificContentSettings::MICROPHONE_BLOCKED | |
- TabSpecificContentSettings::CAMERA_ACCESSED, |
- GetContentSettings()->GetMicrophoneCameraState()); |
- EXPECT_EQ(example_audio_id(), |
- GetContentSettings()->media_stream_requested_audio_device()); |
- EXPECT_EQ(example_audio_id(), |
- GetContentSettings()->media_stream_selected_audio_device()); |
- EXPECT_EQ(example_video_id(), |
- GetContentSettings()->media_stream_requested_video_device()); |
- EXPECT_EQ(example_video_id(), |
- GetContentSettings()->media_stream_selected_video_device()); |
-} |
- |
-// Request microphone access. Requesting camera should not change microphone |
-// state. |
-IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest, |
- RequestCamDoesNotChangeMic) { |
- InitWithUrl(GURL("https://www.example.com")); |
- // Request mic and deny. |
- SetDevicePolicy(DEVICE_TYPE_AUDIO, ACCESS_DENIED); |
- MediaStreamDevicesController mic_controller( |
- GetWebContents(), CreateRequest(example_audio_id(), std::string()), |
- base::Bind(&MediaStreamDevicesControllerTest::OnMediaStreamResponse, |
- base::Unretained(this))); |
- NotifyTabSpecificContentSettings(&mic_controller); |
- EXPECT_FALSE(GetContentSettings()->IsContentAllowed( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); |
- EXPECT_TRUE(GetContentSettings()->IsContentBlocked( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); |
- EXPECT_EQ(example_audio_id(), |
- GetContentSettings()->media_stream_requested_audio_device()); |
- EXPECT_EQ(example_audio_id(), |
- GetContentSettings()->media_stream_selected_audio_device()); |
- |
- // Request cam and allow |
- SetDevicePolicy(DEVICE_TYPE_VIDEO, ACCESS_ALLOWED); |
- MediaStreamDevicesController cam_controller( |
- GetWebContents(), CreateRequest(std::string(), example_video_id()), |
- base::Bind(&MediaStreamDevicesControllerTest::OnMediaStreamResponse, |
- base::Unretained(this))); |
- NotifyTabSpecificContentSettings(&cam_controller); |
- EXPECT_TRUE(GetContentSettings()->IsContentAllowed( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); |
- EXPECT_FALSE(GetContentSettings()->IsContentBlocked( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); |
- EXPECT_EQ(example_video_id(), |
- GetContentSettings()->media_stream_requested_video_device()); |
- EXPECT_EQ(example_video_id(), |
- GetContentSettings()->media_stream_selected_video_device()); |
- |
- // Mic state should not have changed. |
- EXPECT_FALSE(GetContentSettings()->IsContentAllowed( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); |
- EXPECT_TRUE(GetContentSettings()->IsContentBlocked( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); |
- EXPECT_EQ(example_audio_id(), |
- GetContentSettings()->media_stream_requested_audio_device()); |
- EXPECT_EQ(example_audio_id(), |
- GetContentSettings()->media_stream_selected_audio_device()); |
-} |
- |
-// Denying mic access after camera access should still show the camera as state. |
-IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest, |
- DenyMicDoesNotChangeCam) { |
- InitWithUrl(GURL("https://www.example.com")); |
- // Request cam and allow |
- SetDevicePolicy(DEVICE_TYPE_VIDEO, ACCESS_ALLOWED); |
- MediaStreamDevicesController cam_controller( |
- GetWebContents(), CreateRequest(std::string(), example_video_id()), |
- base::Bind(&MediaStreamDevicesControllerTest::OnMediaStreamResponse, |
- base::Unretained(this))); |
- NotifyTabSpecificContentSettings(&cam_controller); |
- EXPECT_TRUE(GetContentSettings()->IsContentAllowed( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); |
- EXPECT_FALSE(GetContentSettings()->IsContentBlocked( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); |
- EXPECT_EQ(example_video_id(), |
- GetContentSettings()->media_stream_requested_video_device()); |
- EXPECT_EQ(example_video_id(), |
- GetContentSettings()->media_stream_selected_video_device()); |
- EXPECT_EQ(TabSpecificContentSettings::CAMERA_ACCESSED, |
- GetContentSettings()->GetMicrophoneCameraState()); |
- |
- // Simulate that an a video stream is now being captured. |
- content::MediaStreamDevice fake_video_device( |
- content::MEDIA_DEVICE_VIDEO_CAPTURE, example_video_id(), |
- example_video_id()); |
- content::MediaStreamDevices video_devices(1, fake_video_device); |
- MediaCaptureDevicesDispatcher* dispatcher = |
- MediaCaptureDevicesDispatcher::GetInstance(); |
- dispatcher->SetTestVideoCaptureDevices(video_devices); |
- std::unique_ptr<content::MediaStreamUI> video_stream_ui = |
- dispatcher->GetMediaStreamCaptureIndicator()->RegisterMediaStream( |
- GetWebContents(), video_devices); |
- video_stream_ui->OnStarted(base::Closure()); |
- |
- // Request mic and deny. |
- SetDevicePolicy(DEVICE_TYPE_AUDIO, ACCESS_DENIED); |
- MediaStreamDevicesController mic_controller( |
- GetWebContents(), CreateRequest(example_audio_id(), std::string()), |
- base::Bind(&MediaStreamDevicesControllerTest::OnMediaStreamResponse, |
- base::Unretained(this))); |
- NotifyTabSpecificContentSettings(&mic_controller); |
- EXPECT_FALSE(GetContentSettings()->IsContentAllowed( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); |
- EXPECT_TRUE(GetContentSettings()->IsContentBlocked( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC)); |
- EXPECT_EQ(example_audio_id(), |
- GetContentSettings()->media_stream_requested_audio_device()); |
- EXPECT_EQ(example_audio_id(), |
- GetContentSettings()->media_stream_selected_audio_device()); |
- |
- // Cam should still be included in the state. |
- EXPECT_TRUE(GetContentSettings()->IsContentAllowed( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); |
- EXPECT_FALSE(GetContentSettings()->IsContentBlocked( |
- CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA)); |
- EXPECT_EQ(example_video_id(), |
- GetContentSettings()->media_stream_requested_video_device()); |
- EXPECT_EQ(example_video_id(), |
- GetContentSettings()->media_stream_selected_video_device()); |
- EXPECT_EQ(TabSpecificContentSettings::MICROPHONE_ACCESSED | |
- TabSpecificContentSettings::MICROPHONE_BLOCKED | |
- TabSpecificContentSettings::CAMERA_ACCESSED, |
- GetContentSettings()->GetMicrophoneCameraState()); |
- |
- // After ending the camera capture, the camera permission is no longer |
- // relevant, so it should no be included in the mic/cam state. |
- video_stream_ui.reset(); |
- EXPECT_EQ(TabSpecificContentSettings::MICROPHONE_ACCESSED | |
- TabSpecificContentSettings::MICROPHONE_BLOCKED, |
- GetContentSettings()->GetMicrophoneCameraState()); |
-} |
- |
-// Stores the ContentSettings inputs for a particular test and has functions |
-// which return the expected outputs for that test. |
-struct ContentSettingsTestData { |
- // The initial value of the mic/cam content settings. |
- ContentSetting mic; |
- ContentSetting cam; |
- // Whether the infobar should be accepted if it's shown. |
- bool accept_infobar; |
- |
- // Whether the infobar should be displayed to request mic/cam for the given |
- // content settings inputs. |
- bool ExpectMicInfobar() const { return mic == CONTENT_SETTING_ASK; } |
- bool ExpectCamInfobar() const { return cam == CONTENT_SETTING_ASK; } |
- |
- // Whether or not the mic/cam should be allowed after clicking accept/deny for |
- // the given inputs. |
- bool ExpectMicAllowed() const { |
- return mic == CONTENT_SETTING_ALLOW || |
- (mic == CONTENT_SETTING_ASK && accept_infobar); |
- } |
- bool ExpectCamAllowed() const { |
- return cam == CONTENT_SETTING_ALLOW || |
- (cam == CONTENT_SETTING_ASK && accept_infobar); |
- } |
- |
- // The expected media stream result after clicking accept/deny for the given |
- // inputs. |
- content::MediaStreamRequestResult ExpectedMediaStreamResult() const { |
- if (ExpectMicAllowed() || ExpectCamAllowed()) |
- return content::MEDIA_DEVICE_OK; |
- return content::MEDIA_DEVICE_PERMISSION_DENIED; |
- } |
-}; |
- |
-// Test all combinations of cam/mic content settings. Then tests the result of |
-// clicking both accept/deny on the infobar. Both cam/mic are requested. |
-IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest, ContentSettings) { |
- InitWithUrl(GURL("https://www.example.com")); |
- static const ContentSettingsTestData tests[] = { |
- // Settings that won't result in an infobar. |
- {CONTENT_SETTING_ALLOW, CONTENT_SETTING_ALLOW, false}, |
- {CONTENT_SETTING_ALLOW, CONTENT_SETTING_BLOCK, false}, |
- {CONTENT_SETTING_BLOCK, CONTENT_SETTING_ALLOW, false}, |
- {CONTENT_SETTING_BLOCK, CONTENT_SETTING_BLOCK, false}, |
- |
- // Settings that will result in an infobar. Test both accept and deny. |
- {CONTENT_SETTING_ALLOW, CONTENT_SETTING_ASK, false}, |
- {CONTENT_SETTING_ALLOW, CONTENT_SETTING_ASK, true}, |
- |
- {CONTENT_SETTING_ASK, CONTENT_SETTING_ASK, false}, |
- {CONTENT_SETTING_ASK, CONTENT_SETTING_ASK, true}, |
- |
- {CONTENT_SETTING_BLOCK, CONTENT_SETTING_ASK, false}, |
- {CONTENT_SETTING_BLOCK, CONTENT_SETTING_ASK, true}, |
- |
- {CONTENT_SETTING_ASK, CONTENT_SETTING_ALLOW, false}, |
- {CONTENT_SETTING_ASK, CONTENT_SETTING_ALLOW, true}, |
- |
- {CONTENT_SETTING_ASK, CONTENT_SETTING_BLOCK, false}, |
- {CONTENT_SETTING_ASK, CONTENT_SETTING_BLOCK, true}, |
- }; |
- |
- for (auto& test : tests) { |
- SetContentSettings(test.mic, test.cam); |
- MediaStreamDevicesController controller( |
- GetWebContents(), CreateRequest(example_audio_id(), example_video_id()), |
- base::Bind(&MediaStreamDevicesControllerTest::OnMediaStreamResponse, |
- base::Unretained(this))); |
- |
- // Check that the infobar is requesting the expected cam/mic values. |
- ASSERT_EQ(test.ExpectMicInfobar(), controller.IsAskingForAudio()); |
- ASSERT_EQ(test.ExpectCamInfobar(), controller.IsAskingForVideo()); |
- |
- // Accept or deny the infobar if it's showing. |
- if (test.ExpectMicInfobar() || test.ExpectCamInfobar()) { |
- if (test.accept_infobar) |
- controller.PermissionGranted(); |
- else |
- controller.PermissionDenied(); |
- } |
- |
- // Check the media stream result is expected and the devices returned are |
- // expected; |
- ASSERT_EQ(test.ExpectedMediaStreamResult(), media_stream_result()); |
- ASSERT_TRUE( |
- DevicesContains(test.ExpectMicAllowed(), test.ExpectCamAllowed())); |
- } |
-} |
- |
-// Request and allow camera access on WebUI pages without prompting. |
-IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest, |
- WebUIRequestAndAllowCam) { |
- InitWithUrl(GURL("chrome://test-page")); |
- MediaStreamDevicesController controller( |
- GetWebContents(), CreateRequest(std::string(), example_video_id()), |
- base::Bind(&MediaStreamDevicesControllerTest::OnMediaStreamResponse, |
- base::Unretained(this))); |
- |
- ASSERT_FALSE(controller.IsAskingForAudio()); |
- ASSERT_FALSE(controller.IsAskingForVideo()); |
- |
- ASSERT_EQ(content::MEDIA_DEVICE_OK, media_stream_result()); |
- ASSERT_TRUE(DevicesContains(false, true)); |
-} |
- |
-IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest, |
- ExtensionRequestMicCam) { |
- InitWithUrl(GURL("chrome-extension://test-page")); |
- // Test that a prompt is required. |
- MediaStreamDevicesController controller( |
- GetWebContents(), CreateRequest(example_audio_id(), example_video_id()), |
- base::Bind(&MediaStreamDevicesControllerTest::OnMediaStreamResponse, |
- base::Unretained(this))); |
- ASSERT_TRUE(controller.IsAskingForAudio()); |
- ASSERT_TRUE(controller.IsAskingForVideo()); |
- |
- // Accept the prompt. |
- controller.PermissionGranted(); |
- ASSERT_EQ(content::MEDIA_DEVICE_OK, media_stream_result()); |
- ASSERT_TRUE(DevicesContains(true, true)); |
- |
- // Check that re-requesting allows without prompting. |
- MediaStreamDevicesController controller2( |
- GetWebContents(), CreateRequest(example_audio_id(), example_video_id()), |
- base::Bind(&MediaStreamDevicesControllerTest::OnMediaStreamResponse, |
- base::Unretained(this))); |
- ASSERT_FALSE(controller2.IsAskingForAudio()); |
- ASSERT_FALSE(controller2.IsAskingForVideo()); |
- |
- ASSERT_EQ(content::MEDIA_DEVICE_OK, media_stream_result()); |
- ASSERT_TRUE(DevicesContains(true, true)); |
-} |
- |
-// For Pepper request from insecure origin, even if it's ALLOW, it won't be |
-// changed to ASK. |
-IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest, |
- PepperRequestInsecure) { |
- InitWithUrl(GURL("http://www.example.com")); |
- SetContentSettings(CONTENT_SETTING_ALLOW, CONTENT_SETTING_ALLOW); |
- |
- MediaStreamDevicesController controller( |
- GetWebContents(), |
- CreateRequestWithType(example_audio_id(), std::string(), |
- content::MEDIA_OPEN_DEVICE_PEPPER_ONLY), |
- base::Bind(&MediaStreamDevicesControllerTest::OnMediaStreamResponse, |
- base::Unretained(this))); |
- ASSERT_FALSE(controller.IsAskingForAudio()); |
- ASSERT_FALSE(controller.IsAskingForVideo()); |
-} |
- |
-// Request and block microphone and camera access with kill switch. |
-IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest, |
- RequestAndKillSwitchMicCam) { |
- std::map<std::string, std::string> params; |
- params[PermissionUtil::GetPermissionString( |
- content::PermissionType::AUDIO_CAPTURE)] = |
- PermissionContextBase::kPermissionsKillSwitchBlockedValue; |
- params[PermissionUtil::GetPermissionString( |
- content::PermissionType::VIDEO_CAPTURE)] = |
- PermissionContextBase::kPermissionsKillSwitchBlockedValue; |
- variations::AssociateVariationParams( |
- PermissionContextBase::kPermissionsKillSwitchFieldStudy, |
- "TestGroup", params); |
- base::FieldTrialList::CreateFieldTrial( |
- PermissionContextBase::kPermissionsKillSwitchFieldStudy, |
- "TestGroup"); |
- InitWithUrl(GURL("https://www.example.com")); |
- SetDevicePolicy(DEVICE_TYPE_AUDIO, ACCESS_ALLOWED); |
- SetDevicePolicy(DEVICE_TYPE_VIDEO, ACCESS_ALLOWED); |
- MediaStreamDevicesController controller( |
- GetWebContents(), CreateRequest(example_audio_id(), example_video_id()), |
- base::Bind(&MediaStreamDevicesControllerTest::OnMediaStreamResponse, |
- base::Unretained(this))); |
- |
- EXPECT_FALSE(controller.IsAllowedForAudio()); |
- EXPECT_FALSE(controller.IsAllowedForVideo()); |
- EXPECT_FALSE(controller.IsAskingForAudio()); |
- EXPECT_FALSE(controller.IsAskingForVideo()); |
-} |