summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/html/dom/documents/resource-metadata-management/support/document-lastModified-utils.js
diff options
context:
space:
mode:
Diffstat (limited to 'testing/web-platform/tests/html/dom/documents/resource-metadata-management/support/document-lastModified-utils.js')
-rw-r--r--testing/web-platform/tests/html/dom/documents/resource-metadata-management/support/document-lastModified-utils.js78
1 files changed, 78 insertions, 0 deletions
diff --git a/testing/web-platform/tests/html/dom/documents/resource-metadata-management/support/document-lastModified-utils.js b/testing/web-platform/tests/html/dom/documents/resource-metadata-management/support/document-lastModified-utils.js
new file mode 100644
index 0000000000..bbcde1894a
--- /dev/null
+++ b/testing/web-platform/tests/html/dom/documents/resource-metadata-management/support/document-lastModified-utils.js
@@ -0,0 +1,78 @@
+const DOCUMENT_LASTMODIFIED_REGEX = /^([0-9]{2})\/([0-9]{2})\/([0-9]{4}) ([0-9]{2}):([0-9]{2}):([0-9]{2})$/;
+
+function assert_document_lastmodified_string_approximately_now(str) {
+ // We want to test that |str| was a time in the user's local
+ // timezone generated within a few seconds prior to the present.
+ // This requires some care, since it is possible that:
+ // - the few second difference may have crossed a
+ // year/month/day/hour/minute boundary
+ // - the few second difference may have crossed a change in the
+ // local timezone's UTC offset
+ // - the local time might be one that has multiple valid UTC
+ // representations (for example, because it's in the hour
+ // following a shift from summer time to winter time)
+ // We will make some assumptions to do this:
+ // - local time's UTC offset doesn't change more than once per
+ // minute
+ // - local time's UTC offset only changes by integral numbers of
+ // minutes
+
+ // The date must be equal to or earlier than the present time.
+ var dmax = new Date();
+
+ // The date must be equal to or later than 2.5 seconds ago.
+ var TOLERANCE_MILLISECONDS = 2500;
+ var dmin = new Date();
+ dmin.setTime(dmax.getTime() - TOLERANCE_MILLISECONDS);
+
+ // Extract the year/month/date/hours/minutes/seconds from str. It
+ // is important that we do *not* try to construct a Date object from
+ // these, since the core of the date object is a timestamp in UTC,
+ // and there are cases (such as the hour on each side of a change
+ // from summer time to winter time) where there are multiple
+ // possible UTC timestamps for a given YYYY-MM-DD HH:MM:SS, and
+ // constructing a Date object would pick one of them, which might be
+ // the wrong one. However, we already have the right one in dmin
+ // and dmax, so we should instead extract local time from those
+ // rather than converting these values to UTC.
+ var m = DOCUMENT_LASTMODIFIED_REGEX.exec(str);
+ var syear = Number(m[3]);
+ var smonth = Number(m[1]) - 1; // match Javascript 0-based months
+ var sdate = Number(m[2]);
+ var shours = Number(m[4]);
+ var sminutes = Number(m[5]);
+ var sseconds = Number(m[6]);
+
+ if (dmin.getFullYear() == dmax.getFullYear() &&
+ dmin.getMonth() == dmax.getMonth() &&
+ dmin.getDate() == dmax.getDate() &&
+ dmin.getHours() == dmax.getHours() &&
+ dmin.getMinutes() == dmax.getMinutes()) {
+ // min and max have the same minute
+ assert_equals(smonth, dmin.getMonth(), "month");
+ assert_equals(sdate, dmin.getDate(), "date");
+ assert_equals(syear, dmin.getFullYear(), "year");
+ assert_equals(shours, dmin.getHours(), "hours");
+ assert_equals(sminutes, dmin.getMinutes(), "minutes");
+ assert_true(dmin.getSeconds() <= sseconds &&
+ sseconds <= dmax.getSeconds(), "seconds");
+ } else if (dmin.getFullYear() == syear &&
+ dmin.getMonth() == smonth &&
+ dmin.getDate() == sdate &&
+ dmin.getHours() == shours &&
+ dmin.getMinutes() == sminutes) {
+ // actual value has the same minute as min
+ assert_true(dmin.getSeconds() <= sseconds, "dmin.getSeconds() <= sseconds");
+ assert_true(57 <= dmin.getSeconds(), "unexpected local time rules (dmin match)");
+ } else if (dmax.getFullYear() == syear &&
+ dmax.getMonth() == smonth &&
+ dmax.getDate() == sdate &&
+ dmax.getHours() == shours &&
+ dmax.getMinutes() == sminutes) {
+ // actual value has the same minute as max
+ assert_true(sseconds <= dmax.getSeconds(), "sseconds <= dmax.getSeconds()");
+ assert_true(dmax.getSeconds() <= 2, "unexpected local time rules (dmax match)");
+ } else {
+ assert_unreached("unexpected local time rules (no match)");
+ }
+}