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 17using content::BrowserThread; 18using content::NavigationEntry; 19 20namespace { 21 22class 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 213TEST_F(ContentSettingsUsagesStateTests, ClearOnNewOriginForGeolocation) { 214 ClearOnNewOrigin(CONTENT_SETTINGS_TYPE_GEOLOCATION); 215} 216 217TEST_F(ContentSettingsUsagesStateTests, ClearOnNewOriginForMidi) { 218 ClearOnNewOrigin(CONTENT_SETTINGS_TYPE_MIDI_SYSEX); 219} 220 221TEST_F(ContentSettingsUsagesStateTests, ShowPortOnSameHostForGeolocation) { 222 ShowPortOnSameHost(CONTENT_SETTINGS_TYPE_GEOLOCATION); 223} 224 225TEST_F(ContentSettingsUsagesStateTests, ShowPortOnSameHostForMidi) { 226 ShowPortOnSameHost(CONTENT_SETTINGS_TYPE_MIDI_SYSEX); 227} 228 229} // namespace 230