1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2010 The Chromium Authors. All rights reserved.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file.
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/geolocation/geolocation_exceptions_table_model.h"
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/content_settings_helper.h"
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/test/testing_profile.h"
8dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/browser_thread.h"
9dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "content/browser/renderer_host/test_render_view_host.h"
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "grit/generated_resources.h"
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace {
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst GURL kUrl0("http://www.example.com");
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst GURL kUrl1("http://www.example1.com");
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochconst GURL kUrl2("http://www.example2.com");
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass GeolocationExceptionsTableModelTest : public RenderViewHostTestHarness {
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GeolocationExceptionsTableModelTest()
21731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick      : ui_thread_(BrowserThread::UI, MessageLoop::current()) {}
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~GeolocationExceptionsTableModelTest() {}
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void SetUp() {
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    RenderViewHostTestHarness::SetUp();
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ResetModel();
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void TearDown() {
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    model_.reset(NULL);
32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    RenderViewHostTestHarness::TearDown();
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void ResetModel() {
36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    model_.reset(new GeolocationExceptionsTableModel(
37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        profile()->GetGeolocationContentSettingsMap()));
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void CreateAllowedSamples() {
41513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch    scoped_refptr<GeolocationContentSettingsMap> map(
42513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch        profile()->GetGeolocationContentSettingsMap());
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    map->SetContentSetting(kUrl0, kUrl0, CONTENT_SETTING_ALLOW);
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    map->SetContentSetting(kUrl0, kUrl1, CONTENT_SETTING_ALLOW);
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    map->SetContentSetting(kUrl0, kUrl2, CONTENT_SETTING_ALLOW);
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    ResetModel();
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    EXPECT_EQ(3, model_->RowCount());
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch protected:
51731df977c0511bca2206b5f333555b1205ff1f43Iain Merrick  BrowserThread ui_thread_;
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  scoped_ptr<GeolocationExceptionsTableModel> model_;
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(GeolocationExceptionsTableModelTest, CanRemoveException) {
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, model_->RowCount());
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
58513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<GeolocationContentSettingsMap> map(
59513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      profile()->GetGeolocationContentSettingsMap());
60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Ensure a single entry can be removed.
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  map->SetContentSetting(kUrl0, kUrl0, CONTENT_SETTING_ALLOW);
63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ResetModel();
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(1, model_->RowCount());
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GeolocationExceptionsTableModel::Rows rows;
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  rows.insert(0U);
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(model_->CanRemoveRows(rows));
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Ensure an entry with children can't be removed.
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  map->SetContentSetting(kUrl0, kUrl0, CONTENT_SETTING_DEFAULT);
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  map->SetContentSetting(kUrl0, kUrl1, CONTENT_SETTING_ALLOW);
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  map->SetContentSetting(kUrl0, kUrl2, CONTENT_SETTING_BLOCK);
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ResetModel();
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, model_->RowCount());
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_FALSE(model_->CanRemoveRows(rows));
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Ensure it can be removed if removing all children.
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  rows.clear();
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  rows.insert(1U);
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  rows.insert(2U);
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_TRUE(model_->CanRemoveRows(rows));
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(GeolocationExceptionsTableModelTest, RemoveExceptions) {
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CreateAllowedSamples();
87513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<GeolocationContentSettingsMap> map(
88513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      profile()->GetGeolocationContentSettingsMap());
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Test removing parent exception.
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GeolocationExceptionsTableModel::Rows rows;
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  rows.insert(0U);
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  model_->RemoveRows(rows);
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(CONTENT_SETTING_ASK, map->GetContentSetting(kUrl0, kUrl0));
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(CONTENT_SETTING_ALLOW, map->GetContentSetting(kUrl0, kUrl1));
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(CONTENT_SETTING_ALLOW, map->GetContentSetting(kUrl0, kUrl2));
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ResetModel();
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(3, model_->RowCount());
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Test removing remaining children.
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  rows.clear();
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  rows.insert(1U);
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  rows.insert(2U);
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  model_->RemoveRows(rows);
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, model_->RowCount());
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(CONTENT_SETTING_ASK, map->GetContentSetting(kUrl0, kUrl0));
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(CONTENT_SETTING_ASK, map->GetContentSetting(kUrl0, kUrl1));
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(CONTENT_SETTING_ASK, map->GetContentSetting(kUrl0, kUrl2));
110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(GeolocationExceptionsTableModelTest, RemoveAll) {
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CreateAllowedSamples();
114513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch  scoped_refptr<GeolocationContentSettingsMap> map(
115513209b27ff55e2841eac0e4120199c23acce758Ben Murdoch      profile()->GetGeolocationContentSettingsMap());
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  model_->RemoveAll();
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(CONTENT_SETTING_ASK, map->GetContentSetting(kUrl0, kUrl0));
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(CONTENT_SETTING_ASK, map->GetContentSetting(kUrl0, kUrl1));
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(CONTENT_SETTING_ASK, map->GetContentSetting(kUrl0, kUrl2));
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ(0, model_->RowCount());
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(GeolocationExceptionsTableModelTest, GetText) {
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CreateAllowedSamples();
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Ensure the parent doesn't have any indentation.
1283f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  string16 text = model_->GetText(0, IDS_EXCEPTIONS_HOSTNAME_HEADER);
1293f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  EXPECT_EQ(content_settings_helper::OriginToString16(kUrl0), text);
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  // Ensure there's some indentation on the children nodes.
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  text = model_->GetText(1, IDS_EXCEPTIONS_HOSTNAME_HEADER);
1333f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  EXPECT_NE(content_settings_helper::OriginToString16(kUrl1), text);
1343f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  EXPECT_NE(string16::npos,
1353f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen            text.find(content_settings_helper::OriginToString16(kUrl1)));
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  text = model_->GetText(2, IDS_EXCEPTIONS_HOSTNAME_HEADER);
1383f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  EXPECT_NE(content_settings_helper::OriginToString16(kUrl2), text);
1393f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen  EXPECT_NE(string16::npos,
1403f50c38dc070f4bb515c1b64450dae14f316474eKristian Monsen            text.find(content_settings_helper::OriginToString16(kUrl2)));
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen
14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}  // namespace
144