Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3449)

Unified Diff: chrome/browser/media/media_stream_devices_controller_browsertest.cc

Issue 678023002: TabSpecificContentSettings no longer knows about MediaStreamDeviceController (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remaining style nits addressed Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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());
+}

Powered by Google App Engine
This is Rietveld 408576698