TypeScript: Allow for chrome.settingsPrivate.PrefObject types
Includes examples where the benefit is immediately clear.
Bug: chromium:1373934
Change-Id: Ic7a5b39e328bd953b919e8d0706d01e1a368df92
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/3949775
Commit-Queue: Wes Okuhara <wesokuhara@google.com>
Reviewed-by: Demetrios Papadopoulos <dpapad@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1058869}
diff --git a/chrome/browser/resources/settings/appearance_page/home_url_input.ts b/chrome/browser/resources/settings/appearance_page/home_url_input.ts
index 888b92d1..b3f7b97 100644
--- a/chrome/browser/resources/settings/appearance_page/home_url_input.ts
+++ b/chrome/browser/resources/settings/appearance_page/home_url_input.ts
@@ -62,7 +62,7 @@
};
}
- pref: chrome.settingsPrivate.PrefObject|undefined;
+ pref: chrome.settingsPrivate.PrefObject<string>|undefined;
disabled: boolean;
canTab: boolean;
invalid: boolean;
diff --git a/chrome/browser/resources/settings/chromeos/settings_scheduler_slider/settings_scheduler_slider.ts b/chrome/browser/resources/settings/chromeos/settings_scheduler_slider/settings_scheduler_slider.ts
index 3232948..8a6ace4 100644
--- a/chrome/browser/resources/settings/chromeos/settings_scheduler_slider/settings_scheduler_slider.ts
+++ b/chrome/browser/resources/settings/chromeos/settings_scheduler_slider/settings_scheduler_slider.ts
@@ -45,11 +45,6 @@
ddy: number,
}>;
-interface PrefObject extends chrome.settingsPrivate.PrefObject {
- type: chrome.settingsPrivate.PrefType.NUMBER;
- value: number;
-}
-
const HOURS_PER_DAY = 24;
const MIN_KNOBS_DISTANCE_MINUTES = 60;
const OFFSET_MINUTES_6PM = 18 * 60;
@@ -151,8 +146,8 @@
];
}
- prefStartTime: PrefObject;
- prefEndTime: PrefObject;
+ prefStartTime: chrome.settingsPrivate.PrefObject<number>;
+ prefEndTime: chrome.settingsPrivate.PrefObject<number>;
private dragObject_: HTMLElement|null;
private isReady_: boolean;
private isRTL_: boolean;
diff --git a/chrome/browser/resources/settings/controls/settings_slider.ts b/chrome/browser/resources/settings/controls/settings_slider.ts
index 5996455..c2b7b4a 100644
--- a/chrome/browser/resources/settings/controls/settings_slider.ts
+++ b/chrome/browser/resources/settings/controls/settings_slider.ts
@@ -94,7 +94,7 @@
];
}
- pref: chrome.settingsPrivate.PrefObject;
+ pref: chrome.settingsPrivate.PrefObject<number>;
ticks: SliderTick[]|number[];
scale: number;
min: number;
diff --git a/chrome/browser/resources/settings/privacy_page/personalization_options.ts b/chrome/browser/resources/settings/privacy_page/personalization_options.ts
index 25cc81c..3941dbb 100644
--- a/chrome/browser/resources/settings/privacy_page/personalization_options.ts
+++ b/chrome/browser/resources/settings/privacy_page/personalization_options.ts
@@ -119,7 +119,7 @@
syncStatus: SyncStatus;
// <if expr="_google_chrome and not chromeos_ash">
- private metricsReportingPref_: chrome.settingsPrivate.PrefObject;
+ private metricsReportingPref_: chrome.settingsPrivate.PrefObject<boolean>;
private showRestart_: boolean;
// </if>
@@ -218,7 +218,7 @@
private setMetricsReportingPref_(metricsReporting: MetricsReporting) {
const hadPreviousPref = this.metricsReportingPref_.value !== undefined;
- const pref: chrome.settingsPrivate.PrefObject = {
+ const pref: chrome.settingsPrivate.PrefObject<boolean> = {
key: '',
type: chrome.settingsPrivate.PrefType.BOOLEAN,
value: metricsReporting.enabled,
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_history_sync_fragment.ts b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_history_sync_fragment.ts
index efc73f5..f02d8c40 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_history_sync_fragment.ts
+++ b/chrome/browser/resources/settings/privacy_page/privacy_guide/privacy_guide_history_sync_fragment.ts
@@ -86,7 +86,7 @@
* set with the next sync prefs update.
*/
private syncAllCache_: boolean|null = null;
- private historySyncVirtualPref_: chrome.settingsPrivate.PrefObject;
+ private historySyncVirtualPref_: chrome.settingsPrivate.PrefObject<boolean>;
private metricsBrowserProxy_: MetricsBrowserProxy =
MetricsBrowserProxyImpl.getInstance();
private startStateHistorySyncOn_: boolean;
diff --git a/chrome/browser/resources/settings/privacy_page/privacy_page.ts b/chrome/browser/resources/settings/privacy_page/privacy_page.ts
index 05961e6..e2ad521 100644
--- a/chrome/browser/resources/settings/privacy_page/privacy_page.ts
+++ b/chrome/browser/resources/settings/privacy_page/privacy_page.ts
@@ -45,7 +45,7 @@
interface BlockAutoplayStatus {
enabled: boolean;
- pref: chrome.settingsPrivate.PrefObject;
+ pref: chrome.settingsPrivate.PrefObject<boolean>;
}
export interface SettingsPrivacyPageElement {
diff --git a/chrome/browser/resources/settings/privacy_page/secure_dns.ts b/chrome/browser/resources/settings/privacy_page/secure_dns.ts
index a259f1b2..5254cfc 100644
--- a/chrome/browser/resources/settings/privacy_page/secure_dns.ts
+++ b/chrome/browser/resources/settings/privacy_page/secure_dns.ts
@@ -134,7 +134,7 @@
}
private secureDnsDescription_: string;
- private secureDnsToggle_: chrome.settingsPrivate.PrefObject;
+ private secureDnsToggle_: chrome.settingsPrivate.PrefObject<boolean>;
private showRadioGroup_: boolean;
private secureDnsRadio_: SecureDnsMode;
private resolverOptions_: ResolverOption[];
@@ -301,7 +301,7 @@
}
// If the underlying secure DNS mode pref has an enforced value, communicate
// that via the toggle pref.
- const pref: chrome.settingsPrivate.PrefObject = {
+ const pref: chrome.settingsPrivate.PrefObject<boolean> = {
key: '',
type: chrome.settingsPrivate.PrefType.BOOLEAN,
value: this.secureDnsToggle_.value,
diff --git a/chrome/browser/resources/settings/site_settings/protocol_handlers.ts b/chrome/browser/resources/settings/site_settings/protocol_handlers.ts
index 1a03d97..4858894 100644
--- a/chrome/browser/resources/settings/site_settings/protocol_handlers.ts
+++ b/chrome/browser/resources/settings/site_settings/protocol_handlers.ts
@@ -144,7 +144,7 @@
toggleOffLabel: string;
toggleOnLabel: string;
ignoredProtocols: HandlerEntry[];
- private handlersEnabledPref_: chrome.settingsPrivate.PrefObject;
+ private handlersEnabledPref_: chrome.settingsPrivate.PrefObject<boolean>;
override ready() {
super.ready();
diff --git a/chrome/browser/resources/settings/site_settings/settings_category_default_radio_group.ts b/chrome/browser/resources/settings/site_settings/settings_category_default_radio_group.ts
index caefac3..ff77593 100644
--- a/chrome/browser/resources/settings/site_settings/settings_category_default_radio_group.ts
+++ b/chrome/browser/resources/settings/site_settings/settings_category_default_radio_group.ts
@@ -111,7 +111,7 @@
blockOptionLabel: string;
blockOptionSubLabel: string;
blockOptionIcon: string;
- private pref_: chrome.settingsPrivate.PrefObject;
+ private pref_: chrome.settingsPrivate.PrefObject<number>;
override ready() {
super.ready();
diff --git a/tools/typescript/definitions/settings_private.d.ts b/tools/typescript/definitions/settings_private.d.ts
index 905a3ba..2220a0d 100644
--- a/tools/typescript/definitions/settings_private.d.ts
+++ b/tools/typescript/definitions/settings_private.d.ts
@@ -35,15 +35,25 @@
PARENT_SUPERVISED = 'PARENT_SUPERVISED',
}
- export interface PrefObject {
+ // TODO(crbug/1373934) Update existing usages of PrefObject to be typed,
+ // removing the need to use any here.
+ export interface PrefObject<T = any> {
key: string;
- type: PrefType;
- value: any;
+ type:
+ // clang-format off
+ T extends boolean ? PrefType.BOOLEAN :
+ T extends number ? PrefType.NUMBER :
+ T extends string ? PrefType.STRING | PrefType.URL :
+ T extends unknown[] ? PrefType.LIST :
+ T extends Record<string|number, unknown> ? PrefType.DICTIONARY :
+ never;
+ // clang-format on
+ value: T;
controlledBy?: ControlledBy;
controlledByName?: string;
enforcement?: Enforcement;
- recommendedValue?: any;
- userSelectableValues?: any[];
+ recommendedValue?: T;
+ userSelectableValues?: T[];
userControlDisabled?: boolean;
extensionId?: string;
extensionCanBeDisabled?: boolean;