Home | History | Annotate | Download | only in content_settings
      1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/content_settings/content_settings_pref_provider.h"
      6 
      7 #include "base/auto_reset.h"
      8 #include "base/command_line.h"
      9 #include "chrome/browser/content_settings/stub_settings_observer.h"
     10 #include "chrome/browser/prefs/browser_prefs.h"
     11 #include "chrome/browser/prefs/default_pref_store.h"
     12 #include "chrome/browser/prefs/overlay_persistent_pref_store.h"
     13 #include "chrome/browser/prefs/pref_service.h"
     14 #include "chrome/browser/prefs/testing_pref_store.h"
     15 #include "chrome/common/chrome_switches.h"
     16 #include "chrome/common/pref_names.h"
     17 #include "chrome/common/url_constants.h"
     18 #include "chrome/test/testing_browser_process_test.h"
     19 #include "chrome/test/testing_pref_service.h"
     20 #include "chrome/test/testing_profile.h"
     21 #include "content/browser/browser_thread.h"
     22 #include "googleurl/src/gurl.h"
     23 #include "testing/gtest/include/gtest/gtest.h"
     24 
     25 namespace {
     26 class ContentSettingsPrefService : public PrefService {
     27  public:
     28   ContentSettingsPrefService(PrefStore* managed_platform_prefs,
     29                              PrefStore* managed_cloud_prefs,
     30                              PrefStore* extension_prefs,
     31                              PrefStore* command_line_prefs,
     32                              PersistentPrefStore* user_prefs,
     33                              PrefStore* recommended_platform_prefs,
     34                              PrefStore* recommended_cloud_prefs,
     35                              DefaultPrefStore* default_store)
     36       : PrefService(
     37           managed_platform_prefs, managed_cloud_prefs, extension_prefs,
     38           command_line_prefs, user_prefs, recommended_platform_prefs,
     39           recommended_cloud_prefs, default_store, NULL) {}
     40   virtual ~ContentSettingsPrefService() {}
     41 };
     42 }
     43 
     44 namespace content_settings {
     45 
     46 class PrefDefaultProviderTest : public TestingBrowserProcessTest {
     47  public:
     48   PrefDefaultProviderTest()
     49       : ui_thread_(BrowserThread::UI, &message_loop_) {
     50   }
     51 
     52  protected:
     53   MessageLoop message_loop_;
     54   BrowserThread ui_thread_;
     55 };
     56 
     57 TEST_F(PrefDefaultProviderTest, DefaultValues) {
     58   TestingProfile profile;
     59   content_settings::PrefDefaultProvider provider(&profile);
     60 
     61   ASSERT_FALSE(
     62       provider.DefaultSettingIsManaged(CONTENT_SETTINGS_TYPE_COOKIES));
     63 
     64   // Check setting defaults.
     65   EXPECT_EQ(CONTENT_SETTING_ALLOW,
     66             provider.ProvideDefaultSetting(CONTENT_SETTINGS_TYPE_COOKIES));
     67   provider.UpdateDefaultSetting(CONTENT_SETTINGS_TYPE_COOKIES,
     68                                 CONTENT_SETTING_BLOCK);
     69   EXPECT_EQ(CONTENT_SETTING_BLOCK,
     70             provider.ProvideDefaultSetting(CONTENT_SETTINGS_TYPE_COOKIES));
     71   provider.ResetToDefaults();
     72   EXPECT_EQ(CONTENT_SETTING_ALLOW,
     73             provider.ProvideDefaultSetting(CONTENT_SETTINGS_TYPE_COOKIES));
     74 }
     75 
     76 TEST_F(PrefDefaultProviderTest, Observer) {
     77   TestingProfile profile;
     78   PrefDefaultProvider provider(&profile);
     79   StubSettingsObserver observer;
     80 
     81   provider.UpdateDefaultSetting(
     82       CONTENT_SETTINGS_TYPE_IMAGES, CONTENT_SETTING_BLOCK);
     83   EXPECT_EQ(profile.GetHostContentSettingsMap(), observer.last_notifier);
     84   EXPECT_TRUE(observer.last_update_all);
     85   EXPECT_FALSE(observer.last_update_all_types);
     86   EXPECT_EQ(1, observer.counter);
     87 }
     88 
     89 TEST_F(PrefDefaultProviderTest, ObserveDefaultPref) {
     90   TestingProfile profile;
     91   PrefDefaultProvider provider(&profile);
     92 
     93   PrefService* prefs = profile.GetPrefs();
     94 
     95   // Make a copy of the default pref value so we can reset it later.
     96   scoped_ptr<Value> default_value(prefs->FindPreference(
     97       prefs::kDefaultContentSettings)->GetValue()->DeepCopy());
     98 
     99   provider.UpdateDefaultSetting(
    100       CONTENT_SETTINGS_TYPE_COOKIES, CONTENT_SETTING_BLOCK);
    101   EXPECT_EQ(CONTENT_SETTING_BLOCK,
    102             provider.ProvideDefaultSetting(CONTENT_SETTINGS_TYPE_COOKIES));
    103 
    104   // Make a copy of the pref's new value so we can reset it later.
    105   scoped_ptr<Value> new_value(prefs->FindPreference(
    106       prefs::kDefaultContentSettings)->GetValue()->DeepCopy());
    107 
    108   // Clearing the backing pref should also clear the internal cache.
    109   prefs->Set(prefs::kDefaultContentSettings, *default_value);
    110   EXPECT_EQ(CONTENT_SETTING_ALLOW,
    111             provider.ProvideDefaultSetting(CONTENT_SETTINGS_TYPE_COOKIES));
    112 
    113   // Reseting the pref to its previous value should update the cache.
    114   prefs->Set(prefs::kDefaultContentSettings, *new_value);
    115   EXPECT_EQ(CONTENT_SETTING_BLOCK,
    116             provider.ProvideDefaultSetting(CONTENT_SETTINGS_TYPE_COOKIES));
    117 }
    118 
    119 TEST_F(PrefDefaultProviderTest, OffTheRecord) {
    120   TestingProfile profile;
    121   PrefDefaultProvider provider(&profile);
    122 
    123   profile.set_incognito(true);
    124   PrefDefaultProvider otr_provider(&profile);
    125   profile.set_incognito(false);
    126 
    127   EXPECT_EQ(CONTENT_SETTING_ALLOW,
    128             provider.ProvideDefaultSetting(CONTENT_SETTINGS_TYPE_COOKIES));
    129   EXPECT_EQ(CONTENT_SETTING_ALLOW,
    130             otr_provider.ProvideDefaultSetting(CONTENT_SETTINGS_TYPE_COOKIES));
    131 
    132   // Changing content settings on the main provider should also affect the
    133   // incognito map.
    134   provider.UpdateDefaultSetting(CONTENT_SETTINGS_TYPE_COOKIES,
    135                                 CONTENT_SETTING_BLOCK);
    136   EXPECT_EQ(CONTENT_SETTING_BLOCK,
    137             provider.ProvideDefaultSetting(CONTENT_SETTINGS_TYPE_COOKIES));
    138   EXPECT_EQ(CONTENT_SETTING_BLOCK,
    139             otr_provider.ProvideDefaultSetting(CONTENT_SETTINGS_TYPE_COOKIES));
    140 
    141   // Changing content settings on the incognito provider should be ignored.
    142   otr_provider.UpdateDefaultSetting(CONTENT_SETTINGS_TYPE_COOKIES,
    143                                    CONTENT_SETTING_ALLOW);
    144   EXPECT_EQ(CONTENT_SETTING_BLOCK,
    145             provider.ProvideDefaultSetting(CONTENT_SETTINGS_TYPE_COOKIES));
    146   EXPECT_EQ(CONTENT_SETTING_BLOCK,
    147             otr_provider.ProvideDefaultSetting(CONTENT_SETTINGS_TYPE_COOKIES));
    148 }
    149 
    150 // ////////////////////////////////////////////////////////////////////////////
    151 // PrefProviderTest
    152 //
    153 
    154 bool SettingsEqual(const ContentSettings& settings1,
    155                    const ContentSettings& settings2) {
    156   for (int i = 0; i < CONTENT_SETTINGS_NUM_TYPES; ++i) {
    157     if (settings1.settings[i] != settings2.settings[i])
    158       return false;
    159   }
    160   return true;
    161 }
    162 
    163 class PrefProviderTest : public TestingBrowserProcessTest {
    164  public:
    165   PrefProviderTest() : ui_thread_(
    166       BrowserThread::UI, &message_loop_) {
    167   }
    168 
    169  protected:
    170   MessageLoop message_loop_;
    171   BrowserThread ui_thread_;
    172 };
    173 
    174 TEST_F(PrefProviderTest, Observer) {
    175   TestingProfile profile;
    176   profile.GetHostContentSettingsMap();
    177   Profile* p = &profile;
    178   PrefProvider pref_content_settings_provider(p);
    179   StubSettingsObserver observer;
    180   ContentSettingsPattern pattern("[*.]example.com");
    181 
    182   pref_content_settings_provider.SetContentSetting(
    183       pattern,
    184       pattern,
    185       CONTENT_SETTINGS_TYPE_IMAGES,
    186       "",
    187       CONTENT_SETTING_ALLOW);
    188   EXPECT_EQ(profile.GetHostContentSettingsMap(), observer.last_notifier);
    189   EXPECT_EQ(pattern, observer.last_pattern);
    190   EXPECT_FALSE(observer.last_update_all);
    191   EXPECT_FALSE(observer.last_update_all_types);
    192   // Expect 2 calls: One from the update and one from canonicalization.
    193   EXPECT_EQ(2, observer.counter);
    194 }
    195 
    196 // Test for regression in which the PrefProvider modified the user pref store
    197 // of the OTR unintentionally: http://crbug.com/74466.
    198 TEST_F(PrefProviderTest, Incognito) {
    199   DefaultPrefStore* default_prefs = new DefaultPrefStore();
    200   PersistentPrefStore* user_prefs = new TestingPrefStore();
    201   OverlayPersistentPrefStore* otr_user_prefs =
    202       new OverlayPersistentPrefStore(user_prefs);
    203 
    204   PrefService* regular_prefs = new ContentSettingsPrefService(
    205       NULL,  // managed_platform_prefs
    206       NULL,  // managed_cloud_prefs
    207       NULL,  // extension_prefs
    208       NULL,  // command_line_prefs
    209       user_prefs,
    210       NULL,  // recommended_platform_prefs,
    211       NULL,  // recommended_cloud_prefs,
    212       default_prefs);
    213 
    214   Profile::RegisterUserPrefs(regular_prefs);
    215   browser::RegisterUserPrefs(regular_prefs);
    216 
    217   PrefService* otr_prefs = new ContentSettingsPrefService(
    218         NULL,  // managed_platform_prefs
    219         NULL,  // managed_cloud_prefs
    220         NULL,  // extension_prefs
    221         NULL,  // command_line_prefs
    222         otr_user_prefs,
    223         NULL,  // recommended_platform_prefs,
    224         NULL,  // recommended_cloud_prefs,
    225         default_prefs);
    226 
    227   TestingProfile profile;
    228   TestingProfile* otr_profile = new TestingProfile;
    229   profile.SetOffTheRecordProfile(otr_profile);
    230   profile.SetPrefService(regular_prefs);
    231   otr_profile->set_incognito(true);
    232   otr_profile->SetPrefService(otr_prefs);
    233   profile.GetHostContentSettingsMap();
    234 
    235   PrefProvider pref_content_settings_provider(&profile);
    236   PrefProvider pref_content_settings_provider_incognito(otr_profile);
    237   ContentSettingsPattern pattern("[*.]example.com");
    238   pref_content_settings_provider.SetContentSetting(
    239       pattern,
    240       pattern,
    241       CONTENT_SETTINGS_TYPE_IMAGES,
    242       "",
    243       CONTENT_SETTING_ALLOW);
    244 
    245   GURL host("http://example.com/");
    246   // The value should of course be visible in the regular PrefProvider.
    247   EXPECT_EQ(CONTENT_SETTING_ALLOW,
    248             pref_content_settings_provider.GetContentSetting(
    249                 host, host, CONTENT_SETTINGS_TYPE_IMAGES, ""));
    250   // And also in the OTR version.
    251   EXPECT_EQ(CONTENT_SETTING_ALLOW,
    252             pref_content_settings_provider_incognito.GetContentSetting(
    253                 host, host, CONTENT_SETTINGS_TYPE_IMAGES, ""));
    254   // But the value should not be overridden in the OTR user prefs accidentally.
    255   EXPECT_FALSE(otr_user_prefs->IsSetInOverlay(prefs::kContentSettingsPatterns));
    256 }
    257 
    258 TEST_F(PrefProviderTest, Patterns) {
    259   TestingProfile testing_profile;
    260   testing_profile.GetHostContentSettingsMap();
    261   PrefProvider pref_content_settings_provider(
    262       testing_profile.GetOriginalProfile());
    263 
    264   GURL host1("http://example.com/");
    265   GURL host2("http://www.example.com/");
    266   GURL host3("http://example.org/");
    267   GURL host4("file:///tmp/test.html");
    268   ContentSettingsPattern pattern1("[*.]example.com");
    269   ContentSettingsPattern pattern2("example.org");
    270   ContentSettingsPattern pattern3("file:///tmp/test.html");
    271 
    272   EXPECT_EQ(CONTENT_SETTING_DEFAULT,
    273             pref_content_settings_provider.GetContentSetting(
    274                 host1, host1, CONTENT_SETTINGS_TYPE_IMAGES, ""));
    275   pref_content_settings_provider.SetContentSetting(
    276       pattern1,
    277       pattern1,
    278       CONTENT_SETTINGS_TYPE_IMAGES,
    279       "",
    280       CONTENT_SETTING_BLOCK);
    281   EXPECT_EQ(CONTENT_SETTING_BLOCK,
    282             pref_content_settings_provider.GetContentSetting(
    283                 host1, host1, CONTENT_SETTINGS_TYPE_IMAGES, ""));
    284   EXPECT_EQ(CONTENT_SETTING_BLOCK,
    285             pref_content_settings_provider.GetContentSetting(
    286                 host2, host2, CONTENT_SETTINGS_TYPE_IMAGES, ""));
    287 
    288   EXPECT_EQ(CONTENT_SETTING_DEFAULT,
    289             pref_content_settings_provider.GetContentSetting(
    290                 host3, host3, CONTENT_SETTINGS_TYPE_IMAGES, ""));
    291   pref_content_settings_provider.SetContentSetting(
    292       pattern2,
    293       pattern2,
    294       CONTENT_SETTINGS_TYPE_IMAGES,
    295       "",
    296       CONTENT_SETTING_BLOCK);
    297   EXPECT_EQ(CONTENT_SETTING_BLOCK,
    298             pref_content_settings_provider.GetContentSetting(
    299                 host3, host3, CONTENT_SETTINGS_TYPE_IMAGES, ""));
    300 
    301   EXPECT_EQ(CONTENT_SETTING_DEFAULT,
    302             pref_content_settings_provider.GetContentSetting(
    303                 host4, host4, CONTENT_SETTINGS_TYPE_IMAGES, ""));
    304   pref_content_settings_provider.SetContentSetting(
    305       pattern3,
    306       pattern3,
    307       CONTENT_SETTINGS_TYPE_IMAGES,
    308       "",
    309       CONTENT_SETTING_BLOCK);
    310   EXPECT_EQ(CONTENT_SETTING_BLOCK,
    311             pref_content_settings_provider.GetContentSetting(
    312                 host4, host4, CONTENT_SETTINGS_TYPE_IMAGES, ""));
    313 }
    314 
    315 TEST_F(PrefProviderTest, ResourceIdentifier) {
    316   // This feature is currently behind a flag.
    317   CommandLine* cmd = CommandLine::ForCurrentProcess();
    318   AutoReset<CommandLine> auto_reset(cmd, *cmd);
    319   cmd->AppendSwitch(switches::kEnableResourceContentSettings);
    320 
    321   TestingProfile testing_profile;
    322   testing_profile.GetHostContentSettingsMap();
    323   PrefProvider pref_content_settings_provider(
    324       testing_profile.GetOriginalProfile());
    325 
    326   GURL host("http://example.com/");
    327   ContentSettingsPattern pattern("[*.]example.com");
    328   std::string resource1("someplugin");
    329   std::string resource2("otherplugin");
    330 
    331   EXPECT_EQ(CONTENT_SETTING_DEFAULT,
    332             pref_content_settings_provider.GetContentSetting(
    333                 host, host, CONTENT_SETTINGS_TYPE_PLUGINS, resource1));
    334   pref_content_settings_provider.SetContentSetting(
    335       pattern,
    336       pattern,
    337       CONTENT_SETTINGS_TYPE_PLUGINS,
    338       resource1,
    339       CONTENT_SETTING_BLOCK);
    340   EXPECT_EQ(CONTENT_SETTING_BLOCK,
    341             pref_content_settings_provider.GetContentSetting(
    342                 host, host, CONTENT_SETTINGS_TYPE_PLUGINS, resource1));
    343   EXPECT_EQ(CONTENT_SETTING_DEFAULT,
    344             pref_content_settings_provider.GetContentSetting(
    345                 host, host, CONTENT_SETTINGS_TYPE_PLUGINS, resource2));
    346 }
    347 
    348 }  // namespace content_settings
    349