#include "components/permissions/contexts/nfc_permission_context.h"
#include "base/memory/raw_ptr.h"
#include "build/build_config.h"
#include "components/content_settings/browser/test_page_specific_content_settings_delegate.h"
#include "components/permissions/permission_manager.h"
#include "components/permissions/permission_request_id.h"
#include "components/permissions/permission_request_manager.h"
#include "components/permissions/permissions_client.h"
#include "components/permissions/test/mock_permission_prompt_factory.h"
#include "components/permissions/test/test_permissions_client.h"
#include "content/public/test/mock_render_process_host.h"
#include "content/public/test/test_renderer_host.h"
#include "content/public/test/test_utils.h"
#if BUILDFLAG(IS_ANDROID)
#include "components/permissions/android/nfc/mock_nfc_system_level_setting.h"
#include "components/permissions/contexts/nfc_permission_context_android.h"
#endif
MockRenderProcessHost;
namespace permissions {
namespace {
class TestNfcPermissionContextDelegate : public NfcPermissionContext::Delegate { … };
}
class NfcPermissionContextTests : public content::RenderViewHostTestHarness { … };
PermissionRequestID NfcPermissionContextTests::RequestID(int request_id) { … }
void NfcPermissionContextTests::RequestNfcPermission(
const PermissionRequestID& id,
const GURL& requesting_frame,
bool user_gesture) { … }
void NfcPermissionContextTests::PermissionResponse(
const PermissionRequestID& id,
ContentSetting content_setting) { … }
void NfcPermissionContextTests::CheckPermissionMessageSent(int request_id,
bool allowed) { … }
void NfcPermissionContextTests::CheckPermissionMessageSentInternal(
MockRenderProcessHost* process,
int request_id,
bool allowed) { … }
void NfcPermissionContextTests::SetUp() { … }
void NfcPermissionContextTests::TearDown() { … }
void NfcPermissionContextTests::SetupRequestManager(
content::WebContents* web_contents) { … }
void NfcPermissionContextTests::RequestManagerDocumentLoadCompleted() { … }
ContentSetting NfcPermissionContextTests::GetNfcContentSetting(GURL frame_0,
GURL frame_1) { … }
void NfcPermissionContextTests::SetNfcContentSetting(
GURL frame_0,
GURL frame_1,
ContentSetting content_setting) { … }
bool NfcPermissionContextTests::HasActivePrompt() { … }
void NfcPermissionContextTests::AcceptPrompt() { … }
void NfcPermissionContextTests::DenyPrompt() { … }
void NfcPermissionContextTests::ClosePrompt() { … }
TEST_F(NfcPermissionContextTests, SinglePermissionPrompt) { … }
TEST_F(NfcPermissionContextTests, SinglePermissionPromptFailsOnInsecureOrigin) { … }
#if BUILDFLAG(IS_ANDROID)
TEST_F(NfcPermissionContextTests,
SystemNfcSettingDisabledWhenNfcPermissionGetsGranted) {
GURL requesting_frame("https://www.example.com/nfc");
NavigateAndCommit(requesting_frame);
RequestManagerDocumentLoadCompleted();
MockNfcSystemLevelSetting::SetNfcSystemLevelSettingEnabled(false);
EXPECT_FALSE(HasActivePrompt());
RequestNfcPermission(RequestID(0), requesting_frame, true);
ASSERT_TRUE(HasActivePrompt());
ASSERT_FALSE(MockNfcSystemLevelSetting::HasShownNfcSettingPrompt());
AcceptPrompt();
ASSERT_TRUE(MockNfcSystemLevelSetting::HasShownNfcSettingPrompt());
CheckPermissionMessageSent(0 , true );
}
TEST_F(NfcPermissionContextTests,
SystemNfcSettingDisabledWhenNfcPermissionGetsDenied) {
GURL requesting_frame("https://www.example.com/nfc");
NavigateAndCommit(requesting_frame);
RequestManagerDocumentLoadCompleted();
MockNfcSystemLevelSetting::SetNfcSystemLevelSettingEnabled(false);
EXPECT_FALSE(HasActivePrompt());
RequestNfcPermission(RequestID(0), requesting_frame, true);
ASSERT_TRUE(HasActivePrompt());
ASSERT_FALSE(MockNfcSystemLevelSetting::HasShownNfcSettingPrompt());
DenyPrompt();
ASSERT_FALSE(MockNfcSystemLevelSetting::HasShownNfcSettingPrompt());
CheckPermissionMessageSent(0 , false );
}
TEST_F(NfcPermissionContextTests,
SystemNfcSettingDisabledWhenNfcPermissionAlreadyGranted) {
GURL requesting_frame("https://www.example.com/nfc");
SetNfcContentSetting(requesting_frame, requesting_frame,
CONTENT_SETTING_ALLOW);
NavigateAndCommit(requesting_frame);
RequestManagerDocumentLoadCompleted();
MockNfcSystemLevelSetting::SetNfcSystemLevelSettingEnabled(false);
EXPECT_FALSE(HasActivePrompt());
RequestNfcPermission(RequestID(0), requesting_frame, true);
ASSERT_FALSE(HasActivePrompt());
ASSERT_TRUE(MockNfcSystemLevelSetting::HasShownNfcSettingPrompt());
}
TEST_F(NfcPermissionContextTests,
SystemNfcSettingEnabledWhenNfcPermissionAlreadyGranted) {
GURL requesting_frame("https://www.example.com/nfc");
SetNfcContentSetting(requesting_frame, requesting_frame,
CONTENT_SETTING_ALLOW);
NavigateAndCommit(requesting_frame);
RequestManagerDocumentLoadCompleted();
EXPECT_FALSE(HasActivePrompt());
RequestNfcPermission(RequestID(0), requesting_frame, true);
ASSERT_FALSE(HasActivePrompt());
ASSERT_FALSE(MockNfcSystemLevelSetting::HasShownNfcSettingPrompt());
}
TEST_F(NfcPermissionContextTests,
SystemNfcSettingCantBeEnabledWhenNfcPermissionGetsGranted) {
GURL requesting_frame("https://www.example.com/nfc");
NavigateAndCommit(requesting_frame);
RequestManagerDocumentLoadCompleted();
MockNfcSystemLevelSetting::SetNfcSystemLevelSettingEnabled(false);
MockNfcSystemLevelSetting::SetNfcAccessIsPossible(false);
EXPECT_FALSE(HasActivePrompt());
RequestNfcPermission(RequestID(0), requesting_frame, true);
ASSERT_TRUE(HasActivePrompt());
ASSERT_FALSE(MockNfcSystemLevelSetting::HasShownNfcSettingPrompt());
AcceptPrompt();
ASSERT_FALSE(HasActivePrompt());
ASSERT_FALSE(MockNfcSystemLevelSetting::HasShownNfcSettingPrompt());
CheckPermissionMessageSent(0 , true );
}
TEST_F(NfcPermissionContextTests,
SystemNfcSettingCantBeEnabledWhenNfcPermissionGetsDenied) {
GURL requesting_frame("https://www.example.com/nfc");
NavigateAndCommit(requesting_frame);
RequestManagerDocumentLoadCompleted();
MockNfcSystemLevelSetting::SetNfcSystemLevelSettingEnabled(false);
MockNfcSystemLevelSetting::SetNfcAccessIsPossible(false);
EXPECT_FALSE(HasActivePrompt());
RequestNfcPermission(RequestID(0), requesting_frame, true);
ASSERT_TRUE(HasActivePrompt());
ASSERT_FALSE(MockNfcSystemLevelSetting::HasShownNfcSettingPrompt());
DenyPrompt();
ASSERT_FALSE(HasActivePrompt());
ASSERT_FALSE(MockNfcSystemLevelSetting::HasShownNfcSettingPrompt());
CheckPermissionMessageSent(0 , false );
}
TEST_F(NfcPermissionContextTests,
SystemNfcSettingCantBeEnabledWhenNfcPermissionAlreadyGranted) {
GURL requesting_frame("https://www.example.com/nfc");
SetNfcContentSetting(requesting_frame, requesting_frame,
CONTENT_SETTING_ALLOW);
NavigateAndCommit(requesting_frame);
RequestManagerDocumentLoadCompleted();
MockNfcSystemLevelSetting::SetNfcSystemLevelSettingEnabled(false);
MockNfcSystemLevelSetting::SetNfcAccessIsPossible(false);
EXPECT_FALSE(HasActivePrompt());
RequestNfcPermission(RequestID(0), requesting_frame, true);
ASSERT_FALSE(HasActivePrompt());
ASSERT_FALSE(MockNfcSystemLevelSetting::HasShownNfcSettingPrompt());
CheckPermissionMessageSent(0 , true );
}
TEST_F(NfcPermissionContextTests, CancelNfcPermissionRequest) {
GURL requesting_frame("https://www.example.com/nfc");
EXPECT_EQ(CONTENT_SETTING_ASK,
GetNfcContentSetting(requesting_frame, requesting_frame));
NavigateAndCommit(requesting_frame);
RequestManagerDocumentLoadCompleted();
ASSERT_FALSE(HasActivePrompt());
RequestNfcPermission(RequestID(0), requesting_frame, true);
ASSERT_TRUE(HasActivePrompt());
ClosePrompt();
ASSERT_FALSE(MockNfcSystemLevelSetting::HasShownNfcSettingPrompt());
EXPECT_EQ(CONTENT_SETTING_ASK,
GetNfcContentSetting(requesting_frame, requesting_frame));
}
#endif
}