 
            -- v3: mshtml: Use the common object implementation for HTMLAttributeCollection mshtml: Use the common object implementation for HTMLStyleSheetsCollection mshtml: Use the common object implementation for HTMLRectCollection mshtml: Use the common object implementation for HTMLSelectElement enumerator. mshtml: Use the common object implementation for HTMLFormElement enumerator. mshtml: Use the common object implementation for HTMLDOMChildrenCollection mshtml: Use a common object implementation for HTMLElementCollection
 
            From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/dispex.c | 140 +++++++++++++++++++++++++++++++ dlls/mshtml/htmlelemcol.c | 154 +++++------------------------------ dlls/mshtml/mshtml_private.h | 15 ++++ 3 files changed, 174 insertions(+), 135 deletions(-)
diff --git a/dlls/mshtml/dispex.c b/dlls/mshtml/dispex.c index cd256dba677..1514a59b225 100644 --- a/dlls/mshtml/dispex.c +++ b/dlls/mshtml/dispex.c @@ -2901,6 +2901,146 @@ static IWineJSDispatchHostVtbl JSDispatchHostVtbl = { JSDispatchHost_ToString, };
+static inline CollectionEnum *CollectionEnum_from_IEnumVARIANT(IEnumVARIANT *iface) +{ + return CONTAINING_RECORD(iface, CollectionEnum, IEnumVARIANT_iface); +} + +static HRESULT WINAPI CollectionEnum_QueryInterface(IEnumVARIANT *iface, REFIID riid, void **ppv) +{ + CollectionEnum *This = CollectionEnum_from_IEnumVARIANT(iface); + + TRACE("(%p)->(%s %p)\n", This, debugstr_mshtml_guid(riid), ppv); + + if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IEnumVARIANT)) + *ppv = &This->IEnumVARIANT_iface; + else { + FIXME("Unsupported iface %s\n", debugstr_mshtml_guid(riid)); + *ppv = NULL; + return E_NOINTERFACE; + } + + IUnknown_AddRef((IUnknown*)*ppv); + return S_OK; +} + +static ULONG WINAPI CollectionEnum_AddRef(IEnumVARIANT *iface) +{ + CollectionEnum *This = CollectionEnum_from_IEnumVARIANT(iface); + LONG ref = InterlockedIncrement(&This->ref); + + TRACE("(%p) ref=%ld\n", This, ref); + + return ref; +} + +static ULONG WINAPI CollectionEnum_Release(IEnumVARIANT *iface) +{ + CollectionEnum *This = CollectionEnum_from_IEnumVARIANT(iface); + LONG ref = InterlockedDecrement(&This->ref); + + TRACE("(%p) ref=%ld\n", This, ref); + + if(!ref) { + DispatchEx_Release(&This->collection->IWineJSDispatchHost_iface); + free(This); + } + + return ref; +} + +static HRESULT WINAPI CollectionEnum_Next(IEnumVARIANT *iface, ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched) +{ + CollectionEnum *This = CollectionEnum_from_IEnumVARIANT(iface); + ULONG iter = This->iter, len, fetched = 0; + DispatchEx *col = This->collection; + HRESULT hres; + + TRACE("(%p)->(%ld %p %p)\n", This, celt, rgVar, pCeltFetched); + + len = col->info->vtbl->collection_len(col); + + while(iter + fetched < len && fetched < celt) { + hres = col->info->vtbl->collection_item(col, iter + fetched, &V_DISPATCH(rgVar + fetched)); + if(FAILED(hres)) { + while(fetched--) + VariantClear(rgVar + fetched); + return hres; + } + V_VT(rgVar + fetched) = V_DISPATCH(rgVar + fetched) ? VT_DISPATCH : VT_NULL; + fetched++; + } + + This->iter = iter + fetched; + if(pCeltFetched) + *pCeltFetched = fetched; + return fetched == celt ? S_OK : S_FALSE; +} + +static HRESULT WINAPI CollectionEnum_Skip(IEnumVARIANT *iface, ULONG celt) +{ + CollectionEnum *This = CollectionEnum_from_IEnumVARIANT(iface); + ULONG len; + + TRACE("(%p)->(%ld)\n", This, celt); + + len = This->collection->info->vtbl->collection_len(This->collection); + + if(This->iter + celt > len) { + This->iter = len; + return S_FALSE; + } + + This->iter += celt; + return S_OK; +} + +static HRESULT WINAPI CollectionEnum_Reset(IEnumVARIANT *iface) +{ + CollectionEnum *This = CollectionEnum_from_IEnumVARIANT(iface); + + TRACE("(%p)->()\n", This); + + This->iter = 0; + return S_OK; +} + +static HRESULT WINAPI CollectionEnum_Clone(IEnumVARIANT *iface, IEnumVARIANT **ppEnum) +{ + CollectionEnum *This = CollectionEnum_from_IEnumVARIANT(iface); + + FIXME("(%p)->(%p)\n", This, ppEnum); + + return E_NOTIMPL; +} + +static const IEnumVARIANTVtbl CollectionEnumVtbl = { + CollectionEnum_QueryInterface, + CollectionEnum_AddRef, + CollectionEnum_Release, + CollectionEnum_Next, + CollectionEnum_Skip, + CollectionEnum_Reset, + CollectionEnum_Clone +}; + +HRESULT CollectionEnum_create(DispatchEx *collection, IUnknown **ret) +{ + CollectionEnum *colenum = malloc(sizeof(*colenum)); + + if(!colenum) + return E_OUTOFMEMORY; + + colenum->IEnumVARIANT_iface.lpVtbl = &CollectionEnumVtbl; + colenum->ref = 1; + colenum->iter = 0; + colenum->collection = collection; + DispatchEx_AddRef(&collection->IWineJSDispatchHost_iface); + + *ret = (IUnknown*)&colenum->IEnumVARIANT_iface; + return S_OK; +} + HRESULT dispex_builtin_props_to_json(DispatchEx *dispex, HTMLInnerWindow *window, VARIANT *ret) { func_info_t *func, *end; diff --git a/dlls/mshtml/htmlelemcol.c b/dlls/mshtml/htmlelemcol.c index 5b3d9b56310..050047ec15a 100644 --- a/dlls/mshtml/htmlelemcol.c +++ b/dlls/mshtml/htmlelemcol.c @@ -39,15 +39,6 @@ typedef struct { DWORD len; } HTMLElementCollection;
-typedef struct { - IEnumVARIANT IEnumVARIANT_iface; - - LONG ref; - - ULONG iter; - HTMLElementCollection *col; -} HTMLElementCollectionEnum; - typedef struct { HTMLElement **buf; DWORD len; @@ -93,118 +84,6 @@ static inline BOOL is_elem_node(nsIDOMNode *node) return type == ELEMENT_NODE || type == COMMENT_NODE; }
-static inline HTMLElementCollectionEnum *impl_from_IEnumVARIANT(IEnumVARIANT *iface) -{ - return CONTAINING_RECORD(iface, HTMLElementCollectionEnum, IEnumVARIANT_iface); -} - -static HRESULT WINAPI HTMLElementCollectionEnum_QueryInterface(IEnumVARIANT *iface, REFIID riid, void **ppv) -{ - HTMLElementCollectionEnum *This = impl_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("Unsupported iface %s\n", debugstr_mshtml_guid(riid)); - *ppv = NULL; - return E_NOINTERFACE; - } - - IUnknown_AddRef((IUnknown*)*ppv); - return S_OK; -} - -static ULONG WINAPI HTMLElementCollectionEnum_AddRef(IEnumVARIANT *iface) -{ - HTMLElementCollectionEnum *This = impl_from_IEnumVARIANT(iface); - LONG ref = InterlockedIncrement(&This->ref); - - TRACE("(%p) ref=%ld\n", This, ref); - - return ref; -} - -static ULONG WINAPI HTMLElementCollectionEnum_Release(IEnumVARIANT *iface) -{ - HTMLElementCollectionEnum *This = impl_from_IEnumVARIANT(iface); - LONG ref = InterlockedDecrement(&This->ref); - - TRACE("(%p) ref=%ld\n", This, ref); - - if(!ref) { - IHTMLElementCollection_Release(&This->col->IHTMLElementCollection_iface); - free(This); - } - - return ref; -} - -static HRESULT WINAPI HTMLElementCollectionEnum_Next(IEnumVARIANT *iface, ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched) -{ - HTMLElementCollectionEnum *This = impl_from_IEnumVARIANT(iface); - ULONG fetched = 0; - - TRACE("(%p)->(%ld %p %p)\n", This, celt, rgVar, pCeltFetched); - - while(This->iter+fetched < This->col->len && fetched < celt) { - V_VT(rgVar+fetched) = VT_DISPATCH; - V_DISPATCH(rgVar+fetched) = (IDispatch*)&This->col->elems[This->iter+fetched]->IHTMLElement_iface; - IDispatch_AddRef(V_DISPATCH(rgVar+fetched)); - fetched++; - } - - This->iter += fetched; - if(pCeltFetched) - *pCeltFetched = fetched; - return fetched == celt ? S_OK : S_FALSE; -} - -static HRESULT WINAPI HTMLElementCollectionEnum_Skip(IEnumVARIANT *iface, ULONG celt) -{ - HTMLElementCollectionEnum *This = impl_from_IEnumVARIANT(iface); - - TRACE("(%p)->(%ld)\n", This, celt); - - if(This->iter + celt > This->col->len) { - This->iter = This->col->len; - return S_FALSE; - } - - This->iter += celt; - return S_OK; -} - -static HRESULT WINAPI HTMLElementCollectionEnum_Reset(IEnumVARIANT *iface) -{ - HTMLElementCollectionEnum *This = impl_from_IEnumVARIANT(iface); - - TRACE("(%p)->()\n", This); - - This->iter = 0; - return S_OK; -} - -static HRESULT WINAPI HTMLElementCollectionEnum_Clone(IEnumVARIANT *iface, IEnumVARIANT **ppEnum) -{ - HTMLElementCollectionEnum *This = impl_from_IEnumVARIANT(iface); - FIXME("(%p)->(%p)\n", This, ppEnum); - return E_NOTIMPL; -} - -static const IEnumVARIANTVtbl HTMLElementCollectionEnumVtbl = { - HTMLElementCollectionEnum_QueryInterface, - HTMLElementCollectionEnum_AddRef, - HTMLElementCollectionEnum_Release, - HTMLElementCollectionEnum_Next, - HTMLElementCollectionEnum_Skip, - HTMLElementCollectionEnum_Reset, - HTMLElementCollectionEnum_Clone -}; - static inline HTMLElementCollection *impl_from_IHTMLElementCollection(IHTMLElementCollection *iface) { return CONTAINING_RECORD(iface, HTMLElementCollection, IHTMLElementCollection_iface); @@ -246,23 +125,10 @@ static HRESULT WINAPI HTMLElementCollection_get__newEnum(IHTMLElementCollection IUnknown **p) { HTMLElementCollection *This = impl_from_IHTMLElementCollection(iface); - HTMLElementCollectionEnum *ret;
TRACE("(%p)->(%p)\n", This, p);
- ret = malloc(sizeof(*ret)); - if(!ret) - return E_OUTOFMEMORY; - - ret->IEnumVARIANT_iface.lpVtbl = &HTMLElementCollectionEnumVtbl; - ret->ref = 1; - ret->iter = 0; - - IHTMLElementCollection_AddRef(&This->IHTMLElementCollection_iface); - ret->col = This; - - *p = (IUnknown*)&ret->IEnumVARIANT_iface; - return S_OK; + return CollectionEnum_create(&This->dispex, p); }
static BOOL is_elem_id(HTMLElement *elem, LPCWSTR name) @@ -559,6 +425,22 @@ static HRESULT HTMLElementCollection_invoke(DispatchEx *dispex, DISPID id, LCID return S_OK; }
+static ULONG HTMLElementCollection_collection_len(DispatchEx *dispex) +{ + HTMLElementCollection *This = impl_from_DispatchEx(dispex); + + return This->len; +} + +static HRESULT HTMLElementCollection_collection_item(DispatchEx *dispex, ULONG index, IDispatch **p) +{ + HTMLElementCollection *This = impl_from_DispatchEx(dispex); + + *p = (IDispatch*)&This->elems[index]->IHTMLElement_iface; + IDispatch_AddRef(*p); + return S_OK; +} + static const dispex_static_data_vtbl_t HTMLElementColection_dispex_vtbl = { .query_interface = HTMLElementCollection_query_interface, .destructor = HTMLElementCollection_destructor, @@ -567,6 +449,8 @@ static const dispex_static_data_vtbl_t HTMLElementColection_dispex_vtbl = { .get_dispid = HTMLElementCollection_get_dispid, .get_prop_desc = dispex_index_prop_desc, .invoke = HTMLElementCollection_invoke, + .collection_len = HTMLElementCollection_collection_len, + .collection_item = HTMLElementCollection_collection_item, };
static const tid_t HTMLCollection_iface_tids[] = { diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index 6e4a58aee55..ddb4e68fb74 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -360,6 +360,7 @@ typedef struct dispex_dynamic_data_t dispex_dynamic_data_t; #define MSHTML_CUSTOM_DISPID_CNT (MSHTML_DISPID_CUSTOM_MAX-MSHTML_DISPID_CUSTOM_MIN)
typedef struct DispatchEx DispatchEx; +typedef struct CollectionEnum CollectionEnum; typedef struct nsCycleCollectionTraversalCallback nsCycleCollectionTraversalCallback; typedef struct dispex_static_data_t dispex_static_data_t;
@@ -420,6 +421,10 @@ typedef struct {
/* Used by objects that want to return a custom name instead of the one in the dispex static data */ const char *(*get_name)(DispatchEx*); + + /* Used by objects that have a collection of items, required by enumerators */ + ULONG (*collection_len)(DispatchEx*); + HRESULT (*collection_item)(DispatchEx*,ULONG,IDispatch**); } dispex_static_data_vtbl_t;
#define ALL_OBJECTS \ @@ -609,6 +614,16 @@ struct DispatchEx { } \ DISPEX_IDISPATCH_NOUNK_IMPL(prefix, iface_name, dispex)
+struct CollectionEnum { + IEnumVARIANT IEnumVARIANT_iface; + LONG ref; + + DispatchEx *collection; + ULONG iter; +}; + +HRESULT CollectionEnum_create(DispatchEx*,IUnknown**); + typedef struct { void *vtbl; int ref_flags;
 
            From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlnode.c | 196 +++++++---------------------------------- 1 file changed, 33 insertions(+), 163 deletions(-)
diff --git a/dlls/mshtml/htmlnode.c b/dlls/mshtml/htmlnode.c index 0d9a5259935..b4028abf448 100644 --- a/dlls/mshtml/htmlnode.c +++ b/dlls/mshtml/htmlnode.c @@ -43,155 +43,6 @@ typedef struct { nsIDOMNodeList *nslist; } HTMLDOMChildrenCollection;
-typedef struct { - IEnumVARIANT IEnumVARIANT_iface; - - LONG ref; - - ULONG iter; - HTMLDOMChildrenCollection *col; -} HTMLDOMChildrenCollectionEnum; - -static inline HTMLDOMChildrenCollectionEnum *impl_from_IEnumVARIANT(IEnumVARIANT *iface) -{ - return CONTAINING_RECORD(iface, HTMLDOMChildrenCollectionEnum, IEnumVARIANT_iface); -} - -static HRESULT WINAPI HTMLDOMChildrenCollectionEnum_QueryInterface(IEnumVARIANT *iface, REFIID riid, void **ppv) -{ - HTMLDOMChildrenCollectionEnum *This = impl_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; -} - -static ULONG WINAPI HTMLDOMChildrenCollectionEnum_AddRef(IEnumVARIANT *iface) -{ - HTMLDOMChildrenCollectionEnum *This = impl_from_IEnumVARIANT(iface); - LONG ref = InterlockedIncrement(&This->ref); - - TRACE("(%p) ref=%ld\n", This, ref); - - return ref; -} - -static ULONG WINAPI HTMLDOMChildrenCollectionEnum_Release(IEnumVARIANT *iface) -{ - HTMLDOMChildrenCollectionEnum *This = impl_from_IEnumVARIANT(iface); - LONG ref = InterlockedDecrement(&This->ref); - - TRACE("(%p) ref=%ld\n", This, ref); - - if(!ref) { - IHTMLDOMChildrenCollection_Release(&This->col->IHTMLDOMChildrenCollection_iface); - free(This); - } - - return ref; -} - -static ULONG get_enum_len(HTMLDOMChildrenCollectionEnum *This) -{ - UINT32 len; - nsresult nsres; - - nsres = nsIDOMNodeList_GetLength(This->col->nslist, &len); - assert(nsres == NS_OK); - return len; -} - -static HRESULT WINAPI HTMLDOMChildrenCollectionEnum_Next(IEnumVARIANT *iface, ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched) -{ - HTMLDOMChildrenCollectionEnum *This = impl_from_IEnumVARIANT(iface); - ULONG fetched = 0, len; - nsIDOMNode *nsnode; - HTMLDOMNode *node; - nsresult nsres; - HRESULT hres; - - TRACE("(%p)->(%ld %p %p)\n", This, celt, rgVar, pCeltFetched); - - len = get_enum_len(This); - - while(This->iter+fetched < len && fetched < celt) { - nsres = nsIDOMNodeList_Item(This->col->nslist, This->iter+fetched, &nsnode); - assert(nsres == NS_OK); - - hres = get_node(nsnode, TRUE, &node); - nsIDOMNode_Release(nsnode); - if(FAILED(hres)) { - while(fetched--) - VariantClear(rgVar+fetched); - return hres; - } - - V_VT(rgVar+fetched) = VT_DISPATCH; - V_DISPATCH(rgVar+fetched) = (IDispatch*)&node->IHTMLDOMNode_iface; - fetched++; - } - - This->iter += fetched; - if(pCeltFetched) - *pCeltFetched = fetched; - return fetched == celt ? S_OK : S_FALSE; -} - -static HRESULT WINAPI HTMLDOMChildrenCollectionEnum_Skip(IEnumVARIANT *iface, ULONG celt) -{ - HTMLDOMChildrenCollectionEnum *This = impl_from_IEnumVARIANT(iface); - ULONG len; - - TRACE("(%p)->(%ld)\n", This, celt); - - len = get_enum_len(This); - if(This->iter + celt > len) { - This->iter = len; - return S_FALSE; - } - - This->iter += celt; - return S_OK; -} - -static HRESULT WINAPI HTMLDOMChildrenCollectionEnum_Reset(IEnumVARIANT *iface) -{ - HTMLDOMChildrenCollectionEnum *This = impl_from_IEnumVARIANT(iface); - - TRACE("(%p)->()\n", This); - - This->iter = 0; - return S_OK; -} - -static HRESULT WINAPI HTMLDOMChildrenCollectionEnum_Clone(IEnumVARIANT *iface, IEnumVARIANT **ppEnum) -{ - HTMLDOMChildrenCollectionEnum *This = impl_from_IEnumVARIANT(iface); - FIXME("(%p)->(%p)\n", This, ppEnum); - return E_NOTIMPL; -} - -static const IEnumVARIANTVtbl HTMLDOMChildrenCollectionEnumVtbl = { - HTMLDOMChildrenCollectionEnum_QueryInterface, - HTMLDOMChildrenCollectionEnum_AddRef, - HTMLDOMChildrenCollectionEnum_Release, - HTMLDOMChildrenCollectionEnum_Next, - HTMLDOMChildrenCollectionEnum_Skip, - HTMLDOMChildrenCollectionEnum_Reset, - HTMLDOMChildrenCollectionEnum_Clone -}; - static inline HTMLDOMChildrenCollection *impl_from_IHTMLDOMChildrenCollection(IHTMLDOMChildrenCollection *iface) { return CONTAINING_RECORD(iface, HTMLDOMChildrenCollection, IHTMLDOMChildrenCollection_iface); @@ -215,23 +66,10 @@ static HRESULT WINAPI HTMLDOMChildrenCollection_get_length(IHTMLDOMChildrenColle static HRESULT WINAPI HTMLDOMChildrenCollection_get__newEnum(IHTMLDOMChildrenCollection *iface, IUnknown **p) { HTMLDOMChildrenCollection *This = impl_from_IHTMLDOMChildrenCollection(iface); - HTMLDOMChildrenCollectionEnum *ret;
TRACE("(%p)->(%p)\n", This, p);
- ret = malloc(sizeof(*ret)); - if(!ret) - return E_OUTOFMEMORY; - - ret->IEnumVARIANT_iface.lpVtbl = &HTMLDOMChildrenCollectionEnumVtbl; - ret->ref = 1; - ret->iter = 0; - - IHTMLDOMChildrenCollection_AddRef(&This->IHTMLDOMChildrenCollection_iface); - ret->col = This; - - *p = (IUnknown*)&ret->IEnumVARIANT_iface; - return S_OK; + return CollectionEnum_create(&This->dispex, p); }
static HRESULT WINAPI HTMLDOMChildrenCollection_item(IHTMLDOMChildrenCollection *iface, LONG index, IDispatch **ppItem) @@ -369,6 +207,36 @@ static HRESULT HTMLDOMChildrenCollection_invoke(DispatchEx *dispex, DISPID id, L return S_OK; }
+static ULONG HTMLDOMChildrenCollection_collection_len(DispatchEx *dispex) +{ + HTMLDOMChildrenCollection *This = impl_from_DispatchEx(dispex); + nsresult nsres; + UINT32 len; + + nsres = nsIDOMNodeList_GetLength(This->nslist, &len); + assert(nsres == NS_OK); + return len; +} + +static HRESULT HTMLDOMChildrenCollection_collection_item(DispatchEx *dispex, ULONG index, IDispatch **p) +{ + HTMLDOMChildrenCollection *This = impl_from_DispatchEx(dispex); + nsIDOMNode *nsnode; + HTMLDOMNode *node; + nsresult nsres; + HRESULT hres; + + nsres = nsIDOMNodeList_Item(This->nslist, index, &nsnode); + if(NS_FAILED(nsres)) + return map_nsresult(nsres); + + hres = get_node(nsnode, TRUE, &node); + nsIDOMNode_Release(nsnode); + if(SUCCEEDED(hres)) + *p = (IDispatch*)&node->IHTMLDOMNode_iface; + return hres; +} + static const dispex_static_data_vtbl_t HTMLDOMChildrenCollection_dispex_vtbl = { .query_interface = HTMLDOMChildrenCollection_query_interface, .destructor = HTMLDOMChildrenCollection_destructor, @@ -377,6 +245,8 @@ static const dispex_static_data_vtbl_t HTMLDOMChildrenCollection_dispex_vtbl = { .get_dispid = HTMLDOMChildrenCollection_get_dispid, .get_prop_desc = dispex_index_prop_desc, .invoke = HTMLDOMChildrenCollection_invoke, + .collection_len = HTMLDOMChildrenCollection_collection_len, + .collection_item = HTMLDOMChildrenCollection_collection_item, };
static const tid_t NodeList_iface_tids[] = {
 
            From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlform.c | 187 ++++++----------------------------------- 1 file changed, 28 insertions(+), 159 deletions(-)
diff --git a/dlls/mshtml/htmlform.c b/dlls/mshtml/htmlform.c index 29986158ca7..c4708c4fae7 100644 --- a/dlls/mshtml/htmlform.c +++ b/dlls/mshtml/htmlform.c @@ -42,15 +42,6 @@ struct HTMLFormElement { nsIDOMHTMLFormElement *nsform; };
-typedef struct { - IEnumVARIANT IEnumVARIANT_iface; - - LONG ref; - - ULONG iter; - HTMLFormElement *elem; -} HTMLFormElementEnum; - HRESULT return_nsform(nsresult nsres, nsIDOMHTMLFormElement *form, IHTMLFormElement **p) { nsIDOMNode *form_node; @@ -118,135 +109,6 @@ static HRESULT htmlform_item(HTMLFormElement *This, int i, IDispatch **ret) return S_OK; }
-static inline HTMLFormElementEnum *impl_from_IEnumVARIANT(IEnumVARIANT *iface) -{ - return CONTAINING_RECORD(iface, HTMLFormElementEnum, IEnumVARIANT_iface); -} - -static HRESULT WINAPI HTMLFormElementEnum_QueryInterface(IEnumVARIANT *iface, REFIID riid, void **ppv) -{ - HTMLFormElementEnum *This = impl_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; -} - -static ULONG WINAPI HTMLFormElementEnum_AddRef(IEnumVARIANT *iface) -{ - HTMLFormElementEnum *This = impl_from_IEnumVARIANT(iface); - LONG ref = InterlockedIncrement(&This->ref); - - TRACE("(%p) ref=%ld\n", This, ref); - - return ref; -} - -static ULONG WINAPI HTMLFormElementEnum_Release(IEnumVARIANT *iface) -{ - HTMLFormElementEnum *This = impl_from_IEnumVARIANT(iface); - LONG ref = InterlockedDecrement(&This->ref); - - TRACE("(%p) ref=%ld\n", This, ref); - - if(!ref) { - IHTMLFormElement_Release(&This->elem->IHTMLFormElement_iface); - free(This); - } - - return ref; -} - -static HRESULT WINAPI HTMLFormElementEnum_Next(IEnumVARIANT *iface, ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched) -{ - HTMLFormElementEnum *This = impl_from_IEnumVARIANT(iface); - nsresult nsres; - HRESULT hres; - ULONG num, i; - LONG len; - - TRACE("(%p)->(%lu %p %p)\n", This, celt, rgVar, pCeltFetched); - - nsres = nsIDOMHTMLFormElement_GetLength(This->elem->nsform, &len); - if(NS_FAILED(nsres)) - return E_FAIL; - num = min(len - This->iter, celt); - - for(i = 0; i < num; i++) { - hres = htmlform_item(This->elem, This->iter + i, &V_DISPATCH(&rgVar[i])); - if(FAILED(hres)) { - while(i--) - VariantClear(&rgVar[i]); - return hres; - } - V_VT(&rgVar[i]) = VT_DISPATCH; - } - - This->iter += num; - if(pCeltFetched) - *pCeltFetched = num; - return num == celt ? S_OK : S_FALSE; -} - -static HRESULT WINAPI HTMLFormElementEnum_Skip(IEnumVARIANT *iface, ULONG celt) -{ - HTMLFormElementEnum *This = impl_from_IEnumVARIANT(iface); - nsresult nsres; - LONG len; - - TRACE("(%p)->(%lu)\n", This, celt); - - nsres = nsIDOMHTMLFormElement_GetLength(This->elem->nsform, &len); - if(NS_FAILED(nsres)) - return E_FAIL; - - if(This->iter + celt > len) { - This->iter = len; - return S_FALSE; - } - - This->iter += celt; - return S_OK; -} - -static HRESULT WINAPI HTMLFormElementEnum_Reset(IEnumVARIANT *iface) -{ - HTMLFormElementEnum *This = impl_from_IEnumVARIANT(iface); - - TRACE("(%p)->()\n", This); - - This->iter = 0; - return S_OK; -} - -static HRESULT WINAPI HTMLFormElementEnum_Clone(IEnumVARIANT *iface, IEnumVARIANT **ppEnum) -{ - HTMLFormElementEnum *This = impl_from_IEnumVARIANT(iface); - FIXME("(%p)->(%p)\n", This, ppEnum); - return E_NOTIMPL; -} - -static const IEnumVARIANTVtbl HTMLFormElementEnumVtbl = { - HTMLFormElementEnum_QueryInterface, - HTMLFormElementEnum_AddRef, - HTMLFormElementEnum_Release, - HTMLFormElementEnum_Next, - HTMLFormElementEnum_Skip, - HTMLFormElementEnum_Reset, - HTMLFormElementEnum_Clone -}; - static inline HTMLFormElement *impl_from_IHTMLFormElement(IHTMLFormElement *iface) { return CONTAINING_RECORD(iface, HTMLFormElement, IHTMLFormElement_iface); @@ -633,23 +495,10 @@ static HRESULT WINAPI HTMLFormElement_get_length(IHTMLFormElement *iface, LONG * static HRESULT WINAPI HTMLFormElement__newEnum(IHTMLFormElement *iface, IUnknown **p) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); - HTMLFormElementEnum *ret;
TRACE("(%p)->(%p)\n", This, p);
- ret = malloc(sizeof(*ret)); - if(!ret) - return E_OUTOFMEMORY; - - ret->IEnumVARIANT_iface.lpVtbl = &HTMLFormElementEnumVtbl; - ret->ref = 1; - ret->iter = 0; - - HTMLFormElement_AddRef(&This->IHTMLFormElement_iface); - ret->elem = This; - - *p = (IUnknown*)&ret->IEnumVARIANT_iface; - return S_OK; + return CollectionEnum_create(&This->element.node.event_target.dispex, p); }
static HRESULT WINAPI HTMLFormElement_item(IHTMLFormElement *iface, VARIANT name, @@ -869,6 +718,24 @@ static HRESULT HTMLFormElement_invoke(DispatchEx *dispex, DISPID id, LCID lcid, return S_OK; }
+static ULONG HTMLFormElement_collection_len(DispatchEx *dispex) +{ + HTMLFormElement *This = impl_from_DispatchEx(dispex); + nsresult nsres; + LONG len; + + nsres = nsIDOMHTMLFormElement_GetLength(This->nsform, &len); + assert(nsres == NS_OK); + return len; +} + +static HRESULT HTMLFormElement_collection_item(DispatchEx *dispex, ULONG index, IDispatch **p) +{ + HTMLFormElement *This = impl_from_DispatchEx(dispex); + + return htmlform_item(This, index, p); +} + static HRESULT HTMLFormElement_handle_event(DispatchEx *dispex, DOMEvent *event, BOOL *prevent_default) { HTMLFormElement *This = impl_from_DispatchEx(dispex); @@ -906,13 +773,15 @@ static void HTMLFormElement_init_dispex_info(dispex_data_t *info, compat_mode_t static const event_target_vtbl_t HTMLFormElement_event_target_vtbl = { { HTMLELEMENT_DISPEX_VTBL_ENTRIES, - .query_interface= HTMLFormElement_query_interface, - .destructor = HTMLElement_destructor, - .traverse = HTMLFormElement_traverse, - .unlink = HTMLFormElement_unlink, - .get_dispid = HTMLFormElement_get_dispid, - .get_prop_desc = dispex_index_prop_desc, - .invoke = HTMLFormElement_invoke + .query_interface = HTMLFormElement_query_interface, + .destructor = HTMLElement_destructor, + .traverse = HTMLFormElement_traverse, + .unlink = HTMLFormElement_unlink, + .get_dispid = HTMLFormElement_get_dispid, + .get_prop_desc = dispex_index_prop_desc, + .invoke = HTMLFormElement_invoke, + .collection_len = HTMLFormElement_collection_len, + .collection_item = HTMLFormElement_collection_item, }, HTMLELEMENT_EVENT_TARGET_VTBL_ENTRIES, .handle_event = HTMLFormElement_handle_event
 
            From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlselect.c | 187 ++++++--------------------------------- 1 file changed, 28 insertions(+), 159 deletions(-)
diff --git a/dlls/mshtml/htmlselect.c b/dlls/mshtml/htmlselect.c index 97a47e38762..ad760300a83 100644 --- a/dlls/mshtml/htmlselect.c +++ b/dlls/mshtml/htmlselect.c @@ -529,15 +529,6 @@ struct HTMLSelectElement { nsIDOMHTMLSelectElement *nsselect; };
-typedef struct { - IEnumVARIANT IEnumVARIANT_iface; - - LONG ref; - - ULONG iter; - HTMLSelectElement *elem; -} HTMLSelectElementEnum; - static inline HTMLSelectElement *impl_from_IHTMLSelectElement(IHTMLSelectElement *iface) { return CONTAINING_RECORD(iface, HTMLSelectElement, IHTMLSelectElement_iface); @@ -578,135 +569,6 @@ static HRESULT htmlselect_item(HTMLSelectElement *This, int i, IDispatch **ret) return S_OK; }
-static inline HTMLSelectElementEnum *impl_from_IEnumVARIANT(IEnumVARIANT *iface) -{ - return CONTAINING_RECORD(iface, HTMLSelectElementEnum, IEnumVARIANT_iface); -} - -static HRESULT WINAPI HTMLSelectElementEnum_QueryInterface(IEnumVARIANT *iface, REFIID riid, void **ppv) -{ - HTMLSelectElementEnum *This = impl_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; -} - -static ULONG WINAPI HTMLSelectElementEnum_AddRef(IEnumVARIANT *iface) -{ - HTMLSelectElementEnum *This = impl_from_IEnumVARIANT(iface); - LONG ref = InterlockedIncrement(&This->ref); - - TRACE("(%p) ref=%ld\n", This, ref); - - return ref; -} - -static ULONG WINAPI HTMLSelectElementEnum_Release(IEnumVARIANT *iface) -{ - HTMLSelectElementEnum *This = impl_from_IEnumVARIANT(iface); - LONG ref = InterlockedDecrement(&This->ref); - - TRACE("(%p) ref=%ld\n", This, ref); - - if(!ref) { - IHTMLSelectElement_Release(&This->elem->IHTMLSelectElement_iface); - free(This); - } - - return ref; -} - -static HRESULT WINAPI HTMLSelectElementEnum_Next(IEnumVARIANT *iface, ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched) -{ - HTMLSelectElementEnum *This = impl_from_IEnumVARIANT(iface); - nsresult nsres; - HRESULT hres; - ULONG num, i; - UINT32 len; - - TRACE("(%p)->(%lu %p %p)\n", This, celt, rgVar, pCeltFetched); - - nsres = nsIDOMHTMLSelectElement_GetLength(This->elem->nsselect, &len); - if(NS_FAILED(nsres)) - return E_FAIL; - num = min(len - This->iter, celt); - - for(i = 0; i < num; i++) { - hres = htmlselect_item(This->elem, This->iter + i, &V_DISPATCH(&rgVar[i])); - if(FAILED(hres)) { - while(i--) - VariantClear(&rgVar[i]); - return hres; - } - V_VT(&rgVar[i]) = VT_DISPATCH; - } - - This->iter += num; - if(pCeltFetched) - *pCeltFetched = num; - return num == celt ? S_OK : S_FALSE; -} - -static HRESULT WINAPI HTMLSelectElementEnum_Skip(IEnumVARIANT *iface, ULONG celt) -{ - HTMLSelectElementEnum *This = impl_from_IEnumVARIANT(iface); - nsresult nsres; - UINT32 len; - - TRACE("(%p)->(%lu)\n", This, celt); - - nsres = nsIDOMHTMLSelectElement_GetLength(This->elem->nsselect, &len); - if(NS_FAILED(nsres)) - return E_FAIL; - - if(This->iter + celt > len) { - This->iter = len; - return S_FALSE; - } - - This->iter += celt; - return S_OK; -} - -static HRESULT WINAPI HTMLSelectElementEnum_Reset(IEnumVARIANT *iface) -{ - HTMLSelectElementEnum *This = impl_from_IEnumVARIANT(iface); - - TRACE("(%p)->()\n", This); - - This->iter = 0; - return S_OK; -} - -static HRESULT WINAPI HTMLSelectElementEnum_Clone(IEnumVARIANT *iface, IEnumVARIANT **ppEnum) -{ - HTMLSelectElementEnum *This = impl_from_IEnumVARIANT(iface); - FIXME("(%p)->(%p)\n", This, ppEnum); - return E_NOTIMPL; -} - -static const IEnumVARIANTVtbl HTMLSelectElementEnumVtbl = { - HTMLSelectElementEnum_QueryInterface, - HTMLSelectElementEnum_AddRef, - HTMLSelectElementEnum_Release, - HTMLSelectElementEnum_Next, - HTMLSelectElementEnum_Skip, - HTMLSelectElementEnum_Reset, - HTMLSelectElementEnum_Clone -}; - DISPEX_IDISPATCH_IMPL(HTMLSelectElement, IHTMLSelectElement, impl_from_IHTMLSelectElement(iface)->element.node.event_target.dispex)
@@ -1055,23 +917,10 @@ static HRESULT WINAPI HTMLSelectElement_get_length(IHTMLSelectElement *iface, LO static HRESULT WINAPI HTMLSelectElement_get__newEnum(IHTMLSelectElement *iface, IUnknown **p) { HTMLSelectElement *This = impl_from_IHTMLSelectElement(iface); - HTMLSelectElementEnum *ret;
TRACE("(%p)->(%p)\n", This, p);
- ret = malloc(sizeof(*ret)); - if(!ret) - return E_OUTOFMEMORY; - - ret->IEnumVARIANT_iface.lpVtbl = &HTMLSelectElementEnumVtbl; - ret->ref = 1; - ret->iter = 0; - - HTMLSelectElement_AddRef(&This->IHTMLSelectElement_iface); - ret->elem = This; - - *p = (IUnknown*)&ret->IEnumVARIANT_iface; - return S_OK; + return CollectionEnum_create(&This->element.node.event_target.dispex, p); }
static HRESULT WINAPI HTMLSelectElement_item(IHTMLSelectElement *iface, VARIANT name, @@ -1239,6 +1088,24 @@ static HRESULT HTMLSelectElement_invoke(DispatchEx *dispex, DISPID id, LCID lcid return S_OK; }
+static ULONG HTMLSelectElement_collection_len(DispatchEx *dispex) +{ + HTMLSelectElement *This = impl_from_DispatchEx(dispex); + nsresult nsres; + UINT32 len; + + nsres = nsIDOMHTMLSelectElement_GetLength(This->nsselect, &len); + assert(nsres == NS_OK); + return len; +} + +static HRESULT HTMLSelectElement_collection_item(DispatchEx *dispex, ULONG index, IDispatch **p) +{ + HTMLSelectElement *This = impl_from_DispatchEx(dispex); + + return htmlselect_item(This, index, p); +} + static const NodeImplVtbl HTMLSelectElementImplVtbl = { .clsid = &CLSID_HTMLSelectElement, .cpc_entries = HTMLElement_cpc, @@ -1267,13 +1134,15 @@ static void HTMLSelectElement_init_dispex_info(dispex_data_t *info, compat_mode_ static const event_target_vtbl_t HTMLSelectElement_event_target_vtbl = { { HTMLELEMENT_DISPEX_VTBL_ENTRIES, - .query_interface= HTMLSelectElement_query_interface, - .destructor = HTMLElement_destructor, - .traverse = HTMLSelectElement_traverse, - .unlink = HTMLSelectElement_unlink, - .get_dispid = HTMLSelectElement_get_dispid, - .get_prop_desc = dispex_index_prop_desc, - .invoke = HTMLSelectElement_invoke + .query_interface = HTMLSelectElement_query_interface, + .destructor = HTMLElement_destructor, + .traverse = HTMLSelectElement_traverse, + .unlink = HTMLSelectElement_unlink, + .get_dispid = HTMLSelectElement_get_dispid, + .get_prop_desc = dispex_index_prop_desc, + .invoke = HTMLSelectElement_invoke, + .collection_len = HTMLSelectElement_collection_len, + .collection_item = HTMLSelectElement_collection_item, }, HTMLELEMENT_EVENT_TARGET_VTBL_ENTRIES, .handle_event = HTMLElement_handle_event
 
            From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlelem.c | 181 ++++++++--------------------------------- 1 file changed, 34 insertions(+), 147 deletions(-)
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index 354f521697c..e5e6697eb43 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -815,139 +815,6 @@ typedef struct { nsIDOMClientRectList *rect_list; } HTMLRectCollection;
-typedef struct { - IEnumVARIANT IEnumVARIANT_iface; - - LONG ref; - - ULONG iter; - HTMLRectCollection *col; -} HTMLRectCollectionEnum; - -static inline HTMLRectCollectionEnum *HTMLRectCollectionEnum_from_IEnumVARIANT(IEnumVARIANT *iface) -{ - return CONTAINING_RECORD(iface, HTMLRectCollectionEnum, IEnumVARIANT_iface); -} - -static HRESULT WINAPI HTMLRectCollectionEnum_QueryInterface(IEnumVARIANT *iface, REFIID riid, void **ppv) -{ - HTMLRectCollectionEnum *This = HTMLRectCollectionEnum_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; -} - -static ULONG WINAPI HTMLRectCollectionEnum_AddRef(IEnumVARIANT *iface) -{ - HTMLRectCollectionEnum *This = HTMLRectCollectionEnum_from_IEnumVARIANT(iface); - LONG ref = InterlockedIncrement(&This->ref); - - TRACE("(%p) ref=%ld\n", This, ref); - - return ref; -} - -static ULONG WINAPI HTMLRectCollectionEnum_Release(IEnumVARIANT *iface) -{ - HTMLRectCollectionEnum *This = HTMLRectCollectionEnum_from_IEnumVARIANT(iface); - LONG ref = InterlockedDecrement(&This->ref); - - TRACE("(%p) ref=%ld\n", This, ref); - - if(!ref) { - IHTMLRectCollection_Release(&This->col->IHTMLRectCollection_iface); - free(This); - } - - return ref; -} - -static HRESULT WINAPI HTMLRectCollectionEnum_Next(IEnumVARIANT *iface, ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched) -{ - HTMLRectCollectionEnum *This = HTMLRectCollectionEnum_from_IEnumVARIANT(iface); - VARIANT index; - HRESULT hres; - ULONG num, i; - UINT32 len; - - TRACE("(%p)->(%lu %p %p)\n", This, celt, rgVar, pCeltFetched); - - nsIDOMClientRectList_GetLength(This->col->rect_list, &len); - num = min(len - This->iter, celt); - V_VT(&index) = VT_I4; - - for(i = 0; i < num; i++) { - V_I4(&index) = This->iter + i; - hres = IHTMLRectCollection_item(&This->col->IHTMLRectCollection_iface, &index, &rgVar[i]); - if(FAILED(hres)) { - while(i--) - VariantClear(&rgVar[i]); - return hres; - } - } - - This->iter += num; - if(pCeltFetched) - *pCeltFetched = num; - return num == celt ? S_OK : S_FALSE; -} - -static HRESULT WINAPI HTMLRectCollectionEnum_Skip(IEnumVARIANT *iface, ULONG celt) -{ - HTMLRectCollectionEnum *This = HTMLRectCollectionEnum_from_IEnumVARIANT(iface); - UINT32 len; - - TRACE("(%p)->(%lu)\n", This, celt); - - nsIDOMClientRectList_GetLength(This->col->rect_list, &len); - if(This->iter + celt > len) { - This->iter = len; - return S_FALSE; - } - - This->iter += celt; - return S_OK; -} - -static HRESULT WINAPI HTMLRectCollectionEnum_Reset(IEnumVARIANT *iface) -{ - HTMLRectCollectionEnum *This = HTMLRectCollectionEnum_from_IEnumVARIANT(iface); - - TRACE("(%p)->()\n", This); - - This->iter = 0; - return S_OK; -} - -static HRESULT WINAPI HTMLRectCollectionEnum_Clone(IEnumVARIANT *iface, IEnumVARIANT **ppEnum) -{ - HTMLRectCollectionEnum *This = HTMLRectCollectionEnum_from_IEnumVARIANT(iface); - FIXME("(%p)->(%p)\n", This, ppEnum); - return E_NOTIMPL; -} - -static const IEnumVARIANTVtbl HTMLRectCollectionEnumVtbl = { - HTMLRectCollectionEnum_QueryInterface, - HTMLRectCollectionEnum_AddRef, - HTMLRectCollectionEnum_Release, - HTMLRectCollectionEnum_Next, - HTMLRectCollectionEnum_Skip, - HTMLRectCollectionEnum_Reset, - HTMLRectCollectionEnum_Clone -}; - static inline HTMLRectCollection *impl_from_IHTMLRectCollection(IHTMLRectCollection *iface) { return CONTAINING_RECORD(iface, HTMLRectCollection, IHTMLRectCollection_iface); @@ -972,23 +839,10 @@ static HRESULT WINAPI HTMLRectCollection_get_length(IHTMLRectCollection *iface, static HRESULT WINAPI HTMLRectCollection_get__newEnum(IHTMLRectCollection *iface, IUnknown **p) { HTMLRectCollection *This = impl_from_IHTMLRectCollection(iface); - HTMLRectCollectionEnum *ret;
TRACE("(%p)->(%p)\n", This, p);
- ret = malloc(sizeof(*ret)); - if(!ret) - return E_OUTOFMEMORY; - - ret->IEnumVARIANT_iface.lpVtbl = &HTMLRectCollectionEnumVtbl; - ret->ref = 1; - ret->iter = 0; - - HTMLRectCollection_AddRef(&This->IHTMLRectCollection_iface); - ret->col = This; - - *p = (IUnknown*)&ret->IEnumVARIANT_iface; - return S_OK; + return CollectionEnum_create(&This->dispex, p); }
static HRESULT WINAPI HTMLRectCollection_item(IHTMLRectCollection *iface, VARIANT *index, VARIANT *result) @@ -1130,6 +984,37 @@ static HRESULT HTMLRectCollection_invoke(DispatchEx *dispex, DISPID id, LCID lci return S_OK; }
+static ULONG HTMLRectCollection_collection_len(DispatchEx *dispex) +{ + HTMLRectCollection *This = HTMLRectCollection_from_DispatchEx(dispex); + nsresult nsres; + UINT32 len; + + nsres = nsIDOMClientRectList_GetLength(This->rect_list, &len); + assert(nsres == NS_OK); + return len; +} + +static HRESULT HTMLRectCollection_collection_item(DispatchEx *dispex, ULONG index, IDispatch **p) +{ + HTMLRectCollection *This = HTMLRectCollection_from_DispatchEx(dispex); + nsIDOMClientRect *nsrect; + nsresult nsres; + HRESULT hres; + + nsres = nsIDOMClientRectList_Item(This->rect_list, index, &nsrect); + if(NS_FAILED(nsres)) + return map_nsresult(nsres); + if(!nsrect) { + *p = NULL; + return S_OK; + } + + hres = create_html_rect(nsrect, &This->dispex, (IHTMLRect**)p); + nsIDOMClientRect_Release(nsrect); + return hres; +} + static const dispex_static_data_vtbl_t HTMLRectCollection_dispex_vtbl = { .query_interface = HTMLRectCollection_query_interface, .destructor = HTMLRectCollection_destructor, @@ -1138,6 +1023,8 @@ static const dispex_static_data_vtbl_t HTMLRectCollection_dispex_vtbl = { .get_dispid = HTMLRectCollection_get_dispid, .get_prop_desc = dispex_index_prop_desc, .invoke = HTMLRectCollection_invoke, + .collection_len = HTMLRectCollection_collection_len, + .collection_item = HTMLRectCollection_collection_item, }; static const tid_t ClientRectList_iface_tids[] = { IHTMLRectCollection_tid,
 
            From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlstylesheet.c | 181 +++++++---------------------------- 1 file changed, 33 insertions(+), 148 deletions(-)
diff --git a/dlls/mshtml/htmlstylesheet.c b/dlls/mshtml/htmlstylesheet.c index fb9d71f894f..6a677b9d167 100644 --- a/dlls/mshtml/htmlstylesheet.c +++ b/dlls/mshtml/htmlstylesheet.c @@ -47,15 +47,6 @@ struct HTMLStyleSheetsCollection { nsIDOMStyleSheetList *nslist; };
-typedef struct { - IEnumVARIANT IEnumVARIANT_iface; - - LONG ref; - - ULONG iter; - HTMLStyleSheetsCollection *col; -} HTMLStyleSheetsCollectionEnum; - struct HTMLStyleSheetRulesCollection { DispatchEx dispex; IHTMLStyleSheetRulesCollection IHTMLStyleSheetRulesCollection_iface; @@ -399,130 +390,6 @@ static HRESULT create_style_sheet_rules_collection(nsIDOMCSSRuleList *nslist, Di return S_OK; }
-static inline HTMLStyleSheetsCollectionEnum *HTMLStyleSheetsCollectionEnum_from_IEnumVARIANT(IEnumVARIANT *iface) -{ - return CONTAINING_RECORD(iface, HTMLStyleSheetsCollectionEnum, IEnumVARIANT_iface); -} - -static HRESULT WINAPI HTMLStyleSheetsCollectionEnum_QueryInterface(IEnumVARIANT *iface, REFIID riid, void **ppv) -{ - HTMLStyleSheetsCollectionEnum *This = HTMLStyleSheetsCollectionEnum_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; -} - -static ULONG WINAPI HTMLStyleSheetsCollectionEnum_AddRef(IEnumVARIANT *iface) -{ - HTMLStyleSheetsCollectionEnum *This = HTMLStyleSheetsCollectionEnum_from_IEnumVARIANT(iface); - LONG ref = InterlockedIncrement(&This->ref); - - TRACE("(%p) ref=%ld\n", This, ref); - - return ref; -} - -static ULONG WINAPI HTMLStyleSheetsCollectionEnum_Release(IEnumVARIANT *iface) -{ - HTMLStyleSheetsCollectionEnum *This = HTMLStyleSheetsCollectionEnum_from_IEnumVARIANT(iface); - LONG ref = InterlockedDecrement(&This->ref); - - TRACE("(%p) ref=%ld\n", This, ref); - - if(!ref) { - IHTMLStyleSheetsCollection_Release(&This->col->IHTMLStyleSheetsCollection_iface); - free(This); - } - - return ref; -} - -static HRESULT WINAPI HTMLStyleSheetsCollectionEnum_Next(IEnumVARIANT *iface, ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched) -{ - HTMLStyleSheetsCollectionEnum *This = HTMLStyleSheetsCollectionEnum_from_IEnumVARIANT(iface); - VARIANT index; - HRESULT hres; - ULONG num, i; - UINT32 len; - - TRACE("(%p)->(%lu %p %p)\n", This, celt, rgVar, pCeltFetched); - - nsIDOMStyleSheetList_GetLength(This->col->nslist, &len); - num = min(len - This->iter, celt); - V_VT(&index) = VT_I4; - - for(i = 0; i < num; i++) { - V_I4(&index) = This->iter + i; - hres = IHTMLStyleSheetsCollection_item(&This->col->IHTMLStyleSheetsCollection_iface, &index, &rgVar[i]); - if(FAILED(hres)) { - while(i--) - VariantClear(&rgVar[i]); - return hres; - } - } - - This->iter += num; - if(pCeltFetched) - *pCeltFetched = num; - return num == celt ? S_OK : S_FALSE; -} - -static HRESULT WINAPI HTMLStyleSheetsCollectionEnum_Skip(IEnumVARIANT *iface, ULONG celt) -{ - HTMLStyleSheetsCollectionEnum *This = HTMLStyleSheetsCollectionEnum_from_IEnumVARIANT(iface); - UINT32 len; - - TRACE("(%p)->(%lu)\n", This, celt); - - nsIDOMStyleSheetList_GetLength(This->col->nslist, &len); - if(This->iter + celt > len) { - This->iter = len; - return S_FALSE; - } - - This->iter += celt; - return S_OK; -} - -static HRESULT WINAPI HTMLStyleSheetsCollectionEnum_Reset(IEnumVARIANT *iface) -{ - HTMLStyleSheetsCollectionEnum *This = HTMLStyleSheetsCollectionEnum_from_IEnumVARIANT(iface); - - TRACE("(%p)->()\n", This); - - This->iter = 0; - return S_OK; -} - -static HRESULT WINAPI HTMLStyleSheetsCollectionEnum_Clone(IEnumVARIANT *iface, IEnumVARIANT **ppEnum) -{ - HTMLStyleSheetsCollectionEnum *This = HTMLStyleSheetsCollectionEnum_from_IEnumVARIANT(iface); - FIXME("(%p)->(%p)\n", This, ppEnum); - return E_NOTIMPL; -} - -static const IEnumVARIANTVtbl HTMLStyleSheetsCollectionEnumVtbl = { - HTMLStyleSheetsCollectionEnum_QueryInterface, - HTMLStyleSheetsCollectionEnum_AddRef, - HTMLStyleSheetsCollectionEnum_Release, - HTMLStyleSheetsCollectionEnum_Next, - HTMLStyleSheetsCollectionEnum_Skip, - HTMLStyleSheetsCollectionEnum_Reset, - HTMLStyleSheetsCollectionEnum_Clone -}; - static inline HTMLStyleSheetsCollection *impl_from_IHTMLStyleSheetsCollection(IHTMLStyleSheetsCollection *iface) { return CONTAINING_RECORD(iface, HTMLStyleSheetsCollection, IHTMLStyleSheetsCollection_iface); @@ -550,23 +417,10 @@ static HRESULT WINAPI HTMLStyleSheetsCollection_get__newEnum(IHTMLStyleSheetsCol IUnknown **p) { HTMLStyleSheetsCollection *This = impl_from_IHTMLStyleSheetsCollection(iface); - HTMLStyleSheetsCollectionEnum *ret;
TRACE("(%p)->(%p)\n", This, p);
- ret = malloc(sizeof(*ret)); - if(!ret) - return E_OUTOFMEMORY; - - ret->IEnumVARIANT_iface.lpVtbl = &HTMLStyleSheetsCollectionEnumVtbl; - ret->ref = 1; - ret->iter = 0; - - HTMLStyleSheetsCollection_AddRef(&This->IHTMLStyleSheetsCollection_iface); - ret->col = This; - - *p = (IUnknown*)&ret->IEnumVARIANT_iface; - return S_OK; + return CollectionEnum_create(&This->dispex, p); }
static HRESULT WINAPI HTMLStyleSheetsCollection_item(IHTMLStyleSheetsCollection *iface, @@ -721,6 +575,35 @@ static HRESULT HTMLStyleSheetsCollection_invoke(DispatchEx *dispex, DISPID id, L return S_OK; }
+static ULONG HTMLStyleSheetsCollection_collection_len(DispatchEx *dispex) +{ + HTMLStyleSheetsCollection *This = HTMLStyleSheetsCollection_from_DispatchEx(dispex); + nsresult nsres; + UINT32 len; + + nsres = nsIDOMStyleSheetList_GetLength(This->nslist, &len); + assert(nsres == NS_OK); + return len; +} + +static HRESULT HTMLStyleSheetsCollection_collection_item(DispatchEx *dispex, ULONG index, IDispatch **p) +{ + HTMLStyleSheetsCollection *This = HTMLStyleSheetsCollection_from_DispatchEx(dispex); + nsIDOMStyleSheet *nsstylesheet; + nsresult nsres; + HRESULT hres; + + nsres = nsIDOMStyleSheetList_Item(This->nslist, index, &nsstylesheet); + if(NS_FAILED(nsres)) + return map_nsresult(nsres); + if(!nsstylesheet) + return E_INVALIDARG; + + hres = create_style_sheet(nsstylesheet, &This->dispex, (IHTMLStyleSheet**)p); + nsIDOMStyleSheet_Release(nsstylesheet); + return hres; +} + static const dispex_static_data_vtbl_t StyleSheetList_dispex_vtbl = { .query_interface = HTMLStyleSheetsCollection_query_interface, .destructor = HTMLStyleSheetsCollection_destructor, @@ -728,7 +611,9 @@ static const dispex_static_data_vtbl_t StyleSheetList_dispex_vtbl = { .unlink = HTMLStyleSheetsCollection_unlink, .get_dispid = HTMLStyleSheetsCollection_get_dispid, .get_prop_desc = dispex_index_prop_desc, - .invoke = HTMLStyleSheetsCollection_invoke + .invoke = HTMLStyleSheetsCollection_invoke, + .collection_len = HTMLStyleSheetsCollection_collection_len, + .collection_item = HTMLStyleSheetsCollection_collection_item, }; static const tid_t StyleSheetList_iface_tids[] = { IHTMLStyleSheetsCollection_tid,
 
            From: Gabriel Ivăncescu gabrielopcode@gmail.com
Signed-off-by: Gabriel Ivăncescu gabrielopcode@gmail.com --- dlls/mshtml/htmlelem.c | 196 ++++++----------------------------------- 1 file changed, 25 insertions(+), 171 deletions(-)
diff --git a/dlls/mshtml/htmlelem.c b/dlls/mshtml/htmlelem.c index e5e6697eb43..7bf649d23e6 100644 --- a/dlls/mshtml/htmlelem.c +++ b/dlls/mshtml/htmlelem.c @@ -7725,9 +7725,9 @@ static inline BOOL is_valid_attr_dispid(HTMLAttributeCollection *col, DISPID id) return TRUE; }
-static HRESULT get_attr_dispid_by_relative_idx(HTMLAttributeCollection *This, LONG *idx, DISPID start, DISPID *dispid) +static HRESULT get_attr_dispid_by_idx(HTMLAttributeCollection *This, LONG *idx, DISPID *dispid) { - DISPID id = start; + DISPID id = DISPID_STARTENUM; LONG len = -1; HRESULT hres;
@@ -7756,11 +7756,6 @@ static HRESULT get_attr_dispid_by_relative_idx(HTMLAttributeCollection *This, LO return S_OK; }
-static HRESULT get_attr_dispid_by_idx(HTMLAttributeCollection *This, LONG *idx, DISPID *dispid) -{ - return get_attr_dispid_by_relative_idx(This, idx, DISPID_STARTENUM, dispid); -} - static inline HRESULT get_attr_dispid_by_name(HTMLAttributeCollection *This, const WCHAR *name, DISPID *id) { HRESULT hres; @@ -7795,156 +7790,6 @@ static inline HRESULT get_domattr(HTMLAttributeCollection *This, DISPID id, LONG return S_OK; }
-typedef struct { - IEnumVARIANT IEnumVARIANT_iface; - - LONG ref; - - 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; -} - -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) -{ - 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; -} - -static HRESULT WINAPI HTMLAttributeCollectionEnum_Next(IEnumVARIANT *iface, ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched) -{ - HTMLAttributeCollectionEnum *This = HTMLAttributeCollectionEnum_from_IEnumVARIANT(iface); - DISPID tmp, dispid = This->iter_dispid; - HTMLDOMAttribute *attr; - LONG rel_index = 0; - HRESULT hres; - ULONG i; - - 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); - if(SUCCEEDED(hres)) { - dispid = tmp; - hres = get_domattr(This->col, dispid, NULL, &attr); - } - else if(hres == DISP_E_UNKNOWNNAME) - break; - - if(FAILED(hres)) { - while(i--) - VariantClear(&rgVar[i]); - return hres; - } - - V_VT(&rgVar[i]) = VT_DISPATCH; - V_DISPATCH(&rgVar[i]) = (IDispatch*)&attr->IHTMLDOMAttribute_iface; - } - - This->iter_dispid = dispid; - if(pCeltFetched) - *pCeltFetched = i; - return i == celt ? S_OK : S_FALSE; -} - -static HRESULT WINAPI HTMLAttributeCollectionEnum_Skip(IEnumVARIANT *iface, ULONG celt) -{ - HTMLAttributeCollectionEnum *This = HTMLAttributeCollectionEnum_from_IEnumVARIANT(iface); - LONG remaining, rel_index; - DISPID dispid; - HRESULT hres; - - TRACE("(%p)->(%lu)\n", This, celt); - - if(!celt) - return S_OK; - - rel_index = -1; - hres = get_attr_dispid_by_relative_idx(This->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); - if(FAILED(hres)) - return hres; - This->iter_dispid = dispid; - } - return celt > remaining ? S_FALSE : S_OK; -} - -static HRESULT WINAPI HTMLAttributeCollectionEnum_Reset(IEnumVARIANT *iface) -{ - HTMLAttributeCollectionEnum *This = HTMLAttributeCollectionEnum_from_IEnumVARIANT(iface); - - TRACE("(%p)->()\n", This); - - This->iter_dispid = DISPID_STARTENUM; - return S_OK; -} - -static HRESULT WINAPI HTMLAttributeCollectionEnum_Clone(IEnumVARIANT *iface, IEnumVARIANT **ppEnum) -{ - HTMLAttributeCollectionEnum *This = HTMLAttributeCollectionEnum_from_IEnumVARIANT(iface); - FIXME("(%p)->(%p)\n", This, ppEnum); - return E_NOTIMPL; -} - -static const IEnumVARIANTVtbl HTMLAttributeCollectionEnumVtbl = { - HTMLAttributeCollectionEnum_QueryInterface, - HTMLAttributeCollectionEnum_AddRef, - HTMLAttributeCollectionEnum_Release, - HTMLAttributeCollectionEnum_Next, - HTMLAttributeCollectionEnum_Skip, - HTMLAttributeCollectionEnum_Reset, - HTMLAttributeCollectionEnum_Clone -}; - /* interface IHTMLAttributeCollection */ static inline HTMLAttributeCollection *impl_from_IHTMLAttributeCollection(IHTMLAttributeCollection *iface) { @@ -7969,23 +7814,10 @@ static HRESULT WINAPI HTMLAttributeCollection_get_length(IHTMLAttributeCollectio static HRESULT WINAPI HTMLAttributeCollection__newEnum(IHTMLAttributeCollection *iface, IUnknown **p) { HTMLAttributeCollection *This = impl_from_IHTMLAttributeCollection(iface); - HTMLAttributeCollectionEnum *ret;
TRACE("(%p)->(%p)\n", This, p);
- ret = malloc(sizeof(*ret)); - 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; - return S_OK; + return CollectionEnum_create(&This->dispex, p); }
static HRESULT WINAPI HTMLAttributeCollection_item(IHTMLAttributeCollection *iface, VARIANT *name, IDispatch **ppItem) @@ -8476,6 +8308,26 @@ static HRESULT HTMLAttributeCollection_invoke(DispatchEx *dispex, DISPID id, LCI } }
+static ULONG HTMLAttributeCollection_collection_len(DispatchEx *dispex) +{ + HTMLAttributeCollection *This = HTMLAttributeCollection_from_DispatchEx(dispex); + LONG idx = -1; + + return SUCCEEDED(get_attr_dispid_by_idx(This, &idx, NULL)) ? idx : 0; +} + +static HRESULT HTMLAttributeCollection_collection_item(DispatchEx *dispex, ULONG index, IDispatch **p) +{ + HTMLAttributeCollection *This = HTMLAttributeCollection_from_DispatchEx(dispex); + IHTMLDOMAttribute *attr; + HRESULT hres; + + hres = IHTMLAttributeCollection3_item(&This->IHTMLAttributeCollection3_iface, index, &attr); + if(SUCCEEDED(hres)) + *p = (IDispatch*)attr; + return hres; +} + static const dispex_static_data_vtbl_t HTMLAttributeCollection_dispex_vtbl = { .query_interface = HTMLAttributeCollection_query_interface, .destructor = HTMLAttributeCollection_destructor, @@ -8484,6 +8336,8 @@ static const dispex_static_data_vtbl_t HTMLAttributeCollection_dispex_vtbl = { .get_dispid = HTMLAttributeCollection_get_dispid, .get_prop_desc = dispex_index_prop_desc, .invoke = HTMLAttributeCollection_invoke, + .collection_len = HTMLAttributeCollection_collection_len, + .collection_item = HTMLAttributeCollection_collection_item, };
static void NamedNodeMap_init_dispex_info(dispex_data_t *info, compat_mode_t mode)
 
            Jacek Caban (@jacek) commented about dlls/mshtml/mshtml_private.h:
} \ DISPEX_IDISPATCH_NOUNK_IMPL(prefix, iface_name, dispex)+struct CollectionEnum {
- IEnumVARIANT IEnumVARIANT_iface;
- LONG ref;
- DispatchEx *collection;
- ULONG iter;
+};
This doesn't need to be in the header, please move it to `dispex.c`. Also something like `EnumVARIANT` for the name would be more descriptive.
 
            Jacek Caban (@jacek) commented about dlls/mshtml/mshtml_private.h:
} \ DISPEX_IDISPATCH_NOUNK_IMPL(prefix, iface_name, dispex)+struct CollectionEnum {
- IEnumVARIANT IEnumVARIANT_iface;
- LONG ref;
- DispatchEx *collection;
- ULONG iter;
+};
+HRESULT CollectionEnum_create(DispatchEx*,IUnknown**);
Maybe `create_enum_variant`.
 
            Jacek Caban (@jacek) commented about dlls/mshtml/htmlnode.c:
+{
- HTMLDOMChildrenCollection *This = impl_from_DispatchEx(dispex);
- nsIDOMNode *nsnode;
- HTMLDOMNode *node;
- nsresult nsres;
- HRESULT hres;
- nsres = nsIDOMNodeList_Item(This->nslist, index, &nsnode);
- if(NS_FAILED(nsres))
return map_nsresult(nsres);- hres = get_node(nsnode, TRUE, &node);
- nsIDOMNode_Release(nsnode);
- if(SUCCEEDED(hres))
*p = (IDispatch*)&node->IHTMLDOMNode_iface;- return hres;
This duplicates `HTMLDOMChildrenCollection_item`. There is similar pattern in a few other patches, please try to avoid that.


