Gabriel Ivăncescu : mshtml: Implement index access for HTMLStyleSheetRulesCollection.
Alexandre Julliard
julliard at winehq.org
Fri Dec 3 15:18:59 CST 2021
Module: wine
Branch: master
Commit: 12ad9b0caf4f12b6aafca30f920bd7ec43025c80
URL: https://source.winehq.org/git/wine.git/?a=commit;h=12ad9b0caf4f12b6aafca30f920bd7ec43025c80
Author: Gabriel Ivăncescu <gabrielopcode at gmail.com>
Date: Fri Dec 3 15:57:36 2021 +0200
mshtml: Implement index access for HTMLStyleSheetRulesCollection.
Signed-off-by: Gabriel Ivăncescu <gabrielopcode at gmail.com>
Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mshtml/htmlstylesheet.c | 73 ++++++++++++++++++++++++++++++++++++++-
dlls/mshtml/tests/documentmode.js | 2 +-
2 files changed, 73 insertions(+), 2 deletions(-)
diff --git a/dlls/mshtml/htmlstylesheet.c b/dlls/mshtml/htmlstylesheet.c
index d82a0890319..3d9b7bb8683 100644
--- a/dlls/mshtml/htmlstylesheet.c
+++ b/dlls/mshtml/htmlstylesheet.c
@@ -375,13 +375,84 @@ static const IHTMLStyleSheetRulesCollectionVtbl HTMLStyleSheetRulesCollectionVtb
HTMLStyleSheetRulesCollection_item
};
+static inline HTMLStyleSheetRulesCollection *HTMLStyleSheetRulesCollection_from_DispatchEx(DispatchEx *iface)
+{
+ return CONTAINING_RECORD(iface, HTMLStyleSheetRulesCollection, dispex);
+}
+
+static HRESULT HTMLStyleSheetRulesCollection_get_dispid(DispatchEx *dispex, BSTR name, DWORD flags, DISPID *dispid)
+{
+ HTMLStyleSheetRulesCollection *This = HTMLStyleSheetRulesCollection_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;
+
+ nsIDOMCSSRuleList_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 HTMLStyleSheetRulesCollection_invoke(DispatchEx *dispex, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params,
+ VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
+{
+ HTMLStyleSheetRulesCollection *This = HTMLStyleSheetRulesCollection_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: {
+ IHTMLStyleSheetRule *stylesheetrule;
+ nsIDOMCSSRule *nsstylesheetrule;
+ nsresult nsres;
+ HRESULT hres;
+
+ nsres = nsIDOMCSSRuleList_Item(This->nslist, id - MSHTML_DISPID_CUSTOM_MIN, &nsstylesheetrule);
+ if(NS_FAILED(nsres))
+ return DISP_E_MEMBERNOTFOUND;
+ if(!nsstylesheetrule) {
+ V_VT(res) = VT_EMPTY;
+ return S_OK;
+ }
+
+ hres = create_style_sheet_rule(nsstylesheetrule, dispex_compat_mode(&This->dispex), &stylesheetrule);
+ nsIDOMCSSRule_Release(nsstylesheetrule);
+ if(FAILED(hres))
+ return hres;
+
+ V_VT(res) = VT_DISPATCH;
+ V_DISPATCH(res) = (IDispatch*)stylesheetrule;
+ break;
+ }
+
+ default:
+ FIXME("unimplemented flags %x\n", flags);
+ return E_NOTIMPL;
+ }
+
+ return S_OK;
+}
+
+static const dispex_static_data_vtbl_t HTMLStyleSheetRulesCollection_dispex_vtbl = {
+ NULL,
+ HTMLStyleSheetRulesCollection_get_dispid,
+ HTMLStyleSheetRulesCollection_invoke
+};
static const tid_t HTMLStyleSheetRulesCollection_iface_tids[] = {
IHTMLStyleSheetRulesCollection_tid,
0
};
static dispex_static_data_t HTMLStyleSheetRulesCollection_dispex = {
L"MSCSSRuleList",
- NULL,
+ &HTMLStyleSheetRulesCollection_dispex_vtbl,
DispHTMLStyleSheetRulesCollection_tid,
HTMLStyleSheetRulesCollection_iface_tids
};
diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js
index 256418679bb..6555e8ba489 100644
--- a/dlls/mshtml/tests/documentmode.js
+++ b/dlls/mshtml/tests/documentmode.js
@@ -226,7 +226,7 @@ sync_test("builtin_toString", function() {
test("sessionStorage", window.sessionStorage, "Storage");
test("style", document.body.style, "MSStyleCSSProperties");
test("styleSheet", sheet, "CSSStyleSheet");
- test("styleSheetRule", sheet.rules.item(0), "CSSStyleRule");
+ test("styleSheetRule", sheet.rules[0], "CSSStyleRule");
test("styleSheetRules", sheet.rules, "MSCSSRuleList");
test("styleSheets", document.styleSheets, "StyleSheetList");
test("textNode", document.createTextNode("testNode"), "Text", v < 9 ? "testNode" : null);
More information about the wine-cvs
mailing list