Commit 978eecd8 authored by Daniel Classon's avatar Daniel Classon Committed by Commit Bot

[OsSettingsDeepLinking] Add deep links to the Date Time Page

Adds deep links to the Date Time page and Time Zone subpage. Also
adds a focus method to settings-radio-group to help with deep linking.

Bug: 1084154
Change-Id: I53cfc17e386ce6799dff95a5d7afccfe7a847f88
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2382960
Commit-Queue: Daniel Classon <dclasson@google.com>
Commit-Queue: Regan Hsu <hsuregan@chromium.org>
Reviewed-by: default avatarRegan Hsu <hsuregan@chromium.org>
Reviewed-by: default avatarKyle Horimoto <khorimoto@chromium.org>
Cr-Commit-Position: refs/heads/master@{#803362}
parent c42c7bb9
...@@ -19,6 +19,7 @@ js_library("date_time_page") { ...@@ -19,6 +19,7 @@ js_library("date_time_page") {
deps = [ deps = [
":date_time_types", ":date_time_types",
":timezone_selector", ":timezone_selector",
"..:deep_linking_behavior",
"..:os_route", "..:os_route",
"../..:router", "../..:router",
"../../prefs:prefs_behavior", "../../prefs:prefs_behavior",
...@@ -50,6 +51,7 @@ js_library("timezone_subpage") { ...@@ -50,6 +51,7 @@ js_library("timezone_subpage") {
":date_time_types", ":date_time_types",
":timezone_browser_proxy", ":timezone_browser_proxy",
":timezone_selector", ":timezone_selector",
"..:deep_linking_behavior",
"../../prefs:prefs_behavior", "../../prefs:prefs_behavior",
"//ui/webui/resources/js:cr", "//ui/webui/resources/js:cr",
] ]
...@@ -69,6 +71,7 @@ js_type_check("closure_compile_module") { ...@@ -69,6 +71,7 @@ js_type_check("closure_compile_module") {
js_library("date_time_page.m") { js_library("date_time_page.m") {
sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/date_time_page/date_time_page.m.js" ] sources = [ "$root_gen_dir/chrome/browser/resources/settings/chromeos/date_time_page/date_time_page.m.js" ]
deps = [ deps = [
"..:deep_linking_behavior.m",
"..:os_settings_routes.m", "..:os_settings_routes.m",
"../../prefs:prefs_behavior.m", "../../prefs:prefs_behavior.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
...@@ -115,9 +118,10 @@ js_library("timezone_subpage.m") { ...@@ -115,9 +118,10 @@ js_library("timezone_subpage.m") {
deps = [ deps = [
":date_time_types.m", ":date_time_types.m",
":timezone_browser_proxy.m", ":timezone_browser_proxy.m",
"..:deep_linking_behavior.m",
"..:os_settings_routes.m", "..:os_settings_routes.m",
"../../prefs:prefs_behavior.m",
"../..:router.m", "../..:router.m",
"../../prefs:prefs_behavior.m",
"//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
"//ui/webui/resources/js:load_time_data.m", "//ui/webui/resources/js:load_time_data.m",
"//ui/webui/resources/js:web_ui_listener_behavior.m", "//ui/webui/resources/js:web_ui_listener_behavior.m",
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
<link rel="import" href="../../controls/settings_toggle_button.html"> <link rel="import" href="../../controls/settings_toggle_button.html">
<link rel="import" href="../../i18n_setup.html"> <link rel="import" href="../../i18n_setup.html">
<link rel="import" href="../../prefs/prefs_behavior.html"> <link rel="import" href="../../prefs/prefs_behavior.html">
<link rel="import" href="../deep_linking_behavior.html">
<link rel="import" href="../os_route.html"> <link rel="import" href="../os_route.html">
<link rel="import" href="../../router.html"> <link rel="import" href="../../router.html">
<link rel="import" href="../../settings_page/settings_subpage.html"> <link rel="import" href="../../settings_page/settings_subpage.html">
...@@ -33,7 +34,8 @@ ...@@ -33,7 +34,8 @@
restamp> restamp>
<settings-toggle-button id="timeZoneAutoDetect" <settings-toggle-button id="timeZoneAutoDetect"
label="$i18n{timeZoneGeolocation}" label="$i18n{timeZoneGeolocation}"
pref="{{prefs.generated.resolve_timezone_by_geolocation_on_off}}"> pref="{{prefs.generated.resolve_timezone_by_geolocation_on_off}}"
deep-link-focus-id$="[[Setting.kChangeTimeZone]]">
</settings-toggle-button> </settings-toggle-button>
</template> </template>
<template is="dom-if" <template is="dom-if"
...@@ -58,7 +60,8 @@ ...@@ -58,7 +60,8 @@
<settings-toggle-button <settings-toggle-button
class="hr" class="hr"
pref="{{prefs.settings.clock.use_24hour_clock}}" pref="{{prefs.settings.clock.use_24hour_clock}}"
label="$i18n{use24HourClock}"> label="$i18n{use24HourClock}"
deep-link-focus-id$="[[Setting.k24HourClock]]">
</settings-toggle-button> </settings-toggle-button>
<cr-link-row class="hr" id="setDateTime" <cr-link-row class="hr" id="setDateTime"
on-click="onSetDateTimeTap_" hidden$="[[!canSetDateTime_]]" on-click="onSetDateTimeTap_" hidden$="[[!canSetDateTime_]]"
......
...@@ -11,7 +11,13 @@ ...@@ -11,7 +11,13 @@
Polymer({ Polymer({
is: 'settings-date-time-page', is: 'settings-date-time-page',
behaviors: [I18nBehavior, PrefsBehavior, WebUIListenerBehavior], behaviors: [
DeepLinkingBehavior,
I18nBehavior,
PrefsBehavior,
settings.RouteObserverBehavior,
WebUIListenerBehavior,
],
properties: { properties: {
/** /**
...@@ -66,6 +72,18 @@ Polymer({ ...@@ -66,6 +72,18 @@ Polymer({
value: loadTimeData.getBoolean('isChild') && value: loadTimeData.getBoolean('isChild') &&
loadTimeData.getBoolean('timeActionsProtectedForChild') loadTimeData.getBoolean('timeActionsProtectedForChild')
}, },
/**
* Used by DeepLinkingBehavior to focus this page's deep links.
* @type {!Set<!chromeos.settings.mojom.Setting>}
*/
supportedSettingIds: {
type: Object,
value: () => new Set([
chromeos.settings.mojom.Setting.k24HourClock,
chromeos.settings.mojom.Setting.kChangeTimeZone,
]),
},
}, },
/** @override */ /** @override */
...@@ -75,6 +93,19 @@ Polymer({ ...@@ -75,6 +93,19 @@ Polymer({
chrome.send('dateTimePageReady'); chrome.send('dateTimePageReady');
}, },
/**
* @param {!settings.Route} route
* @param {!settings.Route} oldRoute
*/
currentRouteChanged(route, oldRoute) {
// Does not apply to this page.
if (route !== settings.routes.DATETIME) {
return;
}
this.attemptDeepLink();
},
/** /**
* @param {boolean} canSetDateTime Whether date and time are settable. * @param {boolean} canSetDateTime Whether date and time are settable.
* @private * @private
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
<link rel="import" href="../../prefs/prefs_behavior.html"> <link rel="import" href="../../prefs/prefs_behavior.html">
<link rel="import" href="../../router.html"> <link rel="import" href="../../router.html">
<link rel="import" href="../../settings_shared_css.html"> <link rel="import" href="../../settings_shared_css.html">
<link rel="import" href="../deep_linking_behavior.html">
<link rel="import" href="../os_route.html"> <link rel="import" href="../os_route.html">
<link rel="import" href="date_time_types.html"> <link rel="import" href="date_time_types.html">
<link rel="import" href="timezone_browser_proxy.html"> <link rel="import" href="timezone_browser_proxy.html">
...@@ -31,7 +32,8 @@ ...@@ -31,7 +32,8 @@
</style> </style>
<div class="settings-box block first"> <div class="settings-box block first">
<settings-radio-group id="timeZoneRadioGroup" <settings-radio-group id="timeZoneRadioGroup"
pref="{{prefs.generated.resolve_timezone_by_geolocation_on_off}}"> pref="{{prefs.generated.resolve_timezone_by_geolocation_on_off}}"
deep-link-focus-id$="[[Setting.kChangeTimeZone]]">
<controlled-radio-button <controlled-radio-button
id="timeZoneAutoDetectOn" id="timeZoneAutoDetectOn"
name="true" name="true"
......
...@@ -9,8 +9,12 @@ ...@@ -9,8 +9,12 @@
Polymer({ Polymer({
is: 'timezone-subpage', is: 'timezone-subpage',
behaviors: behaviors: [
[PrefsBehavior, WebUIListenerBehavior, settings.RouteObserverBehavior], DeepLinkingBehavior,
PrefsBehavior,
settings.RouteObserverBehavior,
WebUIListenerBehavior,
],
properties: { properties: {
/** /**
...@@ -20,6 +24,15 @@ Polymer({ ...@@ -20,6 +24,15 @@ Polymer({
type: String, type: String,
notify: true, notify: true,
}, },
/**
* Used by DeepLinkingBehavior to focus this page's deep links.
* @type {!Set<!chromeos.settings.mojom.Setting>}
*/
supportedSettingIds: {
type: Object,
value: () => new Set([chromeos.settings.mojom.Setting.kChangeTimeZone]),
},
}, },
/** @private {?settings.TimeZoneBrowserProxy} */ /** @private {?settings.TimeZoneBrowserProxy} */
...@@ -41,13 +54,20 @@ Polymer({ ...@@ -41,13 +54,20 @@ Polymer({
* @protected * @protected
*/ */
currentRouteChanged(newRoute) { currentRouteChanged(newRoute) {
if (this.shouldAskForParentAccessCode_(newRoute)) { if (newRoute !== settings.routes.DATETIME_TIMEZONE_SUBPAGE) {
return;
}
// Check if should ask for parent access code.
if (loadTimeData.getBoolean('isChild')) {
this.disableTimeZoneSetting_(); this.disableTimeZoneSetting_();
this.addWebUIListener( this.addWebUIListener(
'access-code-validation-complete', 'access-code-validation-complete',
this.enableTimeZoneSetting_.bind(this)); this.enableTimeZoneSetting_.bind(this));
this.browserProxy_.showParentAccessForTimeZone(); this.browserProxy_.showParentAccessForTimeZone();
} }
this.attemptDeepLink();
}, },
/** /**
...@@ -91,15 +111,6 @@ Polymer({ ...@@ -91,15 +111,6 @@ Polymer({
return result; return result;
}, },
/**
* @param {!settings.Route} route
* @private
*/
shouldAskForParentAccessCode_(route) {
return route === settings.routes.DATETIME_TIMEZONE_SUBPAGE &&
loadTimeData.getBoolean('isChild');
},
/** /**
* Enables all dropdowns and radio buttons. * Enables all dropdowns and radio buttons.
* @private * @private
......
...@@ -46,6 +46,11 @@ Polymer({ ...@@ -46,6 +46,11 @@ Polymer({
'resetToPrefValue(pref.*)', 'resetToPrefValue(pref.*)',
], ],
/** @override */
focus() {
this.$$('cr-radio-group').focus();
},
/** Reset the selected value to match the current pref value. */ /** Reset the selected value to match the current pref value. */
resetToPrefValue() { resetToPrefValue() {
const pref = /** @type {!chrome.settingsPrivate.PrefObject} */ (this.pref); const pref = /** @type {!chrome.settingsPrivate.PrefObject} */ (this.pref);
......
...@@ -10,6 +10,8 @@ ...@@ -10,6 +10,8 @@
// #import {Router, routes} from 'chrome://os-settings/chromeos/os_settings.js'; // #import {Router, routes} from 'chrome://os-settings/chromeos/os_settings.js';
// #import {TestBrowserProxy} from 'chrome://test/test_browser_proxy.m.js'; // #import {TestBrowserProxy} from 'chrome://test/test_browser_proxy.m.js';
// #import {TimeZoneAutoDetectMethod, TimeZoneBrowserProxyImpl} from 'chrome://os-settings/chromeos/lazy_load.js'; // #import {TimeZoneAutoDetectMethod, TimeZoneBrowserProxyImpl} from 'chrome://os-settings/chromeos/lazy_load.js';
// #import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
// #import {waitAfterNextRender} from 'chrome://test/test_util.m.js';
// clang-format on // clang-format on
/** @implements {settings.TimeZoneBrowserProxy} */ /** @implements {settings.TimeZoneBrowserProxy} */
...@@ -237,6 +239,10 @@ suite('settings-date-time-page', function() { ...@@ -237,6 +239,10 @@ suite('settings-date-time-page', function() {
}); });
}); });
teardown(function() {
settings.Router.getInstance().resetRouteForTesting();
});
function checkDateTimePageReadyCalled() { function checkDateTimePageReadyCalled() {
if (dateTime.prefs.cros.flags.fine_grained_time_zone_detection_enabled if (dateTime.prefs.cros.flags.fine_grained_time_zone_detection_enabled
.value) { .value) {
...@@ -339,6 +345,28 @@ suite('settings-date-time-page', function() { ...@@ -339,6 +345,28 @@ suite('settings-date-time-page', function() {
}); });
}); });
test('Deep link to auto set time zone on main page', async () => {
loadTimeData.overrideValues({
isDeepLinkingEnabled: true,
});
const prefs = getFakePrefs();
// Set fine grained time zone off so that toggle appears on this page.
prefs.cros.flags.fine_grained_time_zone_detection_enabled.value = false;
dateTime = initializeDateTime(prefs, false);
const params = new URLSearchParams;
params.append('settingId', '1001');
settings.Router.getInstance().navigateTo(settings.routes.DATETIME, params);
Polymer.dom.flush();
const deepLinkElement = dateTime.$$('#timeZoneAutoDetect').$$('cr-toggle');
await test_util.waitAfterNextRender(deepLinkElement);
assertEquals(
deepLinkElement, getDeepActiveElement(),
'Auto set time zone toggle should be focused for settingId=1001.');
});
test('auto-detect forced on', function(done) { test('auto-detect forced on', function(done) {
const prefs = getFakePrefs(); const prefs = getFakePrefs();
dateTime = initializeDateTime(prefs, true, true); dateTime = initializeDateTime(prefs, true, true);
......
...@@ -592,6 +592,7 @@ var OSSettingsDateTimePageTest = class extends OSSettingsBrowserTest { ...@@ -592,6 +592,7 @@ var OSSettingsDateTimePageTest = class extends OSSettingsBrowserTest {
get extraLibraries() { get extraLibraries() {
return super.extraLibraries.concat([ return super.extraLibraries.concat([
BROWSER_SETTINGS_PATH + '../test_browser_proxy.js', BROWSER_SETTINGS_PATH + '../test_browser_proxy.js',
BROWSER_SETTINGS_PATH + '../test_util.js',
'date_time_page_tests.js', 'date_time_page_tests.js',
]); ]);
} }
...@@ -1764,7 +1765,10 @@ var OSSettingsTimezoneSubpageTest = class extends OSSettingsBrowserTest { ...@@ -1764,7 +1765,10 @@ var OSSettingsTimezoneSubpageTest = class extends OSSettingsBrowserTest {
/** @override */ /** @override */
get extraLibraries() { get extraLibraries() {
return super.extraLibraries.concat(['timezone_subpage_test.js']); return super.extraLibraries.concat([
BROWSER_SETTINGS_PATH + '../test_util.js',
'timezone_subpage_test.js',
]);
} }
}; };
......
...@@ -9,6 +9,9 @@ ...@@ -9,6 +9,9 @@
// #import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; // #import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
// #import {assertEquals} from '../../chai_assert.js'; // #import {assertEquals} from '../../chai_assert.js';
// #import {assert} from 'chrome://resources/js/assert.m.js'; // #import {assert} from 'chrome://resources/js/assert.m.js';
// #import {getDeepActiveElement} from 'chrome://resources/js/util.m.js';
// #import {Router, routes} from 'chrome://os-settings/chromeos/os_settings.js';
// #import {waitAfterNextRender} from 'chrome://test/test_util.m.js';
// clang-format on // clang-format on
suite('TimezoneSubpageTests', function() { suite('TimezoneSubpageTests', function() {
...@@ -31,6 +34,7 @@ suite('TimezoneSubpageTests', function() { ...@@ -31,6 +34,7 @@ suite('TimezoneSubpageTests', function() {
teardown(function() { teardown(function() {
timezoneSubpage.remove(); timezoneSubpage.remove();
CrSettingsPrefs.resetForTesting(); CrSettingsPrefs.resetForTesting();
settings.Router.getInstance().resetRouteForTesting();
}); });
test('Timezone autodetect by geolocation radio', async () => { test('Timezone autodetect by geolocation radio', async () => {
...@@ -65,4 +69,26 @@ suite('TimezoneSubpageTests', function() { ...@@ -65,4 +69,26 @@ suite('TimezoneSubpageTests', function() {
.getPref('generated.resolve_timezone_by_geolocation_on_off') .getPref('generated.resolve_timezone_by_geolocation_on_off')
.value); .value);
}); });
test('Deep link to time zone setter on subpage', async () => {
loadTimeData.overrideValues({
isDeepLinkingEnabled: true,
});
// Resolve timezone by geolocation is on.
timezoneSubpage.setPrefValue(
'generated.resolve_timezone_by_geolocation_on_off', true);
const params = new URLSearchParams;
params.append('settingId', '1001');
settings.Router.getInstance().navigateTo(
settings.routes.DATETIME_TIMEZONE_SUBPAGE, params);
const deepLinkElement =
timezoneSubpage.$$('#timeZoneAutoDetectOn').$$('#button');
await test_util.waitAfterNextRender(deepLinkElement);
assertEquals(
deepLinkElement, getDeepActiveElement(),
'Auto set time zone toggle should be focused for settingId=1001.');
});
}); });
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