[PATCH v5 2/5] jscript: Pass null jsval to builtin functions instead of the global host.
Gabriel Ivăncescu
gabrielopcode at gmail.com
Fri Dec 10 15:52:14 CST 2021
Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---
dlls/jscript/function.c | 2 +-
dlls/jscript/tests/api.js | 36 ++++++++++++++++++++++++++
dlls/mshtml/tests/es5.js | 53 +++++++++++++++++++++++++++++++++++++++
3 files changed, 90 insertions(+), 1 deletion(-)
diff --git a/dlls/jscript/function.c b/dlls/jscript/function.c
index 3730915..43f2441 100644
--- a/dlls/jscript/function.c
+++ b/dlls/jscript/function.c
@@ -599,7 +599,7 @@ static HRESULT NativeFunction_call(script_ctx_t *ctx, FunctionInstance *func, ID
if(this_disp)
vthis = jsval_disp(this_disp);
else
- vthis = jsval_disp(lookup_global_host(ctx));
+ vthis = jsval_null();
return function->proc(ctx, vthis, flags & ~DISPATCH_JSCRIPT_INTERNAL_MASK, argc, argv, r);
}
diff --git a/dlls/jscript/tests/api.js b/dlls/jscript/tests/api.js
index d5d8e7d..7e656b1 100644
--- a/dlls/jscript/tests/api.js
+++ b/dlls/jscript/tests/api.js
@@ -3061,6 +3061,42 @@ ok(unescape.length == 1, "unescape.length = " + unescape.length);
String.length = 3;
ok(String.length == 1, "String.length = " + String.length);
+(function() {
+ var tests = [
+ [ "Array.sort", 0x800a138f, function(ctx) { Array.prototype.sort.call(ctx); } ],
+ [ "Boolean.valueOf", 0x800a1392, function(ctx) { Boolean.prototype.valueOf.call(ctx); } ],
+ [ "Date.getYear", 0x800a138e, function(ctx) { Date.prototype.getYear.call(ctx); } ],
+ [ "Enumerator.atEnd", 0x800a1397, function(ctx) { Enumerator.prototype.atEnd.call(ctx); } ],
+ [ "Function.apply", 0x800a138a, function(ctx) { Function.prototype.apply.call(ctx, [ function() {} ]); } ],
+ [ "Number.toExponential", 0x800a1389, function(ctx) { Number.prototype.toExponential.call(ctx); } ],
+ [ "Object.hasOwnProperty", 0x800a138f, function(ctx) { Object.prototype.hasOwnProperty.call(ctx, "toString"); } ],
+ [ "RegExp.test", 0x800a1398, function(ctx) { RegExp.prototype.test.call(ctx, "foobar"); } ],
+ [ "VBArray.lbound", 0x800a1395, function(ctx) { VBArray.prototype.lbound.call(ctx); } ]
+ ];
+
+ for(var i = 0; i < tests.length; i++) {
+ try {
+ tests[i][2](null);
+ ok(false, "expected exception calling " + tests[i][0] + " with null context");
+ }catch(ex) {
+ var n = ex.number + 0x100000000; /* make it unsigned like HRESULT */
+ ok(n === tests[i][1], tests[i][0] + " with null context exception code = " + n);
+ }
+ try {
+ tests[i][2](undefined);
+ ok(false, "expected exception calling " + tests[i][0] + " with undefined context");
+ }catch(ex) {
+ var n = ex.number + 0x100000000;
+ ok(n === tests[i][1], tests[i][0] + " with undefined context exception code = " + n);
+ }
+ }
+
+ var r = Error.prototype.toString.call(undefined);
+ ok(r === "[object Error]", "Error.toString with undefined context returned " + r);
+ r = String.prototype.slice.call(null, 1, 3);
+ ok(r === "ul", "String.slice with null context returned " + r);
+})();
+
var tmp = createArray();
ok(getVT(tmp) == "VT_ARRAY|VT_VARIANT", "getVT(createArray()) = " + getVT(tmp));
ok(getVT(VBArray(tmp)) == "VT_ARRAY|VT_VARIANT", "getVT(VBArray(tmp)) = " + getVT(VBArray(tmp)));
diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js
index 58b0d43..f5d23b0 100644
--- a/dlls/mshtml/tests/es5.js
+++ b/dlls/mshtml/tests/es5.js
@@ -17,6 +17,14 @@
*/
var JS_E_PROP_DESC_MISMATCH = 0x800a01bd;
+var JS_E_NUMBER_EXPECTED = 0x800a1389;
+var JS_E_FUNCTION_EXPECTED = 0x800a138a;
+var JS_E_DATE_EXPECTED = 0x800a138e;
+var JS_E_OBJECT_EXPECTED = 0x800a138f;
+var JS_E_BOOLEAN_EXPECTED = 0x800a1392;
+var JS_E_VBARRAY_EXPECTED = 0x800a1395;
+var JS_E_ENUMERATOR_EXPECTED = 0x800a1397;
+var JS_E_REGEXP_EXPECTED = 0x800a1398;
var JS_E_INVALID_WRITABLE_PROP_DESC = 0x800a13ac;
var JS_E_NONCONFIGURABLE_REDEFINED = 0x800a13d6;
var JS_E_NONWRITABLE_MODIFIED = 0x800a13d7;
@@ -1222,6 +1230,51 @@ sync_test("isFrozen", function() {
ok(Object.isExtensible(o) === false, "o is extensible");
});
+sync_test("builtin_context", function() {
+ var tests = [
+ [ "Array.map", JS_E_OBJECT_EXPECTED, function(ctx) { Array.prototype.map.call(ctx, function(a, b) {}); } ],
+ [ "Array.sort", JS_E_OBJECT_EXPECTED, function(ctx) { Array.prototype.sort.call(ctx); } ],
+ [ "Boolean.toString", JS_E_BOOLEAN_EXPECTED, function(ctx) { Boolean.prototype.toString.call(ctx); } ],
+ [ "Date.getTime", JS_E_DATE_EXPECTED, function(ctx) { Date.prototype.getTime.call(ctx); } ],
+ [ "Date.toGMTString", JS_E_DATE_EXPECTED, function(ctx) { Date.prototype.toGMTString.call(ctx); } ],
+ [ "Enumerator.item", JS_E_ENUMERATOR_EXPECTED, function(ctx) { Enumerator.prototype.item.call(ctx); } ],
+ [ "Error.toString", JS_E_OBJECT_EXPECTED, function(ctx) { Error.prototype.toString.call(ctx); } ],
+ [ "Function.call", JS_E_FUNCTION_EXPECTED, function(ctx) { Function.prototype.call.call(ctx, function() {}); } ],
+ [ "Map.clear", JS_E_OBJECT_EXPECTED, function(ctx) { Map.prototype.clear.call(ctx); } ],
+ [ "Number.toFixed", JS_E_NUMBER_EXPECTED, function(ctx) { Number.prototype.toFixed.call(ctx); } ],
+ [ "Object.isPrototypeOf", JS_E_OBJECT_EXPECTED, function(ctx) { Object.prototype.isPrototypeOf.call(ctx, Object); } ],
+ [ "RegExp.exec", JS_E_REGEXP_EXPECTED, function(ctx) { RegExp.prototype.exec.call(ctx, "foobar"); } ],
+ [ "String.search", JS_E_OBJECT_EXPECTED, function(ctx) { String.prototype.search.call(ctx, /foobar/g); } ],
+ [ "String.trim", JS_E_OBJECT_EXPECTED, function(ctx) { String.prototype.trim.call(ctx); } ],
+ [ "VBArray.dimensions", JS_E_VBARRAY_EXPECTED, function(ctx) { VBArray.prototype.dimensions.call(ctx); } ]
+ ];
+
+ /* make global object suitable for some calls */
+ window[0] = "foo";
+ window[1] = "bar";
+ window.length = 2;
+
+ for(var i = 0; i < tests.length; i++) {
+ try {
+ tests[i][2](null);
+ ok(false, "expected exception calling " + tests[i][0] + " with null context");
+ }catch(ex) {
+ var n = ex.number + 0x100000000; /* make it unsigned like HRESULT */
+ ok(n === tests[i][1], tests[i][0] + " with null context exception code = " + n);
+ }
+ try {
+ tests[i][2](undefined);
+ ok(false, "expected exception calling " + tests[i][0] + " with undefined context");
+ }catch(ex) {
+ var n = ex.number + 0x100000000;
+ ok(n === tests[i][1], tests[i][0] + " with undefined context exception code = " + n);
+ }
+ }
+
+ var obj = (function() { return this; }).call(null);
+ ok(obj === window, "obj = " + obj);
+});
+
sync_test("head_setter", function() {
document.head = "";
ok(typeof(document.head) === "object", "typeof(document.head) = " + typeof(document.head));
--
2.31.1
More information about the wine-devel
mailing list