Index: chrome/browser/ui/webui/options/chromeos/shared_options_browsertest.cc |
diff --git a/chrome/browser/ui/webui/options/chromeos/shared_options_browsertest.cc b/chrome/browser/ui/webui/options/chromeos/shared_options_browsertest.cc |
deleted file mode 100644 |
index 7e7b7fa708fe8f4e290a2ec903ec376df3baa6cb..0000000000000000000000000000000000000000 |
--- a/chrome/browser/ui/webui/options/chromeos/shared_options_browsertest.cc |
+++ /dev/null |
@@ -1,467 +0,0 @@ |
-// Copyright 2014 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include <stddef.h> |
- |
-#include "base/compiler_specific.h" |
-#include "base/macros.h" |
-#include "base/memory/ptr_util.h" |
-#include "base/strings/stringprintf.h" |
-#include "chrome/browser/chrome_notification_types.h" |
-#include "chrome/browser/chromeos/login/login_manager_test.h" |
-#include "chrome/browser/chromeos/login/startup_utils.h" |
-#include "chrome/browser/chromeos/login/ui/user_adding_screen.h" |
-#include "chrome/browser/chromeos/profiles/profile_helper.h" |
-#include "chrome/browser/chromeos/settings/cros_settings.h" |
-#include "chrome/browser/chromeos/settings/stub_cros_settings_provider.h" |
-#include "chrome/browser/profiles/profile.h" |
-#include "chrome/browser/signin/signin_manager_factory.h" |
-#include "chrome/browser/ui/browser.h" |
-#include "chrome/browser/ui/browser_commands.h" |
-#include "chrome/browser/ui/tabs/tab_strip_model.h" |
-#include "chrome/common/pref_names.h" |
-#include "chrome/test/base/ui_test_utils.h" |
-#include "chromeos/settings/cros_settings_names.h" |
-#if defined(GOOGLE_CHROME_BUILD) |
-#include "components/spellcheck/browser/pref_names.h" |
-#endif |
-#include "components/prefs/pref_service.h" |
-#include "components/signin/core/browser/signin_manager.h" |
-#include "components/user_manager/user_manager.h" |
-#include "content/public/browser/notification_service.h" |
-#include "content/public/browser/notification_source.h" |
-#include "content/public/browser/web_contents.h" |
-#include "content/public/test/browser_test_utils.h" |
-#include "content/public/test/test_utils.h" |
- |
-namespace chromeos { |
- |
-namespace { |
- |
-// Because policy is not needed in this test it is better to use e-mails that |
-// are definitely not enterprise. This lets us to avoid faking of policy fetch |
-// procedure. |
-const char* kTestOwner = "test-owner@gmail.com"; |
-const char* kTestNonOwner = "test-user1@gmail.com"; |
- |
-const char* kKnownSettings[] = { |
- kDeviceOwner, |
- kAccountsPrefAllowGuest, |
- kAccountsPrefAllowNewUser, |
- kAccountsPrefDeviceLocalAccounts, |
- kAccountsPrefShowUserNamesOnSignIn, |
- kAccountsPrefSupervisedUsersEnabled, |
-}; |
- |
-// Stub settings provider that only handles the settings we need to control. |
-// StubCrosSettingsProvider handles more settings but leaves many of them unset |
-// which the Settings page doesn't expect. |
-class StubAccountSettingsProvider : public StubCrosSettingsProvider { |
- public: |
- StubAccountSettingsProvider() { |
- } |
- |
- ~StubAccountSettingsProvider() override {} |
- |
- // StubCrosSettingsProvider implementation. |
- bool HandlesSetting(const std::string& path) const override { |
- const char** end = kKnownSettings + arraysize(kKnownSettings); |
- return std::find(kKnownSettings, end, path) != end; |
- } |
-}; |
- |
-struct PrefTest { |
- const char* pref_name; |
- bool owner_only; |
- bool indicator; |
-}; |
- |
-const PrefTest kPrefTests[] = { |
- { kSystemTimezone, false, false }, |
- { prefs::kUse24HourClock, false, false }, |
- { kAttestationForContentProtectionEnabled, true, true }, |
- { kAccountsPrefAllowGuest, true, false }, |
- { kAccountsPrefAllowNewUser, true, false }, |
- { kAccountsPrefShowUserNamesOnSignIn, true, false }, |
- { kAccountsPrefSupervisedUsersEnabled, true, false }, |
-#if defined(GOOGLE_CHROME_BUILD) |
- { kStatsReportingPref, true, true }, |
- { spellcheck::prefs::kSpellCheckUseSpellingService, false, false }, |
-#endif |
-}; |
- |
-} // namespace |
- |
-class SharedOptionsTest : public LoginManagerTest { |
- public: |
- SharedOptionsTest() |
- : LoginManagerTest(false), |
- stub_settings_provider_(base::MakeUnique<StubCrosSettingsProvider>()), |
- stub_settings_provider_ptr_(static_cast<StubCrosSettingsProvider*>( |
- stub_settings_provider_.get())), |
- test_owner_account_id_(AccountId::FromUserEmail(kTestOwner)), |
- test_non_owner_account_id_(AccountId::FromUserEmail(kTestNonOwner)) { |
- stub_settings_provider_->Set(kDeviceOwner, base::Value(kTestOwner)); |
- } |
- |
- ~SharedOptionsTest() override {} |
- |
- void SetUpOnMainThread() override { |
- LoginManagerTest::SetUpOnMainThread(); |
- |
- CrosSettings* settings = CrosSettings::Get(); |
- |
- // Add the stub settings provider, moving the device settings provider |
- // behind it so our stub takes precedence. |
- std::unique_ptr<CrosSettingsProvider> device_settings_provider = |
- settings->RemoveSettingsProvider(settings->GetProvider(kDeviceOwner)); |
- settings->AddSettingsProvider(std::move(stub_settings_provider_)); |
- settings->AddSettingsProvider(std::move(device_settings_provider)); |
- |
- // Notify ChromeUserManager of ownership change. |
- content::NotificationService::current()->Notify( |
- chrome::NOTIFICATION_OWNERSHIP_STATUS_CHANGED, |
- content::Source<SharedOptionsTest>(this), |
- content::NotificationService::NoDetails()); |
- } |
- |
- void TearDownOnMainThread() override { |
- CrosSettings* settings = CrosSettings::Get(); |
- settings->RemoveSettingsProvider(stub_settings_provider_ptr_); |
- LoginManagerTest::TearDownOnMainThread(); |
- } |
- |
- protected: |
- void CheckOptionsUI(const user_manager::User* user, |
- bool is_owner, |
- bool is_primary) { |
- ASSERT_NE(nullptr, user); |
- Browser* browser = CreateBrowserForUser(user); |
- content::WebContents* contents = |
- browser->tab_strip_model()->GetActiveWebContents(); |
- |
- for (size_t i = 0; i < sizeof(kPrefTests) / sizeof(kPrefTests[0]); i++) { |
- bool disabled = !is_owner && kPrefTests[i].owner_only; |
- if (strcmp(kPrefTests[i].pref_name, kSystemTimezone) == 0) { |
- disabled = ProfileHelper::Get() |
- ->GetProfileByUser(user) |
- ->GetPrefs() |
- ->GetBoolean(prefs::kResolveTimezoneByGeolocation); |
- } |
- |
- CheckPreference( |
- contents, kPrefTests[i].pref_name, disabled, |
- !is_owner && kPrefTests[i].indicator ? "owner" : std::string()); |
- } |
- CheckBanner(contents, is_primary); |
- CheckSharedSections(contents, is_primary); |
- CheckAccountsOverlay(contents, is_owner); |
- } |
- |
- // Creates a browser and navigates to the Settings page. |
- Browser* CreateBrowserForUser(const user_manager::User* user) { |
- Profile* profile = ProfileHelper::Get()->GetProfileByUser(user); |
- SigninManagerFactory::GetForProfile(profile)->SetAuthenticatedAccountInfo( |
- GetGaiaIDForUserID(user->GetAccountId().GetUserEmail()), |
- user->GetAccountId().GetUserEmail()); |
- |
- ui_test_utils::BrowserAddedObserver observer; |
- Browser* browser = CreateBrowser(profile); |
- observer.WaitForSingleNewBrowser(); |
- |
- ui_test_utils::NavigateToURL(browser, |
- GURL("chrome://settings-frame")); |
- return browser; |
- } |
- |
- // Verifies a preference's disabled state and controlled-by indicator. |
- void CheckPreference(content::WebContents* contents, |
- std::string pref_name, |
- bool disabled, |
- std::string controlled_by) { |
- bool success; |
- std::string js_expression = base::StringPrintf( |
- "var prefSelector = '[pref=\"%s\"]';" |
- "var controlledBy = '%s';" |
- "var input = document.querySelector(" |
- " 'input' + prefSelector + ', select' + prefSelector);" |
- "var success = false;" |
- "if (input) {" |
- " success = input.disabled == %d;" |
- " var indicator = input.parentNode.parentNode.querySelector(" |
- " '.controlled-setting-indicator');" |
- " if (controlledBy) {" |
- " success = success && indicator &&" |
- " indicator.getAttribute('controlled-by') == controlledBy;" |
- " } else {" |
- " success = success && (!indicator ||" |
- " !indicator.hasAttribute('controlled-by') ||" |
- " indicator.getAttribute('controlled-by') == '')" |
- " }" |
- "}" |
- "window.domAutomationController.send(!!success);", |
- pref_name.c_str(), controlled_by.c_str(), disabled); |
- ASSERT_TRUE(content::ExecuteScriptAndExtractBool( |
- contents, js_expression, &success)); |
- EXPECT_TRUE(success); |
- } |
- |
- // Verifies a checkbox's disabled state, controlled-by indicator and value. |
- void CheckBooleanPreference(content::WebContents* contents, |
- std::string pref_name, |
- bool disabled, |
- std::string controlled_by, |
- bool expected_value) { |
- CheckPreference(contents, pref_name, disabled, controlled_by); |
- bool actual_value; |
- std::string js_expression = base::StringPrintf( |
- "window.domAutomationController.send(document.querySelector('" |
- " input[type=\"checkbox\"][pref=\"%s\"]').checked);", |
- pref_name.c_str()); |
- ASSERT_TRUE(content::ExecuteScriptAndExtractBool( |
- contents, js_expression, &actual_value)); |
- EXPECT_EQ(expected_value, actual_value); |
- } |
- |
- // Verifies that the shared settings banner is visible only for |
- // secondary users. |
- void CheckBanner(content::WebContents* contents, |
- bool is_primary) { |
- bool banner_visible; |
- ASSERT_TRUE(content::ExecuteScriptAndExtractBool( |
- contents, |
- "var e = $('secondary-user-banner');" |
- "window.domAutomationController.send(e && !e.hidden);", |
- &banner_visible)); |
- EXPECT_EQ(!is_primary, banner_visible); |
- } |
- |
- // Verifies that sections of shared settings have the appropriate indicator. |
- void CheckSharedSections(content::WebContents* contents, |
- bool is_primary) { |
- // This only applies to the Internet options section. |
- std::string controlled_by; |
- ASSERT_TRUE(content::ExecuteScriptAndExtractString( |
- contents, |
- "var e = document.querySelector(" |
- " '#network-section-header span.controlled-setting-indicator');" |
- "if (!e || !e.getAttribute('controlled-by')) {" |
- " window.domAutomationController.send('');" |
- "} else {" |
- " window.domAutomationController.send(" |
- " e.getAttribute('controlled-by'));" |
- "}", |
- &controlled_by)); |
- EXPECT_EQ(!is_primary ? "shared" : std::string(), controlled_by); |
- } |
- |
- // Checks the Accounts header and non-checkbox inputs. |
- void CheckAccountsOverlay(content::WebContents* contents, bool is_owner) { |
- // Set cros.accounts.allowGuest to false so we can test the accounts list. |
- // This has to be done after the PRE_* test or we can't add the owner. |
- stub_settings_provider_ptr_->Set(kAccountsPrefAllowNewUser, |
- base::Value(false)); |
- |
- bool success; |
- std::string js_expression = base::StringPrintf( |
- "var controlled = %d;" |
- "var warning = $('ownerOnlyWarning');" |
- "var userList = $('userList');" |
- "var input = $('userNameEdit');" |
- "var success;" |
- "if (controlled)" |
- " success = warning && !warning.hidden && userList.disabled &&" |
- " input.disabled;" |
- "else" |
- " success = (!warning || warning.hidden) && !userList.disabled &&" |
- " !input.disabled;" |
- "window.domAutomationController.send(!!success);", |
- !is_owner); |
- ASSERT_TRUE(content::ExecuteScriptAndExtractBool( |
- contents, js_expression, &success)); |
- EXPECT_TRUE(success) << "Accounts overlay incorrect for " << |
- (is_owner ? "owner." : "non-owner."); |
- } |
- |
- std::unique_ptr<CrosSettingsProvider> stub_settings_provider_; |
- StubCrosSettingsProvider* stub_settings_provider_ptr_; |
- |
- const AccountId test_owner_account_id_; |
- const AccountId test_non_owner_account_id_; |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(SharedOptionsTest); |
-}; |
- |
-IN_PROC_BROWSER_TEST_F(SharedOptionsTest, PRE_SharedOptions) { |
- RegisterUser(test_owner_account_id_.GetUserEmail()); |
- RegisterUser(test_non_owner_account_id_.GetUserEmail()); |
- StartupUtils::MarkOobeCompleted(); |
-} |
- |
-IN_PROC_BROWSER_TEST_F(SharedOptionsTest, SharedOptions) { |
- // Log in the owner first, then add a secondary user. |
- LoginUser(test_owner_account_id_.GetUserEmail()); |
- UserAddingScreen::Get()->Start(); |
- content::RunAllPendingInMessageLoop(); |
- AddUser(test_non_owner_account_id_.GetUserEmail()); |
- |
- user_manager::UserManager* manager = user_manager::UserManager::Get(); |
- ASSERT_EQ(2u, manager->GetLoggedInUsers().size()); |
- { |
- SCOPED_TRACE("Checking settings for owner, primary user."); |
- CheckOptionsUI(manager->FindUser(manager->GetOwnerAccountId()), true, true); |
- } |
- { |
- SCOPED_TRACE("Checking settings for non-owner, secondary user."); |
- CheckOptionsUI(manager->FindUser(test_non_owner_account_id_), false, false); |
- } |
- // TODO(michaelpg): Add tests for non-primary owner and primary non-owner |
- // when the owner-only multiprofile restriction is removed, probably M38. |
-} |
- |
-IN_PROC_BROWSER_TEST_F(SharedOptionsTest, PRE_ScreenLockPreferencePrimary) { |
- RegisterUser(test_owner_account_id_.GetUserEmail()); |
- RegisterUser(test_non_owner_account_id_.GetUserEmail()); |
- StartupUtils::MarkOobeCompleted(); |
-} |
- |
-// Tests the shared setting indicator for the primary user's auto-lock setting |
-// when the secondary user has enabled or disabled their preference. |
-// (The checkbox is unset if the current user's preference is false, but if any |
-// other signed-in user has enabled this preference, the shared setting |
-// indicator explains this.) |
-IN_PROC_BROWSER_TEST_F(SharedOptionsTest, ScreenLockPreferencePrimary) { |
- LoginUser(test_owner_account_id_.GetUserEmail()); |
- UserAddingScreen::Get()->Start(); |
- content::RunAllPendingInMessageLoop(); |
- AddUser(test_non_owner_account_id_.GetUserEmail()); |
- |
- user_manager::UserManager* manager = user_manager::UserManager::Get(); |
- const user_manager::User* user1 = manager->FindUser(test_owner_account_id_); |
- const user_manager::User* user2 = |
- manager->FindUser(test_non_owner_account_id_); |
- |
- PrefService* prefs1 = |
- ProfileHelper::Get()->GetProfileByUser(user1)->GetPrefs(); |
- PrefService* prefs2 = |
- ProfileHelper::Get()->GetProfileByUser(user2)->GetPrefs(); |
- |
- // Set both users' preference to false, then change the secondary user's to |
- // true. We'll do the opposite in the next test. Doesn't provide 100% coverage |
- // but reloading the settings page is super slow on debug builds. |
- prefs1->SetBoolean(prefs::kEnableAutoScreenLock, false); |
- prefs2->SetBoolean(prefs::kEnableAutoScreenLock, false); |
- |
- Browser* browser = CreateBrowserForUser(user1); |
- content::WebContents* contents = |
- browser->tab_strip_model()->GetActiveWebContents(); |
- |
- bool disabled = false; |
- bool expected_value; |
- std::string empty_controlled; |
- std::string shared_controlled("shared"); |
- |
- { |
- SCOPED_TRACE("Screen lock false for both users"); |
- expected_value = false; |
- CheckBooleanPreference(contents, prefs::kEnableAutoScreenLock, disabled, |
- empty_controlled, expected_value); |
- } |
- |
- // Set the secondary user's preference to true, and reload the primary user's |
- // browser to see the updated controlled-by indicator. |
- prefs2->SetBoolean(prefs::kEnableAutoScreenLock, true); |
- chrome::Reload(browser, WindowOpenDisposition::CURRENT_TAB); |
- content::WaitForLoadStop(contents); |
- { |
- SCOPED_TRACE("Screen lock false for primary user"); |
- expected_value = false; |
- CheckBooleanPreference(contents, prefs::kEnableAutoScreenLock, disabled, |
- shared_controlled, expected_value); |
- } |
- |
- // Set the preference to true for the primary user and check that the |
- // indicator disappears. |
- prefs1->SetBoolean(prefs::kEnableAutoScreenLock, true); |
- { |
- SCOPED_TRACE("Screen lock true for both users"); |
- expected_value = true; |
- CheckBooleanPreference(contents, prefs::kEnableAutoScreenLock, disabled, |
- empty_controlled, expected_value); |
- } |
-} |
- |
-IN_PROC_BROWSER_TEST_F(SharedOptionsTest, PRE_ScreenLockPreferenceSecondary) { |
- RegisterUser(test_owner_account_id_.GetUserEmail()); |
- RegisterUser(test_non_owner_account_id_.GetUserEmail()); |
- StartupUtils::MarkOobeCompleted(); |
-} |
- |
-// Tests the shared setting indicator for the secondary user's auto-lock setting |
-// when the primary user has enabled or disabled their preference. |
-// (The checkbox is unset if the current user's preference is false, but if any |
-// other signed-in user has enabled this preference, the shared setting |
-// indicator explains this.) |
-IN_PROC_BROWSER_TEST_F(SharedOptionsTest, ScreenLockPreferenceSecondary) { |
- LoginUser(test_owner_account_id_.GetUserEmail()); |
- UserAddingScreen::Get()->Start(); |
- content::RunAllPendingInMessageLoop(); |
- AddUser(test_non_owner_account_id_.GetUserEmail()); |
- |
- user_manager::UserManager* manager = user_manager::UserManager::Get(); |
- const user_manager::User* user1 = manager->FindUser(test_owner_account_id_); |
- const user_manager::User* user2 = |
- manager->FindUser(test_non_owner_account_id_); |
- |
- PrefService* prefs1 = |
- ProfileHelper::Get()->GetProfileByUser(user1)->GetPrefs(); |
- PrefService* prefs2 = |
- ProfileHelper::Get()->GetProfileByUser(user2)->GetPrefs(); |
- |
- // Set both users' preference to true, then change the secondary user's to |
- // false. |
- prefs1->SetBoolean(prefs::kEnableAutoScreenLock, true); |
- prefs2->SetBoolean(prefs::kEnableAutoScreenLock, true); |
- |
- Browser* browser = CreateBrowserForUser(user2); |
- content::WebContents* contents = |
- browser->tab_strip_model()->GetActiveWebContents(); |
- |
- bool disabled = false; |
- bool expected_value; |
- std::string empty_controlled; |
- std::string shared_controlled("shared"); |
- |
- { |
- SCOPED_TRACE("Screen lock true for both users"); |
- expected_value = true; |
- CheckBooleanPreference(contents, prefs::kEnableAutoScreenLock, disabled, |
- empty_controlled, expected_value); |
- } |
- |
- // Set the secondary user's preference to false and check that the |
- // controlled-by indicator is shown. |
- prefs2->SetBoolean(prefs::kEnableAutoScreenLock, false); |
- { |
- SCOPED_TRACE("Screen lock false for secondary user"); |
- expected_value = false; |
- CheckBooleanPreference(contents, prefs::kEnableAutoScreenLock, disabled, |
- shared_controlled, expected_value); |
- } |
- |
- // Set the preference to false for the primary user and check that the |
- // indicator disappears. |
- prefs1->SetBoolean(prefs::kEnableAutoScreenLock, false); |
- chrome::Reload(browser, WindowOpenDisposition::CURRENT_TAB); |
- content::WaitForLoadStop(contents); |
- { |
- SCOPED_TRACE("Screen lock false for both users"); |
- expected_value = false; |
- CheckBooleanPreference(contents, prefs::kEnableAutoScreenLock, disabled, |
- empty_controlled, expected_value); |
- } |
-} |
- |
-} // namespace chromeos |