blob: 6273cb0779be2cfb8eb9e53f84fae77f902a1e5e [file] [log] [blame]
// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/permissions/permission_util.h"
#include "base/test/scoped_feature_list.h"
#include "content/public/browser/permission_descriptor_util.h"
#include "content/public/test/test_browser_context.h"
#include "content/public/test/test_renderer_host.h"
#include "content/public/test/web_contents_tester.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/blink/public/common/features.h"
#include "third_party/blink/public/mojom/permissions/permission.mojom-forward.h"
#include "url/gurl.h"
#include "url/origin.h"
namespace content {
class PermissionUtilTest : public ::testing::Test {};
TEST_F(PermissionUtilTest, TestIsDomainOverrideNoExtension) {
blink::mojom::PermissionDescriptorPtr ptr =
blink::mojom::PermissionDescriptor::New();
EXPECT_FALSE(PermissionUtil::IsDomainOverride(ptr));
}
TEST_F(PermissionUtilTest, TestIsDomainOverrideWrongExtension) {
blink::mojom::PermissionDescriptorPtr ptr =
blink::mojom::PermissionDescriptor::New();
ptr->extension =
blink::mojom::PermissionDescriptorExtension::NewMidi(nullptr);
EXPECT_FALSE(PermissionUtil::IsDomainOverride(ptr));
}
TEST_F(PermissionUtilTest, TestIsDomainOverride) {
blink::mojom::PermissionDescriptorPtr ptr =
blink::mojom::PermissionDescriptor::New();
ptr->extension =
blink::mojom::PermissionDescriptorExtension::NewTopLevelStorageAccess(
nullptr);
EXPECT_TRUE(PermissionUtil::IsDomainOverride(ptr));
}
TEST_F(PermissionUtilTest, TestExtractDomainOverride) {
url::Origin expected = url::Origin::Create(GURL("https://example.xyz"));
blink::mojom::PermissionDescriptorPtr ptr =
blink::mojom::PermissionDescriptor::New();
auto top_level_storage_access_extension =
blink::mojom::TopLevelStorageAccessPermissionDescriptor::New();
top_level_storage_access_extension->requestedOrigin = expected;
ptr->extension =
blink::mojom::PermissionDescriptorExtension::NewTopLevelStorageAccess(
std::move(top_level_storage_access_extension));
EXPECT_EQ(PermissionUtil::ExtractDomainOverride(ptr), expected);
}
TEST_F(PermissionUtilTest, TestInvalidDomainOverrideFeatureDisabled) {
EXPECT_FALSE(PermissionUtil::ValidateDomainOverride(
{}, nullptr, blink::mojom::PermissionDescriptor::New()));
}
TEST_F(PermissionUtilTest, TestInvalidDomainOverrideMultiRequest) {
std::vector<blink::mojom::PermissionDescriptorPtr> descriptors;
descriptors.emplace_back(
PermissionDescriptorUtil::CreatePermissionDescriptorForPermissionType(
blink::PermissionType::STORAGE_ACCESS_GRANT));
descriptors.emplace_back(descriptors.front()->Clone());
EXPECT_FALSE(PermissionUtil::ValidateDomainOverride(
descriptors, nullptr, blink::mojom::PermissionDescriptor::New()));
}
TEST_F(PermissionUtilTest, TestInvalidDomainOverrideNullRfh) {
content::BrowserTaskEnvironment task_environment;
TestBrowserContext browser_context;
RenderViewHostTestEnabler enabler;
std::unique_ptr<WebContents> web_contents(
WebContentsTester::CreateTestWebContents(
WebContents::CreateParams(&browser_context)));
WebContentsTester* web_contents_tester =
WebContentsTester::For(web_contents.get());
web_contents_tester->NavigateAndCommit(GURL("https://example.xyz"));
std::vector<blink::mojom::PermissionDescriptorPtr> descriptors;
descriptors.emplace_back(
PermissionDescriptorUtil::CreatePermissionDescriptorForPermissionType(
blink::PermissionType::STORAGE_ACCESS_GRANT));
EXPECT_FALSE(PermissionUtil::ValidateDomainOverride(
descriptors, nullptr, blink::mojom::PermissionDescriptor::New()));
}
TEST_F(PermissionUtilTest, TestValidDomainOverride) {
content::BrowserTaskEnvironment task_environment;
TestBrowserContext browser_context;
RenderViewHostTestEnabler enabler;
std::unique_ptr<WebContents> web_contents(
WebContentsTester::CreateTestWebContents(
WebContents::CreateParams(&browser_context)));
WebContentsTester* web_contents_tester =
WebContentsTester::For(web_contents.get());
web_contents_tester->NavigateAndCommit(GURL("https://example.xyz"));
url::Origin expected =
url::Origin::Create(GURL("https://another_example.xyz"));
blink::mojom::PermissionDescriptorPtr descriptor =
blink::mojom::PermissionDescriptor::New();
auto top_level_storage_access_extension =
blink::mojom::TopLevelStorageAccessPermissionDescriptor::New();
top_level_storage_access_extension->requestedOrigin = expected;
descriptor->extension =
blink::mojom::PermissionDescriptorExtension::NewTopLevelStorageAccess(
std::move(top_level_storage_access_extension));
std::vector<blink::mojom::PermissionDescriptorPtr> descriptors;
descriptors.emplace_back(
PermissionDescriptorUtil::CreatePermissionDescriptorForPermissionType(
blink::PermissionType::STORAGE_ACCESS_GRANT));
EXPECT_TRUE(PermissionUtil::ValidateDomainOverride(
descriptors, web_contents->GetPrimaryMainFrame(), descriptor));
}
TEST_F(PermissionUtilTest, TestSameOriginInvalidDomainOverride) {
content::BrowserTaskEnvironment task_environment;
TestBrowserContext browser_context;
RenderViewHostTestEnabler enabler;
std::unique_ptr<WebContents> web_contents(
WebContentsTester::CreateTestWebContents(
WebContents::CreateParams(&browser_context)));
WebContentsTester* web_contents_tester =
WebContentsTester::For(web_contents.get());
web_contents_tester->NavigateAndCommit(GURL("https://example.xyz"));
url::Origin expected = url::Origin::Create(GURL("https://example.xyz"));
blink::mojom::PermissionDescriptorPtr descriptor =
blink::mojom::PermissionDescriptor::New();
auto top_level_storage_access_extension =
blink::mojom::TopLevelStorageAccessPermissionDescriptor::New();
top_level_storage_access_extension->requestedOrigin = expected;
descriptor->extension =
blink::mojom::PermissionDescriptorExtension::NewTopLevelStorageAccess(
std::move(top_level_storage_access_extension));
std::vector<blink::mojom::PermissionDescriptorPtr> descriptors;
descriptors.emplace_back(
PermissionDescriptorUtil::CreatePermissionDescriptorForPermissionType(
blink::PermissionType::STORAGE_ACCESS_GRANT));
EXPECT_FALSE(PermissionUtil::ValidateDomainOverride(
descriptors, web_contents->GetPrimaryMainFrame(), descriptor));
}
} // namespace content