Home | History | Annotate | Download | only in content_settings
      1 // Copyright 2013 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_usages_state.h"
      6 
      7 #include <string>
      8 
      9 #include "base/message_loop/message_loop.h"
     10 #include "chrome/browser/content_settings/host_content_settings_map.h"
     11 #include "chrome/test/base/testing_profile.h"
     12 #include "content/public/browser/navigation_details.h"
     13 #include "content/public/browser/navigation_entry.h"
     14 #include "content/public/test/test_browser_thread.h"
     15 #include "testing/gtest/include/gtest/gtest.h"
     16 
     17 using content::BrowserThread;
     18 using content::NavigationEntry;
     19 
     20 namespace {
     21 
     22 class ContentSettingsUsagesStateTests : public testing::Test {
     23  public:
     24   ContentSettingsUsagesStateTests()
     25     : ui_thread_(BrowserThread::UI, &message_loop_) {
     26   }
     27 
     28  protected:
     29   void ClearOnNewOrigin(ContentSettingsType type) {
     30     TestingProfile profile;
     31     ContentSettingsUsagesState state(&profile, type);
     32     GURL url_0("http://www.example.com");
     33 
     34     scoped_ptr<NavigationEntry> entry(NavigationEntry::Create());
     35     entry->SetURL(url_0);
     36     content::LoadCommittedDetails load_committed_details;
     37     load_committed_details.entry = entry.get();
     38     state.DidNavigate(load_committed_details);
     39 
     40     profile.GetHostContentSettingsMap()->SetContentSetting(
     41         ContentSettingsPattern::FromURLNoWildcard(url_0),
     42         ContentSettingsPattern::FromURLNoWildcard(url_0),
     43         type,
     44         std::string(),
     45         CONTENT_SETTING_ALLOW);
     46     state.OnPermissionSet(url_0, true);
     47 
     48     GURL url_1("http://www.example1.com");
     49     profile.GetHostContentSettingsMap()->SetContentSetting(
     50         ContentSettingsPattern::FromURLNoWildcard(url_1),
     51         ContentSettingsPattern::FromURLNoWildcard(url_0),
     52         type,
     53         std::string(),
     54         CONTENT_SETTING_BLOCK);
     55     state.OnPermissionSet(url_1, false);
     56 
     57     ContentSettingsUsagesState::StateMap state_map =
     58         state.state_map();
     59     EXPECT_EQ(2U, state_map.size());
     60 
     61     ContentSettingsUsagesState::FormattedHostsPerState formatted_host_per_state;
     62     unsigned int tab_state_flags = 0;
     63     state.GetDetailedInfo(&formatted_host_per_state, &tab_state_flags);
     64     EXPECT_TRUE(tab_state_flags &
     65                 ContentSettingsUsagesState::TABSTATE_HAS_ANY_ALLOWED)
     66                 << tab_state_flags;
     67     EXPECT_TRUE(tab_state_flags &
     68                 ContentSettingsUsagesState::TABSTATE_HAS_EXCEPTION)
     69                 << tab_state_flags;
     70     EXPECT_FALSE(tab_state_flags &
     71                  ContentSettingsUsagesState::TABSTATE_HAS_CHANGED)
     72                  << tab_state_flags;
     73     EXPECT_TRUE(tab_state_flags &
     74                 ContentSettingsUsagesState::TABSTATE_HAS_ANY_ICON)
     75                 << tab_state_flags;
     76     EXPECT_EQ(1U, formatted_host_per_state[CONTENT_SETTING_ALLOW].size());
     77     EXPECT_EQ(1U,
     78               formatted_host_per_state[CONTENT_SETTING_ALLOW].count(
     79                   url_0.host()));
     80 
     81     EXPECT_EQ(1U, formatted_host_per_state[CONTENT_SETTING_BLOCK].size());
     82     EXPECT_EQ(1U,
     83               formatted_host_per_state[CONTENT_SETTING_BLOCK].count(
     84                   url_1.host()));
     85 
     86     state.OnPermissionSet(url_0, false);
     87 
     88     formatted_host_per_state.clear();
     89     tab_state_flags = 0;
     90     state.GetDetailedInfo(&formatted_host_per_state, &tab_state_flags);
     91     EXPECT_FALSE(tab_state_flags &
     92                  ContentSettingsUsagesState::TABSTATE_HAS_ANY_ALLOWED)
     93                  << tab_state_flags;
     94     EXPECT_TRUE(tab_state_flags &
     95                 ContentSettingsUsagesState::TABSTATE_HAS_EXCEPTION)
     96                 << tab_state_flags;
     97     EXPECT_TRUE(tab_state_flags &
     98                 ContentSettingsUsagesState::TABSTATE_HAS_CHANGED)
     99                 << tab_state_flags;
    100     EXPECT_TRUE(tab_state_flags &
    101                 ContentSettingsUsagesState::TABSTATE_HAS_ANY_ICON)
    102                 << tab_state_flags;
    103     EXPECT_EQ(0U, formatted_host_per_state[CONTENT_SETTING_ALLOW].size());
    104     EXPECT_EQ(2U, formatted_host_per_state[CONTENT_SETTING_BLOCK].size());
    105     EXPECT_EQ(1U,
    106               formatted_host_per_state[CONTENT_SETTING_BLOCK].count(
    107                   url_0.host()));
    108     EXPECT_EQ(1U,
    109               formatted_host_per_state[CONTENT_SETTING_BLOCK].count(
    110                   url_1.host()));
    111 
    112     state.OnPermissionSet(url_0, true);
    113 
    114     load_committed_details.previous_url = url_0;
    115     state.DidNavigate(load_committed_details);
    116 
    117     ContentSettingsUsagesState::StateMap new_state_map =
    118         state.state_map();
    119     EXPECT_EQ(state_map.size(), new_state_map.size());
    120 
    121     GURL different_url("http://foo.com");
    122     entry->SetURL(different_url);
    123     state.DidNavigate(load_committed_details);
    124 
    125     EXPECT_TRUE(state.state_map().empty());
    126 
    127     formatted_host_per_state.clear();
    128     tab_state_flags = 0;
    129     state.GetDetailedInfo(&formatted_host_per_state, &tab_state_flags);
    130     EXPECT_TRUE(formatted_host_per_state.empty());
    131     EXPECT_EQ(0U, tab_state_flags);
    132   }
    133 
    134   void ShowPortOnSameHost(ContentSettingsType type) {
    135     TestingProfile profile;
    136     ContentSettingsUsagesState state(&profile, type);
    137     GURL url_0("http://www.example.com");
    138 
    139     scoped_ptr<NavigationEntry> entry(NavigationEntry::Create());
    140     entry->SetURL(url_0);
    141     content::LoadCommittedDetails load_committed_details;
    142     load_committed_details.entry = entry.get();
    143     state.DidNavigate(load_committed_details);
    144 
    145     profile.GetHostContentSettingsMap()->SetContentSetting(
    146         ContentSettingsPattern::FromURLNoWildcard(url_0),
    147         ContentSettingsPattern::FromURLNoWildcard(url_0),
    148         type,
    149         std::string(),
    150         CONTENT_SETTING_ALLOW);
    151     state.OnPermissionSet(url_0, true);
    152 
    153     GURL url_1("https://www.example.com");
    154     profile.GetHostContentSettingsMap()->SetContentSetting(
    155         ContentSettingsPattern::FromURLNoWildcard(url_1),
    156         ContentSettingsPattern::FromURLNoWildcard(url_0),
    157         type,
    158         std::string(),
    159         CONTENT_SETTING_ALLOW);
    160     state.OnPermissionSet(url_1, true);
    161 
    162     GURL url_2("http://www.example1.com");
    163     profile.GetHostContentSettingsMap()->SetContentSetting(
    164         ContentSettingsPattern::FromURLNoWildcard(url_2),
    165         ContentSettingsPattern::FromURLNoWildcard(url_0),
    166         type,
    167         std::string(),
    168         CONTENT_SETTING_ALLOW);
    169     state.OnPermissionSet(url_2, true);
    170 
    171     ContentSettingsUsagesState::StateMap state_map =
    172         state.state_map();
    173     EXPECT_EQ(3U, state_map.size());
    174 
    175     ContentSettingsUsagesState::FormattedHostsPerState formatted_host_per_state;
    176     unsigned int tab_state_flags = 0;
    177     state.GetDetailedInfo(&formatted_host_per_state, &tab_state_flags);
    178 
    179     EXPECT_EQ(3U, formatted_host_per_state[CONTENT_SETTING_ALLOW].size());
    180     EXPECT_EQ(1U,
    181               formatted_host_per_state[CONTENT_SETTING_ALLOW].count(
    182                   url_0.spec()));
    183     EXPECT_EQ(1U,
    184               formatted_host_per_state[CONTENT_SETTING_ALLOW].count(
    185                   url_1.spec()));
    186     EXPECT_EQ(1U,
    187               formatted_host_per_state[CONTENT_SETTING_ALLOW].count(
    188                   url_2.host()));
    189 
    190     state.OnPermissionSet(url_1, false);
    191     formatted_host_per_state.clear();
    192     tab_state_flags = 0;
    193     state.GetDetailedInfo(&formatted_host_per_state, &tab_state_flags);
    194 
    195     EXPECT_EQ(2U, formatted_host_per_state[CONTENT_SETTING_ALLOW].size());
    196     EXPECT_EQ(1U,
    197               formatted_host_per_state[CONTENT_SETTING_ALLOW].count(
    198                   url_0.spec()));
    199     EXPECT_EQ(1U,
    200               formatted_host_per_state[CONTENT_SETTING_ALLOW].count(
    201                   url_2.host()));
    202     EXPECT_EQ(1U, formatted_host_per_state[CONTENT_SETTING_BLOCK].size());
    203     EXPECT_EQ(1U,
    204               formatted_host_per_state[CONTENT_SETTING_BLOCK].count(
    205                   url_1.spec()));
    206   }
    207 
    208  protected:
    209   base::MessageLoop message_loop_;
    210   content::TestBrowserThread ui_thread_;
    211 };
    212 
    213 TEST_F(ContentSettingsUsagesStateTests, ClearOnNewOriginForGeolocation) {
    214   ClearOnNewOrigin(CONTENT_SETTINGS_TYPE_GEOLOCATION);
    215 }
    216 
    217 TEST_F(ContentSettingsUsagesStateTests, ClearOnNewOriginForMidi) {
    218   ClearOnNewOrigin(CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
    219 }
    220 
    221 TEST_F(ContentSettingsUsagesStateTests, ShowPortOnSameHostForGeolocation) {
    222   ShowPortOnSameHost(CONTENT_SETTINGS_TYPE_GEOLOCATION);
    223 }
    224 
    225 TEST_F(ContentSettingsUsagesStateTests, ShowPortOnSameHostForMidi) {
    226   ShowPortOnSameHost(CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
    227 }
    228 
    229 }  // namespace
    230