15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/extensions/api/content_settings/content_settings_store.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/content_settings/content_settings_utils.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/content_settings/core/browser/content_settings_rule.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "url/gurl.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Mock;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CheckRule(const content_settings::Rule& rule,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               const ContentSettingsPattern& primary_pattern,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               const ContentSettingsPattern& secondary_pattern,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               ContentSetting setting) {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(primary_pattern.ToString(), rule.primary_pattern.ToString());
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(secondary_pattern.ToString(), rule.secondary_pattern.ToString());
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(setting, content_settings::ValueToContentSetting(rule.value.get()));
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper class which returns monotonically-increasing base::Time objects.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FakeTimer {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FakeTimer() : internal_(0) {}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::Time GetNext() {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return base::Time::FromInternalValue(++internal_);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int64 internal_;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockContentSettingsStoreObserver
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public ContentSettingsStore::Observer {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MOCK_METHOD2(OnContentSettingChanged,
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)               void(const std::string& extension_id, bool incognito));
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ContentSetting GetContentSettingFromStore(
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContentSettingsStore* store,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& primary_url, const GURL& secondary_url,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& resource_identifier,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool incognito) {
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<content_settings::RuleIterator> rule_iterator(
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      store->GetRuleIterator(content_type, resource_identifier, incognito));
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<base::Value> setting(
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      content_settings::GetContentSettingValueAndPatterns(
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          rule_iterator.get(), primary_url, secondary_url, NULL, NULL));
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return content_settings::ValueToContentSetting(setting.get());
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void GetSettingsForOneTypeFromStore(
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ContentSettingsStore* store,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ContentSettingsType content_type,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& resource_identifier,
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool incognito,
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<content_settings::Rule>* rules) {
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  rules->clear();
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<content_settings::RuleIterator> rule_iterator(
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      store->GetRuleIterator(content_type, resource_identifier, incognito));
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (rule_iterator->HasNext())
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rules->push_back(rule_iterator->Next());
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ContentSettingsStoreTest : public ::testing::Test {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsStoreTest() :
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      store_(new ContentSettingsStore()) {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void RegisterExtension(const std::string& ext_id) {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    store_->RegisterExtension(ext_id, timer_.GetNext(), true);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsStore* store() {
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return store_.get();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FakeTimer timer_;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_refptr<ContentSettingsStore> store_;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ContentSettingsStoreTest, RegisterUnregister) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ::testing::StrictMock<MockContentSettingsStoreObserver> observer;
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store()->AddObserver(&observer);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url("http://www.youtube.com");
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CONTENT_SETTING_DEFAULT,
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            GetContentSettingFromStore(store(),
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       url,
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       url,
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       CONTENT_SETTINGS_TYPE_COOKIES,
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       std::string(),
110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       false));
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Register first extension
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string ext_id("my_extension");
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterExtension(ext_id);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CONTENT_SETTING_DEFAULT,
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            GetContentSettingFromStore(store(),
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       url,
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       url,
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       CONTENT_SETTINGS_TYPE_COOKIES,
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       std::string(),
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       false));
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set setting
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsPattern pattern =
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::FromURL(GURL("http://www.youtube.com"));
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer, OnContentSettingChanged(ext_id, false));
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  store()->SetExtensionContentSetting(ext_id,
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      pattern,
130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      pattern,
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      CONTENT_SETTINGS_TYPE_COOKIES,
132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      std::string(),
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      CONTENT_SETTING_ALLOW,
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      kExtensionPrefsScopeRegular);
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClear(&observer);
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CONTENT_SETTING_ALLOW,
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            GetContentSettingFromStore(store(),
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       url,
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       url,
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       CONTENT_SETTINGS_TYPE_COOKIES,
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       std::string(),
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       false));
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Register second extension.
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string ext_id_2("my_second_extension");
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterExtension(ext_id_2);
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer, OnContentSettingChanged(ext_id_2, false));
149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  store()->SetExtensionContentSetting(ext_id_2,
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      pattern,
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      pattern,
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      CONTENT_SETTINGS_TYPE_COOKIES,
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      std::string(),
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      CONTENT_SETTING_BLOCK,
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      kExtensionPrefsScopeRegular);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CONTENT_SETTING_BLOCK,
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            GetContentSettingFromStore(store(),
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       url,
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       url,
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       CONTENT_SETTINGS_TYPE_COOKIES,
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       std::string(),
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       false));
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unregister first extension. This shouldn't change the setting.
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer, OnContentSettingChanged(ext_id, false));
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store()->UnregisterExtension(ext_id);
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CONTENT_SETTING_BLOCK,
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            GetContentSettingFromStore(store(),
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       url,
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       url,
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       CONTENT_SETTINGS_TYPE_COOKIES,
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       std::string(),
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       false));
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Mock::VerifyAndClear(&observer);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Unregister second extension. This should reset the setting to its default
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // value.
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(observer, OnContentSettingChanged(ext_id_2, false));
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store()->UnregisterExtension(ext_id_2);
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_EQ(CONTENT_SETTING_DEFAULT,
182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            GetContentSettingFromStore(store(),
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       url,
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       url,
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       CONTENT_SETTINGS_TYPE_COOKIES,
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       std::string(),
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                       false));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store()->RemoveObserver(&observer);
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(ContentSettingsStoreTest, GetAllSettings) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool incognito = false;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<content_settings::Rule> rules;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetSettingsForOneTypeFromStore(
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      store(), CONTENT_SETTINGS_TYPE_COOKIES, std::string(), incognito, &rules);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, rules.size());
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Register first extension.
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string ext_id("my_extension");
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterExtension(ext_id);
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsPattern pattern =
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::FromURL(GURL("http://www.youtube.com"));
204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  store()->SetExtensionContentSetting(ext_id,
205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      pattern,
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      pattern,
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      CONTENT_SETTINGS_TYPE_COOKIES,
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      std::string(),
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      CONTENT_SETTING_ALLOW,
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      kExtensionPrefsScopeRegular);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetSettingsForOneTypeFromStore(
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      store(), CONTENT_SETTINGS_TYPE_COOKIES, std::string(), incognito, &rules);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, rules.size());
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckRule(rules[0], pattern, pattern, CONTENT_SETTING_ALLOW);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Register second extension.
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string ext_id_2("my_second_extension");
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  RegisterExtension(ext_id_2);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ContentSettingsPattern pattern_2 =
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ContentSettingsPattern::FromURL(GURL("http://www.example.com"));
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  store()->SetExtensionContentSetting(ext_id_2,
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      pattern_2,
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      pattern_2,
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      CONTENT_SETTINGS_TYPE_COOKIES,
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      std::string(),
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      CONTENT_SETTING_BLOCK,
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                      kExtensionPrefsScopeRegular);
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  GetSettingsForOneTypeFromStore(
231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      store(), CONTENT_SETTINGS_TYPE_COOKIES, std::string(), incognito, &rules);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(2u, rules.size());
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Rules appear in the reverse installation order of the extensions.
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckRule(rules[0], pattern_2, pattern_2, CONTENT_SETTING_BLOCK);
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckRule(rules[1], pattern, pattern, CONTENT_SETTING_ALLOW);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Disable first extension.
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store()->SetExtensionState(ext_id, false);
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetSettingsForOneTypeFromStore(
241c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      store(), CONTENT_SETTINGS_TYPE_COOKIES, std::string(), incognito, &rules);
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(1u, rules.size());
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CheckRule(rules[0], pattern_2, pattern_2, CONTENT_SETTING_BLOCK);
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Uninstall second extension.
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  store()->UnregisterExtension(ext_id_2);
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetSettingsForOneTypeFromStore(
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      store(), CONTENT_SETTINGS_TYPE_COOKIES, std::string(), incognito, &rules);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ASSERT_EQ(0u, rules.size());
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace extensions
254