Commit 9827d624 authored by Kyle Horimoto's avatar Kyle Horimoto Committed by Commit Bot

[CrOS Settings] Register subpages/settings in all sections

This CL uses the Hierarchy infrastructure added in [1] to register
subpages and settings for each section. It also changes
OsSettingsSection::RegisterHierarchy() to a pure virtual function so
that all sections must implement this functionality.

Additionally, this CL adds a test which verifies that metadata is
registered for every subpage/setting. This ensures that as new content
is added to the settings page, it must be registered to pass the CQ.

[1] https://chromium-review.googlesource.com/c/chromium/src/+/2203149

Bug: 1080892
Change-Id: Ia9736f3f841c1c61202e1fe59bdb3793f0874bf2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2204440Reviewed-by: default avatarRegan Hsu <hsuregan@chromium.org>
Reviewed-by: default avatarTom Sepez <tsepez@chromium.org>
Auto-Submit: Kyle Horimoto <khorimoto@chromium.org>
Commit-Queue: Tom Sepez <tsepez@chromium.org>
Cr-Commit-Position: refs/heads/master@{#769496}
parent cf5ae918
......@@ -270,5 +270,19 @@ void AboutSection::AddHandlers(content::WebUI* web_ui) {
web_ui->AddMessageHandler(std::make_unique<::settings::AboutHandler>());
}
void AboutSection::RegisterHierarchy(HierarchyGenerator* generator) const {
// About Chrome OS.
generator->RegisterTopLevelSubpage(mojom::Subpage::kAboutChromeOsDetails);
// Detailed build info.
generator->RegisterNestedSubpage(mojom::Subpage::kDetailedBuildInfo,
mojom::Subpage::kAboutChromeOsDetails);
static constexpr mojom::Setting kDetailedBuildInfoSettings[] = {
mojom::Setting::kChangeChromeChannel,
mojom::Setting::kCopyDetailedBuildInfo};
RegisterNestedSettingBulk(mojom::Subpage::kDetailedBuildInfo,
kDetailedBuildInfoSettings, generator);
}
} // namespace settings
} // namespace chromeos
......@@ -26,6 +26,7 @@ class AboutSection : public OsSettingsSection {
// OsSettingsSection:
void AddLoadTimeData(content::WebUIDataSource* html_source) override;
void AddHandlers(content::WebUI* web_ui) override;
void RegisterHierarchy(HierarchyGenerator* generator) const override;
};
} // namespace settings
......
......@@ -510,6 +510,59 @@ void AccessibilitySection::AddHandlers(content::WebUI* web_ui) {
std::make_unique<::settings::FontHandler>(profile()));
}
void AccessibilitySection::RegisterHierarchy(
HierarchyGenerator* generator) const {
generator->RegisterTopLevelSetting(mojom::Setting::kA11yQuickSettings);
// Manage accessibility.
generator->RegisterTopLevelSubpage(mojom::Subpage::kManageAccessibility);
static constexpr mojom::Setting kManageAccessibilitySettings[] = {
mojom::Setting::kChromeVox,
mojom::Setting::kSelectToSpeak,
mojom::Setting::kHighContrastMode,
mojom::Setting::kFullscreenMagnifier,
mojom::Setting::kDockedMagnifier,
mojom::Setting::kStickyKeys,
mojom::Setting::kOnScreenKeyboard,
mojom::Setting::kDictation,
mojom::Setting::kSpeakToType,
mojom::Setting::kEnableSwitchAccess,
mojom::Setting::kHighlightTextCaret,
mojom::Setting::kAutoClickWhenCursorStops,
mojom::Setting::kLargeCursor,
mojom::Setting::kHighlightCursorWhileMoving,
mojom::Setting::kTabletNavigationButtons,
mojom::Setting::kMonoAudio,
mojom::Setting::kStartupSound,
mojom::Setting::kGetImageDescriptionsFromGoogle,
};
RegisterNestedSettingBulk(mojom::Subpage::kManageAccessibility,
kManageAccessibilitySettings, generator);
// Text-to-Speech.
generator->RegisterTopLevelSubpage(mojom::Subpage::kTextToSpeech);
static constexpr mojom::Setting kTextToSpeechSettings[] = {
mojom::Setting::kTextToSpeechRate, mojom::Setting::kTextToSpeechPitch,
mojom::Setting::kTextToSpeechVolume, mojom::Setting::kTextToSpeechVoice,
mojom::Setting::kTextToSpeechEngines,
};
RegisterNestedSettingBulk(mojom::Subpage::kTextToSpeech,
kTextToSpeechSettings, generator);
// Switch access.
generator->RegisterTopLevelSubpage(mojom::Subpage::kSwitchAccessOptions);
static constexpr mojom::Setting kSwitchAccessSettings[] = {
mojom::Setting::kSwitchActionAssignment,
mojom::Setting::kSwitchActionAutoScan,
mojom::Setting::kSwitchActionAutoScanKeyboard,
};
RegisterNestedSettingBulk(mojom::Subpage::kSwitchAccessOptions,
kSwitchAccessSettings, generator);
// Captions.
generator->RegisterTopLevelSubpage(mojom::Subpage::kCaptions);
}
void AccessibilitySection::UpdateSearchTags() {
if (accessibility_state_utils::IsScreenReaderEnabled() &&
AreExperimentalA11yLabelsAllowed()) {
......
......@@ -31,6 +31,7 @@ class AccessibilitySection : public OsSettingsSection {
// OsSettingsSection:
void AddLoadTimeData(content::WebUIDataSource* html_source) override;
void AddHandlers(content::WebUI* web_ui) override;
void RegisterHierarchy(HierarchyGenerator* generator) const override;
void UpdateSearchTags();
......
......@@ -220,6 +220,25 @@ void AppsSection::AddHandlers(content::WebUI* web_ui) {
}
}
void AppsSection::RegisterHierarchy(HierarchyGenerator* generator) const {
// Manage apps.
generator->RegisterTopLevelSubpage(mojom::Subpage::kAppManagement);
generator->RegisterNestedSubpage(mojom::Subpage::kAppDetails,
mojom::Subpage::kAppManagement);
generator->RegisterNestedSubpage(mojom::Subpage::kPluginVmSharedPaths,
mojom::Subpage::kAppManagement);
// Google Play Store.
generator->RegisterTopLevelSubpage(mojom::Subpage::kGooglePlayStore);
static constexpr mojom::Setting kGooglePlayStoreSettings[] = {
mojom::Setting::kManageAndroidPreferences,
mojom::Setting::kRemovePlayStore,
mojom::Setting::kTurnOnPlayStore,
};
RegisterNestedSettingBulk(mojom::Subpage::kGooglePlayStore,
kGooglePlayStoreSettings, generator);
}
void AppsSection::OnAppRegistered(const std::string& app_id,
const ArcAppListPrefs::AppInfo& app_info) {
UpdateAndroidSearchTags();
......
......@@ -33,6 +33,7 @@ class AppsSection : public OsSettingsSection, public ArcAppListPrefs::Observer {
// OsSettingsSection:
void AddLoadTimeData(content::WebUIDataSource* html_source) override;
void AddHandlers(content::WebUI* web_ui) override;
void RegisterHierarchy(HierarchyGenerator* generator) const override;
// ArcAppListPrefs::Observer:
void OnAppRegistered(const std::string& app_id,
......
......@@ -165,6 +165,20 @@ void BluetoothSection::AddLoadTimeData(content::WebUIDataSource* html_source) {
chromeos::bluetooth_dialog::AddLocalizedStrings(html_source);
}
void BluetoothSection::RegisterHierarchy(HierarchyGenerator* generator) const {
generator->RegisterTopLevelSubpage(mojom::Subpage::kBluetoothDevices);
static constexpr mojom::Setting kBluetoothDevicesSettings[] = {
mojom::Setting::kBluetoothOnOff,
mojom::Setting::kBluetoothConnectToDevice,
mojom::Setting::kBluetoothDisconnectFromDevice,
mojom::Setting::kBluetoothPairDevice,
mojom::Setting::kBluetoothUnpairDevice,
};
RegisterNestedSettingBulk(mojom::Subpage::kBluetoothDevices,
kBluetoothDevicesSettings, generator);
generator->RegisterTopLevelAltSetting(mojom::Setting::kBluetoothOnOff);
}
void BluetoothSection::AdapterPresentChanged(device::BluetoothAdapter* adapter,
bool present) {
UpdateSearchTags();
......
......@@ -31,6 +31,7 @@ class BluetoothSection : public OsSettingsSection,
private:
// OsSettingsSection:
void AddLoadTimeData(content::WebUIDataSource* html_source) override;
void RegisterHierarchy(HierarchyGenerator* generator) const override;
// device::BluetoothAdapter::Observer:
void AdapterPresentChanged(device::BluetoothAdapter* adapter,
......
......@@ -101,6 +101,7 @@ enum Setting {
kOpenWallpaper = 500,
kAmbientModeOnOff = 501,
kAmbientModeSource = 502,
kChangeDeviceAccountImage = 503,
// Search and Assistant section.
kPreferredSearchEngine = 600,
......
......@@ -448,6 +448,49 @@ void CrostiniSection::AddHandlers(content::WebUI* web_ui) {
}
}
void CrostiniSection::RegisterHierarchy(HierarchyGenerator* generator) const {
generator->RegisterTopLevelSetting(mojom::Setting::kSetUpCrostini);
// Crostini details.
generator->RegisterTopLevelSubpage(mojom::Subpage::kCrostiniDetails);
static constexpr mojom::Setting kCrostiniDetailsSettings[] = {
mojom::Setting::kCrostiniContainerUpgrade,
mojom::Setting::kCrostiniDiskResize,
mojom::Setting::kCrostiniMicAccess,
mojom::Setting::kUninstallCrostini,
};
RegisterNestedSettingBulk(mojom::Subpage::kCrostiniDetails,
kCrostiniDetailsSettings, generator);
// Manage shared folders.
generator->RegisterNestedSubpage(mojom::Subpage::kCrostiniManageSharedFolders,
mojom::Subpage::kCrostiniDetails);
// USB preferences.
generator->RegisterNestedSubpage(mojom::Subpage::kCrostiniUsbPreferences,
mojom::Subpage::kCrostiniDetails);
// Backup and restore.
generator->RegisterNestedSubpage(mojom::Subpage::kCrostiniBackupAndRestore,
mojom::Subpage::kCrostiniDetails);
static constexpr mojom::Setting kCrostiniBackupAndRestoreSettings[] = {
mojom::Setting::kBackupLinuxAppsAndFiles,
mojom::Setting::kRestoreLinuxAppsAndFiles,
};
RegisterNestedSettingBulk(mojom::Subpage::kCrostiniBackupAndRestore,
kCrostiniBackupAndRestoreSettings, generator);
// Develop Android apps.
generator->RegisterNestedSubpage(mojom::Subpage::kCrostiniDevelopAndroidApps,
mojom::Subpage::kCrostiniDetails);
generator->RegisterNestedSetting(mojom::Setting::kCrostiniAdbDebugging,
mojom::Subpage::kCrostiniDevelopAndroidApps);
// Port forwarding.
generator->RegisterNestedSubpage(mojom::Subpage::kCrostiniPortForwarding,
mojom::Subpage::kCrostiniDetails);
}
bool CrostiniSection::IsCrostiniAllowed() {
return crostini::CrostiniFeatures::Get()->IsUIAllowed(profile(),
/*check_policy=*/false);
......
......@@ -31,6 +31,7 @@ class CrostiniSection : public OsSettingsSection {
// OsSettingsSection:
void AddLoadTimeData(content::WebUIDataSource* html_source) override;
void AddHandlers(content::WebUI* web_ui) override;
void RegisterHierarchy(HierarchyGenerator* generator) const override;
bool IsCrostiniAllowed();
bool IsExportImportAllowed();
......
......@@ -71,6 +71,11 @@ const std::vector<SearchConcept>& GetNoFineGrainedTimeZoneSearchConcepts() {
return *tags;
}
bool IsFineGrainedTimeZoneEnabled() {
SystemSettingsProvider provider;
return provider.Get(chromeos::kFineGrainedTimeZoneResolveEnabled)->GetBool();
}
} // namespace
DateTimeSection::DateTimeSection(Profile* profile,
......@@ -78,8 +83,7 @@ DateTimeSection::DateTimeSection(Profile* profile,
: OsSettingsSection(profile, search_tag_registry) {
registry()->AddSearchTags(GetDateTimeSearchConcepts());
SystemSettingsProvider provider;
if (provider.Get(chromeos::kFineGrainedTimeZoneResolveEnabled)->GetBool())
if (IsFineGrainedTimeZoneEnabled())
registry()->AddSearchTags(GetFineGrainedTimeZoneSearchConcepts());
else
registry()->AddSearchTags(GetNoFineGrainedTimeZoneSearchConcepts());
......@@ -133,5 +137,21 @@ void DateTimeSection::AddHandlers(content::WebUI* web_ui) {
web_ui->AddMessageHandler(std::make_unique<DateTimeHandler>());
}
void DateTimeSection::RegisterHierarchy(HierarchyGenerator* generator) const {
generator->RegisterTopLevelSetting(mojom::Setting::k24HourClock);
generator->RegisterTopLevelSubpage(mojom::Subpage::kTimeZone);
// When fine-grained time zone is enabled, users change the time zone on the
// time zone subpage; otherwise, the setting is directly embedded in the
// section.
if (IsFineGrainedTimeZoneEnabled()) {
generator->RegisterNestedSetting(mojom::Setting::kChangeTimeZone,
mojom::Subpage::kTimeZone);
} else {
generator->RegisterTopLevelSetting(mojom::Setting::kChangeTimeZone);
}
}
} // namespace settings
} // namespace chromeos
......@@ -26,6 +26,7 @@ class DateTimeSection : public OsSettingsSection {
// OsSettingsSection:
void AddLoadTimeData(content::WebUIDataSource* html_source) override;
void AddHandlers(content::WebUI* web_ui) override;
void RegisterHierarchy(HierarchyGenerator* generator) const override;
};
} // namespace settings
......
......@@ -830,6 +830,73 @@ void DeviceSection::AddHandlers(content::WebUI* web_ui) {
std::make_unique<chromeos::settings::StylusHandler>());
}
void DeviceSection::RegisterHierarchy(HierarchyGenerator* generator) const {
// Pointers.
generator->RegisterTopLevelSubpage(mojom::Subpage::kPointers);
static constexpr mojom::Setting kPointersSettings[] = {
mojom::Setting::kTouchpadTapToClick,
mojom::Setting::kTouchpadTapDragging,
mojom::Setting::kTouchpadReverseScrolling,
mojom::Setting::kTouchpadAcceleration,
mojom::Setting::kTouchpadScrollAcceleration,
mojom::Setting::kTouchpadSpeed,
mojom::Setting::kMouseSwapPrimaryButtons,
mojom::Setting::kMouseReverseScrolling,
mojom::Setting::kMouseAcceleration,
mojom::Setting::kMouseScrollAcceleration,
mojom::Setting::kMouseSpeed,
};
RegisterNestedSettingBulk(mojom::Subpage::kPointers, kPointersSettings,
generator);
// Keyboard.
generator->RegisterTopLevelSubpage(mojom::Subpage::kKeyboard);
static constexpr mojom::Setting kKeyboardSettings[] = {
mojom::Setting::kKeyboardFunctionKeys,
mojom::Setting::kKeyboardAutoRepeat,
mojom::Setting::kKeyboardShortcuts,
};
RegisterNestedSettingBulk(mojom::Subpage::kKeyboard, kKeyboardSettings,
generator);
// Stylus.
generator->RegisterTopLevelSubpage(mojom::Subpage::kStylus);
static constexpr mojom::Setting kStylusSettings[] = {
mojom::Setting::kStylusToolsInShelf,
mojom::Setting::kStylusNoteTakingApp,
mojom::Setting::kStylusNoteTakingFromLockScreen,
mojom::Setting::kStylusLatestNoteOnLockScreen,
};
RegisterNestedSettingBulk(mojom::Subpage::kStylus, kStylusSettings,
generator);
// Display.
generator->RegisterTopLevelSubpage(mojom::Subpage::kDisplay);
static constexpr mojom::Setting kDisplaySettings[] = {
mojom::Setting::kDisplaySize, mojom::Setting::kNightLight,
mojom::Setting::kDisplayOrientation, mojom::Setting::kDisplayArrangement,
mojom::Setting::kDisplayResolution, mojom::Setting::kDisplayRefreshRate,
};
RegisterNestedSettingBulk(mojom::Subpage::kDisplay, kDisplaySettings,
generator);
// Storage.
generator->RegisterTopLevelSubpage(mojom::Subpage::kStorage);
generator->RegisterNestedSubpage(mojom::Subpage::kExternalStorage,
mojom::Subpage::kStorage);
generator->RegisterNestedSubpage(mojom::Subpage::kDlc,
mojom::Subpage::kStorage);
// Power.
generator->RegisterTopLevelSubpage(mojom::Subpage::kPower);
static constexpr mojom::Setting kPowerSettings[] = {
mojom::Setting::kPowerIdleBehavior,
mojom::Setting::kPowerSource,
mojom::Setting::kSleepWhenLaptopLidClosed,
};
RegisterNestedSettingBulk(mojom::Subpage::kPower, kPowerSettings, generator);
}
void DeviceSection::TouchpadExists(bool exists) {
if (exists)
registry()->AddSearchTags(GetTouchpadSearchConcepts());
......
......@@ -50,6 +50,7 @@ class DeviceSection : public OsSettingsSection,
// OsSettingsSection:
void AddLoadTimeData(content::WebUIDataSource* html_source) override;
void AddHandlers(content::WebUI* web_ui) override;
void RegisterHierarchy(HierarchyGenerator* generator) const override;
// system::PointerDeviceObserver::Observer:
void TouchpadExists(bool exists) override;
......
......@@ -102,5 +102,12 @@ void FilesSection::AddHandlers(content::WebUI* web_ui) {
profile(), base::DoNothing()));
}
void FilesSection::RegisterHierarchy(HierarchyGenerator* generator) const {
generator->RegisterTopLevelSetting(mojom::Setting::kGoogleDriveConnection);
// Network file shares.
generator->RegisterTopLevelSubpage(mojom::Subpage::kNetworkFileShares);
}
} // namespace settings
} // namespace chromeos
......@@ -26,6 +26,7 @@ class FilesSection : public OsSettingsSection {
// OsSettingsSection:
void AddLoadTimeData(content::WebUIDataSource* html_source) override;
void AddHandlers(content::WebUI* web_ui) override;
void RegisterHierarchy(HierarchyGenerator* generator) const override;
};
} // namespace settings
......
......@@ -560,6 +560,86 @@ void InternetSection::AddHandlers(content::WebUI* web_ui) {
web_ui->AddMessageHandler(std::make_unique<InternetHandler>(profile()));
}
void InternetSection::RegisterHierarchy(HierarchyGenerator* generator) const {
// Ethernet details.
generator->RegisterTopLevelSubpage(mojom::Subpage::kEthernetDetails);
static constexpr mojom::Setting kEthernetDetailsSettings[] = {
mojom::Setting::kConfigureEthernet,
mojom::Setting::kEthernetAutoConfigureIp,
mojom::Setting::kEthernetDns,
mojom::Setting::kEthernetProxy,
};
RegisterNestedSettingBulk(mojom::Subpage::kEthernetDetails,
kEthernetDetailsSettings, generator);
// Wi-Fi networks.
generator->RegisterTopLevelSubpage(mojom::Subpage::kWifiNetworks);
generator->RegisterNestedSetting(mojom::Setting::kWifiOnOff,
mojom::Subpage::kWifiNetworks);
generator->RegisterTopLevelAltSetting(mojom::Setting::kWifiOnOff);
// Wi-Fi details.
generator->RegisterNestedSubpage(mojom::Subpage::kWifiDetails,
mojom::Subpage::kWifiNetworks);
static constexpr mojom::Setting kWifiDetailsSettings[] = {
mojom::Setting::kDisconnectWifiNetwork,
mojom::Setting::kPreferWifiNetwork,
mojom::Setting::kForgetWifiNetwork,
mojom::Setting::kConfigureWifi,
mojom::Setting::kWifiAutoConfigureIp,
mojom::Setting::kWifiDns,
mojom::Setting::kWifiProxy,
mojom::Setting::kWifiAutoConnectToNetwork,
};
RegisterNestedSettingBulk(mojom::Subpage::kWifiDetails, kWifiDetailsSettings,
generator);
// Known networks.
generator->RegisterNestedSubpage(mojom::Subpage::kKnownNetworks,
mojom::Subpage::kWifiNetworks);
generator->RegisterNestedAltSetting(mojom::Setting::kPreferWifiNetwork,
mojom::Subpage::kKnownNetworks);
generator->RegisterNestedAltSetting(mojom::Setting::kForgetWifiNetwork,
mojom::Subpage::kKnownNetworks);
// Mobile data. If Instant Tethering is available, a mobile data subpage is
// available which lists both Cellular and Instant Tethering networks. If
// Instant Tethering is not available, there is no mobile data subpage.
generator->RegisterTopLevelSubpage(mojom::Subpage::kMobileDataNetworks);
generator->RegisterNestedSetting(mojom::Setting::kMobileOnOff,
mojom::Subpage::kMobileDataNetworks);
generator->RegisterTopLevelAltSetting(mojom::Setting::kMobileOnOff);
// Cellular details. Cellular details are considered a child of the mobile
// data subpage. However, note that if Instant Tethering is not available,
// clicking on "Mobile data" at the Network section navigates users directly
// to the cellular details page and skips over the mobile data subpage.
generator->RegisterNestedSubpage(mojom::Subpage::kCellularDetails,
mojom::Subpage::kMobileDataNetworks);
static constexpr mojom::Setting kCellularDetailsSettings[] = {
mojom::Setting::kCellularSimLock,
mojom::Setting::kCellularRoaming,
mojom::Setting::kCellularApn,
mojom::Setting::kDisconnectCellularNetwork,
mojom::Setting::kCellularAutoConfigureIp,
mojom::Setting::kCellularDns,
mojom::Setting::kCellularProxy,
mojom::Setting::kCellularAutoConnectToNetwork,
};
RegisterNestedSettingBulk(mojom::Subpage::kCellularDetails,
kCellularDetailsSettings, generator);
// Instant Tethering. Although this is a multi-device feature, its UI resides
// in the network section.
generator->RegisterNestedSubpage(mojom::Subpage::kTetherDetails,
mojom::Subpage::kMobileDataNetworks);
generator->RegisterNestedSetting(mojom::Setting::kInstantTetheringOnOff,
mojom::Subpage::kMobileDataNetworks);
// VPN.
generator->RegisterTopLevelSubpage(mojom::Subpage::kVpnDetails);
}
void InternetSection::OnDeviceStateListChanged() {
FetchDeviceList();
}
......
......@@ -34,6 +34,7 @@ class InternetSection
// OsSettingsSection:
void AddLoadTimeData(content::WebUIDataSource* html_source) override;
void AddHandlers(content::WebUI* web_ui) override;
void RegisterHierarchy(HierarchyGenerator* generator) const override;
// network_config::mojom::CrosNetworkConfigObserver:
void OnActiveNetworksChanged(
......
......@@ -161,5 +161,26 @@ void LanguagesSection::AddHandlers(content::WebUI* web_ui) {
std::make_unique<::settings::LanguagesHandler>(profile()));
}
void LanguagesSection::RegisterHierarchy(HierarchyGenerator* generator) const {
// Languages and input details.
generator->RegisterTopLevelSubpage(mojom::Subpage::kLanguagesAndInputDetails);
static constexpr mojom::Setting kLanguagesAndInputDetailsSettings[] = {
mojom::Setting::kAddLanguage,
mojom::Setting::kShowInputOptionsInShelf,
};
RegisterNestedSettingBulk(mojom::Subpage::kLanguagesAndInputDetails,
kLanguagesAndInputDetailsSettings, generator);
// Manage input methods.
generator->RegisterNestedSubpage(mojom::Subpage::kManageInputMethods,
mojom::Subpage::kLanguagesAndInputDetails);
// Smart inputs.
generator->RegisterTopLevelSubpage(mojom::Subpage::kSmartInputs);
generator->RegisterNestedSetting(
mojom::Setting::kShowPersonalInformationSuggestions,
mojom::Subpage::kSmartInputs);
}
} // namespace settings
} // namespace chromeos
......@@ -28,6 +28,7 @@ class LanguagesSection : public OsSettingsSection {
// OsSettingsSection:
void AddLoadTimeData(content::WebUIDataSource* html_source) override;
void AddHandlers(content::WebUI* web_ui) override;
void RegisterHierarchy(HierarchyGenerator* generator) const override;
};
} // namespace settings
......
......@@ -162,6 +162,12 @@ void MainSection::AddHandlers(content::WebUI* web_ui) {
std::make_unique<::settings::BrowserLifetimeHandler>());
}
void MainSection::RegisterHierarchy(HierarchyGenerator* generator) const {
// MainSection is a container for common resources/functionality shared
// between sections and does not have its own subpages/settings.
NOTIMPLEMENTED();
}
void MainSection::AddChromeOSUserStrings(
content::WebUIDataSource* html_source) {
const user_manager::User* user =
......
......@@ -26,6 +26,7 @@ class MainSection : public OsSettingsSection {
// OsSettingsSection:
void AddLoadTimeData(content::WebUIDataSource* html_source) override;
void AddHandlers(content::WebUI* web_ui) override;
void RegisterHierarchy(HierarchyGenerator* generator) const override;
void AddChromeOSUserStrings(content::WebUIDataSource* html_source);
};
......
......@@ -231,6 +231,40 @@ void MultiDeviceSection::AddHandlers(content::WebUI* web_ui) {
: nullptr));
}
void MultiDeviceSection::RegisterHierarchy(
HierarchyGenerator* generator) const {
generator->RegisterTopLevelSetting(mojom::Setting::kSetUpMultiDevice);
generator->RegisterTopLevelSetting(mojom::Setting::kVerifyMultiDeviceSetup);
// MultiDevice features.
generator->RegisterTopLevelSubpage(mojom::Subpage::kMultiDeviceFeatures);
static constexpr mojom::Setting kMultiDeviceFeaturesSettings[] = {
mojom::Setting::kMultiDeviceOnOff,
mojom::Setting::kMessagesSetUp,
mojom::Setting::kMessagesOnOff,
mojom::Setting::kForgetPhone,
};
RegisterNestedSettingBulk(mojom::Subpage::kMultiDeviceFeatures,
kMultiDeviceFeaturesSettings, generator);
generator->RegisterTopLevelAltSetting(mojom::Setting::kMultiDeviceOnOff);
// Note: Instant Tethering is part of the Network section, but it has an
// alternate setting within the MultiDevice section.
generator->RegisterNestedAltSetting(mojom::Setting::kInstantTetheringOnOff,
mojom::Subpage::kMultiDeviceFeatures);
// Smart Lock.
generator->RegisterNestedSubpage(mojom::Subpage::kSmartLock,
mojom::Subpage::kMultiDeviceFeatures);
static constexpr mojom::Setting kSmartLockSettings[] = {
mojom::Setting::kSmartLockOnOff,
mojom::Setting::kSmartLockUnlockOrSignIn,
};
RegisterNestedSettingBulk(mojom::Subpage::kSmartLock, kSmartLockSettings,
generator);
generator->RegisterNestedAltSetting(mojom::Setting::kSmartLockOnOff,
mojom::Subpage::kMultiDeviceFeatures);
}
void MultiDeviceSection::OnHostStatusChanged(
const multidevice_setup::MultiDeviceSetupClient::HostStatusWithDevice&
host_status_with_device) {
......
......@@ -43,6 +43,7 @@ class MultiDeviceSection
// OsSettingsSection:
void AddLoadTimeData(content::WebUIDataSource* html_source) override;
void AddHandlers(content::WebUI* web_ui) override;
void RegisterHierarchy(HierarchyGenerator* generator) const override;
// multidevice_setup::MultiDeviceSetupClient::Observer:
void OnHostStatusChanged(
......
......@@ -106,7 +106,7 @@ class OsSettingsManager : public KeyedService {
SearchHandler* search_handler() { return search_handler_.get(); }
private:
FRIEND_TEST_ALL_PREFIXES(OsSettingsManagerTest, Sections);
FRIEND_TEST_ALL_PREFIXES(OsSettingsManagerTest, Initialization);
// KeyedService:
void Shutdown() override;
......
......@@ -7,6 +7,7 @@
#include "base/no_destructor.h"
#include "chrome/browser/ui/webui/settings/chromeos/constants/constants_util.h"
#include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h"
#include "chrome/browser/ui/webui/settings/chromeos/hierarchy.h"
#include "chrome/browser/ui/webui/settings/chromeos/os_settings_manager_factory.h"
#include "chrome/browser/ui/webui/settings/chromeos/os_settings_sections.h"
#include "chrome/test/base/testing_browser_process.h"
......@@ -40,13 +41,25 @@ class OsSettingsManagerTest : public testing::Test {
OsSettingsManager* manager_;
};
TEST_F(OsSettingsManagerTest, Sections) {
TEST_F(OsSettingsManagerTest, Initialization) {
// For each mojom::Section value, there should be an associated
// OsSettingsSection class registered.
for (const auto& section : constants::AllSections()) {
EXPECT_TRUE(manager_->sections_->GetSection(section))
<< "No OsSettingsSection instance created for " << section << ".";
}
// Each mojom::Subpage should be registered in the hierarchy. Note that
// GetSubpageMetadata() internally CHECK()s that the metadata exists before
// returning it.
for (const auto& subpage : constants::AllSubpages())
manager_->hierarchy_->GetSubpageMetadata(subpage);
// Each mojom::Setting should be registered in the hierarchy. Note that
// GetSettingMetadata() internally CHECK()s that the metadata exists before
// returning it.
for (const auto& setting : constants::AllSettings())
manager_->hierarchy_->GetSettingMetadata(setting);
}
} // namespace settings
......
......@@ -18,6 +18,15 @@ base::string16 OsSettingsSection::GetHelpUrlWithBoard(
"&b=" + base::SysInfo::GetLsbReleaseBoard());
}
// static
void OsSettingsSection::RegisterNestedSettingBulk(
mojom::Subpage subpage,
const base::span<const mojom::Setting>& settings,
HierarchyGenerator* generator) {
for (const auto& setting : settings)
generator->RegisterNestedSetting(setting, subpage);
}
OsSettingsSection::~OsSettingsSection() = default;
OsSettingsSection::OsSettingsSection(Profile* profile,
......
......@@ -8,6 +8,7 @@
#include <string>
#include <vector>
#include "base/containers/span.h"
#include "base/strings/string16.h"
#include "chrome/browser/ui/webui/settings/chromeos/constants/routes.mojom.h"
#include "chrome/browser/ui/webui/settings/chromeos/constants/setting.mojom.h"
......@@ -95,10 +96,14 @@ class OsSettingsSection {
virtual void AddHandlers(content::WebUI* web_ui) {}
// Registers the subpages and/or settings which reside in this section.
virtual void RegisterHierarchy(HierarchyGenerator* generator) const {}
virtual void RegisterHierarchy(HierarchyGenerator* generator) const = 0;
protected:
static base::string16 GetHelpUrlWithBoard(const std::string& original_url);
static void RegisterNestedSettingBulk(
mojom::Subpage,
const base::span<const mojom::Setting>& settings,
HierarchyGenerator* generator);
OsSettingsSection(Profile* profile, SearchTagRegistry* search_tag_registry);
......
......@@ -780,6 +780,71 @@ void PeopleSection::AddHandlers(content::WebUI* web_ui) {
}
}
void PeopleSection::RegisterHierarchy(HierarchyGenerator* generator) const {
generator->RegisterTopLevelSetting(mojom::Setting::kSetUpParentalControls);
// My accounts.
generator->RegisterTopLevelSubpage(mojom::Subpage::kMyAccounts);
static constexpr mojom::Setting kMyAccountsSettings[] = {
mojom::Setting::kAddAccount,
mojom::Setting::kRemoveAccount,
};
RegisterNestedSettingBulk(mojom::Subpage::kMyAccounts, kMyAccountsSettings,
generator);
// Combined browser/OS sync (deprecated). Note that settings are not
// registered for these subpages since they'll be removed shortly.
generator->RegisterTopLevelSubpage(mojom::Subpage::kSyncDeprecated);
generator->RegisterNestedSubpage(mojom::Subpage::kSyncDeprecatedAdvanced,
mojom::Subpage::kSyncDeprecated);
// OS sync.
generator->RegisterTopLevelSubpage(mojom::Subpage::kSync);
generator->RegisterNestedSetting(mojom::Setting::kSyncOnOff,
mojom::Subpage::kSync);
// Security and sign-in.
generator->RegisterTopLevelSubpage(mojom::Subpage::kSecurityAndSignIn);
static constexpr mojom::Setting kSecurityAndSignInSettings[] = {
mojom::Setting::kLockScreen,
mojom::Setting::kChangeAuthPin,
};
RegisterNestedSettingBulk(mojom::Subpage::kSecurityAndSignIn,
kSecurityAndSignInSettings, generator);
// Fingerprint.
generator->RegisterNestedSubpage(mojom::Subpage::kFingerprint,
mojom::Subpage::kSecurityAndSignIn);
static constexpr mojom::Setting kFingerprintSettings[] = {
mojom::Setting::kAddFingerprint,
mojom::Setting::kRemoveFingerprint,
};
RegisterNestedSettingBulk(mojom::Subpage::kFingerprint, kFingerprintSettings,
generator);
// Manage other people.
generator->RegisterTopLevelSubpage(mojom::Subpage::kManageOtherPeople);
static constexpr mojom::Setting kManageOtherPeopleSettings[] = {
mojom::Setting::kGuestBrowsing,
mojom::Setting::kShowUsernamesAndPhotosAtSignIn,
mojom::Setting::kRestrictSignIn,
mojom::Setting::kAddToUserWhitelist,
mojom::Setting::kRemoveFromUserWhitelist,
};
RegisterNestedSettingBulk(mojom::Subpage::kManageOtherPeople,
kManageOtherPeopleSettings, generator);
// Kerberos.
generator->RegisterTopLevelSubpage(mojom::Subpage::kKerberos);
static constexpr mojom::Setting kKerberosSettings[] = {
mojom::Setting::kAddKerberosTicket,
mojom::Setting::kRemoveKerberosTicket,
mojom::Setting::kSetActiveKerberosTicket,
};
RegisterNestedSettingBulk(mojom::Subpage::kKerberos, kKerberosSettings,
generator);
}
void PeopleSection::OnStateChanged(syncer::SyncService* sync_service) {
DCHECK(chromeos::features::IsSplitSettingsSyncEnabled());
DCHECK_EQ(sync_service, sync_service_);
......
......@@ -54,6 +54,7 @@ class PeopleSection : public OsSettingsSection,
// OsSettingsSection:
void AddLoadTimeData(content::WebUIDataSource* html_source) override;
void AddHandlers(content::WebUI* web_ui) override;
void RegisterHierarchy(HierarchyGenerator* generator) const override;
// syncer::SyncServiceObserver:
void OnStateChanged(syncer::SyncService* sync_service) override;
......
......@@ -197,6 +197,25 @@ void PersonalizationSection::AddHandlers(content::WebUI* web_ui) {
}
}
void PersonalizationSection::RegisterHierarchy(
HierarchyGenerator* generator) const {
generator->RegisterTopLevelSetting(mojom::Setting::kOpenWallpaper);
// Change picture.
generator->RegisterTopLevelSubpage(mojom::Subpage::kChangePicture);
generator->RegisterNestedSetting(mojom::Setting::kChangeDeviceAccountImage,
mojom::Subpage::kChangePicture);
// Ambient mode.
generator->RegisterTopLevelSubpage(mojom::Subpage::kAmbientMode);
static constexpr mojom::Setting kAmbientModeSettings[] = {
mojom::Setting::kAmbientModeOnOff,
mojom::Setting::kAmbientModeSource,
};
RegisterNestedSettingBulk(mojom::Subpage::kAmbientMode, kAmbientModeSettings,
generator);
}
void PersonalizationSection::OnAmbientModeEnabledStateChanged() {
if (pref_service_->GetBoolean(ash::ambient::prefs::kAmbientModeEnabled)) {
registry()->AddSearchTags(GetAmbientModeOnSearchConcepts());
......
......@@ -33,6 +33,7 @@ class PersonalizationSection : public OsSettingsSection {
// OsSettingsSection:
void AddLoadTimeData(content::WebUIDataSource* html_source) override;
void AddHandlers(content::WebUI* web_ui) override;
void RegisterHierarchy(HierarchyGenerator* generator) const override;
// ash::AmbientModeService::Observer:
void OnAmbientModeEnabledStateChanged();
......
......@@ -246,5 +246,18 @@ void PrintingSection::AddHandlers(content::WebUI* web_ui) {
std::make_unique<CupsPrintersHandler>(profile(), printers_manager_));
}
void PrintingSection::RegisterHierarchy(HierarchyGenerator* generator) const {
generator->RegisterTopLevelSetting(mojom::Setting::kPrintJobs);
// Printing details.
generator->RegisterTopLevelSubpage(mojom::Subpage::kPrintingDetails);
static constexpr mojom::Setting kPrintingDetailsSettings[] = {
mojom::Setting::kAddPrinter,
mojom::Setting::kSavedPrinters,
};
RegisterNestedSettingBulk(mojom::Subpage::kPrintingDetails,
kPrintingDetailsSettings, generator);
}
} // namespace settings
} // namespace chromeos
......@@ -31,6 +31,7 @@ class PrintingSection : public OsSettingsSection {
// OsSettingsSection:
void AddLoadTimeData(content::WebUIDataSource* html_source) override;
void AddHandlers(content::WebUI* web_ui) override;
void RegisterHierarchy(HierarchyGenerator* generator) const override;
CupsPrintersManager* printers_manager_;
};
......
......@@ -96,5 +96,12 @@ void PrivacySection::AddLoadTimeData(content::WebUIDataSource* html_source) {
::settings::AddPersonalizationOptionsStrings(html_source);
}
void PrivacySection::RegisterHierarchy(HierarchyGenerator* generator) const {
generator->RegisterTopLevelSetting(mojom::Setting::kVerifiedAccess);
generator->RegisterTopLevelSetting(mojom::Setting::kKeepWifiOnDuringSleep);
generator->RegisterTopLevelSetting(
mojom::Setting::kUsageStatsAndCrashReports);
}
} // namespace settings
} // namespace chromeos
......@@ -26,6 +26,7 @@ class PrivacySection : public OsSettingsSection {
private:
// OsSettingsSection:
void AddLoadTimeData(content::WebUIDataSource* html_source) override;
void RegisterHierarchy(HierarchyGenerator* generator) const override;
};
} // namespace settings
......
......@@ -94,5 +94,9 @@ void ResetSection::AddHandlers(content::WebUI* web_ui) {
std::make_unique<::settings::ResetSettingsHandler>(profile()));
}
void ResetSection::RegisterHierarchy(HierarchyGenerator* generator) const {
generator->RegisterTopLevelSetting(mojom::Setting::kPowerwash);
}
} // namespace settings
} // namespace chromeos
......@@ -28,6 +28,7 @@ class ResetSection : public OsSettingsSection {
// OsSettingsSection:
void AddLoadTimeData(content::WebUIDataSource* html_source) override;
void AddHandlers(content::WebUI* web_ui) override;
void RegisterHierarchy(HierarchyGenerator* generator) const override;
};
} // namespace settings
......
......@@ -248,6 +248,23 @@ void SearchSection::AddHandlers(content::WebUI* web_ui) {
std::make_unique<chromeos::settings::GoogleAssistantHandler>());
}
void SearchSection::RegisterHierarchy(HierarchyGenerator* generator) const {
generator->RegisterTopLevelSetting(mojom::Setting::kPreferredSearchEngine);
// Assistant.
generator->RegisterTopLevelSubpage(mojom::Subpage::kAssistant);
static constexpr mojom::Setting kAssistantSettings[] = {
mojom::Setting::kAssistantOnOff,
mojom::Setting::kAssistantRelatedInfo,
mojom::Setting::kAssistantQuickAnswers,
mojom::Setting::kAssistantOkGoogle,
mojom::Setting::kAssistantNotifications,
mojom::Setting::kAssistantVoiceInput,
};
RegisterNestedSettingBulk(mojom::Subpage::kAssistant, kAssistantSettings,
generator);
}
void SearchSection::OnAssistantConsentStatusChanged(int consent_status) {
UpdateAssistantSearchTags();
}
......
......@@ -30,6 +30,7 @@ class SearchSection : public OsSettingsSection,
// OsSettingsSection:
void AddLoadTimeData(content::WebUIDataSource* html_source) override;
void AddHandlers(content::WebUI* web_ui) override;
void RegisterHierarchy(HierarchyGenerator* generator) const override;
// ash::AssistantStateObserver:
void OnAssistantConsentStatusChanged(int consent_status) override;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment