Jacek Caban : jscript: Fixed deleting properties of pure dispatch interface .

Alexandre Julliard julliard at winehq.org
Mon Dec 17 13:58:23 CST 2012


Module: wine
Branch: master
Commit: 7202f1a32f884838586c1b019b02401f22cafd7a
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=7202f1a32f884838586c1b019b02401f22cafd7a

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Dec 17 13:36:31 2012 +0100

jscript: Fixed deleting properties of pure dispatch interface.

---

 dlls/jscript/dispex.c    |   14 ++++++++++++--
 dlls/jscript/tests/run.c |    8 ++++++++
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/dlls/jscript/dispex.c b/dlls/jscript/dispex.c
index dbb1c63..78809ee 100644
--- a/dlls/jscript/dispex.c
+++ b/dlls/jscript/dispex.c
@@ -1542,8 +1542,18 @@ HRESULT disp_delete_name(script_ctx_t *ctx, IDispatch *disp, jsstr_t *name, BOOL
 
         IDispatchEx_Release(dispex);
     }else {
-        hres = S_OK;
-        ret = FALSE;
+        WCHAR *name_str = name->str;
+        DISPID id;
+
+        hres = IDispatch_GetIDsOfNames(disp, &IID_NULL, &name_str, 1, 0, &id);
+        if(SUCCEEDED(hres)) {
+            /* Property exists and we can't delete it from pure IDispatch interface, so return false. */
+            *ret = FALSE;
+        }else if(hres == DISP_E_UNKNOWNNAME) {
+            /* Property doesn't exist, so nothing to delete */
+            *ret = TRUE;
+            hres = S_OK;
+        }
     }
 
     return hres;
diff --git a/dlls/jscript/tests/run.c b/dlls/jscript/tests/run.c
index 55b1398..46f519a 100644
--- a/dlls/jscript/tests/run.c
+++ b/dlls/jscript/tests/run.c
@@ -1846,6 +1846,14 @@ static BOOL run_tests(void)
     CHECK_CALLED(global_propdelete_d);
     CHECK_CALLED(DeleteMemberByDispID);
 
+    SET_EXPECT(puredisp_prop_d);
+    parse_script_a("ok((delete pureDisp.prop) === false, 'delete pureDisp.prop did not return true');");
+    CHECK_CALLED(puredisp_prop_d);
+
+    SET_EXPECT(puredisp_noprop_d);
+    parse_script_a("ok((delete pureDisp.noprop) === true, 'delete pureDisp.noprop did not return false');");
+    CHECK_CALLED(puredisp_noprop_d);
+
     parse_script_a("(function reportSuccess() {})()");
 
     parse_script_a("ok(typeof(test) === 'object', \"typeof(test) != 'object'\");");




More information about the wine-cvs mailing list