| // Copyright 2015 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "chrome/browser/permissions/chooser_context_base.h" |
| #include "chrome/test/base/testing_profile.h" |
| #include "content/public/test/test_browser_thread_bundle.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace { |
| |
| const char* kRequiredKey1 = "key-1"; |
| const char* kRequiredKey2 = "key-2"; |
| |
| class TestChooserContext : public ChooserContextBase { |
| public: |
| // This class uses the USB content settings type for testing purposes only. |
| explicit TestChooserContext(Profile* profile) |
| : ChooserContextBase(profile, CONTENT_SETTINGS_TYPE_USB_CHOOSER_DATA) {} |
| ~TestChooserContext() override {} |
| |
| bool IsValidObject(const base::DictionaryValue& object) override { |
| return object.size() == 2 && object.HasKey(kRequiredKey1) && |
| object.HasKey(kRequiredKey2); |
| } |
| }; |
| |
| } // namespace |
| |
| class ChooserContextBaseTest : public testing::Test { |
| public: |
| ChooserContextBaseTest() |
| : context_(&profile_), |
| origin1_("https://google.com"), |
| origin2_("https://chromium.org") { |
| object1_.SetString(kRequiredKey1, "value1"); |
| object1_.SetString(kRequiredKey2, "value2"); |
| object2_.SetString(kRequiredKey1, "value3"); |
| object2_.SetString(kRequiredKey2, "value4"); |
| } |
| |
| ~ChooserContextBaseTest() override {} |
| |
| private: |
| content::TestBrowserThreadBundle thread_bundle_; |
| TestingProfile profile_; |
| |
| protected: |
| TestChooserContext context_; |
| GURL origin1_; |
| GURL origin2_; |
| base::DictionaryValue object1_; |
| base::DictionaryValue object2_; |
| }; |
| |
| TEST_F(ChooserContextBaseTest, GrantAndRevokeObjectPermissions) { |
| context_.GrantObjectPermission(origin1_, origin1_, object1_.CreateDeepCopy()); |
| context_.GrantObjectPermission(origin1_, origin1_, object2_.CreateDeepCopy()); |
| |
| std::vector<std::unique_ptr<base::DictionaryValue>> objects = |
| context_.GetGrantedObjects(origin1_, origin1_); |
| EXPECT_EQ(2u, objects.size()); |
| EXPECT_TRUE(object1_.Equals(objects[0].get())); |
| EXPECT_TRUE(object2_.Equals(objects[1].get())); |
| |
| // Granting permission to one origin should not grant them to another. |
| objects = context_.GetGrantedObjects(origin2_, origin2_); |
| EXPECT_EQ(0u, objects.size()); |
| |
| // Nor when the original origin is embedded in another. |
| objects = context_.GetGrantedObjects(origin1_, origin2_); |
| EXPECT_EQ(0u, objects.size()); |
| } |
| |
| TEST_F(ChooserContextBaseTest, GrantObjectPermissionTwice) { |
| context_.GrantObjectPermission(origin1_, origin1_, object1_.CreateDeepCopy()); |
| context_.GrantObjectPermission(origin1_, origin1_, object1_.CreateDeepCopy()); |
| |
| std::vector<std::unique_ptr<base::DictionaryValue>> objects = |
| context_.GetGrantedObjects(origin1_, origin1_); |
| EXPECT_EQ(1u, objects.size()); |
| EXPECT_TRUE(object1_.Equals(objects[0].get())); |
| |
| context_.RevokeObjectPermission(origin1_, origin1_, object1_); |
| objects = context_.GetGrantedObjects(origin1_, origin1_); |
| EXPECT_EQ(0u, objects.size()); |
| } |
| |
| TEST_F(ChooserContextBaseTest, GrantObjectPermissionEmbedded) { |
| context_.GrantObjectPermission(origin1_, origin2_, object1_.CreateDeepCopy()); |
| |
| std::vector<std::unique_ptr<base::DictionaryValue>> objects = |
| context_.GetGrantedObjects(origin1_, origin2_); |
| EXPECT_EQ(1u, objects.size()); |
| EXPECT_TRUE(object1_.Equals(objects[0].get())); |
| |
| // The embedding origin still does not have permission. |
| objects = context_.GetGrantedObjects(origin2_, origin2_); |
| EXPECT_EQ(0u, objects.size()); |
| |
| // The requesting origin also doesn't have permission when not embedded. |
| objects = context_.GetGrantedObjects(origin1_, origin1_); |
| EXPECT_EQ(0u, objects.size()); |
| } |
| |
| TEST_F(ChooserContextBaseTest, GetAllGrantedObjects) { |
| context_.GrantObjectPermission(origin1_, origin1_, object1_.CreateDeepCopy()); |
| context_.GrantObjectPermission(origin2_, origin2_, object2_.CreateDeepCopy()); |
| |
| std::vector<std::unique_ptr<ChooserContextBase::Object>> objects = |
| context_.GetAllGrantedObjects(); |
| EXPECT_EQ(2u, objects.size()); |
| bool found_one = false; |
| bool found_two = false; |
| for (const auto& object : objects) { |
| if (object->requesting_origin == origin1_) { |
| EXPECT_FALSE(found_one); |
| EXPECT_EQ(origin1_, object->embedding_origin); |
| EXPECT_TRUE(object->object.Equals(&object1_)); |
| found_one = true; |
| } else if (object->requesting_origin == origin2_) { |
| EXPECT_FALSE(found_two); |
| EXPECT_EQ(origin2_, object->embedding_origin); |
| EXPECT_TRUE(object->object.Equals(&object2_)); |
| found_two = true; |
| } else { |
| ADD_FAILURE() << "Unexpected object."; |
| } |
| } |
| EXPECT_TRUE(found_one); |
| EXPECT_TRUE(found_two); |
| } |