[PATCH 2/9] mshtml: Implement index access for HTMLStyleSheetsCollection.

Gabriel Ivăncescu gabrielopcode at gmail.com
Fri Dec 3 07:57:35 CST 2021


Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
---
 dlls/mshtml/htmlstylesheet.c | 73 +++++++++++++++++++++++++++++++++++-
 dlls/mshtml/tests/dom.js     |  3 ++
 2 files changed, 75 insertions(+), 1 deletion(-)

diff --git a/dlls/mshtml/htmlstylesheet.c b/dlls/mshtml/htmlstylesheet.c
index c31c780..d82a089 100644
--- a/dlls/mshtml/htmlstylesheet.c
+++ b/dlls/mshtml/htmlstylesheet.c
@@ -576,13 +576,84 @@ static const IHTMLStyleSheetsCollectionVtbl HTMLStyleSheetsCollectionVtbl = {
     HTMLStyleSheetsCollection_item
 };
 
+static inline HTMLStyleSheetsCollection *HTMLStyleSheetsCollection_from_DispatchEx(DispatchEx *iface)
+{
+    return CONTAINING_RECORD(iface, HTMLStyleSheetsCollection, dispex);
+}
+
+static HRESULT HTMLStyleSheetsCollection_get_dispid(DispatchEx *dispex, BSTR name, DWORD flags, DISPID *dispid)
+{
+    HTMLStyleSheetsCollection *This = HTMLStyleSheetsCollection_from_DispatchEx(dispex);
+    UINT32 len = 0;
+    DWORD idx = 0;
+    WCHAR *ptr;
+
+    for(ptr = name; *ptr && is_digit(*ptr); ptr++)
+        idx = idx*10 + (*ptr-'0');
+    if(*ptr)
+        return DISP_E_UNKNOWNNAME;
+
+    nsIDOMStyleSheetList_GetLength(This->nslist, &len);
+    if(idx >= len)
+        return DISP_E_UNKNOWNNAME;
+
+    *dispid = MSHTML_DISPID_CUSTOM_MIN + idx;
+    TRACE("ret %x\n", *dispid);
+    return S_OK;
+}
+
+static HRESULT HTMLStyleSheetsCollection_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params,
+        VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
+{
+    HTMLStyleSheetsCollection *This = HTMLStyleSheetsCollection_from_DispatchEx(dispex);
+
+    TRACE("(%p)->(%x %x %x %p %p %p %p)\n", This, id, lcid, flags, params, res, ei, caller);
+
+    switch(flags) {
+    case DISPATCH_PROPERTYGET: {
+        nsIDOMStyleSheet *nsstylesheet;
+        IHTMLStyleSheet *stylesheet;
+        nsresult nsres;
+        HRESULT hres;
+
+        nsres = nsIDOMStyleSheetList_Item(This->nslist, id - MSHTML_DISPID_CUSTOM_MIN, &nsstylesheet);
+        if(NS_FAILED(nsres))
+            return DISP_E_MEMBERNOTFOUND;
+        if(!nsstylesheet) {
+            V_VT(res) = VT_EMPTY;
+            return S_OK;
+        }
+
+        hres = create_style_sheet(nsstylesheet, dispex_compat_mode(&This->dispex), &stylesheet);
+        nsIDOMStyleSheet_Release(nsstylesheet);
+        if(FAILED(hres))
+            return hres;
+
+        V_VT(res) = VT_DISPATCH;
+        V_DISPATCH(res) = (IDispatch*)stylesheet;
+        break;
+    }
+
+    default:
+        FIXME("unimplemented flags %x\n", flags);
+        return E_NOTIMPL;
+    }
+
+    return S_OK;
+}
+
+static const dispex_static_data_vtbl_t HTMLStyleSheetsCollection_dispex_vtbl = {
+    NULL,
+    HTMLStyleSheetsCollection_get_dispid,
+    HTMLStyleSheetsCollection_invoke
+};
 static const tid_t HTMLStyleSheetsCollection_iface_tids[] = {
     IHTMLStyleSheetsCollection_tid,
     0
 };
 static dispex_static_data_t HTMLStyleSheetsCollection_dispex = {
     L"StyleSheetList",
-    NULL,
+    &HTMLStyleSheetsCollection_dispex_vtbl,
     DispHTMLStyleSheetsCollection_tid,
     HTMLStyleSheetsCollection_iface_tids
 };
diff --git a/dlls/mshtml/tests/dom.js b/dlls/mshtml/tests/dom.js
index e2be697..ed5f72c 100644
--- a/dlls/mshtml/tests/dom.js
+++ b/dlls/mshtml/tests/dom.js
@@ -405,6 +405,9 @@ sync_test("stylesheets", function() {
     ok(typeof(stylesheet.rules.item(0)) === "object",
        "typeof(stylesheet.rules.item(0)) = " + typeof(stylesheet.rules.item(0)));
 
+    stylesheet = document.styleSheets[0];
+    ok(stylesheet.rules.length === 1, "document.styleSheets[0].rules.length = " + stylesheet.rules.length);
+
     try {
         stylesheet.rules.item(1);
         ok(false, "expected exception");
-- 
2.31.1




More information about the wine-devel mailing list