1 // Copyright (c) 2010 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/geolocation/geolocation_content_settings_map.h" 6 #include "chrome/browser/geolocation/geolocation_settings_state.h" 7 #include "chrome/test/testing_profile.h" 8 #include "content/browser/browser_thread.h" 9 #include "content/browser/tab_contents/navigation_entry.h" 10 #include "testing/gtest/include/gtest/gtest.h" 11 12 namespace { 13 14 class GeolocationSettingsStateTests : public testing::Test { 15 public: 16 GeolocationSettingsStateTests() 17 : ui_thread_(BrowserThread::UI, &message_loop_) { 18 } 19 20 protected: 21 MessageLoop message_loop_; 22 BrowserThread ui_thread_; 23 }; 24 25 TEST_F(GeolocationSettingsStateTests, ClearOnNewOrigin) { 26 TestingProfile profile; 27 GeolocationSettingsState state(&profile); 28 GURL url_0("http://www.example.com"); 29 30 NavigationEntry entry; 31 entry.set_url(url_0); 32 NavigationController::LoadCommittedDetails load_committed_details; 33 load_committed_details.entry = &entry; 34 state.DidNavigate(load_committed_details); 35 36 profile.GetGeolocationContentSettingsMap()->SetContentSetting( 37 url_0, url_0, CONTENT_SETTING_ALLOW); 38 state.OnGeolocationPermissionSet(url_0, true); 39 40 GURL url_1("http://www.example1.com"); 41 profile.GetGeolocationContentSettingsMap()->SetContentSetting( 42 url_1, url_0, CONTENT_SETTING_BLOCK); 43 state.OnGeolocationPermissionSet(url_1, false); 44 45 GeolocationSettingsState::StateMap state_map = 46 state.state_map(); 47 EXPECT_EQ(2U, state_map.size()); 48 49 GeolocationSettingsState::FormattedHostsPerState formatted_host_per_state; 50 unsigned int tab_state_flags = 0; 51 state.GetDetailedInfo(&formatted_host_per_state, &tab_state_flags); 52 EXPECT_TRUE(tab_state_flags & 53 GeolocationSettingsState::TABSTATE_HAS_ANY_ALLOWED) 54 << tab_state_flags; 55 EXPECT_TRUE(tab_state_flags & 56 GeolocationSettingsState::TABSTATE_HAS_EXCEPTION) 57 << tab_state_flags; 58 EXPECT_FALSE(tab_state_flags & 59 GeolocationSettingsState::TABSTATE_HAS_CHANGED) 60 << tab_state_flags; 61 EXPECT_TRUE(tab_state_flags & 62 GeolocationSettingsState::TABSTATE_HAS_ANY_ICON) 63 << tab_state_flags; 64 EXPECT_EQ(1U, formatted_host_per_state[CONTENT_SETTING_ALLOW].size()); 65 EXPECT_EQ(1U, 66 formatted_host_per_state[CONTENT_SETTING_ALLOW].count( 67 url_0.host())); 68 69 EXPECT_EQ(1U, formatted_host_per_state[CONTENT_SETTING_BLOCK].size()); 70 EXPECT_EQ(1U, 71 formatted_host_per_state[CONTENT_SETTING_BLOCK].count( 72 url_1.host())); 73 74 state.OnGeolocationPermissionSet(url_0, false); 75 76 formatted_host_per_state.clear(); 77 tab_state_flags = 0; 78 state.GetDetailedInfo(&formatted_host_per_state, &tab_state_flags); 79 EXPECT_FALSE(tab_state_flags & 80 GeolocationSettingsState::TABSTATE_HAS_ANY_ALLOWED) 81 << tab_state_flags; 82 EXPECT_TRUE(tab_state_flags & 83 GeolocationSettingsState::TABSTATE_HAS_EXCEPTION) 84 << tab_state_flags; 85 EXPECT_TRUE(tab_state_flags & 86 GeolocationSettingsState::TABSTATE_HAS_CHANGED) 87 << tab_state_flags; 88 EXPECT_TRUE(tab_state_flags & 89 GeolocationSettingsState::TABSTATE_HAS_ANY_ICON) 90 << tab_state_flags; 91 EXPECT_EQ(0U, formatted_host_per_state[CONTENT_SETTING_ALLOW].size()); 92 EXPECT_EQ(2U, formatted_host_per_state[CONTENT_SETTING_BLOCK].size()); 93 EXPECT_EQ(1U, 94 formatted_host_per_state[CONTENT_SETTING_BLOCK].count( 95 url_0.host())); 96 EXPECT_EQ(1U, 97 formatted_host_per_state[CONTENT_SETTING_BLOCK].count( 98 url_1.host())); 99 100 state.OnGeolocationPermissionSet(url_0, true); 101 102 load_committed_details.previous_url = url_0; 103 state.DidNavigate(load_committed_details); 104 105 GeolocationSettingsState::StateMap new_state_map = 106 state.state_map(); 107 EXPECT_EQ(state_map.size(), new_state_map.size()); 108 109 GURL different_url("http://foo.com"); 110 entry.set_url(different_url); 111 state.DidNavigate(load_committed_details); 112 113 EXPECT_TRUE(state.state_map().empty()); 114 115 formatted_host_per_state.clear(); 116 tab_state_flags = 0; 117 state.GetDetailedInfo(&formatted_host_per_state, &tab_state_flags); 118 EXPECT_TRUE(formatted_host_per_state.empty()); 119 EXPECT_EQ(0U, tab_state_flags); 120 } 121 122 TEST_F(GeolocationSettingsStateTests, ShowPortOnSameHost) { 123 TestingProfile profile; 124 GeolocationSettingsState state(&profile); 125 GURL url_0("http://www.example.com"); 126 127 NavigationEntry entry; 128 entry.set_url(url_0); 129 NavigationController::LoadCommittedDetails load_committed_details; 130 load_committed_details.entry = &entry; 131 state.DidNavigate(load_committed_details); 132 133 profile.GetGeolocationContentSettingsMap()->SetContentSetting( 134 url_0, url_0, CONTENT_SETTING_ALLOW); 135 state.OnGeolocationPermissionSet(url_0, true); 136 137 GURL url_1("https://www.example.com"); 138 profile.GetGeolocationContentSettingsMap()->SetContentSetting( 139 url_1, url_0, CONTENT_SETTING_ALLOW); 140 state.OnGeolocationPermissionSet(url_1, true); 141 142 GURL url_2("http://www.example1.com"); 143 profile.GetGeolocationContentSettingsMap()->SetContentSetting( 144 url_2, url_0, CONTENT_SETTING_ALLOW); 145 state.OnGeolocationPermissionSet(url_2, true); 146 147 GeolocationSettingsState::StateMap state_map = 148 state.state_map(); 149 EXPECT_EQ(3U, state_map.size()); 150 151 GeolocationSettingsState::FormattedHostsPerState formatted_host_per_state; 152 unsigned int tab_state_flags = 0; 153 state.GetDetailedInfo(&formatted_host_per_state, &tab_state_flags); 154 155 EXPECT_EQ(3U, formatted_host_per_state[CONTENT_SETTING_ALLOW].size()); 156 EXPECT_EQ(1U, 157 formatted_host_per_state[CONTENT_SETTING_ALLOW].count( 158 url_0.spec())); 159 EXPECT_EQ(1U, 160 formatted_host_per_state[CONTENT_SETTING_ALLOW].count( 161 url_1.spec())); 162 EXPECT_EQ(1U, 163 formatted_host_per_state[CONTENT_SETTING_ALLOW].count( 164 url_2.host())); 165 166 state.OnGeolocationPermissionSet(url_1, false); 167 formatted_host_per_state.clear(); 168 tab_state_flags = 0; 169 state.GetDetailedInfo(&formatted_host_per_state, &tab_state_flags); 170 171 EXPECT_EQ(2U, formatted_host_per_state[CONTENT_SETTING_ALLOW].size()); 172 EXPECT_EQ(1U, 173 formatted_host_per_state[CONTENT_SETTING_ALLOW].count( 174 url_0.spec())); 175 EXPECT_EQ(1U, 176 formatted_host_per_state[CONTENT_SETTING_ALLOW].count( 177 url_2.host())); 178 EXPECT_EQ(1U, formatted_host_per_state[CONTENT_SETTING_BLOCK].size()); 179 EXPECT_EQ(1U, 180 formatted_host_per_state[CONTENT_SETTING_BLOCK].count( 181 url_1.spec())); 182 } 183 184 185 } // namespace 186