From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlelem.c | 80 ++++++++---------------------------------- 1 file changed, 14 insertions(+), 66 deletions(-)
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index 7925d762aef..60e864c7dc0 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -7857,67 +7857,24 @@ static inline HRESULT get_domattr(HTMLAttributeCollection *This, DISPID id, LONG }
typedef struct { - IEnumVARIANT IEnumVARIANT_iface; - - LONG ref; - + CollectionEnum colenum; DISPID iter_dispid; - HTMLAttributeCollection *col; } HTMLAttributeCollectionEnum;
static inline HTMLAttributeCollectionEnum *HTMLAttributeCollectionEnum_from_IEnumVARIANT(IEnumVARIANT *iface) { - return CONTAINING_RECORD(iface, HTMLAttributeCollectionEnum, IEnumVARIANT_iface); -} - -static HRESULT WINAPI HTMLAttributeCollectionEnum_QueryInterface(IEnumVARIANT *iface, REFIID riid, void **ppv) -{ - HTMLAttributeCollectionEnum *This = HTMLAttributeCollectionEnum_from_IEnumVARIANT(iface); - - TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); - - if(IsEqualGUID(riid, &IID_IUnknown)) { - *ppv = &This->IEnumVARIANT_iface; - }else if(IsEqualGUID(riid, &IID_IEnumVARIANT)) { - *ppv = &This->IEnumVARIANT_iface; - }else { - FIXME("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); - *ppv = NULL; - return E_NOINTERFACE; - } - - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; + return CONTAINING_RECORD(iface, HTMLAttributeCollectionEnum, colenum.IEnumVARIANT_iface); }
-static ULONG WINAPI HTMLAttributeCollectionEnum_AddRef(IEnumVARIANT *iface) -{ - HTMLAttributeCollectionEnum *This = HTMLAttributeCollectionEnum_from_IEnumVARIANT(iface); - LONG ref = InterlockedIncrement(&This->ref); - - TRACE("(%p) ref=%ld\n", This, ref); - - return ref; -} - -static ULONG WINAPI HTMLAttributeCollectionEnum_Release(IEnumVARIANT *iface) +static inline HTMLAttributeCollection *HTMLAttributeCollection_from_DispatchEx(DispatchEx *iface) { - HTMLAttributeCollectionEnum *This = HTMLAttributeCollectionEnum_from_IEnumVARIANT(iface); - LONG ref = InterlockedDecrement(&This->ref); - - TRACE("(%p) ref=%ld\n", This, ref); - - if(!ref) { - IHTMLAttributeCollection_Release(&This->col->IHTMLAttributeCollection_iface); - free(This); - } - - return ref; + return CONTAINING_RECORD(iface, HTMLAttributeCollection, dispex); }
static HRESULT WINAPI HTMLAttributeCollectionEnum_Next(IEnumVARIANT *iface, ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched) { HTMLAttributeCollectionEnum *This = HTMLAttributeCollectionEnum_from_IEnumVARIANT(iface); + HTMLAttributeCollection *col = HTMLAttributeCollection_from_DispatchEx(This->colenum.disp); DISPID tmp, dispid = This->iter_dispid; HTMLDOMAttribute *attr; LONG rel_index = 0; @@ -7927,10 +7884,10 @@ static HRESULT WINAPI HTMLAttributeCollectionEnum_Next(IEnumVARIANT *iface, ULON TRACE("(%p)->(%lu %p %p)\n", This, celt, rgVar, pCeltFetched);
for(i = 0; i < celt; i++) { - hres = get_attr_dispid_by_relative_idx(This->col, &rel_index, dispid, &tmp); + hres = get_attr_dispid_by_relative_idx(col, &rel_index, dispid, &tmp); if(SUCCEEDED(hres)) { dispid = tmp; - hres = get_domattr(This->col, dispid, NULL, &attr); + hres = get_domattr(col, dispid, NULL, &attr); } else if(hres == DISP_E_UNKNOWNNAME) break; @@ -7954,6 +7911,7 @@ static HRESULT WINAPI HTMLAttributeCollectionEnum_Next(IEnumVARIANT *iface, ULON static HRESULT WINAPI HTMLAttributeCollectionEnum_Skip(IEnumVARIANT *iface, ULONG celt) { HTMLAttributeCollectionEnum *This = HTMLAttributeCollectionEnum_from_IEnumVARIANT(iface); + HTMLAttributeCollection *col = HTMLAttributeCollection_from_DispatchEx(This->colenum.disp); LONG remaining, rel_index; DISPID dispid; HRESULT hres; @@ -7964,14 +7922,14 @@ static HRESULT WINAPI HTMLAttributeCollectionEnum_Skip(IEnumVARIANT *iface, ULON return S_OK;
rel_index = -1; - hres = get_attr_dispid_by_relative_idx(This->col, &rel_index, This->iter_dispid, NULL); + hres = get_attr_dispid_by_relative_idx(col, &rel_index, This->iter_dispid, NULL); if(FAILED(hres)) return hres; remaining = min(celt, rel_index);
if(remaining) { rel_index = remaining - 1; - hres = get_attr_dispid_by_relative_idx(This->col, &rel_index, This->iter_dispid, &dispid); + hres = get_attr_dispid_by_relative_idx(col, &rel_index, This->iter_dispid, &dispid); if(FAILED(hres)) return hres; This->iter_dispid = dispid; @@ -7997,9 +7955,9 @@ static HRESULT WINAPI HTMLAttributeCollectionEnum_Clone(IEnumVARIANT *iface, IEn }
static const IEnumVARIANTVtbl HTMLAttributeCollectionEnumVtbl = { - HTMLAttributeCollectionEnum_QueryInterface, - HTMLAttributeCollectionEnum_AddRef, - HTMLAttributeCollectionEnum_Release, + CollectionEnum_QueryInterface, + CollectionEnum_AddRef, + CollectionEnum_Release, HTMLAttributeCollectionEnum_Next, HTMLAttributeCollectionEnum_Skip, HTMLAttributeCollectionEnum_Reset, @@ -8038,14 +7996,9 @@ static HRESULT WINAPI HTMLAttributeCollection__newEnum(IHTMLAttributeCollection if(!ret) return E_OUTOFMEMORY;
- ret->IEnumVARIANT_iface.lpVtbl = &HTMLAttributeCollectionEnumVtbl; - ret->ref = 1; ret->iter_dispid = DISPID_STARTENUM;
- HTMLAttributeCollection_AddRef(&This->IHTMLAttributeCollection_iface); - ret->col = This; - - *p = (IUnknown*)&ret->IEnumVARIANT_iface; + *p = CollectionEnum_init(&ret->colenum, &This->dispex, &HTMLAttributeCollectionEnumVtbl); return S_OK; }
@@ -8368,11 +8321,6 @@ static const IHTMLAttributeCollection4Vtbl HTMLAttributeCollection4Vtbl = { HTMLAttributeCollection4_get_length };
-static inline HTMLAttributeCollection *HTMLAttributeCollection_from_DispatchEx(DispatchEx *iface) -{ - return CONTAINING_RECORD(iface, HTMLAttributeCollection, dispex); -} - static void *HTMLAttributeCollection_query_interface(DispatchEx *dispex, REFIID riid) { HTMLAttributeCollection *This = HTMLAttributeCollection_from_DispatchEx(dispex);