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 |
new file mode 100644 |
index 0000000000000000000000000000000000000000..b12c1b7b369f93372053f4163d3e871db1a5b2be |
--- /dev/null |
+++ b/chrome/browser/media/media_stream_devices_controller_browsertest.cc |
@@ -0,0 +1,398 @@ |
+// 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/prefs/pref_service.h" |
+#include "chrome/browser/content_settings/tab_specific_content_settings.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/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 "content/public/common/media_stream_request.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. |
+ controller->Accept(false); |
+} |
+ |
+} // namespace |
+ |
+class MediaStreamDevicesControllerTest : public WebRtcTestBase { |
+ public: |
+ MediaStreamDevicesControllerTest() |
+ : example_url_("about:blank"), |
+ example_audio_id_("example audio ID"), |
+ example_video_id_("example video ID") {} |
+ |
+ 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_; } |
+ |
+ // 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); |
+ } |
+ |
+ 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 CreateRequest(const std::string& audio_id, |
+ const std::string& video_id) { |
+ 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, |
+ content::MEDIA_DEVICE_ACCESS, |
+ audio_id, |
+ video_id, |
+ audio_type, |
+ video_type); |
+ } |
+ |
+ // Dummy callback for when we deny the current request directly. |
+ static void OnMediaStreamResponse(const content::MediaStreamDevices& devices, |
+ content::MediaStreamRequestResult result, |
+ scoped_ptr<content::MediaStreamUI> ui) {} |
+ |
+ private: |
+ void SetUpOnMainThread() override { |
+ WebRtcTestBase::SetUpOnMainThread(); |
+ ui_test_utils::NavigateToURL(browser(), example_url_); |
+ |
+ EXPECT_EQ(TabSpecificContentSettings::MICROPHONE_CAMERA_NOT_ACCESSED, |
+ GetContentSettings()->GetMicrophoneCameraState()); |
+ } |
+ |
+ const GURL example_url_; |
+ const std::string example_audio_id_; |
+ const std::string example_video_id_; |
+}; |
+ |
+// Request and allow microphone access. |
+IN_PROC_BROWSER_TEST_F(MediaStreamDevicesControllerTest, RequestAndAllowMic) { |
+ SetDevicePolicy(DEVICE_TYPE_AUDIO, ACCESS_ALLOWED); |
+ MediaStreamDevicesController controller( |
+ GetWebContents(), |
+ CreateRequest(example_audio_id(), std::string()), |
+ base::Bind(&OnMediaStreamResponse)); |
+ 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) { |
+ SetDevicePolicy(DEVICE_TYPE_VIDEO, ACCESS_ALLOWED); |
+ MediaStreamDevicesController controller( |
+ GetWebContents(), |
+ CreateRequest(std::string(), example_video_id()), |
+ base::Bind(&OnMediaStreamResponse)); |
+ 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) { |
+ SetDevicePolicy(DEVICE_TYPE_AUDIO, ACCESS_DENIED); |
+ MediaStreamDevicesController controller( |
+ GetWebContents(), |
+ CreateRequest(example_audio_id(), std::string()), |
+ base::Bind(&OnMediaStreamResponse)); |
+ 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) { |
+ SetDevicePolicy(DEVICE_TYPE_VIDEO, ACCESS_DENIED); |
+ MediaStreamDevicesController controller( |
+ GetWebContents(), |
+ CreateRequest(std::string(), example_video_id()), |
+ base::Bind(&OnMediaStreamResponse)); |
+ 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) { |
+ SetDevicePolicy(DEVICE_TYPE_AUDIO, ACCESS_ALLOWED); |
+ SetDevicePolicy(DEVICE_TYPE_VIDEO, ACCESS_ALLOWED); |
+ MediaStreamDevicesController controller( |
+ GetWebContents(), |
+ CreateRequest(example_audio_id(), example_video_id()), |
+ base::Bind(&OnMediaStreamResponse)); |
+ 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) { |
+ SetDevicePolicy(DEVICE_TYPE_AUDIO, ACCESS_DENIED); |
+ SetDevicePolicy(DEVICE_TYPE_VIDEO, ACCESS_DENIED); |
+ MediaStreamDevicesController controller( |
+ GetWebContents(), |
+ CreateRequest(example_audio_id(), example_video_id()), |
+ base::Bind(&OnMediaStreamResponse)); |
+ 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) { |
+ SetDevicePolicy(DEVICE_TYPE_AUDIO, ACCESS_ALLOWED); |
+ SetDevicePolicy(DEVICE_TYPE_VIDEO, ACCESS_DENIED); |
+ MediaStreamDevicesController controller( |
+ GetWebContents(), |
+ CreateRequest(example_audio_id(), example_video_id()), |
+ base::Bind(&OnMediaStreamResponse)); |
+ 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) { |
+ SetDevicePolicy(DEVICE_TYPE_AUDIO, ACCESS_DENIED); |
+ SetDevicePolicy(DEVICE_TYPE_VIDEO, ACCESS_ALLOWED); |
+ MediaStreamDevicesController controller( |
+ GetWebContents(), |
+ CreateRequest(example_audio_id(), example_video_id()), |
+ base::Bind(&OnMediaStreamResponse)); |
+ 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) { |
+ // Request mic and deny. |
+ SetDevicePolicy(DEVICE_TYPE_AUDIO, ACCESS_DENIED); |
+ MediaStreamDevicesController mic_controller( |
+ GetWebContents(), |
+ CreateRequest(example_audio_id(), std::string()), |
+ base::Bind(&OnMediaStreamResponse)); |
+ 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(&OnMediaStreamResponse)); |
+ 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()); |
+} |