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_exceptions_table_model.h"
6 #include "chrome/common/content_settings_helper.h"
7 #include "chrome/test/testing_profile.h"
8 #include "content/browser/browser_thread.h"
9 #include "content/browser/renderer_host/test_render_view_host.h"
10 #include "grit/generated_resources.h"
11 #include "testing/gtest/include/gtest/gtest.h"
12
13 namespace {
14 const GURL kUrl0("http://www.example.com");
15 const GURL kUrl1("http://www.example1.com");
16 const GURL kUrl2("http://www.example2.com");
17
18 class GeolocationExceptionsTableModelTest : public RenderViewHostTestHarness {
19 public:
GeolocationExceptionsTableModelTest()20 GeolocationExceptionsTableModelTest()
21 : ui_thread_(BrowserThread::UI, MessageLoop::current()) {}
22
~GeolocationExceptionsTableModelTest()23 virtual ~GeolocationExceptionsTableModelTest() {}
24
SetUp()25 virtual void SetUp() {
26 RenderViewHostTestHarness::SetUp();
27 ResetModel();
28 }
29
TearDown()30 virtual void TearDown() {
31 model_.reset(NULL);
32 RenderViewHostTestHarness::TearDown();
33 }
34
ResetModel()35 virtual void ResetModel() {
36 model_.reset(new GeolocationExceptionsTableModel(
37 profile()->GetGeolocationContentSettingsMap()));
38 }
39
CreateAllowedSamples()40 void CreateAllowedSamples() {
41 scoped_refptr<GeolocationContentSettingsMap> map(
42 profile()->GetGeolocationContentSettingsMap());
43 map->SetContentSetting(kUrl0, kUrl0, CONTENT_SETTING_ALLOW);
44 map->SetContentSetting(kUrl0, kUrl1, CONTENT_SETTING_ALLOW);
45 map->SetContentSetting(kUrl0, kUrl2, CONTENT_SETTING_ALLOW);
46 ResetModel();
47 EXPECT_EQ(3, model_->RowCount());
48 }
49
50 protected:
51 BrowserThread ui_thread_;
52 scoped_ptr<GeolocationExceptionsTableModel> model_;
53 };
54
TEST_F(GeolocationExceptionsTableModelTest,CanRemoveException)55 TEST_F(GeolocationExceptionsTableModelTest, CanRemoveException) {
56 EXPECT_EQ(0, model_->RowCount());
57
58 scoped_refptr<GeolocationContentSettingsMap> map(
59 profile()->GetGeolocationContentSettingsMap());
60
61 // Ensure a single entry can be removed.
62 map->SetContentSetting(kUrl0, kUrl0, CONTENT_SETTING_ALLOW);
63 ResetModel();
64 EXPECT_EQ(1, model_->RowCount());
65 GeolocationExceptionsTableModel::Rows rows;
66 rows.insert(0U);
67 EXPECT_TRUE(model_->CanRemoveRows(rows));
68
69
70 // Ensure an entry with children can't be removed.
71 map->SetContentSetting(kUrl0, kUrl0, CONTENT_SETTING_DEFAULT);
72 map->SetContentSetting(kUrl0, kUrl1, CONTENT_SETTING_ALLOW);
73 map->SetContentSetting(kUrl0, kUrl2, CONTENT_SETTING_BLOCK);
74 ResetModel();
75 EXPECT_EQ(3, model_->RowCount());
76 EXPECT_FALSE(model_->CanRemoveRows(rows));
77
78 // Ensure it can be removed if removing all children.
79 rows.clear();
80 rows.insert(1U);
81 rows.insert(2U);
82 EXPECT_TRUE(model_->CanRemoveRows(rows));
83 }
84
TEST_F(GeolocationExceptionsTableModelTest,RemoveExceptions)85 TEST_F(GeolocationExceptionsTableModelTest, RemoveExceptions) {
86 CreateAllowedSamples();
87 scoped_refptr<GeolocationContentSettingsMap> map(
88 profile()->GetGeolocationContentSettingsMap());
89
90 // Test removing parent exception.
91 GeolocationExceptionsTableModel::Rows rows;
92 rows.insert(0U);
93 model_->RemoveRows(rows);
94 EXPECT_EQ(CONTENT_SETTING_ASK, map->GetContentSetting(kUrl0, kUrl0));
95 EXPECT_EQ(CONTENT_SETTING_ALLOW, map->GetContentSetting(kUrl0, kUrl1));
96 EXPECT_EQ(CONTENT_SETTING_ALLOW, map->GetContentSetting(kUrl0, kUrl2));
97
98 ResetModel();
99 EXPECT_EQ(3, model_->RowCount());
100
101 // Test removing remaining children.
102 rows.clear();
103 rows.insert(1U);
104 rows.insert(2U);
105 model_->RemoveRows(rows);
106 EXPECT_EQ(0, model_->RowCount());
107 EXPECT_EQ(CONTENT_SETTING_ASK, map->GetContentSetting(kUrl0, kUrl0));
108 EXPECT_EQ(CONTENT_SETTING_ASK, map->GetContentSetting(kUrl0, kUrl1));
109 EXPECT_EQ(CONTENT_SETTING_ASK, map->GetContentSetting(kUrl0, kUrl2));
110 }
111
TEST_F(GeolocationExceptionsTableModelTest,RemoveAll)112 TEST_F(GeolocationExceptionsTableModelTest, RemoveAll) {
113 CreateAllowedSamples();
114 scoped_refptr<GeolocationContentSettingsMap> map(
115 profile()->GetGeolocationContentSettingsMap());
116
117 model_->RemoveAll();
118 EXPECT_EQ(CONTENT_SETTING_ASK, map->GetContentSetting(kUrl0, kUrl0));
119 EXPECT_EQ(CONTENT_SETTING_ASK, map->GetContentSetting(kUrl0, kUrl1));
120 EXPECT_EQ(CONTENT_SETTING_ASK, map->GetContentSetting(kUrl0, kUrl2));
121 EXPECT_EQ(0, model_->RowCount());
122 }
123
TEST_F(GeolocationExceptionsTableModelTest,GetText)124 TEST_F(GeolocationExceptionsTableModelTest, GetText) {
125 CreateAllowedSamples();
126
127 // Ensure the parent doesn't have any indentation.
128 string16 text = model_->GetText(0, IDS_EXCEPTIONS_HOSTNAME_HEADER);
129 EXPECT_EQ(content_settings_helper::OriginToString16(kUrl0), text);
130
131 // Ensure there's some indentation on the children nodes.
132 text = model_->GetText(1, IDS_EXCEPTIONS_HOSTNAME_HEADER);
133 EXPECT_NE(content_settings_helper::OriginToString16(kUrl1), text);
134 EXPECT_NE(string16::npos,
135 text.find(content_settings_helper::OriginToString16(kUrl1)));
136
137 text = model_->GetText(2, IDS_EXCEPTIONS_HOSTNAME_HEADER);
138 EXPECT_NE(content_settings_helper::OriginToString16(kUrl2), text);
139 EXPECT_NE(string16::npos,
140 text.find(content_settings_helper::OriginToString16(kUrl2)));
141 }
142
143 } // namespace
144