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 <string>
6
7#include "base/path_service.h"
8#include "base/strings/utf_string_conversions.h"
9#include "chrome/browser/download/download_prefs.h"
10#include "chrome/browser/prefs/pref_service_syncable.h"
11#include "chrome/browser/ui/browser.h"
12#include "chrome/browser/ui/browser_commands.h"
13#include "chrome/browser/ui/tabs/tab_strip_model.h"
14#include "chrome/common/chrome_paths.h"
15#include "chrome/common/pref_names.h"
16#include "chrome/test/base/in_process_browser_test.h"
17#include "chrome/test/base/testing_browser_process.h"
18#include "chrome/test/base/testing_profile.h"
19#include "chrome/test/base/ui_test_utils.h"
20#include "content/public/browser/web_contents.h"
21#include "content/public/test/browser_test_utils.h"
22#include "content/public/test/download_test_observer.h"
23
24using content::BrowserContext;
25using content::DownloadManager;
26
27class PrefsFunctionalTest : public InProcessBrowserTest {
28 protected:
29  // Create a DownloadTestObserverTerminal that will wait for the
30  // specified number of downloads to finish.
31  scoped_ptr<content::DownloadTestObserver> CreateWaiter(Browser* browser,
32                                                         int num_downloads) {
33    DownloadManager* download_manager =
34        BrowserContext::GetDownloadManager(browser->profile());
35
36    content::DownloadTestObserver* downloads_observer =
37         new content::DownloadTestObserverTerminal(
38             download_manager,
39             num_downloads,
40             content::DownloadTestObserver::ON_DANGEROUS_DOWNLOAD_FAIL);
41    return make_scoped_ptr(downloads_observer);
42  }
43};
44
45IN_PROC_BROWSER_TEST_F(PrefsFunctionalTest, TestDownloadDirPref) {
46  ASSERT_TRUE(test_server()->Start());
47  base::ScopedTempDir new_download_dir;
48  ASSERT_TRUE(new_download_dir.CreateUniqueTempDir());
49
50  base::FilePath downloaded_pkg =
51      new_download_dir.path().AppendASCII("a_zip_file.zip");
52
53  // Set pref to download in new_download_dir.
54  browser()->profile()->GetPrefs()->SetFilePath(
55      prefs::kDownloadDefaultDirectory, new_download_dir.path());
56
57  // Create a downloads observer.
58  scoped_ptr<content::DownloadTestObserver> downloads_observer(
59      CreateWaiter(browser(), 1));
60  ui_test_utils::NavigateToURL(
61      browser(),
62      test_server()->GetURL("files/downloads/a_zip_file.zip"));
63  // Waits for the download to complete.
64  downloads_observer->WaitForFinished();
65  EXPECT_TRUE(base::PathExists(downloaded_pkg));
66}
67
68// Verify image content settings show or hide images.
69IN_PROC_BROWSER_TEST_F(PrefsFunctionalTest, TestImageContentSettings) {
70  ASSERT_TRUE(test_server()->Start());
71
72  ui_test_utils::NavigateToURL(
73      browser(),
74      test_server()->GetURL("files/settings/image_page.html"));
75
76  bool result = false;
77  std::string script =
78      "for (i=0; i < document.images.length; i++) {"
79      "  if ((document.images[i].naturalWidth != 0) &&"
80      "      (document.images[i].naturalHeight != 0)) {"
81      "    window.domAutomationController.send(true);"
82      "  }"
83      "}"
84      "window.domAutomationController.send(false);";
85  EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
86      browser()->tab_strip_model()->GetActiveWebContents(),
87      script,
88      &result));
89  EXPECT_TRUE(result);
90
91  base::DictionaryValue value;
92  value.SetInteger("images", 2);
93  browser()->profile()->GetPrefs()->Set(prefs::kDefaultContentSettings,
94                                        value);
95
96  ui_test_utils::NavigateToURL(
97      browser(),
98      test_server()->GetURL("files/settings/image_page.html"));
99
100  result = false;
101  EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
102      browser()->tab_strip_model()->GetActiveWebContents(),
103      script,
104      &result));
105  EXPECT_FALSE(result);
106}
107
108// Verify that enabling/disabling Javascript in prefs works.
109IN_PROC_BROWSER_TEST_F(PrefsFunctionalTest, TestJavascriptEnableDisable) {
110  ASSERT_TRUE(test_server()->Start());
111
112  EXPECT_TRUE(browser()->profile()->GetPrefs()->GetBoolean(
113      prefs::kWebKitJavascriptEnabled));
114  ui_test_utils::NavigateToURL(
115      browser(),
116      test_server()->GetURL("files/javaScriptTitle.html"));
117  EXPECT_EQ(base::ASCIIToUTF16("Title from script javascript enabled"),
118            browser()->tab_strip_model()->GetActiveWebContents()->GetTitle());
119  browser()->profile()->GetPrefs()->SetBoolean(prefs::kWebKitJavascriptEnabled,
120                                               false);
121  ui_test_utils::NavigateToURL(
122      browser(),
123      test_server()->GetURL("files/javaScriptTitle.html"));
124  EXPECT_EQ(base::ASCIIToUTF16("This is html title"),
125            browser()->tab_strip_model()->GetActiveWebContents()->GetTitle());
126}
127
128// Verify DNS prefetching pref.
129IN_PROC_BROWSER_TEST_F(PrefsFunctionalTest, TestNetworkPredictionEnabledPref) {
130  EXPECT_TRUE(browser()->profile()->GetPrefs()->GetBoolean(
131      prefs::kNetworkPredictionEnabled));
132  browser()->profile()->GetPrefs()->SetBoolean(prefs::kNetworkPredictionEnabled,
133                                               false);
134  EXPECT_FALSE(browser()->profile()->GetPrefs()->GetBoolean(
135      prefs::kNetworkPredictionEnabled));
136}
137
138// Verify restore for bookmark bar visibility.
139IN_PROC_BROWSER_TEST_F(PrefsFunctionalTest,
140                       TestSessionRestoreShowBookmarkBar) {
141  EXPECT_FALSE(browser()->profile()->GetPrefs()->GetBoolean(
142      bookmarks::prefs::kShowBookmarkBar));
143  browser()->profile()->GetPrefs()->SetBoolean(
144      bookmarks::prefs::kShowBookmarkBar, true);
145  EXPECT_TRUE(browser()->profile()->GetPrefs()->GetBoolean(
146      bookmarks::prefs::kShowBookmarkBar));
147
148  EXPECT_TRUE(browser()->profile()->GetPrefs()->GetBoolean(
149      bookmarks::prefs::kShowBookmarkBar));
150  EXPECT_EQ(BookmarkBar::SHOW, browser()->bookmark_bar_state());
151}
152
153// Verify images are not blocked in incognito mode.
154IN_PROC_BROWSER_TEST_F(PrefsFunctionalTest, TestImagesNotBlockedInIncognito) {
155  ASSERT_TRUE(test_server()->Start());
156  GURL url = test_server()->GetURL("files/settings/image_page.html");
157  Browser* incognito_browser = CreateIncognitoBrowser();
158  ui_test_utils::NavigateToURLWithDisposition(
159      incognito_browser,
160      url,
161      CURRENT_TAB,
162      ui_test_utils::BROWSER_TEST_WAIT_FOR_NAVIGATION);
163
164  bool result = false;
165  std::string script =
166      "for (i=0; i < document.images.length; i++) {"
167      "  if ((document.images[i].naturalWidth != 0) &&"
168      "      (document.images[i].naturalHeight != 0)) {"
169      "    window.domAutomationController.send(true);"
170      "  }"
171      "}"
172      "window.domAutomationController.send(false);";
173  EXPECT_TRUE(content::ExecuteScriptAndExtractBool(
174      incognito_browser->tab_strip_model()->GetActiveWebContents(),
175      script,
176      &result));
177  EXPECT_TRUE(result);
178}
179
180// Verify setting homepage preference to newtabpage across restarts. Part1
181IN_PROC_BROWSER_TEST_F(PrefsFunctionalTest, PRE_TestHomepageNewTabpagePrefs) {
182  browser()->profile()->GetPrefs()->SetBoolean(prefs::kHomePageIsNewTabPage,
183                                               true);
184}
185
186// Verify setting homepage preference to newtabpage across restarts. Part2
187IN_PROC_BROWSER_TEST_F(PrefsFunctionalTest, TestHomepageNewTabpagePrefs) {
188  EXPECT_TRUE(browser()->profile()->GetPrefs()->GetBoolean(
189      prefs::kHomePageIsNewTabPage));
190}
191
192// Verify setting homepage preference to specific url. Part1
193IN_PROC_BROWSER_TEST_F(PrefsFunctionalTest, PRE_TestHomepagePrefs) {
194  GURL home_page_url("http://www.google.com");
195
196  PrefService* prefs = browser()->profile()->GetPrefs();
197  prefs->SetBoolean(prefs::kHomePageIsNewTabPage, false);
198  const PrefService::Preference* pref =
199      prefs->FindPreference(prefs::kHomePage);
200  if (pref && !pref->IsManaged()) {
201    prefs->SetString(prefs::kHomePage, home_page_url.spec());
202  }
203}
204
205// Verify setting homepage preference to specific url. Part2
206IN_PROC_BROWSER_TEST_F(PrefsFunctionalTest, TestHomepagePrefs) {
207  GURL home_page_url("http://www.google.com");
208
209  PrefService* prefs = browser()->profile()->GetPrefs();
210  EXPECT_FALSE(prefs->GetBoolean(prefs::kHomePageIsNewTabPage));
211  EXPECT_EQ(home_page_url.spec(), prefs->GetString(prefs::kHomePage));
212}
213
214// Verify the security preference under privacy across restarts. Part1
215IN_PROC_BROWSER_TEST_F(PrefsFunctionalTest, PRE_TestPrivacySecurityPrefs) {
216  PrefService* prefs = browser()->profile()->GetPrefs();
217
218  EXPECT_TRUE(prefs->GetBoolean(prefs::kNetworkPredictionEnabled));
219  prefs->SetBoolean(prefs::kNetworkPredictionEnabled, false);
220
221  EXPECT_TRUE(prefs->GetBoolean(prefs::kSafeBrowsingEnabled));
222  prefs->SetBoolean(prefs::kSafeBrowsingEnabled, false);
223
224  EXPECT_TRUE(prefs->GetBoolean(prefs::kAlternateErrorPagesEnabled));
225  prefs->SetBoolean(prefs::kAlternateErrorPagesEnabled, false);
226
227  EXPECT_TRUE(prefs->GetBoolean(prefs::kSearchSuggestEnabled));
228  prefs->SetBoolean(prefs::kSearchSuggestEnabled, false);
229}
230
231// Verify the security preference under privacy across restarts. Part2
232IN_PROC_BROWSER_TEST_F(PrefsFunctionalTest, TestPrivacySecurityPrefs) {
233  PrefService* prefs = browser()->profile()->GetPrefs();
234
235  EXPECT_FALSE(prefs->GetBoolean(prefs::kNetworkPredictionEnabled));
236  EXPECT_FALSE(prefs->GetBoolean(prefs::kSafeBrowsingEnabled));
237  EXPECT_FALSE(prefs->GetBoolean(prefs::kAlternateErrorPagesEnabled));
238  EXPECT_FALSE(prefs->GetBoolean(prefs::kSearchSuggestEnabled));
239}
240
241// Verify that we have some Local State prefs.
242IN_PROC_BROWSER_TEST_F(PrefsFunctionalTest, TestHaveLocalStatePrefs) {
243  EXPECT_TRUE(g_browser_process->local_state()->GetPreferenceValues().get());
244}
245
246