Sub-fields in input[type=week] should be read-only in some cases. This requires window.internals. On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". createWeekInput argument order: min, max, value Year field: PASS isReadOnlyField(createWeekInput("", "", ""), pseudoYear) is false PASS isReadOnlyField(createWeekInput("2012-W50", "", ""), pseudoYear) is false PASS isReadOnlyField(createWeekInput("", "2012-W50", ""), pseudoYear) is false PASS isReadOnlyField(createWeekInput("", "", "2012-W50"), pseudoYear) is false PASS isReadOnlyField(createWeekInput("2012-W01", "2012-W50", ""), pseudoYear) is true PASS isReadOnlyField(createWeekInput("2012-W01", "2013-W50", ""), pseudoYear) is false PASS isReadOnlyField(createWeekInput("2012-W01", "2012-W50", "2012-W05"), pseudoYear) is true PASS isReadOnlyField(createWeekInput("2012-W01", "2012-W50", "2013-W01"), pseudoYear) is false Week field: We should not make all the fields readonly by min/max, so week field is always editable. PASS isReadOnlyField(createWeekInput("", "", ""), pseudoWeek) is false PASS isReadOnlyField(createWeekInput("2012-W50", "", ""), pseudoWeek) is false PASS isReadOnlyField(createWeekInput("", "2012-W50", ""), pseudoWeek) is false PASS isReadOnlyField(createWeekInput("", "", "2012-W50"), pseudoWeek) is false PASS isReadOnlyField(createWeekInput("2012-W50", "2012-W50", ""), pseudoWeek) is false PASS isReadOnlyField(createWeekInput("2012-W49", "2013-W50", ""), pseudoWeek) is false PASS isReadOnlyField(createWeekInput("2012-W50", "2013-W50", ""), pseudoWeek) is false PASS isReadOnlyField(createWeekInput("2012-W50", "2012-W50", "2012-W50"), pseudoWeek) is false PASS isReadOnlyField(createWeekInput("2012-W50", "2012-W50", "2012-W49"), pseudoWeek) is false PASS successfullyParsed is true TEST COMPLETE