| // 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 |