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