Jacek Caban : jscript: Support accessor properties in getOwnPropertyDescriptor.
Alexandre Julliard
julliard at winehq.org
Tue May 15 16:25:22 CDT 2018
Module: wine
Branch: master
Commit: d8aa26f660a7fe59272549ca1184094d44e75643
URL: https://source.winehq.org/git/wine.git/?a=commit;h=d8aa26f660a7fe59272549ca1184094d44e75643
Author: Jacek Caban <jacek at codeweavers.com>
Date: Tue May 15 13:26:10 2018 +0200
jscript: Support accessor properties in getOwnPropertyDescriptor.
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/jscript/dispex.c | 9 +++++++++
dlls/mshtml/tests/es5.js | 22 ++++++++++++++++++++++
2 files changed, 31 insertions(+)
diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c
index 4eb3a8b..a1298eb 100644
--- a/dlls/jscript/dispex.c
+++ b/dlls/jscript/dispex.c
@@ -1623,6 +1623,15 @@ HRESULT jsdisp_get_own_property(jsdisp_t *obj, const WCHAR *name, BOOL flags_onl
return hres;
}
break;
+ case PROP_ACCESSOR:
+ desc->explicit_getter = desc->explicit_setter = TRUE;
+ if(!flags_only) {
+ desc->getter = prop->u.accessor.getter
+ ? jsdisp_addref(prop->u.accessor.getter) : NULL;
+ desc->setter = prop->u.accessor.setter
+ ? jsdisp_addref(prop->u.accessor.setter) : NULL;
+ }
+ break;
default:
return DISP_E_UNKNOWNNAME;
}
diff --git a/dlls/mshtml/tests/es5.js b/dlls/mshtml/tests/es5.js
index d96803a..df5b7c7 100644
--- a/dlls/mshtml/tests/es5.js
+++ b/dlls/mshtml/tests/es5.js
@@ -204,6 +204,19 @@ function test_getOwnPropertyDescriptor() {
}
function test_defineProperty() {
+ function test_accessor_prop_desc(obj, prop, orig_desc) {
+ var expected_enumerable = "enumerable" in orig_desc && !!orig_desc.enumerable;
+ var expected_configurable = "configurable" in orig_desc && !!orig_desc.configurable;
+
+ var desc = Object.getOwnPropertyDescriptor(obj, prop);
+ ok(desc.enumerable === expected_enumerable, "desc.enumerable = " + desc.enumerable
+ + " expected " + expected_enumerable);
+ ok(desc.configurable === expected_configurable, "desc.configurable = " + desc.configurable
+ + " expected " + expected_configurable);
+ ok(desc.get === orig_desc.get, "desc.get = " + desc.get);
+ ok(desc.set === orig_desc.set, "desc.set = " + desc.set);
+ }
+
function expect_exception(func, expected_number) {
try {
func();
@@ -242,6 +255,7 @@ function test_defineProperty() {
}
};
Object.defineProperty(obj, "getsetprop", desc);
+ test_accessor_prop_desc(obj, "getsetprop", desc);
Object.defineProperty(obj, "notConf", {writable: true, enumerable: true, configurable: false, value: 1});
test_own_data_prop_desc(obj, "notConf", true, true, false);
@@ -304,6 +318,7 @@ function test_defineProperty() {
configurable: false
};
Object.defineProperty(obj, "notConfAcc", desc);
+ test_accessor_prop_desc(obj, "notConfAcc", desc);
expect_exception(function() {
Object.defineProperty(obj, "notConfAcc", {value: 1});
@@ -322,10 +337,13 @@ function test_defineProperty() {
}, JS_E_NONCONFIGURABLE_REDEFINED);
Object.defineProperty(obj, "notConfAcc", {get: desc.get});
+ test_accessor_prop_desc(obj, "notConfAcc", desc);
Object.defineProperty(obj, "notConfAcc", {set: desc.set});
+ test_accessor_prop_desc(obj, "notConfAcc", desc);
Object.defineProperty(obj, "notConfAcc", {configurable: false});
+ test_accessor_prop_desc(obj, "notConfAcc", desc);
desc = {
get: function() {
@@ -337,15 +355,18 @@ function test_defineProperty() {
configurable: true
};
Object.defineProperty(obj, "confAcc", desc);
+ test_accessor_prop_desc(obj, "confAcc", desc);
Object.defineProperty(obj, "confAcc", {writable: 1});
test_own_data_prop_desc(obj, "confAcc", true, false, true);
Object.defineProperty(obj, "confAcc", desc);
+ test_accessor_prop_desc(obj, "confAcc", desc);
desc.get = function() {};
desc.set = undefined;
Object.defineProperty(obj, "confAcc", desc);
+ test_accessor_prop_desc(obj, "confAcc", desc);
expect_exception(function() {
Object.defineProperty(obj, "invaliddesc", {get: undefined, value: 1});
@@ -371,6 +392,7 @@ function test_defineProperty() {
ok(Object.getOwnPropertyDescriptor(obj, "parent_accessor") === undefined,
"getOwnPropertyDescriptor(parent_accessor) did not return undefined");
+ test_accessor_prop_desc(child.prototype, "parent_accessor", desc);
next_test();
}
More information about the wine-cvs
mailing list