blob: 7d964aa95974a388d29221af33f17a580db7cdc8 [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// 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/capture_policy_utils.h"
#include "base/values.h"
#include "chrome/common/pref_names.h"
#include "components/prefs/pref_registry_simple.h"
#include "components/prefs/pref_service.h"
#include "components/prefs/testing_pref_service.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
namespace {
constexpr char kTestSite1[] = "https://foo.test.org";
constexpr char kTestSite1Pattern[] = "foo.test.org";
constexpr char kTestSite1NonMatchingPattern[] = "foo.org";
} // namespace
class CapturePolicyUtilsTest : public testing::Test {
public:
CapturePolicyUtilsTest() {
prefs_.registry()->RegisterBooleanPref(prefs::kScreenCaptureAllowed, true);
prefs_.registry()->RegisterListPref(prefs::kScreenCaptureAllowedByOrigins);
prefs_.registry()->RegisterListPref(prefs::kWindowCaptureAllowedByOrigins);
prefs_.registry()->RegisterListPref(prefs::kTabCaptureAllowedByOrigins);
prefs_.registry()->RegisterListPref(
prefs::kSameOriginTabCaptureAllowedByOrigins);
}
TestingPrefServiceSimple* prefs() { return &prefs_; }
private:
TestingPrefServiceSimple prefs_;
};
// Test that the default policy allows all capture.
TEST_F(CapturePolicyUtilsTest, SimpleAllowTest) {
EXPECT_EQ(AllowedScreenCaptureLevel::kUnrestricted,
capture_policy::GetAllowedCaptureLevel(GURL(kTestSite1), *prefs()));
}
// Test that setting |kScreenCaptureAllowed| to false, denies all capture.
TEST_F(CapturePolicyUtilsTest, SimpleDenyTest) {
prefs()->SetBoolean(prefs::kScreenCaptureAllowed, false);
EXPECT_EQ(AllowedScreenCaptureLevel::kDisallowed,
capture_policy::GetAllowedCaptureLevel(GURL(kTestSite1), *prefs()));
}
// Test that the FullCapture allowed list overrides |kScreenCaptureAllowed|.
TEST_F(CapturePolicyUtilsTest, SimpleOverrideUnrestricted) {
base::Value::List matchlist;
matchlist.Append(kTestSite1Pattern);
prefs()->SetBoolean(prefs::kScreenCaptureAllowed, false);
prefs()->SetList(prefs::kScreenCaptureAllowedByOrigins, std::move(matchlist));
EXPECT_EQ(AllowedScreenCaptureLevel::kUnrestricted,
capture_policy::GetAllowedCaptureLevel(GURL(kTestSite1), *prefs()));
}
// Test that the Window/Tab allowed list overrides |kScreenCaptureAllowed|.
TEST_F(CapturePolicyUtilsTest, SimpleOverrideWindowTabs) {
base::Value::List matchlist;
matchlist.Append(kTestSite1Pattern);
prefs()->SetBoolean(prefs::kScreenCaptureAllowed, false);
prefs()->SetList(prefs::kWindowCaptureAllowedByOrigins, std::move(matchlist));
EXPECT_EQ(AllowedScreenCaptureLevel::kWindow,
capture_policy::GetAllowedCaptureLevel(GURL(kTestSite1), *prefs()));
}
// Test that the Tab allowed list overrides |kScreenCaptureAllowed|.
TEST_F(CapturePolicyUtilsTest, SimpleOverrideTabs) {
base::Value::List matchlist;
matchlist.Append(kTestSite1Pattern);
prefs()->SetBoolean(prefs::kScreenCaptureAllowed, false);
prefs()->SetList(prefs::kTabCaptureAllowedByOrigins, std::move(matchlist));
EXPECT_EQ(AllowedScreenCaptureLevel::kTab,
capture_policy::GetAllowedCaptureLevel(GURL(kTestSite1), *prefs()));
}
// Test that the Same Origin Tab allowed list overrides |kScreenCaptureAllowed|.
TEST_F(CapturePolicyUtilsTest, SimpleOverrideSameOriginTabs) {
base::Value::List matchlist;
matchlist.Append(kTestSite1Pattern);
prefs()->SetBoolean(prefs::kScreenCaptureAllowed, false);
prefs()->SetList(prefs::kSameOriginTabCaptureAllowedByOrigins,
std::move(matchlist));
EXPECT_EQ(AllowedScreenCaptureLevel::kSameOrigin,
capture_policy::GetAllowedCaptureLevel(GURL(kTestSite1), *prefs()));
}
// Test that an item that doesn't match any list still respects the default.
TEST_F(CapturePolicyUtilsTest, SimpleOverrideNoMatches) {
base::Value::List matchlist;
matchlist.Append(kTestSite1NonMatchingPattern);
prefs()->SetBoolean(prefs::kScreenCaptureAllowed, false);
prefs()->SetList(prefs::kSameOriginTabCaptureAllowedByOrigins,
std::move(matchlist));
EXPECT_EQ(AllowedScreenCaptureLevel::kDisallowed,
capture_policy::GetAllowedCaptureLevel(GURL(kTestSite1), *prefs()));
}
// Ensure that a full wildcard policy is accepted.
TEST_F(CapturePolicyUtilsTest, TestWildcard) {
base::Value::List matchlist;
matchlist.Append("*");
prefs()->SetBoolean(prefs::kScreenCaptureAllowed, false);
prefs()->SetList(prefs::kTabCaptureAllowedByOrigins, std::move(matchlist));
EXPECT_EQ(AllowedScreenCaptureLevel::kTab,
capture_policy::GetAllowedCaptureLevel(GURL(kTestSite1), *prefs()));
EXPECT_EQ(
AllowedScreenCaptureLevel::kTab,
capture_policy::GetAllowedCaptureLevel(GURL("https://a.com"), *prefs()));
EXPECT_EQ(
AllowedScreenCaptureLevel::kTab,
capture_policy::GetAllowedCaptureLevel(GURL("https://b.com"), *prefs()));
EXPECT_EQ(
AllowedScreenCaptureLevel::kTab,
capture_policy::GetAllowedCaptureLevel(GURL("https://c.com"), *prefs()));
EXPECT_EQ(
AllowedScreenCaptureLevel::kTab,
capture_policy::GetAllowedCaptureLevel(GURL("https://d.com"), *prefs()));
EXPECT_EQ(
AllowedScreenCaptureLevel::kTab,
capture_policy::GetAllowedCaptureLevel(GURL("https://e.com"), *prefs()));
}
// Ensure that if a URL appears in multiple lists that it returns the most
// restrictive list that it is included in.
TEST_F(CapturePolicyUtilsTest, TestOverrideMoreRestrictive) {
base::Value::List full_capture_list;
full_capture_list.Append("a.com");
full_capture_list.Append("b.com");
full_capture_list.Append("c.com");
prefs()->SetBoolean(prefs::kScreenCaptureAllowed, false);
prefs()->SetList(prefs::kScreenCaptureAllowedByOrigins,
std::move(full_capture_list));
base::Value::List window_tab_list;
window_tab_list.Append("b.com");
prefs()->SetList(prefs::kWindowCaptureAllowedByOrigins,
std::move(window_tab_list));
base::Value::List tab_list;
tab_list.Append("c.com");
tab_list.Append("d.com");
prefs()->SetList(prefs::kTabCaptureAllowedByOrigins, std::move(tab_list));
base::Value::List same_origin_tab_list;
same_origin_tab_list.Append("d.com");
prefs()->SetList(prefs::kSameOriginTabCaptureAllowedByOrigins,
std::move(same_origin_tab_list));
EXPECT_EQ(
AllowedScreenCaptureLevel::kUnrestricted,
capture_policy::GetAllowedCaptureLevel(GURL("https://a.com"), *prefs()));
EXPECT_EQ(
AllowedScreenCaptureLevel::kWindow,
capture_policy::GetAllowedCaptureLevel(GURL("https://b.com"), *prefs()));
EXPECT_EQ(
AllowedScreenCaptureLevel::kTab,
capture_policy::GetAllowedCaptureLevel(GURL("https://c.com"), *prefs()));
EXPECT_EQ(
AllowedScreenCaptureLevel::kSameOrigin,
capture_policy::GetAllowedCaptureLevel(GURL("https://d.com"), *prefs()));
EXPECT_EQ(
AllowedScreenCaptureLevel::kDisallowed,
capture_policy::GetAllowedCaptureLevel(GURL("https://e.com"), *prefs()));
}
// Ensure that if a URL appears in multiple lists that it returns the most
// restrictive list that it is included in.
TEST_F(CapturePolicyUtilsTest, TestSubdomainOverrides) {
prefs()->SetBoolean(prefs::kScreenCaptureAllowed, false);
base::Value::List same_origin_tab_list;
same_origin_tab_list.Append("github.io");
prefs()->SetList(prefs::kSameOriginTabCaptureAllowedByOrigins,
std::move(same_origin_tab_list));
base::Value::List tab_list;
tab_list.Append("foo.github.io");
prefs()->SetList(prefs::kTabCaptureAllowedByOrigins, std::move(tab_list));
base::Value::List full_capture_list;
full_capture_list.Append("[*.]github.io");
prefs()->SetList(prefs::kScreenCaptureAllowedByOrigins,
std::move(full_capture_list));
EXPECT_EQ(AllowedScreenCaptureLevel::kSameOrigin,
capture_policy::GetAllowedCaptureLevel(GURL("https://github.io"),
*prefs()));
EXPECT_EQ(AllowedScreenCaptureLevel::kTab,
capture_policy::GetAllowedCaptureLevel(
GURL("https://foo.github.io"), *prefs()));
EXPECT_EQ(AllowedScreenCaptureLevel::kUnrestricted,
capture_policy::GetAllowedCaptureLevel(
GURL("https://bar.github.io"), *prefs()));
}
// Returns a std::vector<DesktopMediaList::Type> containing all values.
std::vector<DesktopMediaList::Type> GetFullMediaList() {
return {DesktopMediaList::Type::kCurrentTab,
DesktopMediaList::Type::kWebContents, DesktopMediaList::Type::kWindow,
DesktopMediaList::Type::kScreen};
}
// Test FilterMediaList with the different values of AllowedScreenCaptureLevel
// and ensure that values are filtered out and remain in sorted out.
TEST_F(CapturePolicyUtilsTest, FilterMediaListUnrestricted) {
std::vector<DesktopMediaList::Type> expected_media_types = {
DesktopMediaList::Type::kCurrentTab, DesktopMediaList::Type::kWebContents,
DesktopMediaList::Type::kWindow, DesktopMediaList::Type::kScreen};
AllowedScreenCaptureLevel level = AllowedScreenCaptureLevel::kUnrestricted;
std::vector<DesktopMediaList::Type> actual_media_types = GetFullMediaList();
capture_policy::FilterMediaList(actual_media_types, level);
EXPECT_EQ(expected_media_types, actual_media_types);
}
TEST_F(CapturePolicyUtilsTest, FilterMediaListRestrictedWindow) {
std::vector<DesktopMediaList::Type> expected_media_types = {
DesktopMediaList::Type::kCurrentTab, DesktopMediaList::Type::kWebContents,
DesktopMediaList::Type::kWindow};
AllowedScreenCaptureLevel level = AllowedScreenCaptureLevel::kWindow;
std::vector<DesktopMediaList::Type> actual_media_types = GetFullMediaList();
capture_policy::FilterMediaList(actual_media_types, level);
EXPECT_EQ(expected_media_types, actual_media_types);
}
TEST_F(CapturePolicyUtilsTest, FilterMediaListRestrictedTab) {
std::vector<DesktopMediaList::Type> expected_media_types = {
DesktopMediaList::Type::kCurrentTab,
DesktopMediaList::Type::kWebContents};
AllowedScreenCaptureLevel level = AllowedScreenCaptureLevel::kTab;
std::vector<DesktopMediaList::Type> actual_media_types = GetFullMediaList();
capture_policy::FilterMediaList(actual_media_types, level);
EXPECT_EQ(expected_media_types, actual_media_types);
}
// We don't do the SameOrigin filter at the MediaTypes level, so this should be
// the same.
TEST_F(CapturePolicyUtilsTest, FilterMediaListRestrictedSameOrigin) {
std::vector<DesktopMediaList::Type> expected_media_types = {
DesktopMediaList::Type::kCurrentTab,
DesktopMediaList::Type::kWebContents};
AllowedScreenCaptureLevel level = AllowedScreenCaptureLevel::kSameOrigin;
std::vector<DesktopMediaList::Type> actual_media_types = GetFullMediaList();
capture_policy::FilterMediaList(actual_media_types, level);
EXPECT_EQ(expected_media_types, actual_media_types);
}