diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2020-02-12 12:37:02 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-02-12 12:37:02 -0500 |
commit | da75ef25a74e4bcc29be86637706083875118281 (patch) | |
tree | 543d3154c648e8c2be63acb91e8776615cd90da5 | |
parent | ed9b5843443db7164bda6eb6f3cb7caff2ff5a3c (diff) | |
parent | 6dc8f67f8f074bcb93e85df65daf59ebe967b170 (diff) | |
download | servo-da75ef25a74e4bcc29be86637706083875118281.tar.gz servo-da75ef25a74e4bcc29be86637706083875118281.zip |
Auto merge of #25494 - pshaughn:leadingzeroes, r=jdm
Make sure input value=12:30:01 doesn't turn into 12:30:1
Fixed convert_valid_normalized_local_date_and_time_string to add the mandatory leading 0 before seconds values that needed it, added tests to see that various-length strings with zeroes in them would roundtrip properly.
---
<!-- Thank you for contributing to Servo! Please replace each `[ ]` by `[X]` when the step is complete, and replace `___` with appropriate data: -->
- [X] `./mach build -d` does not report any errors
- [X] `./mach test-tidy` does not report any errors
- [X] These changes fix #25493
<!-- Either: -->
- [X] There are tests for these changes
<!-- Also, please make sure that "Allow edits from maintainers" checkbox is checked, so that we can help you if you get stuck somewhere along the way.-->
<!-- Pull requests that do not address these steps are welcome, but they will require additional verification as part of the review process. -->
3 files changed, 70 insertions, 0 deletions
diff --git a/components/script/dom/bindings/str.rs b/components/script/dom/bindings/str.rs index 67ba6f34b3d..986554206b6 100644 --- a/components/script/dom/bindings/str.rs +++ b/components/script/dom/bindings/str.rs @@ -474,7 +474,15 @@ impl DOMString { "{:04}-{:02}-{:02}T{:02}:{:02}", year, month, day, hour, minute ); + } else if second < 10.0 { + // we need exactly one leading zero on the seconds, + // whatever their total string length might be + self.0 = format!( + "{:04}-{:02}-{:02}T{:02}:{:02}:0{}", + year, month, day, hour, minute, second + ); } else { + // we need no leading zeroes on the seconds self.0 = format!( "{:04}-{:02}-{:02}T{:02}:{:02}:{}", year, month, day, hour, minute, second diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index b63cdb025a4..8f37ab58752 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -369990,6 +369990,12 @@ {} ] ], + "html/semantics/forms/the-input-element/input-seconds-leading-zeroes.html": [ + [ + "html/semantics/forms/the-input-element/input-seconds-leading-zeroes.html", + {} + ] + ], "html/semantics/forms/the-input-element/input-setcustomvalidity.html": [ [ "html/semantics/forms/the-input-element/input-setcustomvalidity.html", @@ -693507,6 +693513,10 @@ "006a8fbd8f1b84d18e9ec29285f751f037118389", "testharness" ], + "html/semantics/forms/the-input-element/input-seconds-leading-zeroes.html": [ + "d94bee10296da58ba700b4e7a910f9e0821c82ef", + "testharness" + ], "html/semantics/forms/the-input-element/input-setcustomvalidity.html": [ "accb24d8f9564f97e12bf4784162ff3cd00f35af", "testharness" diff --git a/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-seconds-leading-zeroes.html b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-seconds-leading-zeroes.html new file mode 100644 index 00000000000..d94bee10296 --- /dev/null +++ b/tests/wpt/web-platform-tests/html/semantics/forms/the-input-element/input-seconds-leading-zeroes.html @@ -0,0 +1,52 @@ +<!DOCTYPE HTML> +<meta charset="utf-8"> +<html> + <head> + <title>HTMLInputElement leading zeroes in seconds/millis</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + </head> + <body> + <h3>input times and datetimes with leading zeroes in seconds/millis</h3> + <!-- This test ensures that seconds and milliseconds are being + output with the appropriate field widths when sanitizing + datetime-locals and times, e.g. that we don't see "12:30:1". + The spec is not specific about how much precision to use + in a sanitized time string, but an invalid string would + fail at .valueAsNumber --> + <hr> + <div id="log"></div> + + <input id="inp"> + <script> + var inp=document.getElementById("inp"); + var cases = [ + ["datetime-local", "2000-01-01T12:30:01", 946729801000], + ["datetime-local", "2000-01-01T12:30:00.5", 946729800500], + ["datetime-local", "2000-01-01T12:30:00.04", 946729800040], + ["datetime-local", "2000-01-01T12:30:00.003", 946729800003], + + ["time", "12:30:01", 45001000], + ["time", "12:30:00.5", 45000500], + ["time", "12:30:00.04", 45000040], + ["time", "12:30:00.003", 45000003], + ]; + + for (var i in cases) { + var c = cases[i]; + test(function() { + inp.setAttribute("type", c[0]); + inp.value = c[1]; + assert_equals(inp.valueAsNumber, c[2]); + },"Expected valueAsNumber=" +c[2] + " from " + c[1]); + if (c[0] == "datetime-local") { + test(function() { + inp.setAttribute("type", c[0]); + inp.value = c[1]; + assert_in_array(inp.value, [c[1], c[1].replace("T", " ")]); + },"Expected digits unchanged in round-trip of " + c[1]) + } + } + </script> + </body> +</html> |