Commit 2229ecba authored by Joey Arhar's avatar Joey Arhar Committed by Commit Bot

<input type=date> check day when disabling today button

Before this patch, the "today" button in the popup date picker for
<input type=date> will be disabled if today's month is outside the range
of any valid month, but if today's particular day of the month is not
within the valid range of days, the button will be enabled rather than
being disabled.

This patch checks the day of the month in addition to the month when
deciding to enable or disable the "today" button.

Bug: 1105813
Change-Id: I25fdc0a5656bcfe42920db0410b30037b942b2a1
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2302911
Commit-Queue: Joey Arhar <jarhar@chromium.org>
Reviewed-by: default avatarKent Tamura <tkent@chromium.org>
Reviewed-by: default avatarIonel Popescu <iopopesc@microsoft.com>
Cr-Commit-Position: refs/heads/master@{#793614}
parent e91be0b1
......@@ -3478,6 +3478,26 @@ CalendarNavigationButton.prototype.onRepeatingClick = function(event) {
setTimeout(this.onRepeatingClick, this.reapeatingClicksInterval);
};
/**
* @param {!Day} day
* @param {!Day} minDay
* @param {!Day} maxDay
* @return {boolean}
*/
function isDayOutsideOfRange(day, minDay, maxDay) {
return day < minDay || maxDay < day;
}
/**
* @param {!Week} week
* @param {!Week} minWeek
* @param {!Week} maxWeek
* @return {boolean}
*/
function isWeekOutsideOfRange(week, minWeek, maxWeek) {
return week < minWeek || maxWeek < week;
}
/**
* @constructor
* @extends View
......@@ -3532,10 +3552,15 @@ function CalendarHeaderView(calendarPicker) {
this.onNavigationButtonClick);
this._todayButton.element.classList.add(
CalendarHeaderView.GetClassNameTodayButton());
var monthContainingToday = Month.createFromToday();
this._todayButton.setDisabled(
monthContainingToday < this.calendarPicker.minimumMonth ||
monthContainingToday > this.calendarPicker.maximumMonth);
if (this.calendarPicker.type === 'week') {
this._todayButton.setDisabled(isWeekOutsideOfRange(
Week.createFromToday(), this.calendarPicker.config.minimum,
this.calendarPicker.config.maximum));
} else {
this._todayButton.setDisabled(isDayOutsideOfRange(
Day.createFromToday(), this.calendarPicker.config.minimum,
this.calendarPicker.config.maximum));
}
this._todayButton.element.setAttribute(
'aria-label', global.params.todayLabel);
}
......@@ -3660,11 +3685,17 @@ CalendarHeaderView.prototype.setDisabled = function(disabled) {
this.disabled ||
this.calendarPicker.currentMonth() >= this.calendarPicker.maximumMonth);
if (this._todayButton) {
var monthContainingToday = Month.createFromToday();
this._todayButton.setDisabled(
this.disabled ||
monthContainingToday < this.calendarPicker.minimumMonth ||
monthContainingToday > this.calendarPicker.maximumMonth);
if (this.disabled) {
this._todayButton.setDisabled(true);
} else if (this.calendarPicker.type === 'week') {
this._todayButton.setDisabled(isWeekOutsideOfRange(
Week.createFromToday(), this.calendarPicker.config.minimum,
this.calendarPicker.config.maximum));
} else {
this._todayButton.setDisabled(isDayOutsideOfRange(
Day.createFromToday(), this.calendarPicker.config.minimum,
this.calendarPicker.config.maximum));
}
}
};
......@@ -4041,10 +4072,15 @@ function CalendarTableView(calendarPicker) {
todayButton.element.textContent = global.params.todayLabel;
todayButton.element.classList.add(
CalendarHeaderView.GetClassNameTodayButton());
var monthContainingToday = Month.createFromToday();
todayButton.setDisabled(
monthContainingToday < this.calendarPicker.minimumMonth ||
monthContainingToday > this.calendarPicker.maximumMonth);
if (this.calendarPicker.type === 'week') {
todayButton.setDisabled(isWeekOutsideOfRange(
Week.createFromToday(), this.calendarPicker.config.minimum,
this.calendarPicker.config.maximum));
} else {
todayButton.setDisabled(isDayOutsideOfRange(
Day.createFromToday(), this.calendarPicker.config.minimum,
this.calendarPicker.config.maximum));
}
todayButton.element.setAttribute('aria-label', global.params.todayLabel);
}
......
<!DOCTYPE html>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script src="../../forms/resources/picker-common.js"></script>
<input type=date id=dateElement>
<script>
promise_test(async () => {
await openPickerWithPromise(dateElement);
const {Month, Day, isDayOutsideOfRange} = popupWindow;
assert_true(isDayOutsideOfRange(
/*day=*/new Day(1, 1, 1),
/*minDay=*/new Day(2, 1, 1),
/*maxDay=*/new Day(3, 1, 1)),
'day.year < min < max: day is outside of range');
assert_false(isDayOutsideOfRange(
/*day=*/new Day(2, 9, 9),
/*minDay=*/new Day(1, 1, 1),
/*maxDay=*/new Day(3, 1, 1)),
'min < day.year < max: day is within range');
assert_true(isDayOutsideOfRange(
/*day=*/new Day(3, 1, 1),
/*minDay=*/new Day(1, 1, 1),
/*maxDay=*/new Day(2, 1, 1)),
'min < max < day.year: day is outside of range');
assert_true(isDayOutsideOfRange(
/*day=*/new Day(1, 1, 1),
/*minDay=*/new Day(1, 2, 1),
/*maxDay=*/new Day(1, 3, 1)),
'day.month < min < max: day is outside of range');
assert_false(isDayOutsideOfRange(
/*day=*/new Day(1, 2, 9),
/*minDay=*/new Day(1, 1, 1),
/*maxDay=*/new Day(1, 3, 1)),
'min < day.month < max: day is within range');
assert_true(isDayOutsideOfRange(
/*day=*/new Day(1, 3, 1),
/*minDay=*/new Day(1, 1, 1),
/*maxDay=*/new Day(1, 2, 1)),
'min < max < day.month: day is outside of range');
assert_true(isDayOutsideOfRange(
/*day=*/new Day(1, 1, 1),
/*minDay=*/new Day(1, 1, 2),
/*maxDay=*/new Day(1, 1, 3)),
'day.date < min < max: day is outside of range');
assert_false(isDayOutsideOfRange(
/*day=*/new Day(1, 1, 2),
/*minDay=*/new Day(1, 1, 1),
/*maxDay=*/new Day(1, 1, 3)),
'min < day.date < max: day is within range');
assert_true(isDayOutsideOfRange(
/*day=*/new Day(1, 1, 3),
/*minDay=*/new Day(1, 1, 1),
/*maxDay=*/new Day(1, 1, 2)),
'min < max < day.date: day is outside of range');
}, `Tests behavior of the date picker's internal function isTodayOutsideOfRange.`);
</script>
<!DOCTYPE html>
<script src="../../../resources/testharness.js"></script>
<script src="../../../resources/testharnessreport.js"></script>
<script src="../../forms/resources/picker-common.js"></script>
<input type=date id=dateElement>
<script>
promise_test(async () => {
await openPickerWithPromise(dateElement);
const {Month, Day, Week, isWeekOutsideOfRange} = popupWindow;
assert_true(isWeekOutsideOfRange(
/*week=*/new Week(1, 1),
/*minWeek=*/new Week(2, 1),
/*maxWeek=*/new Week(3, 1)),
'week.year < min < max: week is outside of range');
assert_false(isWeekOutsideOfRange(
/*week=*/new Week(2, 9),
/*minWeek=*/new Week(1, 1),
/*maxWeek=*/new Week(3, 1)),
'min < week.year < max: week is within range');
assert_true(isWeekOutsideOfRange(
/*week=*/new Week(3, 1),
/*minWeek=*/new Week(1, 1),
/*maxWeek=*/new Week(2, 1)),
'min < max < week.year: week is outside of range');
assert_true(isWeekOutsideOfRange(
/*week=*/new Week(1, 1),
/*minWeek=*/new Week(1, 2),
/*maxWeek=*/new Week(1, 3)),
'week.week < min < max: week is outside of range');
assert_false(isWeekOutsideOfRange(
/*week=*/new Week(1, 2),
/*minWeek=*/new Week(1, 1),
/*maxWeek=*/new Week(1, 3)),
'min < week.week < max: week is within range');
assert_true(isWeekOutsideOfRange(
/*week=*/new Week(1, 3),
/*minWeek=*/new Week(1, 1),
/*maxWeek=*/new Week(1, 2)),
'min < max < week.week: week is outside of range');
}, `Tests behavior of the date picker's internal function isTodayOutsideOfRange.`);
</script>
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