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