Jacek Caban : jscript: Added Date.prototype.toISOString implementation.

Alexandre Julliard julliard at winehq.org
Wed Apr 11 16:12:55 CDT 2018


Module: wine
Branch: master
Commit: aa27dd07aa55301f3e23acf9f74daa0f465e7b6d
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=aa27dd07aa55301f3e23acf9f74daa0f465e7b6d

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed Apr 11 19:36:25 2018 +0200

jscript: Added Date.prototype.toISOString implementation.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/jscript/date.c               | 48 +++++++++++++++++++++++++++++++++++++++
 dlls/mshtml/tests/documentmode.js |  2 ++
 dlls/mshtml/tests/es5.js          | 35 ++++++++++++++++++++++++++++
 3 files changed, 85 insertions(+)

diff --git a/dlls/jscript/date.c b/dlls/jscript/date.c
index f784d51..28ad23d 100644
--- a/dlls/jscript/date.c
+++ b/dlls/jscript/date.c
@@ -49,6 +49,7 @@ typedef struct {
 static const WCHAR toStringW[] = {'t','o','S','t','r','i','n','g',0};
 static const WCHAR toLocaleStringW[] = {'t','o','L','o','c','a','l','e','S','t','r','i','n','g',0};
 static const WCHAR valueOfW[] = {'v','a','l','u','e','O','f',0};
+static const WCHAR toISOStringW[] = {'t','o','I','S','O','S','t','r','i','n','g',0};
 static const WCHAR toUTCStringW[] = {'t','o','U','T','C','S','t','r','i','n','g',0};
 static const WCHAR toGMTStringW[] = {'t','o','G','M','T','S','t','r','i','n','g',0};
 static const WCHAR toDateStringW[] = {'t','o','D','a','t','e','S','t','r','i','n','g',0};
@@ -632,6 +633,52 @@ static HRESULT Date_toLocaleString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flag
     return S_OK;
 }
 
+static HRESULT Date_toISOString(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
+        jsval_t *r)
+{
+    DateInstance *date;
+    WCHAR buf[64], *p = buf;
+    double year;
+
+    static const WCHAR short_year_formatW[] = {'%','0','4','d',0};
+    static const WCHAR long_year_formatW[] = {'%','0','6','d',0};
+    static const WCHAR formatW[] = {'-','%','0','2','d','-','%','0','2','d',
+        'T','%','0','2','d',':','%','0','2','d',':','%','0','2','d','.','%','0','3','d','Z',0};
+
+    TRACE("\n");
+
+    if(!(date = date_this(jsthis)))
+        return throw_type_error(ctx, JS_E_DATE_EXPECTED, NULL);
+
+    year = year_from_time(date->time);
+    if(isnan(year) || year > 999999 || year < -999999) {
+        FIXME("year %lf should throw an exception\n", year);
+        return E_FAIL;
+    }
+
+    if(year < 0) {
+        *p++ = '-';
+        p += sprintfW(p, long_year_formatW, -(int)year);
+    }else if(year > 9999) {
+        *p++ = '+';
+        p += sprintfW(p, long_year_formatW, (int)year);
+    }else {
+        p += sprintfW(p, short_year_formatW, (int)year);
+    }
+
+    sprintfW(p, formatW, (int)month_from_time(date->time) + 1, (int)date_from_time(date->time),
+             (int)hour_from_time(date->time), (int)min_from_time(date->time),
+             (int)sec_from_time(date->time), (int)ms_from_time(date->time));
+
+    if(r) {
+        jsstr_t *ret;
+        if(!(ret = jsstr_alloc(buf)))
+            return E_OUTOFMEMORY;
+        *r = jsval_string(ret);
+    }
+    return S_OK;
+}
+
 static HRESULT Date_valueOf(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
         jsval_t *r)
 {
@@ -1923,6 +1970,7 @@ static const builtin_prop_t Date_props[] = {
     {setYearW,               Date_setYear,               PROPF_METHOD|1},
     {toDateStringW,          Date_toDateString,          PROPF_METHOD},
     {toGMTStringW,           Date_toGMTString,           PROPF_METHOD},
+    {toISOStringW,           Date_toISOString,           PROPF_METHOD|PROPF_ES5},
     {toLocaleDateStringW,    Date_toLocaleDateString,    PROPF_METHOD},
     {toLocaleStringW,        Date_toLocaleString,        PROPF_METHOD},
     {toLocaleTimeStringW,    Date_toLocaleTimeString,    PROPF_METHOD},
diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js
index 21a3582..3fbb2fb 100644
--- a/dlls/mshtml/tests/documentmode.js
+++ b/dlls/mshtml/tests/documentmode.js
@@ -80,6 +80,7 @@ function test_window_props() {
 
     var v = document.documentMode;
 
+    test_exposed("postMessage", true);
     test_exposed("addEventListener", v >= 9);
     test_exposed("removeEventListener", v >= 9);
     test_exposed("dispatchEvent", v >= 9);
@@ -136,6 +137,7 @@ function test_javascript() {
 
     test_exposed("JSON", g, v >= 8);
     test_exposed("now", Date, true);
+    test_exposed("toISOString", Date.prototype, v >= 9);
     test_exposed("isArray", Array, v >= 9);
     test_exposed("indexOf", Array.prototype, v >= 9);
 
diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js
index 9b0dc21..d539557 100644
--- a/dlls/mshtml/tests/es5.js
+++ b/dlls/mshtml/tests/es5.js
@@ -27,6 +27,40 @@ function test_date_now() {
     next_test();
 }
 
+function test_toISOString() {
+    var s;
+
+    function expect(date, expected) {
+        var s = date.toISOString();
+        ok(s === expected, "toISOString returned " + s + " expected " + expected);
+    }
+
+    function expect_exception(func) {
+        try {
+            func();
+        }catch(e) {
+            return;
+        }
+        ok(false, "expected exception");
+    }
+
+    expect(new Date(0), "1970-01-01T00:00:00.000Z");
+    expect(new Date(0xdeadbeef), "1970-02-13T05:45:28.559Z");
+    expect(new Date(10928309128301), "2316-04-22T01:25:28.301Z");
+    expect(new Date(-1), "1969-12-31T23:59:59.999Z");
+    expect(new Date(-62167219200000), "0000-01-01T00:00:00.000Z");
+    expect(new Date(-62167219200001), "-000001-12-31T23:59:59.999Z");
+    expect(new Date(-6216721920000100), "-195031-12-03T23:59:59.900Z");
+    expect(new Date(1092830912830100), "+036600-06-07T22:27:10.100Z");
+
+    trace("" + 0xdeadbeef);
+
+    expect_exception(function() { new Date(NaN).toISOString(); });
+    expect_exception(function() { new Date(31494784780800001).toISOString(); });
+
+    next_test();
+}
+
 function test_indexOf() {
     function expect(array, args, exr) {
         var r = Array.prototype.indexOf.apply(array, args);
@@ -115,6 +149,7 @@ function test_identifier_keywords() {
 
 var tests = [
     test_date_now,
+    test_toISOString,
     test_indexOf,
     test_isArray,
     test_identifier_keywords




More information about the wine-cvs mailing list