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