Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(165)

Side by Side Diff: chrome/browser/ui/webui/options/chromeos/shared_options_browsertest.cc

Issue 2919343005: Remove tests for deprecated Options UI (Closed)
Patch Set: and more Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2014 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 <stddef.h>
6
7 #include "base/compiler_specific.h"
8 #include "base/macros.h"
9 #include "base/memory/ptr_util.h"
10 #include "base/strings/stringprintf.h"
11 #include "chrome/browser/chrome_notification_types.h"
12 #include "chrome/browser/chromeos/login/login_manager_test.h"
13 #include "chrome/browser/chromeos/login/startup_utils.h"
14 #include "chrome/browser/chromeos/login/ui/user_adding_screen.h"
15 #include "chrome/browser/chromeos/profiles/profile_helper.h"
16 #include "chrome/browser/chromeos/settings/cros_settings.h"
17 #include "chrome/browser/chromeos/settings/stub_cros_settings_provider.h"
18 #include "chrome/browser/profiles/profile.h"
19 #include "chrome/browser/signin/signin_manager_factory.h"
20 #include "chrome/browser/ui/browser.h"
21 #include "chrome/browser/ui/browser_commands.h"
22 #include "chrome/browser/ui/tabs/tab_strip_model.h"
23 #include "chrome/common/pref_names.h"
24 #include "chrome/test/base/ui_test_utils.h"
25 #include "chromeos/settings/cros_settings_names.h"
26 #if defined(GOOGLE_CHROME_BUILD)
27 #include "components/spellcheck/browser/pref_names.h"
28 #endif
29 #include "components/prefs/pref_service.h"
30 #include "components/signin/core/browser/signin_manager.h"
31 #include "components/user_manager/user_manager.h"
32 #include "content/public/browser/notification_service.h"
33 #include "content/public/browser/notification_source.h"
34 #include "content/public/browser/web_contents.h"
35 #include "content/public/test/browser_test_utils.h"
36 #include "content/public/test/test_utils.h"
37
38 namespace chromeos {
39
40 namespace {
41
42 // Because policy is not needed in this test it is better to use e-mails that
43 // are definitely not enterprise. This lets us to avoid faking of policy fetch
44 // procedure.
45 const char* kTestOwner = "test-owner@gmail.com";
46 const char* kTestNonOwner = "test-user1@gmail.com";
47
48 const char* kKnownSettings[] = {
49 kDeviceOwner,
50 kAccountsPrefAllowGuest,
51 kAccountsPrefAllowNewUser,
52 kAccountsPrefDeviceLocalAccounts,
53 kAccountsPrefShowUserNamesOnSignIn,
54 kAccountsPrefSupervisedUsersEnabled,
55 };
56
57 // Stub settings provider that only handles the settings we need to control.
58 // StubCrosSettingsProvider handles more settings but leaves many of them unset
59 // which the Settings page doesn't expect.
60 class StubAccountSettingsProvider : public StubCrosSettingsProvider {
61 public:
62 StubAccountSettingsProvider() {
63 }
64
65 ~StubAccountSettingsProvider() override {}
66
67 // StubCrosSettingsProvider implementation.
68 bool HandlesSetting(const std::string& path) const override {
69 const char** end = kKnownSettings + arraysize(kKnownSettings);
70 return std::find(kKnownSettings, end, path) != end;
71 }
72 };
73
74 struct PrefTest {
75 const char* pref_name;
76 bool owner_only;
77 bool indicator;
78 };
79
80 const PrefTest kPrefTests[] = {
81 { kSystemTimezone, false, false },
82 { prefs::kUse24HourClock, false, false },
83 { kAttestationForContentProtectionEnabled, true, true },
84 { kAccountsPrefAllowGuest, true, false },
85 { kAccountsPrefAllowNewUser, true, false },
86 { kAccountsPrefShowUserNamesOnSignIn, true, false },
87 { kAccountsPrefSupervisedUsersEnabled, true, false },
88 #if defined(GOOGLE_CHROME_BUILD)
89 { kStatsReportingPref, true, true },
90 { spellcheck::prefs::kSpellCheckUseSpellingService, false, false },
91 #endif
92 };
93
94 } // namespace
95
96 class SharedOptionsTest : public LoginManagerTest {
97 public:
98 SharedOptionsTest()
99 : LoginManagerTest(false),
100 stub_settings_provider_(base::MakeUnique<StubCrosSettingsProvider>()),
101 stub_settings_provider_ptr_(static_cast<StubCrosSettingsProvider*>(
102 stub_settings_provider_.get())),
103 test_owner_account_id_(AccountId::FromUserEmail(kTestOwner)),
104 test_non_owner_account_id_(AccountId::FromUserEmail(kTestNonOwner)) {
105 stub_settings_provider_->Set(kDeviceOwner, base::Value(kTestOwner));
106 }
107
108 ~SharedOptionsTest() override {}
109
110 void SetUpOnMainThread() override {
111 LoginManagerTest::SetUpOnMainThread();
112
113 CrosSettings* settings = CrosSettings::Get();
114
115 // Add the stub settings provider, moving the device settings provider
116 // behind it so our stub takes precedence.
117 std::unique_ptr<CrosSettingsProvider> device_settings_provider =
118 settings->RemoveSettingsProvider(settings->GetProvider(kDeviceOwner));
119 settings->AddSettingsProvider(std::move(stub_settings_provider_));
120 settings->AddSettingsProvider(std::move(device_settings_provider));
121
122 // Notify ChromeUserManager of ownership change.
123 content::NotificationService::current()->Notify(
124 chrome::NOTIFICATION_OWNERSHIP_STATUS_CHANGED,
125 content::Source<SharedOptionsTest>(this),
126 content::NotificationService::NoDetails());
127 }
128
129 void TearDownOnMainThread() override {
130 CrosSettings* settings = CrosSettings::Get();
131 settings->RemoveSettingsProvider(stub_settings_provider_ptr_);
132 LoginManagerTest::TearDownOnMainThread();
133 }
134
135 protected:
136 void CheckOptionsUI(const user_manager::User* user,
137 bool is_owner,
138 bool is_primary) {
139 ASSERT_NE(nullptr, user);
140 Browser* browser = CreateBrowserForUser(user);
141 content::WebContents* contents =
142 browser->tab_strip_model()->GetActiveWebContents();
143
144 for (size_t i = 0; i < sizeof(kPrefTests) / sizeof(kPrefTests[0]); i++) {
145 bool disabled = !is_owner && kPrefTests[i].owner_only;
146 if (strcmp(kPrefTests[i].pref_name, kSystemTimezone) == 0) {
147 disabled = ProfileHelper::Get()
148 ->GetProfileByUser(user)
149 ->GetPrefs()
150 ->GetBoolean(prefs::kResolveTimezoneByGeolocation);
151 }
152
153 CheckPreference(
154 contents, kPrefTests[i].pref_name, disabled,
155 !is_owner && kPrefTests[i].indicator ? "owner" : std::string());
156 }
157 CheckBanner(contents, is_primary);
158 CheckSharedSections(contents, is_primary);
159 CheckAccountsOverlay(contents, is_owner);
160 }
161
162 // Creates a browser and navigates to the Settings page.
163 Browser* CreateBrowserForUser(const user_manager::User* user) {
164 Profile* profile = ProfileHelper::Get()->GetProfileByUser(user);
165 SigninManagerFactory::GetForProfile(profile)->SetAuthenticatedAccountInfo(
166 GetGaiaIDForUserID(user->GetAccountId().GetUserEmail()),
167 user->GetAccountId().GetUserEmail());
168
169 ui_test_utils::BrowserAddedObserver observer;
170 Browser* browser = CreateBrowser(profile);
171 observer.WaitForSingleNewBrowser();
172
173 ui_test_utils::NavigateToURL(browser,
174 GURL("chrome://settings-frame"));
175 return browser;
176 }
177
178 // Verifies a preference's disabled state and controlled-by indicator.
179 void CheckPreference(content::WebContents* contents,
180 std::string pref_name,
181 bool disabled,
182 std::string controlled_by) {
183 bool success;
184 std::string js_expression = base::StringPrintf(
185 "var prefSelector = '[pref=\"%s\"]';"
186 "var controlledBy = '%s';"
187 "var input = document.querySelector("
188 " 'input' + prefSelector + ', select' + prefSelector);"
189 "var success = false;"
190 "if (input) {"
191 " success = input.disabled == %d;"
192 " var indicator = input.parentNode.parentNode.querySelector("
193 " '.controlled-setting-indicator');"
194 " if (controlledBy) {"
195 " success = success && indicator &&"
196 " indicator.getAttribute('controlled-by') == controlledBy;"
197 " } else {"
198 " success = success && (!indicator ||"
199 " !indicator.hasAttribute('controlled-by') ||"
200 " indicator.getAttribute('controlled-by') == '')"
201 " }"
202 "}"
203 "window.domAutomationController.send(!!success);",
204 pref_name.c_str(), controlled_by.c_str(), disabled);
205 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
206 contents, js_expression, &success));
207 EXPECT_TRUE(success);
208 }
209
210 // Verifies a checkbox's disabled state, controlled-by indicator and value.
211 void CheckBooleanPreference(content::WebContents* contents,
212 std::string pref_name,
213 bool disabled,
214 std::string controlled_by,
215 bool expected_value) {
216 CheckPreference(contents, pref_name, disabled, controlled_by);
217 bool actual_value;
218 std::string js_expression = base::StringPrintf(
219 "window.domAutomationController.send(document.querySelector('"
220 " input[type=\"checkbox\"][pref=\"%s\"]').checked);",
221 pref_name.c_str());
222 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
223 contents, js_expression, &actual_value));
224 EXPECT_EQ(expected_value, actual_value);
225 }
226
227 // Verifies that the shared settings banner is visible only for
228 // secondary users.
229 void CheckBanner(content::WebContents* contents,
230 bool is_primary) {
231 bool banner_visible;
232 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
233 contents,
234 "var e = $('secondary-user-banner');"
235 "window.domAutomationController.send(e && !e.hidden);",
236 &banner_visible));
237 EXPECT_EQ(!is_primary, banner_visible);
238 }
239
240 // Verifies that sections of shared settings have the appropriate indicator.
241 void CheckSharedSections(content::WebContents* contents,
242 bool is_primary) {
243 // This only applies to the Internet options section.
244 std::string controlled_by;
245 ASSERT_TRUE(content::ExecuteScriptAndExtractString(
246 contents,
247 "var e = document.querySelector("
248 " '#network-section-header span.controlled-setting-indicator');"
249 "if (!e || !e.getAttribute('controlled-by')) {"
250 " window.domAutomationController.send('');"
251 "} else {"
252 " window.domAutomationController.send("
253 " e.getAttribute('controlled-by'));"
254 "}",
255 &controlled_by));
256 EXPECT_EQ(!is_primary ? "shared" : std::string(), controlled_by);
257 }
258
259 // Checks the Accounts header and non-checkbox inputs.
260 void CheckAccountsOverlay(content::WebContents* contents, bool is_owner) {
261 // Set cros.accounts.allowGuest to false so we can test the accounts list.
262 // This has to be done after the PRE_* test or we can't add the owner.
263 stub_settings_provider_ptr_->Set(kAccountsPrefAllowNewUser,
264 base::Value(false));
265
266 bool success;
267 std::string js_expression = base::StringPrintf(
268 "var controlled = %d;"
269 "var warning = $('ownerOnlyWarning');"
270 "var userList = $('userList');"
271 "var input = $('userNameEdit');"
272 "var success;"
273 "if (controlled)"
274 " success = warning && !warning.hidden && userList.disabled &&"
275 " input.disabled;"
276 "else"
277 " success = (!warning || warning.hidden) && !userList.disabled &&"
278 " !input.disabled;"
279 "window.domAutomationController.send(!!success);",
280 !is_owner);
281 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
282 contents, js_expression, &success));
283 EXPECT_TRUE(success) << "Accounts overlay incorrect for " <<
284 (is_owner ? "owner." : "non-owner.");
285 }
286
287 std::unique_ptr<CrosSettingsProvider> stub_settings_provider_;
288 StubCrosSettingsProvider* stub_settings_provider_ptr_;
289
290 const AccountId test_owner_account_id_;
291 const AccountId test_non_owner_account_id_;
292
293 private:
294 DISALLOW_COPY_AND_ASSIGN(SharedOptionsTest);
295 };
296
297 IN_PROC_BROWSER_TEST_F(SharedOptionsTest, PRE_SharedOptions) {
298 RegisterUser(test_owner_account_id_.GetUserEmail());
299 RegisterUser(test_non_owner_account_id_.GetUserEmail());
300 StartupUtils::MarkOobeCompleted();
301 }
302
303 IN_PROC_BROWSER_TEST_F(SharedOptionsTest, SharedOptions) {
304 // Log in the owner first, then add a secondary user.
305 LoginUser(test_owner_account_id_.GetUserEmail());
306 UserAddingScreen::Get()->Start();
307 content::RunAllPendingInMessageLoop();
308 AddUser(test_non_owner_account_id_.GetUserEmail());
309
310 user_manager::UserManager* manager = user_manager::UserManager::Get();
311 ASSERT_EQ(2u, manager->GetLoggedInUsers().size());
312 {
313 SCOPED_TRACE("Checking settings for owner, primary user.");
314 CheckOptionsUI(manager->FindUser(manager->GetOwnerAccountId()), true, true);
315 }
316 {
317 SCOPED_TRACE("Checking settings for non-owner, secondary user.");
318 CheckOptionsUI(manager->FindUser(test_non_owner_account_id_), false, false);
319 }
320 // TODO(michaelpg): Add tests for non-primary owner and primary non-owner
321 // when the owner-only multiprofile restriction is removed, probably M38.
322 }
323
324 IN_PROC_BROWSER_TEST_F(SharedOptionsTest, PRE_ScreenLockPreferencePrimary) {
325 RegisterUser(test_owner_account_id_.GetUserEmail());
326 RegisterUser(test_non_owner_account_id_.GetUserEmail());
327 StartupUtils::MarkOobeCompleted();
328 }
329
330 // Tests the shared setting indicator for the primary user's auto-lock setting
331 // when the secondary user has enabled or disabled their preference.
332 // (The checkbox is unset if the current user's preference is false, but if any
333 // other signed-in user has enabled this preference, the shared setting
334 // indicator explains this.)
335 IN_PROC_BROWSER_TEST_F(SharedOptionsTest, ScreenLockPreferencePrimary) {
336 LoginUser(test_owner_account_id_.GetUserEmail());
337 UserAddingScreen::Get()->Start();
338 content::RunAllPendingInMessageLoop();
339 AddUser(test_non_owner_account_id_.GetUserEmail());
340
341 user_manager::UserManager* manager = user_manager::UserManager::Get();
342 const user_manager::User* user1 = manager->FindUser(test_owner_account_id_);
343 const user_manager::User* user2 =
344 manager->FindUser(test_non_owner_account_id_);
345
346 PrefService* prefs1 =
347 ProfileHelper::Get()->GetProfileByUser(user1)->GetPrefs();
348 PrefService* prefs2 =
349 ProfileHelper::Get()->GetProfileByUser(user2)->GetPrefs();
350
351 // Set both users' preference to false, then change the secondary user's to
352 // true. We'll do the opposite in the next test. Doesn't provide 100% coverage
353 // but reloading the settings page is super slow on debug builds.
354 prefs1->SetBoolean(prefs::kEnableAutoScreenLock, false);
355 prefs2->SetBoolean(prefs::kEnableAutoScreenLock, false);
356
357 Browser* browser = CreateBrowserForUser(user1);
358 content::WebContents* contents =
359 browser->tab_strip_model()->GetActiveWebContents();
360
361 bool disabled = false;
362 bool expected_value;
363 std::string empty_controlled;
364 std::string shared_controlled("shared");
365
366 {
367 SCOPED_TRACE("Screen lock false for both users");
368 expected_value = false;
369 CheckBooleanPreference(contents, prefs::kEnableAutoScreenLock, disabled,
370 empty_controlled, expected_value);
371 }
372
373 // Set the secondary user's preference to true, and reload the primary user's
374 // browser to see the updated controlled-by indicator.
375 prefs2->SetBoolean(prefs::kEnableAutoScreenLock, true);
376 chrome::Reload(browser, WindowOpenDisposition::CURRENT_TAB);
377 content::WaitForLoadStop(contents);
378 {
379 SCOPED_TRACE("Screen lock false for primary user");
380 expected_value = false;
381 CheckBooleanPreference(contents, prefs::kEnableAutoScreenLock, disabled,
382 shared_controlled, expected_value);
383 }
384
385 // Set the preference to true for the primary user and check that the
386 // indicator disappears.
387 prefs1->SetBoolean(prefs::kEnableAutoScreenLock, true);
388 {
389 SCOPED_TRACE("Screen lock true for both users");
390 expected_value = true;
391 CheckBooleanPreference(contents, prefs::kEnableAutoScreenLock, disabled,
392 empty_controlled, expected_value);
393 }
394 }
395
396 IN_PROC_BROWSER_TEST_F(SharedOptionsTest, PRE_ScreenLockPreferenceSecondary) {
397 RegisterUser(test_owner_account_id_.GetUserEmail());
398 RegisterUser(test_non_owner_account_id_.GetUserEmail());
399 StartupUtils::MarkOobeCompleted();
400 }
401
402 // Tests the shared setting indicator for the secondary user's auto-lock setting
403 // when the primary user has enabled or disabled their preference.
404 // (The checkbox is unset if the current user's preference is false, but if any
405 // other signed-in user has enabled this preference, the shared setting
406 // indicator explains this.)
407 IN_PROC_BROWSER_TEST_F(SharedOptionsTest, ScreenLockPreferenceSecondary) {
408 LoginUser(test_owner_account_id_.GetUserEmail());
409 UserAddingScreen::Get()->Start();
410 content::RunAllPendingInMessageLoop();
411 AddUser(test_non_owner_account_id_.GetUserEmail());
412
413 user_manager::UserManager* manager = user_manager::UserManager::Get();
414 const user_manager::User* user1 = manager->FindUser(test_owner_account_id_);
415 const user_manager::User* user2 =
416 manager->FindUser(test_non_owner_account_id_);
417
418 PrefService* prefs1 =
419 ProfileHelper::Get()->GetProfileByUser(user1)->GetPrefs();
420 PrefService* prefs2 =
421 ProfileHelper::Get()->GetProfileByUser(user2)->GetPrefs();
422
423 // Set both users' preference to true, then change the secondary user's to
424 // false.
425 prefs1->SetBoolean(prefs::kEnableAutoScreenLock, true);
426 prefs2->SetBoolean(prefs::kEnableAutoScreenLock, true);
427
428 Browser* browser = CreateBrowserForUser(user2);
429 content::WebContents* contents =
430 browser->tab_strip_model()->GetActiveWebContents();
431
432 bool disabled = false;
433 bool expected_value;
434 std::string empty_controlled;
435 std::string shared_controlled("shared");
436
437 {
438 SCOPED_TRACE("Screen lock true for both users");
439 expected_value = true;
440 CheckBooleanPreference(contents, prefs::kEnableAutoScreenLock, disabled,
441 empty_controlled, expected_value);
442 }
443
444 // Set the secondary user's preference to false and check that the
445 // controlled-by indicator is shown.
446 prefs2->SetBoolean(prefs::kEnableAutoScreenLock, false);
447 {
448 SCOPED_TRACE("Screen lock false for secondary user");
449 expected_value = false;
450 CheckBooleanPreference(contents, prefs::kEnableAutoScreenLock, disabled,
451 shared_controlled, expected_value);
452 }
453
454 // Set the preference to false for the primary user and check that the
455 // indicator disappears.
456 prefs1->SetBoolean(prefs::kEnableAutoScreenLock, false);
457 chrome::Reload(browser, WindowOpenDisposition::CURRENT_TAB);
458 content::WaitForLoadStop(contents);
459 {
460 SCOPED_TRACE("Screen lock false for both users");
461 expected_value = false;
462 CheckBooleanPreference(contents, prefs::kEnableAutoScreenLock, disabled,
463 empty_controlled, expected_value);
464 }
465 }
466
467 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698