Jacek Caban : jscript: Added Date.now implementation.
Alexandre Julliard
julliard at winehq.org
Thu Mar 1 13:34:45 CST 2018
Module: wine
Branch: master
Commit: af5edf95045212834394ac42c9dcab0805078918
URL: https://source.winehq.org/git/wine.git/?a=commit;h=af5edf95045212834394ac42c9dcab0805078918
Author: Jacek Caban <jacek at codeweavers.com>
Date: Thu Mar 1 19:18:49 2018 +0100
jscript: Added Date.now implementation.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/jscript/date.c | 34 ++++++++++++++++++++++++----------
dlls/jscript/tests/api.js | 1 +
dlls/mshtml/tests/documentmode.js | 1 +
dlls/mshtml/tests/es5.js | 32 ++++++++++++++++++++++++++++++++
dlls/mshtml/tests/rsrc.rc | 3 +++
dlls/mshtml/tests/script.c | 1 +
6 files changed, 62 insertions(+), 10 deletions(-)
diff --git a/dlls/jscript/date.c b/dlls/jscript/date.c
index 21a359a..f784d51 100644
--- a/dlls/jscript/date.c
+++ b/dlls/jscript/date.c
@@ -92,6 +92,7 @@ static const WCHAR getYearW[] = {'g','e','t','Y','e','a','r',0};
static const WCHAR setYearW[] = {'s','e','t','Y','e','a','r',0};
static const WCHAR UTCW[] = {'U','T','C',0};
+static const WCHAR nowW[] = {'n','o','w',0};
static const WCHAR parseW[] = {'p','a','r','s','e',0};
static inline DateInstance *date_from_jsdisp(jsdisp_t *jsdisp)
@@ -452,6 +453,17 @@ static inline DOUBLE time_clip(DOUBLE time)
return floor(time);
}
+static double date_now(void)
+{
+ FILETIME ftime;
+ LONGLONG time;
+
+ GetSystemTimeAsFileTime(&ftime);
+ time = ((LONGLONG)ftime.dwHighDateTime << 32) + ftime.dwLowDateTime;
+
+ return time/10000 - TIME_EPOCH;
+}
+
static SYSTEMTIME create_systemtime(DOUBLE time)
{
SYSTEMTIME st;
@@ -2361,6 +2373,15 @@ static HRESULT DateConstr_UTC(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, un
return hres;
}
+/* ECMA-262 5.1 Edition 15.9.4.4 */
+static HRESULT DateConstr_now(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv, jsval_t *r)
+{
+ TRACE("\n");
+
+ if(r) *r = jsval_number(date_now());
+ return S_OK;
+}
+
static HRESULT DateConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags, unsigned argc, jsval_t *argv,
jsval_t *r)
{
@@ -2373,19 +2394,11 @@ static HRESULT DateConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
case DISPATCH_CONSTRUCT:
switch(argc) {
/* ECMA-262 3rd Edition 15.9.3.3 */
- case 0: {
- FILETIME time;
- LONGLONG lltime;
-
- GetSystemTimeAsFileTime(&time);
- lltime = ((LONGLONG)time.dwHighDateTime<<32)
- + time.dwLowDateTime;
-
- hres = create_date(ctx, NULL, lltime/10000-TIME_EPOCH, &date);
+ case 0:
+ hres = create_date(ctx, NULL, date_now(), &date);
if(FAILED(hres))
return hres;
break;
- }
/* ECMA-262 3rd Edition 15.9.3.2 */
case 1: {
@@ -2454,6 +2467,7 @@ static HRESULT DateConstr_value(script_ctx_t *ctx, vdisp_t *jsthis, WORD flags,
static const builtin_prop_t DateConstr_props[] = {
{UTCW, DateConstr_UTC, PROPF_METHOD},
+ {nowW, DateConstr_now, PROPF_HTML|PROPF_METHOD},
{parseW, DateConstr_parse, PROPF_METHOD}
};
diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js
index 5a78b3a..084aa84 100644
--- a/dlls/jscript/tests/api.js
+++ b/dlls/jscript/tests/api.js
@@ -294,6 +294,7 @@ obj = new Date();
ok(!obj.hasOwnProperty('getTime'), "obj.hasOwnProperty('getTime') is true");
ok(!Date.hasOwnProperty('getTime'), "Date.hasOwnProperty('getTime') is true");
ok(Date.prototype.hasOwnProperty('getTime'), "Date.prototype.hasOwnProperty('getTime') is false");
+ok(!("now" in Date), "now found in Date");
obj = new Number();
ok(!obj.hasOwnProperty('toFixed'), "obj.hasOwnProperty('toFixed') is true");
diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js
index 823f4f9..7287bab 100644
--- a/dlls/mshtml/tests/documentmode.js
+++ b/dlls/mshtml/tests/documentmode.js
@@ -121,6 +121,7 @@ function test_javascript() {
test_exposed("ScriptEngineMajorVersion", g, true);
test_exposed("JSON", g, v >= 8);
+ test_exposed("now", Date, true);
next_test();
}
diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js
new file mode 100644
index 0000000..3f77c05
--- /dev/null
+++ b/dlls/mshtml/tests/es5.js
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2018 Jacek Caban for CodeWeavers
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+function test_date_now() {
+ var now = Date.now();
+ var time = (new Date()).getTime();
+
+ ok(time >= now && time-now < 50, "unexpected Date.now() result " + now + " expected " + time);
+
+ Date.now(1, 2, 3);
+
+ next_test();
+}
+
+var tests = [
+ test_date_now
+];
diff --git a/dlls/mshtml/tests/rsrc.rc b/dlls/mshtml/tests/rsrc.rc
index df5b469..3ce867e 100644
--- a/dlls/mshtml/tests/rsrc.rc
+++ b/dlls/mshtml/tests/rsrc.rc
@@ -52,6 +52,9 @@ xhr.js HTML "xhr.js"
/* @makedep: elements.js */
elements.js HTML "elements.js"
+/* @makedep: es5.js */
+es5.js HTML "es5.js"
+
/* @makedep: events.js */
events.js HTML "events.js"
diff --git a/dlls/mshtml/tests/script.c b/dlls/mshtml/tests/script.c
index b07cce1..db6ac25 100644
--- a/dlls/mshtml/tests/script.c
+++ b/dlls/mshtml/tests/script.c
@@ -3465,6 +3465,7 @@ static void run_js_tests(void)
run_script_as_http_with_mode("xhr.js", NULL, "11");
run_script_as_http_with_mode("elements.js", NULL, "11");
+ run_script_as_http_with_mode("es5.js", NULL, "11");
run_script_as_http_with_mode("events.js", NULL, "9");
run_script_as_http_with_mode("navigation.js", NULL, NULL);
run_script_as_http_with_mode("navigation.js", NULL, "11");
More information about the wine-cvs
mailing list