Jacek Caban : mshtml: Fixed GetNextDispID for the case when the first dynamic property is deleted.

Alexandre Julliard julliard at wine.codeweavers.com
Wed May 4 11:38:21 CDT 2016


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Wed May  4 15:21:49 2016 +0200

mshtml: Fixed GetNextDispID for the case when the first dynamic property is deleted.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mshtml/dispex.c | 30 +++++++++++++++++-------------
 1 file changed, 17 insertions(+), 13 deletions(-)

diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c
index 90e5c72..502affb 100644
--- a/dlls/mshtml/dispex.c
+++ b/dlls/mshtml/dispex.c
@@ -1601,6 +1601,20 @@ static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BS
     return S_OK;
 }
 
+static HRESULT next_dynamic_id(DispatchEx *dispex, DWORD idx, DISPID *ret_id)
+{
+    while(idx < dispex->dynamic_data->prop_cnt && dispex->dynamic_data->props[idx].flags & DYNPROP_DELETED)
+        idx++;
+
+    if(idx == dispex->dynamic_data->prop_cnt) {
+        *ret_id = DISPID_STARTENUM;
+        return S_FALSE;
+    }
+
+    *ret_id = DISPID_DYNPROP_0+idx;
+    return S_OK;
+}
+
 static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
 {
     DispatchEx *This = impl_from_IDispatchEx(iface);
@@ -1616,15 +1630,7 @@ static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex,
         if(!get_dynamic_data(This) || This->dynamic_data->prop_cnt <= idx)
             return DISP_E_UNKNOWNNAME;
 
-        while(++idx < This->dynamic_data->prop_cnt && This->dynamic_data->props[idx].flags & DYNPROP_DELETED);
-
-        if(idx == This->dynamic_data->prop_cnt) {
-            *pid = DISPID_STARTENUM;
-            return S_FALSE;
-        }
-
-        *pid = DISPID_DYNPROP_0+idx;
-        return S_OK;
+        return next_dynamic_id(This, idx+1, pid);
     }
 
     data = get_dispex_data(This);
@@ -1649,10 +1655,8 @@ static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex,
         func++;
     }
 
-    if(get_dynamic_data(This) && This->dynamic_data->prop_cnt) {
-        *pid = DISPID_DYNPROP_0;
-        return S_OK;
-    }
+    if(get_dynamic_data(This) && This->dynamic_data->prop_cnt)
+        return next_dynamic_id(This, 0, pid);
 
     *pid = DISPID_STARTENUM;
     return S_FALSE;




More information about the wine-cvs mailing list