blob: 7dbaaf09cbbb4937892a508d8f5df9a850baaca6 [file] [log] [blame]
// Copyright 2015 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 "chrome/browser/media/webrtc/media_stream_device_permission_context.h"
#include "base/bind.h"
#include "base/macros.h"
#include "base/test/scoped_feature_list.h"
#include "build/build_config.h"
#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
#include "chrome/browser/infobars/infobar_service.h"
#include "chrome/browser/permissions/permission_request_id.h"
#include "chrome/test/base/chrome_render_view_host_test_harness.h"
#include "chrome/test/base/testing_profile.h"
#include "components/content_settings/core/browser/host_content_settings_map.h"
#include "components/content_settings/core/common/content_settings.h"
#include "components/content_settings/core/common/content_settings_types.h"
#include "content/public/browser/web_contents.h"
#include "content/public/common/content_features.h"
#include "content/public/test/mock_render_process_host.h"
#include "content/public/test/web_contents_tester.h"
#include "testing/gtest/include/gtest/gtest.h"
#if !defined(OS_ANDROID)
#include "chrome/browser/permissions/permission_request_manager.h"
#endif
namespace {
class TestPermissionContext : public MediaStreamDevicePermissionContext {
public:
TestPermissionContext(Profile* profile,
const ContentSettingsType content_settings_type)
: MediaStreamDevicePermissionContext(profile, content_settings_type) {}
~TestPermissionContext() override {}
};
} // anonymous namespace
// TODO(raymes): many tests in MediaStreamDevicesControllerTest should be
// converted to tests in this file.
class MediaStreamDevicePermissionContextTests
: public ChromeRenderViewHostTestHarness {
protected:
MediaStreamDevicePermissionContextTests() = default;
void TestInsecureQueryingUrl(ContentSettingsType content_settings_type) {
TestPermissionContext permission_context(profile(), content_settings_type);
GURL insecure_url("http://www.example.com");
GURL secure_url("https://www.example.com");
// Check that there is no saved content settings.
EXPECT_EQ(CONTENT_SETTING_ASK,
HostContentSettingsMapFactory::GetForProfile(profile())
->GetContentSetting(insecure_url.GetOrigin(),
insecure_url.GetOrigin(),
content_settings_type, std::string()));
EXPECT_EQ(CONTENT_SETTING_ASK,
HostContentSettingsMapFactory::GetForProfile(profile())
->GetContentSetting(secure_url.GetOrigin(),
insecure_url.GetOrigin(),
content_settings_type, std::string()));
EXPECT_EQ(CONTENT_SETTING_ASK,
HostContentSettingsMapFactory::GetForProfile(profile())
->GetContentSetting(insecure_url.GetOrigin(),
secure_url.GetOrigin(),
content_settings_type, std::string()));
EXPECT_EQ(CONTENT_SETTING_BLOCK,
permission_context
.GetPermissionStatus(nullptr /* render_frame_host */,
insecure_url, insecure_url)
.content_setting);
EXPECT_EQ(CONTENT_SETTING_BLOCK,
permission_context
.GetPermissionStatus(nullptr /* render_frame_host */,
insecure_url, secure_url)
.content_setting);
}
void TestSecureQueryingUrl(ContentSettingsType content_settings_type) {
TestPermissionContext permission_context(profile(), content_settings_type);
GURL secure_url("https://www.example.com");
// Check that there is no saved content settings.
EXPECT_EQ(CONTENT_SETTING_ASK,
HostContentSettingsMapFactory::GetForProfile(profile())
->GetContentSetting(secure_url.GetOrigin(),
secure_url.GetOrigin(),
content_settings_type,
std::string()));
EXPECT_EQ(CONTENT_SETTING_ASK,
permission_context
.GetPermissionStatus(nullptr /* render_frame_host */,
secure_url, secure_url)
.content_setting);
}
private:
// ChromeRenderViewHostTestHarness:
void SetUp() override {
ChromeRenderViewHostTestHarness::SetUp();
#if defined(OS_ANDROID)
InfoBarService::CreateForWebContents(web_contents());
#else
PermissionRequestManager::CreateForWebContents(web_contents());
#endif
}
DISALLOW_COPY_AND_ASSIGN(MediaStreamDevicePermissionContextTests);
};
// MEDIASTREAM_MIC permission status should be ask for insecure origin to
// accommodate the usage case of Flash.
TEST_F(MediaStreamDevicePermissionContextTests, TestMicInsecureQueryingUrl) {
TestInsecureQueryingUrl(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC);
}
// MEDIASTREAM_CAMERA permission status should be ask for insecure origin to
// accommodate the usage case of Flash.
TEST_F(MediaStreamDevicePermissionContextTests, TestCameraInsecureQueryingUrl) {
TestInsecureQueryingUrl(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA);
}
// MEDIASTREAM_MIC permission status should be ask for Secure origin.
TEST_F(MediaStreamDevicePermissionContextTests, TestMicSecureQueryingUrl) {
TestSecureQueryingUrl(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC);
}
// MEDIASTREAM_CAMERA permission status should be ask for Secure origin.
TEST_F(MediaStreamDevicePermissionContextTests, TestCameraSecureQueryingUrl) {
TestSecureQueryingUrl(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA);
}