Unreviewed, rolling out r217458.
authorryanhaddad@apple.com <ryanhaddad@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 26 May 2017 19:27:41 +0000 (19:27 +0000)
committerryanhaddad@apple.com <ryanhaddad@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 26 May 2017 19:27:41 +0000 (19:27 +0000)
This change caused 55 JSC test failures.

Reverted changeset:

"Date should use historical data if it's available."
https://bugs.webkit.org/show_bug.cgi?id=172592
http://trac.webkit.org/changeset/217458

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@217499 268f45cc-cd09-0410-ab3c-d52691b4dbfc

13 files changed:
JSTests/ChangeLog
JSTests/mozilla/ecma/Date/15.9.5.31-1.js
JSTests/mozilla/ecma/Date/15.9.5.35-1.js
LayoutTests/ChangeLog
LayoutTests/js/dom/date-big-setdate-expected.txt [new file with mode: 0644]
LayoutTests/js/dom/date-big-setdate.html [new file with mode: 0644]
LayoutTests/js/dom/script-tests/date-big-setdate.js [new file with mode: 0644]
LayoutTests/storage/indexeddb/modern/date-basic-expected.txt
LayoutTests/storage/indexeddb/modern/date-basic-private-expected.txt
LayoutTests/storage/indexeddb/modern/get-keyrange-expected.txt
LayoutTests/storage/indexeddb/modern/get-keyrange-private-expected.txt
Source/WTF/ChangeLog
Source/WTF/wtf/DateMath.cpp

index c01b2c3..12eb96b 100644 (file)
@@ -1,3 +1,15 @@
+2017-05-26  Ryan Haddad  <ryanhaddad@apple.com>
+
+        Unreviewed, rolling out r217458.
+
+        This change caused 55 JSC test failures.
+
+        Reverted changeset:
+
+        "Date should use historical data if it's available."
+        https://bugs.webkit.org/show_bug.cgi?id=172592
+        http://trac.webkit.org/changeset/217458
+
 2017-05-26  Yusuke Suzuki  <utatane.tea@gmail.com>
 
         Give ModuleProgram the same treatment that we did for ProgramCode in bug#167725
index e1f5f4b..b6a2fee 100644 (file)
@@ -89,13 +89,11 @@ function getTestCases() {
                     UTCDateFromTime(SetUTCHours(28800000,-8670)),
                     LocalDateFromTime(SetUTCHours(28800000,-8670)) );
 
