Safari Date Bug, Dojo 1.5

A funky Date bug in Safari, impacting DateTextBox

by brianarn

HTML

<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/dojo/1.5/dojo/resources/dojo.css">
<link rel="stylesheet" href="https://ajax.googleapis.com/ajax/libs/dojo/1.5/dijit/themes/claro/claro.css">
<h2>Instructions to duplicate error (Safari 5+ only)</h2>
<ol>
    <li>Click "Make a new DateTextBox". The new DTB should be blank.</li>
    <li>Click 'new Date("")', which will console.log out an empty date. In all browsers, this should be an invalid date.</li>
    <li>Click 'new Date("01/01/2021")', which will console.log out a Date object representing January 1st, 2021 in all browsers.</li>
    <li>Click 'new Date("")'. This action <em>should</em> log out an Invalid Date again, but in Safari 5, it's logging out January 1st, 2021 again.</li>
    <li>Click "Make a new DateTextBox". The default date is effectively the same as `new Date("")`, and therefore, in Safari 5, it is inheriting the far-future date.</li>
    <li>Click 'new Date("X")', which will console.log out an invalid date in all browsers.</li>
    <li>Click 'new Date("")', which will console.log out an invalid date in all browsers, as Safari 5 is now hanging onto the Invalid Date.</li>
    <li>Click "Make a new DateTextBox". It should result in an empty DTB, like the first.
</ol>
<h2>Actions</h2>
<div id="actions">
    <div id="newDTB" jsId="newDTB" dojoType="dijit.form.Button">Make a new DateTextBox</div>
    <div id="newDateX" jsId="newDateX" dojoType="dijit.form.Button">new Date("X")</div>
    <div id="newDateEmpty" jsId="newDateEmpty" dojoType="dijit.form.Button">new Date("")</div>
    <div id="newDateStr" jsId="newDateStr" dojoType="dijit.form.Button">new Date("01/01/2021")</div>
</div>
<h2>Widgets</h2>
<ul id="widgets"></ul>

CSS

label { width: 40px; display: inline-block; text-align: right; padding: 10px; }

JavaScript

// Require things here
dojo.require('dijit.form.Button');
dojo.require('dijit.form.DateTextBox');

// Do something once DOM/requires are ready
dojo.ready(function(){
    var widgets = dojo.byId('widgets'), count = 1;
    
    // Set up actions
    dojo.connect(newDateX, 'onClick', function(){ console.log(new Date("X")); });
    dojo.connect(newDateEmpty, 'onClick', function(){ console.log(new Date("")); });
    dojo.connect(newDateStr, 'onClick', function(){ console.log(new Date("01/01/2021")); });
    dojo.connect(newDTB, 'onClick', function(){
        var li = dojo.create('li'),
            label = dojo.place('<label>' + count + ':</label>', li),
            dtb = new dijit.form.DateTextBox({}).placeAt(li);
        dojo.place(li, widgets);
        ++count;
    });
});