Backed out 2 changesets (bug 1871220, bug 1870434) for causing remote failures on browser_RemoteValue.js. CLOSED TREE

Backed out changeset 328ba82c361f (bug 1871220)
Backed out changeset efbca6aae3d9 (bug 1870434)
This commit is contained in:
Natalia Csoregi 2023-12-22 11:54:27 +02:00
parent b7ef1034db
commit 1a950a75e7
4 changed files with 42 additions and 171 deletions

View File

@ -22,47 +22,6 @@ const endsWithNullRx = /\0$/;
const whitespaceRx = /\s+/g; const whitespaceRx = /\s+/g;
const startsWithZeroRx = /^0/; const startsWithZeroRx = /^0/;
const versionRx = /^([\w-]+-)?\d+\.\d+\.\d+$/; const versionRx = /^([\w-]+-)?\d+\.\d+\.\d+$/;
const numericDateRx = /^\d+[- /]\d+[- /]\d+$/;
// If a string contains any of these, we'll try to parse it as a Date
const dateKeywords = [
"mon",
"tues",
"wed",
"thur",
"fri",
"sat",
"sun",
"jan",
"feb",
"mar",
"apr",
"may",
"jun",
"jul",
"aug",
"sep",
"oct",
"nov",
"dec",
];
/**
* Figures whether a given string should be considered by naturalSort to be a
* Date, and returns the Date's timestamp if so. Some Date formats, like
* single numbers and MM.DD.YYYY, are not supported due to conflicts with things
* like version numbers.
*/
function tryParseDate(str) {
const lowerCaseStr = str.toLowerCase();
return (
!versionRx.test(str) &&
(numericDateRx.test(str) ||
dateKeywords.some(s => lowerCaseStr.includes(s))) &&
Date.parse(str)
);
}
/** /**
* Sort numbers, strings, IP Addresses, Dates, Filenames, version numbers etc. * Sort numbers, strings, IP Addresses, Dates, Filenames, version numbers etc.
@ -106,8 +65,10 @@ function naturalSort(a = "", b = "", sessionString, insensitive = false) {
.split("\0"); .split("\0");
// Hex or date detection. // Hex or date detection.
const aHexOrDate = parseInt(a.match(hexRx), 16) || tryParseDate(a); const aHexOrDate =
const bHexOrDate = parseInt(b.match(hexRx), 16) || tryParseDate(b); parseInt(a.match(hexRx), 16) || (!versionRx.test(a) && Date.parse(a));
const bHexOrDate =
parseInt(b.match(hexRx), 16) || (!versionRx.test(b) && Date.parse(b));
if ( if (
(aHexOrDate || bHexOrDate) && (aHexOrDate || bHexOrDate) &&

View File

@ -1407,16 +1407,6 @@ static bool ParseDate(DateTimeInfo::ForceUTC forceUTC, const CharT* s,
if (IsMonthName(s + start, index - start, &mon)) { if (IsMonthName(s + start, index - start, &mon)) {
seenMonthName = true; seenMonthName = true;
// If the next digit is a number, we need to break so it
// gets parsed as mday
if (IsAsciiDigit(s[index])) {
break;
}
} else {
// Reject numbers directly after letters e.g. foo2
if (IsAsciiDigit(s[index]) && IsAsciiAlpha(s[index - 1])) {
return false;
}
} }
} }
@ -1688,48 +1678,46 @@ static bool ParseDate(DateTimeInfo::ForceUTC forceUTC, const CharT* s,
continue; continue;
} }
// Record a month if it is a month name. Note that some numbers are
// initially treated as months; if a numeric field has already been
// interpreted as a month, store that value to the actually appropriate
// date component and set the month here.
int tryMonth;
if (IsMonthName(s + start, index - start, &tryMonth)) {
if (seenMonthName) {
// Overwrite the previous month name
mon = tryMonth;
prevc = 0;
continue;
}
seenMonthName = true;
if (mon < 0) {
mon = tryMonth;
} else if (mday < 0) {
mday = mon;
mon = tryMonth;
} else if (year < 0) {
if (mday > 0) {
// If the date is of the form f l month, then when month is
// reached we have f in mon and l in mday. In order to be
// consistent with the f month l and month f l forms, we need to
// swap so that f is in mday and l is in year.
year = mday;
mday = mon;
} else {
year = mon;
}
mon = tryMonth;
} else {
return false;
}
prevc = 0;
continue;
}
size_t k = std::size(keywords); size_t k = std::size(keywords);
while (k-- > 0) { while (k-- > 0) {
// Record a month if it is a month name. Note that some numbers are
// initially treated as months; if a numeric field has already been
// interpreted as a month, store that value to the actually appropriate
// date component and set the month here.
int tryMonth;
if (IsMonthName(s + start, index - start, &tryMonth)) {
if (seenMonthName) {
// Overwrite the previous month name
mon = tryMonth;
break;
}
seenMonthName = true;
if (mon < 0) {
mon = tryMonth;
} else if (mday < 0) {
mday = mon;
mon = tryMonth;
} else if (year < 0) {
if (mday > 0) {
// If the date is of the form f l month, then when month is
// reached we have f in mon and l in mday. In order to be
// consistent with the f month l and month f l forms, we need to
// swap so that f is in mday and l is in year.
year = mday;
mday = mon;
} else {
year = mon;
}
mon = tryMonth;
} else {
return false;
}
break;
}
const CharsAndAction& keyword = keywords[k]; const CharsAndAction& keyword = keywords[k];
// If the field doesn't match the keyword, try the next one. // If the field doesn't match the keyword, try the next one.
@ -1780,26 +1768,6 @@ static bool ParseDate(DateTimeInfo::ForceUTC forceUTC, const CharT* s,
return false; return false;
} }
// Handle cases where the input is a single number. Single numbers >= 1000
// are handled by the spec (ParseISOStyleDate), so we don't need to account
// for that here.
if (mon != -1 && year < 0 && mday < 0) {
// Reject 13-31 for Chrome parity
if (mon >= 13 && mon <= 31) {
return false;
}
mday = 1;
if (mon >= 1 && mon <= 12) {
// 1-12 is parsed as a month with the year defaulted to 2001
// (again, for Chrome parity)
year = 2001;
} else {
year = FixupNonFullYear(mon);
mon = 1;
}
}
if (year < 0 || mon < 0 || mday < 0) { if (year < 0 || mon < 0 || mday < 0) {
return false; return false;
} }

View File

@ -62,7 +62,6 @@ const rejected = [
"Sep 26 foo 1995", "Sep 26 foo 1995",
"Sep 26 1995 foo", "Sep 26 1995 foo",
"1995 foo Sep 26", "1995 foo Sep 26",
"foo2 Sep 26 1995",
]; ];
for (const format of formats) { for (const format of formats) {

View File

@ -1,57 +0,0 @@
/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
const accepted = {
"0": "2000-01-01T00:00:00",
"1": "2001-01-01T00:00:00",
"12": "2001-12-01T00:00:00",
"32": "2032-01-01T00:00:00",
"49": "2049-01-01T00:00:00",
"50": "1950-01-01T00:00:00",
"99": "1999-01-01T00:00:00",
"100": "0100-01-01T00:00:00",
"999": "0999-01-01T00:00:00",
"1000": "1000-01-01T00:00:00Z",
// Rejecting e.g. S22 (see rejected patterns below) shouldn't
// reject mday directly after month name
"Sep26 1995": "1995-09-26T00:00:00",
};
const rejected = [
"S22",
"5C",
"Sep26 foo 1995",
];
for (const [test, expected] of Object.entries(accepted)) {
const testDate = new Date(test);
const expectedDate = new Date(expected);
assertEq(
false, isNaN(testDate),
`${test} should be accepted.`
);
assertEq(
testDate.getTime(), expectedDate.getTime(),
`"${test}" should be ${expectedDate} (got ${testDate}).`
);
}
for (let i = 13; i <= 31; ++i) {
assertEq(
true, isNaN(new Date(`${i}`)),
`"${i}" should be rejected.`
);
}
for (const reject of rejected) {
assertEq(
true, isNaN(new Date(reject)),
`"${reject}" should be rejected.`
);
}
if (typeof reportCompare === "function")
reportCompare(true, true);