-// This test is commented out because it relies on non-historical data, which is allowed now.
-/*
     addNewTestCase( 946684800000, 1234567, void 0, void 0, void 0,
                     "TDATE = new Date(946684800000);(TDATE).setUTCHours(1234567);TDATE",
                     UTCDateFromTime(SetUTCHours(946684800000,1234567)),
                     LocalDateFromTime(SetUTCHours(946684800000,1234567)) );
-*/
+
     addNewTestCase( -2208988800000, 59, 999, void 0, void 0,
                     "TDATE = new Date(-2208988800000);(TDATE).setUTCHours(59,999);TDATE",
                     UTCDateFromTime(SetUTCHours(-2208988800000,59,999)),
index d688e74..242c0d8 100644 (file)
@@ -58,12 +58,10 @@ function getTestCases() {
                     UTCDateFromTime(SetUTCMonth(0,11)),
                     LocalDateFromTime(SetUTCMonth(0,11)) );
 
-// This test is commented out because it relies on non-historical data, which is allowed now.
-/*
     addNewTestCase( "TDATE = new Date(0);(TDATE).setUTCMonth(3,4);TDATE",
                     UTCDateFromTime(SetUTCMonth(0,3,4)),
                     LocalDateFromTime(SetUTCMonth(0,3,4)) );
-*/
+
 }
 
 function addNewTestCase( DateString, UTCDate, LocalDate) {
index 86205c0..0209911 100644 (file)
@@ -1,5 +1,17 @@
 2017-05-26  Ryan Haddad  <ryanhaddad@apple.com>
 
+        Unreviewed, rolling out r217458.
+
+        This change caused 55 JSC test failures.
+
+        Reverted changeset:
+
+        "Date should use historical data if it's available."
+        https://bugs.webkit.org/show_bug.cgi?id=172592
+        http://trac.webkit.org/changeset/217458
+
+2017-05-26  Ryan Haddad  <ryanhaddad@apple.com>
+
         Rebaseline js/dom/global-constructors-attributes.html.
 
         Unreviewed test gardening.
diff --git a/LayoutTests/js/dom/date-big-setdate-expected.txt b/LayoutTests/js/dom/date-big-setdate-expected.txt
new file mode 100644 (file)
index 0000000..8b0c7b0
--- /dev/null
@@ -0,0 +1,20 @@
+This test checks for regression against: 3381 Date.prototype.setDate() incorrect for values >=128. 
+12975: DST changes in US affect JavaScript date calculations
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS d.valueOf() - curValue is millisecondsPerDay
+PASS d.valueOf() - curValue is millisecondsPerDay
+PASS d.valueOf() - curValue is millisecondsPerDay
+PASS d.valueOf() - curValue is millisecondsPerDay
+PASS d.valueOf() - curValue is millisecondsPerDay
+PASS d.valueOf() - curValue is millisecondsPerDay
+PASS d.valueOf() - curValue is millisecondsPerDay
+PASS d.valueOf() - curValue is millisecondsPerDay
+PASS d.valueOf() - curValue is millisecondsPerDay
+PASS Passed all tests for DST (or skipped the tests if your timezone isn't PST/PDT)
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/js/dom/date-big-setdate.html b/LayoutTests/js/dom/date-big-setdate.html
new file mode 100644 (file)
index 0000000..db97701
--- /dev/null
@@ -0,0 +1,10 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<script src="../../resources/js-test-pre.js"></script>
+</head>
+<body>
+<script src="script-tests/date-big-setdate.js"></script>
+<script src="../../resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/js/dom/script-tests/date-big-setdate.js b/LayoutTests/js/dom/script-tests/date-big-setdate.js
new file mode 100644 (file)
index 0000000..b0f6cb2
--- /dev/null
@@ -0,0 +1,57 @@
+description(
+'This test checks for regression against: <a href="http://bugs.webkit.org/show_bug.cgi?id=3381"> 3381 Date.prototype.setDate() incorrect for values >=128.</a> <br /> <a href="http://bugs.webkit.org/show_bug.cgi?id=12975">12975: DST changes in US affect JavaScript date calculations</a>'
+);
+
+
+var validVars = false;
+var curValue;
+var success = true;
+var millisecondsPerDay = 1000 * 60 * 60 * 24;
+var millisecondsPerHour = 1000 * 60 * 60;
+
+for (var i = 116; i < 126; i++) {
+    var d = new Date(0);
+    d.setDate(i);
+    if (validVars)
+        shouldBe("d.valueOf() - curValue", "millisecondsPerDay");
+
+    curValue = d.valueOf();        
+    validVars = true;
+}
+
+var testCases = [];
+if ((new Date(2009, 9, 1)).toString().match("PDT")) {
+    // Added a special case that should represent a change in DST.  DST did not actually
+    // change on this date but because of the wierdness of how JavaScriptDates are
+// expected to interpolate DST as opposed to reflect acurate history, this day
+    // (April 5th 1970) should show a DST change.
+    testCases.push([new Date(0), 97, 98]);
+
+    // Added more special cases. These dates match the recent DST changes in the US.
+    // These tests check that the new changes are correctly propogated to the past and
+    // all of the tests should show DST occurring on the same date.
+    testCases.push([new Date(1970, 0,0,0,0,0,0), 98, 99]);
+    testCases.push([new Date(1998, 0,0,0,0,0,0), 98, 99]);
+    testCases.push([new Date(2026, 0,0,0,0,0,0), 98, 99]);
+    testCases.push([new Date(2054, 0,0,0,0,0,0), 98, 99]);
+}
+
+var errors = [];
+for (var i = 0; i < testCases.length; i++) {
+    var c = testCases[i][0];
+    var d = new Date(c);
+    c.setDate(testCases[i][1]);
+    d.setDate(testCases[i][2]);
+
+    var actual = d.valueOf() - c.valueOf();
+    var expected = millisecondsPerDay - millisecondsPerHour;
+    if (actual != expected) {
+        errors.push("Unexpected difference between two days (expected: " + expected + ", actual: " +  actual + ") for " + testCases[i][0]);
+    }
+}
+
+if (errors.length) {
+    testFailed(errors.length + "/" + testCases.length + " tests were failed: " + errors.join(", "));
+} else {
+    testPassed("Passed all tests for DST (or skipped the tests if your timezone isn't PST/PDT)");
+}
index 4e7f1fe..6397b89 100644 (file)
@@ -9,13 +9,13 @@ indexedDB.deleteDatabase(dbname)
 indexedDB.open(dbname)
 Initial upgrade needed: Old version - 0 New version - 1
 Initial upgrade versionchange transaction complete
-Success getting key 'Fri Nov 04 1955 16:00:00 GMT-0800 (PST)' of type object, result is 'Flux capacitor' of type string
+Success getting key 'Fri Nov 04 1955 17:00:00 GMT-0700 (PDT)' of type object, result is 'Flux capacitor' of type string
 Key is a Date object, btw
 Success getting key 'Sat Nov 12 1955 10:00:00 GMT-0800 (PST)' of type object, result is 'Fish under the sea' of type string
 Key is a Date object, btw
 Success getting key 'Wed Oct 21 2015 09:00:00 GMT-0700 (PDT)' of type object, result is 'Hoverboards' of type string
 Key is a Date object, btw
-Success getting key 'a' of type string, result is 'Fri Nov 04 1955 16:00:00 GMT-0800 (PST)' of type object
+Success getting key 'a' of type string, result is 'Fri Nov 04 1955 17:00:00 GMT-0700 (PDT)' of type object
 Result is a Date object, btw
 Success getting key 'b' of type string, result is 'Sat Nov 12 1955 10:00:00 GMT-0800 (PST)' of type object
 Result is a Date object, btw
index 4e7f1fe..6397b89 100644 (file)
@@ -9,13 +9,13 @@ indexedDB.deleteDatabase(dbname)
 indexedDB.open(dbname)
 Initial upgrade needed: Old version - 0 New version - 1
 Initial upgrade versionchange transaction complete
-Success getting key 'Fri Nov 04 1955 16:00:00 GMT-0800 (PST)' of type object, result is 'Flux capacitor' of type string
+Success getting key 'Fri Nov 04 1955 17:00:00 GMT-0700 (PDT)' of type object, result is 'Flux capacitor' of type string
 Key is a Date object, btw
 Success getting key 'Sat Nov 12 1955 10:00:00 GMT-0800 (PST)' of type object, result is 'Fish under the sea' of type string
 Key is a Date object, btw
 Success getting key 'Wed Oct 21 2015 09:00:00 GMT-0700 (PDT)' of type object, result is 'Hoverboards' of type string
 Key is a Date object, btw
-Success getting key 'a' of type string, result is 'Fri Nov 04 1955 16:00:00 GMT-0800 (PST)' of type object
+Success getting key 'a' of type string, result is 'Fri Nov 04 1955 17:00:00 GMT-0700 (PDT)' of type object
 Result is a Date object, btw
 Success getting key 'b' of type string, result is 'Sat Nov 12 1955 10:00:00 GMT-0800 (PST)' of type object
 Result is a Date object, btw
index e44e4a2..6714036 100644 (file)
@@ -123,13 +123,13 @@ Success getting keyRange [Infinity (Closed), a (Open)]
 Result is PosInf
 Success getting keyRange [Infinity (Open), a (Open)]
 Result is Flux capacitor
-Success getting keyRange [Fri Nov 04 1955 16:00:00 GMT-0800 (PST) (Closed), Wed Oct 21 2015 09:00:00 GMT-0700 (PDT) (Closed)]
+Success getting keyRange [Fri Nov 04 1955 17:00:00 GMT-0700 (PDT) (Closed), Wed Oct 21 2015 09:00:00 GMT-0700 (PDT) (Closed)]
 Result is Flux capacitor
-Success getting keyRange [Fri Nov 04 1955 16:00:00 GMT-0800 (PST) (Open), Wed Oct 21 2015 09:00:00 GMT-0700 (PDT) (Closed)]
+Success getting keyRange [Fri Nov 04 1955 17:00:00 GMT-0700 (PDT) (Open), Wed Oct 21 2015 09:00:00 GMT-0700 (PDT) (Closed)]
 Result is Fish under the sea
-Success getting keyRange [Fri Nov 04 1955 16:00:00 GMT-0800 (PST) (Closed), Wed Oct 21 2015 09:00:00 GMT-0700 (PDT) (Open)]
+Success getting keyRange [Fri Nov 04 1955 17:00:00 GMT-0700 (PDT) (Closed), Wed Oct 21 2015 09:00:00 GMT-0700 (PDT) (Open)]
 Result is Flux capacitor
-Success getting keyRange [Fri Nov 04 1955 16:00:00 GMT-0800 (PST) (Open), Wed Oct 21 2015 09:00:00 GMT-0700 (PDT) (Open)]
+Success getting keyRange [Fri Nov 04 1955 17:00:00 GMT-0700 (PDT) (Open), Wed Oct 21 2015 09:00:00 GMT-0700 (PDT) (Open)]
 Result is Fish under the sea
 readonly transaction complete
 PASS successfullyParsed is true
index e44e4a2..6714036 100644 (file)
@@ -123,13 +123,13 @@ Success getting keyRange [Infinity (Closed), a (Open)]
 Result is PosInf
 Success getting keyRange [Infinity (Open), a (Open)]
 Result is Flux capacitor
-Success getting keyRange [Fri Nov 04 1955 16:00:00 GMT-0800 (PST) (Closed), Wed Oct 21 2015 09:00:00 GMT-0700 (PDT) (Closed)]
+Success getting keyRange [Fri Nov 04 1955 17:00:00 GMT-0700 (PDT) (Closed), Wed Oct 21 2015 09:00:00 GMT-0700 (PDT) (Closed)]
 Result is Flux capacitor
-Success getting keyRange [Fri Nov 04 1955 16:00:00 GMT-0800 (PST) (Open), Wed Oct 21 2015 09:00:00 GMT-0700 (PDT) (Closed)]
+Success getting keyRange [Fri Nov 04 1955 17:00:00 GMT-0700 (PDT) (Open), Wed Oct 21 2015 09:00:00 GMT-0700 (PDT) (Closed)]
 Result is Fish under the sea
-Success getting keyRange [Fri Nov 04 1955 16:00:00 GMT-0800 (PST) (Closed), Wed Oct 21 2015 09:00:00 GMT-0700 (PDT) (Open)]
+Success getting keyRange [Fri Nov 04 1955 17:00:00 GMT-0700 (PDT) (Closed), Wed Oct 21 2015 09:00:00 GMT-0700 (PDT) (Open)]
 Result is Flux capacitor
-Success getting keyRange [Fri Nov 04 1955 16:00:00 GMT-0800 (PST) (Open), Wed Oct 21 2015 09:00:00 GMT-0700 (PDT) (Open)]
+Success getting keyRange [Fri Nov 04 1955 17:00:00 GMT-0700 (PDT) (Open), Wed Oct 21 2015 09:00:00 GMT-0700 (PDT) (Open)]
 Result is Fish under the sea
 readonly transaction complete
 PASS successfullyParsed is true
index ec5f3f8..deaf30e 100644 (file)
@@ -1,3 +1,15 @@
+2017-05-26  Ryan Haddad  <ryanhaddad@apple.com>
+
+        Unreviewed, rolling out r217458.
+
+        This change caused 55 JSC test failures.
+
+        Reverted changeset:
+
+        "Date should use historical data if it's available."
+        https://bugs.webkit.org/show_bug.cgi?id=172592
+        http://trac.webkit.org/changeset/217458
+
 2017-05-25  Keith Miller  <keith_miller@apple.com>
 
         Date should use historical data if it's available.
index 2150371..c01793e 100644 (file)
@@ -196,6 +196,14 @@ int dayInYear(double ms, int year)
     return static_cast<int>(msToDays(ms) - daysFrom1970ToYear(year));
 }
 
+static inline double msToMilliseconds(double ms)
+{
+    double result = fmod(ms, msPerDay);
+    if (result < 0)
+        result += msPerDay;
+    return result;
+}
+
 int msToMinutes(double ms)
 {
     double result = fmod(floor(ms / msPerMinute), minutesPerHour);
@@ -505,6 +513,22 @@ LocalTimeOffset calculateLocalTimeOffset(double ms, TimeType inputTimeType)
     if (inputTimeType == LocalTime)
         ms -= localToUTCTimeOffset;
 
+    // On Mac OS X, the call to localtime (see calculateDSTOffset) will return historically accurate
+    // DST information (e.g. New Zealand did not have DST from 1946 to 1974) however the JavaScript
+    // standard explicitly dictates that historical information should not be considered when
+    // determining DST. For this reason we shift away from years that localtime can handle but would
+    // return historically accurate information.
+    int year = msToYear(ms);
+    int equivalentYear = equivalentYearForDST(year);
+    if (year != equivalentYear) {
+        bool leapYear = isLeapYear(year);
+        int dayInYearLocal = dayInYear(ms, year);
+        int dayInMonth = dayInMonthFromDayInYear(dayInYearLocal, leapYear);
+        int month = monthFromDayInYear(dayInYearLocal, leapYear);
+        double day = dateToDaysFrom1970(equivalentYear, month, dayInMonth);
+        ms = (day * msPerDay) + msToMilliseconds(ms);
+    }
+
     double localTimeSeconds = ms / msPerSecond;
     if (localTimeSeconds > maxUnixTime)
         localTimeSeconds = maxUnixTime;