Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(126)

Side by Side Diff: chrome/browser/permissions/permission_manager_unittest.cc

Issue 2945243002: Permissions: Allow PermissionManager to return more PermissionStatusSources.
Patch Set: Cleanup. Created 3 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/permissions/permission_manager.h" 5 #include "chrome/browser/permissions/permission_manager.h"
6 6
7 #include "base/macros.h" 7 #include "base/macros.h"
8 #include "build/build_config.h" 8 #include "build/build_config.h"
9 #include "chrome/browser/content_settings/host_content_settings_map_factory.h" 9 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
10 #include "chrome/browser/permissions/permission_manager_factory.h" 10 #include "chrome/browser/permissions/permission_manager_factory.h"
11 #include "chrome/browser/permissions/permission_request_manager.h"
11 #include "chrome/browser/permissions/permission_result.h" 12 #include "chrome/browser/permissions/permission_result.h"
12 #include "chrome/test/base/chrome_render_view_host_test_harness.h" 13 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
13 #include "chrome/test/base/testing_profile.h" 14 #include "chrome/test/base/testing_profile.h"
14 #include "components/content_settings/core/browser/host_content_settings_map.h" 15 #include "components/content_settings/core/browser/host_content_settings_map.h"
16 #include "components/content_settings/core/common/pref_names.h"
17 #include "components/content_settings/core/test/content_settings_test_utils.h"
18 #include "components/sync_preferences/testing_pref_service_syncable.h"
15 #include "content/public/browser/permission_type.h" 19 #include "content/public/browser/permission_type.h"
16 #include "content/public/test/test_browser_thread_bundle.h" 20 #include "content/public/test/test_browser_thread_bundle.h"
17 #include "device/vr/features/features.h" 21 #include "device/vr/features/features.h"
18 #include "testing/gtest/include/gtest/gtest.h" 22 #include "testing/gtest/include/gtest/gtest.h"
19 23
20 #if BUILDFLAG(ENABLE_VR) && defined(OS_ANDROID) 24 #if BUILDFLAG(ENABLE_VR) && defined(OS_ANDROID)
21 #include "chrome/browser/android/vr_shell/vr_tab_helper.h" 25 #include "chrome/browser/android/vr_shell/vr_tab_helper.h"
22 #endif // BUILDFLAG(ENABLE_VR) && defined(OS_ANDROID) 26 #endif // BUILDFLAG(ENABLE_VR) && defined(OS_ANDROID)
23 27
28 #if !defined(OS_ANDROID)
29 #include "chrome/browser/extensions/api/content_settings/content_settings_custom _extension_provider.h"
30 #include "chrome/browser/extensions/api/content_settings/content_settings_store. h"
31 #endif // !defined(OS_ANDROID)
32
24 using blink::mojom::PermissionStatus; 33 using blink::mojom::PermissionStatus;
25 using content::PermissionType; 34 using content::PermissionType;
26 35
36 namespace test {
37
27 namespace { 38 namespace {
28 39
29 #if BUILDFLAG(ENABLE_VR) && defined(OS_ANDROID) 40 #if BUILDFLAG(ENABLE_VR) && defined(OS_ANDROID)
30 int kNoPendingOperation = -1; 41 int kNoPendingOperation = -1;
31 #endif // BUILDFLAG(ENABLE_VR) && defined(OS_ANDROID) 42 #endif // BUILDFLAG(ENABLE_VR) && defined(OS_ANDROID)
32 43
33 class PermissionManagerTestingProfile final : public TestingProfile { 44 class PermissionManagerTestingProfile final : public TestingProfile {
34 public: 45 public:
35 PermissionManagerTestingProfile() {} 46 PermissionManagerTestingProfile() {}
36 ~PermissionManagerTestingProfile() override {} 47 ~PermissionManagerTestingProfile() override {}
37 48
38 PermissionManager* GetPermissionManager() override { 49 PermissionManager* GetPermissionManager() override {
39 return PermissionManagerFactory::GetForProfile(this); 50 return PermissionManagerFactory::GetForProfile(this);
40 } 51 }
41 52
42 DISALLOW_COPY_AND_ASSIGN(PermissionManagerTestingProfile); 53 DISALLOW_COPY_AND_ASSIGN(PermissionManagerTestingProfile);
43 }; 54 };
44 55
45 } // anonymous namespace 56 } // namespace
46 57
47 class PermissionManagerTest : public ChromeRenderViewHostTestHarness { 58 class PermissionManagerTest : public ChromeRenderViewHostTestHarness {
48 public: 59 public:
49 void OnPermissionChange(PermissionStatus permission) { 60 void OnPermissionChange(PermissionStatus permission) {
50 callback_called_ = true; 61 callback_called_ = true;
51 callback_result_ = permission; 62 callback_result_ = permission;
52 } 63 }
53 64
54 protected: 65 protected:
55 PermissionManagerTest() 66 PermissionManagerTest()
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
148 CheckPermissionStatus(PermissionType::MIDI_SYSEX, PermissionStatus::GRANTED); 159 CheckPermissionStatus(PermissionType::MIDI_SYSEX, PermissionStatus::GRANTED);
149 160
150 #if defined(OS_ANDROID) 161 #if defined(OS_ANDROID)
151 SetPermission(CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER, 162 SetPermission(CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER,
152 CONTENT_SETTING_ALLOW); 163 CONTENT_SETTING_ALLOW);
153 CheckPermissionStatus(PermissionType::PROTECTED_MEDIA_IDENTIFIER, 164 CheckPermissionStatus(PermissionType::PROTECTED_MEDIA_IDENTIFIER,
154 PermissionStatus::GRANTED); 165 PermissionStatus::GRANTED);
155 #endif 166 #endif
156 } 167 }
157 168
158 TEST_F(PermissionManagerTest, CheckPersmissionResultDefault) { 169 TEST_F(PermissionManagerTest, CheckPermissionResultDefault) {
159 CheckPermissionResult(CONTENT_SETTINGS_TYPE_MIDI_SYSEX, CONTENT_SETTING_ASK, 170 CheckPermissionResult(CONTENT_SETTINGS_TYPE_MIDI_SYSEX, CONTENT_SETTING_ASK,
160 PermissionStatusSource::UNSPECIFIED); 171 PermissionStatusSource::UNSPECIFIED);
161 CheckPermissionResult(CONTENT_SETTINGS_TYPE_PUSH_MESSAGING, 172 CheckPermissionResult(CONTENT_SETTINGS_TYPE_PUSH_MESSAGING,
162 CONTENT_SETTING_ASK, 173 CONTENT_SETTING_ASK,
163 PermissionStatusSource::UNSPECIFIED); 174 PermissionStatusSource::UNSPECIFIED);
164 CheckPermissionResult(CONTENT_SETTINGS_TYPE_NOTIFICATIONS, 175 CheckPermissionResult(CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
165 CONTENT_SETTING_ASK, 176 CONTENT_SETTING_ASK,
166 PermissionStatusSource::UNSPECIFIED); 177 PermissionStatusSource::UNSPECIFIED);
167 CheckPermissionResult(CONTENT_SETTINGS_TYPE_GEOLOCATION, CONTENT_SETTING_ASK, 178 CheckPermissionResult(CONTENT_SETTINGS_TYPE_GEOLOCATION, CONTENT_SETTING_ASK,
168 PermissionStatusSource::UNSPECIFIED); 179 PermissionStatusSource::UNSPECIFIED);
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
428 439
429 vr_tab_helper->SetIsInVr(false); 440 vr_tab_helper->SetIsInVr(false);
430 GetPermissionManager()->RequestPermission( 441 GetPermissionManager()->RequestPermission(
431 PermissionType::NOTIFICATIONS, main_rfh(), url(), false, 442 PermissionType::NOTIFICATIONS, main_rfh(), url(), false,
432 base::Bind(&PermissionManagerTest::OnPermissionChange, 443 base::Bind(&PermissionManagerTest::OnPermissionChange,
433 base::Unretained(this))); 444 base::Unretained(this)));
434 EXPECT_TRUE(callback_called()); 445 EXPECT_TRUE(callback_called());
435 EXPECT_EQ(PermissionStatus::GRANTED, callback_result()); 446 EXPECT_EQ(PermissionStatus::GRANTED, callback_result());
436 } 447 }
437 #endif // BUILDFLAG(ENABLE_VR) && defined(OS_ANDROID) 448 #endif // BUILDFLAG(ENABLE_VR) && defined(OS_ANDROID)
449
450 class PermissionManagerStatusSourceTest
451 : public ChromeRenderViewHostTestHarness {
452 public:
453 PermissionManagerStatusSourceTest() : weak_factory_(this) {}
454
455 void SetUp() override {
456 ChromeRenderViewHostTestHarness::SetUp();
457 PermissionRequestManager::CreateForWebContents(web_contents());
458 }
459
460 PermissionManager* GetPermissionManager() {
461 return PermissionManagerFactory::GetForProfile(profile());
462 }
463
464 base::WeakPtr<PermissionManagerStatusSourceTest> GetWeakPtr() {
465 return weak_factory_.GetWeakPtr();
466 }
467
468 void NavigateToAndLoadGurl(GURL& gurl) {
469 NavigateAndCommit(gurl);
470 PermissionRequestManager::FromWebContents(web_contents())
471 ->DocumentOnLoadCompletedInMainFrame();
472 }
473
474 private:
475 base::WeakPtrFactory<PermissionManagerStatusSourceTest> weak_factory_;
476 };
477
478 // Helper class for setting ContentSettings via different sources.
479 class ContentSettingSourceSetter {
480 public:
481 ContentSettingSourceSetter(TestingProfile* profile,
482 ContentSettingsType content_type)
483 : prefs_(profile->GetTestingPrefService()),
484 host_content_settings_map_(
485 HostContentSettingsMapFactory::GetForProfile(profile)),
486 #if !defined(OS_ANDROID)
487 store_(new extensions::ContentSettingsStore()),
488 #endif // !defined(OS_ANDROID)
489 content_type_(content_type) {
490 #if !defined(OS_ANDROID)
491 store_->RegisterExtension(extension_id_, base::Time::UnixEpoch(), true);
492 content_settings::TestUtils::OverrideProvider(
493 host_content_settings_map_,
494 base::MakeUnique<content_settings::CustomExtensionProvider>(store_,
495 true),
496 HostContentSettingsMap::CUSTOM_EXTENSION_PROVIDER);
497 #endif // !defined(OS_ANDROID)
498 }
499
500 void SetPolicyDefault(ContentSetting setting) {
501 prefs_->SetManagedPref(GetPrefNameForDefaultPermissionSetting(),
502 base::MakeUnique<base::Value>(setting));
503 }
504
505 void AddPolicyException(const std::string& pattern, ContentSetting setting) {
506 auto pattern_list = base::MakeUnique<base::ListValue>();
507 pattern_list->Set(0, base::MakeUnique<base::Value>(pattern));
508 if (setting == CONTENT_SETTING_ALLOW)
509 prefs_->SetManagedPref(GetPrefNameForAllowingSettingForPattern(),
510 std::move(pattern_list));
511 }
512
513 #if !defined(OS_ANDROID)
514 void AddExtensionException(std::string exception,
515 ContentSetting content_settings) {
516 ContentSettingsPattern pattern =
517 ContentSettingsPattern::FromString(exception);
518 store()->SetExtensionContentSetting(
519 extension_id_, pattern, pattern, content_type_, std::string(),
520 content_settings, extensions::kExtensionPrefsScopeRegular);
521 }
522 #endif // !defined(OS_ANDROID)
523
524 void AddUserException(std::string exception,
525 ContentSetting content_settings) {
526 ContentSettingsPattern pattern =
527 ContentSettingsPattern::FromString(exception);
528 host_content_settings_map_->SetContentSettingCustomScope(
529 pattern, pattern, content_type_, std::string(), content_settings);
530 }
531
532 const char* GetPrefNameForDefaultPermissionSetting() {
533 switch (content_type_) {
534 case CONTENT_SETTINGS_TYPE_GEOLOCATION:
535 return prefs::kManagedDefaultGeolocationSetting;
536 case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
537 return prefs::kManagedDefaultNotificationsSetting;
538 default:
539 // Add support as needed.
540 NOTREACHED();
541 return "";
542 }
543 }
544
545 const char* GetPrefNameForAllowingSettingForPattern() {
546 switch (content_type_) {
547 case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
548 return prefs::kManagedNotificationsAllowedForUrls;
549 default:
550 // Add support as needed.
551 NOTREACHED();
552 return "";
553 }
554 }
555
556 const char* GetPrefNameForBlockingSettingForPattern() {
557 switch (content_type_) {
558 case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
559 return prefs::kManagedNotificationsBlockedForUrls;
560 default:
561 // Add support as needed.
562 NOTREACHED();
563 return "";
564 }
565 }
566
567 #if !defined(OS_ANDROID)
568 extensions::ContentSettingsStore* store() { return store_.get(); }
569 #endif // !defined(OS_ANDROID)
570
571 private:
572 sync_preferences::TestingPrefServiceSyncable* prefs_;
573 HostContentSettingsMap* host_content_settings_map_;
574 #if !defined(OS_ANDROID)
575 scoped_refptr<extensions::ContentSettingsStore> store_;
576 std::string extension_id_ = "test-extension";
577 #endif // !defined(OS_ANDROID)
578 ContentSettingsType content_type_;
579
580 DISALLOW_COPY_AND_ASSIGN(ContentSettingSourceSetter);
581 };
582
583 // Check PermissionResult shows requests denied due to insecure origins.
584 TEST_F(PermissionManagerStatusSourceTest, InsecureOrigin) {
585 GURL insecure_frame("http://www.example.com/geolocation");
586 NavigateToAndLoadGurl(insecure_frame);
587
588 PermissionResult result = GetPermissionManager()->GetPermissionStatusForFrame(
589 CONTENT_SETTINGS_TYPE_GEOLOCATION, web_contents()->GetMainFrame(),
590 insecure_frame);
591
592 EXPECT_EQ(CONTENT_SETTING_BLOCK, result.content_setting);
593 EXPECT_EQ(PermissionStatusSource::INSECURE_ORIGIN, result.source);
594
595 GURL secure_frame("https://www.example.com/geolocation");
596 NavigateToAndLoadGurl(secure_frame);
597
598 result = GetPermissionManager()->GetPermissionStatusForFrame(
599 CONTENT_SETTINGS_TYPE_GEOLOCATION, web_contents()->GetMainFrame(),
600 secure_frame);
601
602 EXPECT_EQ(CONTENT_SETTING_ASK, result.content_setting);
603 EXPECT_EQ(PermissionStatusSource::UNSPECIFIED, result.source);
604 }
605
606 // Check PermissionResult shows permissions controlled by enterprise policy,
607 // including patterns set by the policy.
608 TEST_F(PermissionManagerStatusSourceTest, EnterprisePolicy) {
609 GURL requesting_frame("https://www.example.com/path/to/page");
610 NavigateToAndLoadGurl(requesting_frame);
611 ContentSettingSourceSetter pref_tester(profile(),
612 CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
613
614 // Default setting should be 'ASK' and controlled by the user.
615 PermissionResult result = GetPermissionManager()->GetPermissionStatusForFrame(
616 CONTENT_SETTINGS_TYPE_NOTIFICATIONS, web_contents()->GetMainFrame(),
617 requesting_frame);
618 EXPECT_EQ(CONTENT_SETTING_ASK, result.content_setting);
619 EXPECT_EQ(PermissionStatusSource::UNSPECIFIED, result.source);
620
621 // Set the default via policy.
622 pref_tester.SetPolicyDefault(CONTENT_SETTING_BLOCK);
623 result = GetPermissionManager()->GetPermissionStatusForFrame(
624 CONTENT_SETTINGS_TYPE_NOTIFICATIONS, web_contents()->GetMainFrame(),
625 requesting_frame);
626 EXPECT_EQ(CONTENT_SETTING_BLOCK, result.content_setting);
627 EXPECT_EQ(PermissionStatusSource::ENTERPRISE_POLICY, result.source);
628
629 pref_tester.AddPolicyException("https://*", CONTENT_SETTING_ALLOW);
630 result = GetPermissionManager()->GetPermissionStatusForFrame(
631 CONTENT_SETTINGS_TYPE_NOTIFICATIONS, web_contents()->GetMainFrame(),
632 requesting_frame);
633
634 EXPECT_EQ(CONTENT_SETTING_ALLOW, result.content_setting);
635 EXPECT_EQ(PermissionStatusSource::ENTERPRISE_POLICY, result.source);
636 }
637
638 #if !defined(OS_ANDROID)
639 // Check PermissionResult shows permissions controlled by an extension,
640 // including patterns set by an extension.
641 TEST_F(PermissionManagerStatusSourceTest, Extension) {
642 GURL requesting_frame("https://www.example.com/path/to/page");
643 NavigateToAndLoadGurl(requesting_frame);
644 ContentSettingSourceSetter pref_tester(profile(),
645 CONTENT_SETTINGS_TYPE_GEOLOCATION);
646
647 // Add a universal setting for geolocation access.
648 pref_tester.AddExtensionException("*", CONTENT_SETTING_BLOCK);
649 PermissionResult result = GetPermissionManager()->GetPermissionStatusForFrame(
650 CONTENT_SETTINGS_TYPE_GEOLOCATION, web_contents()->GetMainFrame(),
651 requesting_frame);
652
653 EXPECT_EQ(CONTENT_SETTING_BLOCK, result.content_setting);
654 EXPECT_EQ(PermissionStatusSource::EXTENSION, result.source);
655
656 // Override the above pattern.
657 pref_tester.AddExtensionException("https://*", CONTENT_SETTING_ALLOW);
658 result = GetPermissionManager()->GetPermissionStatusForFrame(
659 CONTENT_SETTINGS_TYPE_GEOLOCATION, web_contents()->GetMainFrame(),
660 requesting_frame);
661
662 EXPECT_EQ(CONTENT_SETTING_ALLOW, result.content_setting);
663 EXPECT_EQ(PermissionStatusSource::EXTENSION, result.source);
664 }
665 #endif // !defined(OS_ANDROID)
666
667 // Check PermissionResult shows permissions controlled by the user, including
668 // patterns set by the user.
669 TEST_F(PermissionManagerStatusSourceTest, User) {
670 GURL requesting_frame("https://www.example.com/path/to/page");
671 NavigateToAndLoadGurl(requesting_frame);
672 ContentSettingSourceSetter pref_tester(profile(),
673 CONTENT_SETTINGS_TYPE_GEOLOCATION);
674
675 pref_tester.AddUserException("*", CONTENT_SETTING_BLOCK);
676 PermissionResult result = GetPermissionManager()->GetPermissionStatusForFrame(
677 CONTENT_SETTINGS_TYPE_GEOLOCATION, web_contents()->GetMainFrame(),
678 requesting_frame);
679
680 EXPECT_EQ(CONTENT_SETTING_BLOCK, result.content_setting);
681 EXPECT_EQ(PermissionStatusSource::UNSPECIFIED, result.source);
682
683 // Override the above pattern.
684 pref_tester.AddUserException("https://*", CONTENT_SETTING_ALLOW);
685 result = GetPermissionManager()->GetPermissionStatusForFrame(
686 CONTENT_SETTINGS_TYPE_GEOLOCATION, web_contents()->GetMainFrame(),
687 requesting_frame);
688
689 EXPECT_EQ(CONTENT_SETTING_ALLOW, result.content_setting);
690 EXPECT_EQ(PermissionStatusSource::UNSPECIFIED, result.source);
691 }
692
693 #if !defined(OS_ANDROID)
694 // Check PermissionResult shows permissions controlled by a user, extensions,
695 // and policy, and verify the ContentSetting of the highest precedence source is
696 // surfaced by the PermissionManager.
697 TEST_F(PermissionManagerStatusSourceTest, SourceOverriddenByOtherSource) {
698 GURL requesting_frame("https://www.example.com/path/to/page");
699 NavigateToAndLoadGurl(requesting_frame);
700 ContentSettingSourceSetter pref_tester(profile(),
701 CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
702
703 pref_tester.AddUserException("*", CONTENT_SETTING_ALLOW);
704 PermissionResult result = GetPermissionManager()->GetPermissionStatusForFrame(
705 CONTENT_SETTINGS_TYPE_NOTIFICATIONS, web_contents()->GetMainFrame(),
706 requesting_frame);
707 EXPECT_EQ(CONTENT_SETTING_ALLOW, result.content_setting);
708 EXPECT_EQ(PermissionStatusSource::UNSPECIFIED, result.source);
709
710 // Verify extension settings take precedence over the user's.
711 pref_tester.AddExtensionException("https://*", CONTENT_SETTING_BLOCK);
712 result = GetPermissionManager()->GetPermissionStatusForFrame(
713 CONTENT_SETTINGS_TYPE_NOTIFICATIONS, web_contents()->GetMainFrame(),
714 requesting_frame);
715 EXPECT_EQ(CONTENT_SETTING_BLOCK, result.content_setting);
716 EXPECT_EQ(PermissionStatusSource::EXTENSION, result.source);
717
718 // Verify policy settings take precedence over extensions.
719 pref_tester.AddPolicyException("https://*", CONTENT_SETTING_ALLOW);
720 result = GetPermissionManager()->GetPermissionStatusForFrame(
721 CONTENT_SETTINGS_TYPE_NOTIFICATIONS, web_contents()->GetMainFrame(),
722 requesting_frame);
723 EXPECT_EQ(CONTENT_SETTING_ALLOW, result.content_setting);
724 EXPECT_EQ(PermissionStatusSource::ENTERPRISE_POLICY, result.source);
725 EXPECT_NE(PermissionStatusSource::EXTENSION, result.source);
726 EXPECT_NE(PermissionStatusSource::UNSPECIFIED, result.source);
727 }
728 #endif // !defined(OS_ANDROID)
729
730 } // namespace test
OLDNEW
« no previous file with comments | « chrome/browser/permissions/permission_context_base.cc ('k') | chrome/browser/permissions/permission_request_manager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698