Jacek Caban : mshtml: Initialize HTMLStyleSheet object with compat mode.

Alexandre Julliard julliard at winehq.org
Mon Mar 15 16:59:13 CDT 2021


Module: wine
Branch: master
Commit: f35737a0885f4acd349f85b129aa39dd01a9bd85
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=f35737a0885f4acd349f85b129aa39dd01a9bd85

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Mar 15 16:18:13 2021 +0100

mshtml: Initialize HTMLStyleSheet object with compat mode.

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

---

 dlls/mshtml/htmldoc.c        |  4 ++--
 dlls/mshtml/htmlstyleelem.c  |  7 ++++---
 dlls/mshtml/htmlstylesheet.c | 30 ++++++++++++++++++++----------
 dlls/mshtml/mshtml_private.h |  2 +-
 4 files changed, 27 insertions(+), 16 deletions(-)

diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index 54273f5a6e0..ad3ce941002 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -1733,8 +1733,8 @@ static HRESULT WINAPI HTMLDocument_createStyleSheet(IHTMLDocument2 *iface, BSTR
 
     if(bstrHref && *bstrHref) {
         FIXME("semi-stub for href %s\n", debugstr_w(bstrHref));
-        *ppnewStyleSheet = HTMLStyleSheet_Create(NULL);
-        return S_OK;
+        return create_style_sheet(NULL, dispex_compat_mode(&This->doc_node->node.event_target.dispex),
+                                  ppnewStyleSheet);
     }
 
     hres = create_element(This->doc_node, L"style", &elem);
diff --git a/dlls/mshtml/htmlstyleelem.c b/dlls/mshtml/htmlstyleelem.c
index 14fd8bc8f53..0cb6bac0710 100644
--- a/dlls/mshtml/htmlstyleelem.c
+++ b/dlls/mshtml/htmlstyleelem.c
@@ -198,10 +198,11 @@ static HRESULT WINAPI HTMLStyleElement_get_styleSheet(IHTMLStyleElement *iface,
         assert(nsres == NS_OK);
 
         if(ss) {
-            This->style_sheet = HTMLStyleSheet_Create(ss);
+            HRESULT hres = create_style_sheet(ss, dispex_compat_mode(&This->element.node.event_target.dispex),
+                                              &This->style_sheet);
             nsIDOMStyleSheet_Release(ss);
-            if(!This->style_sheet)
-                return E_OUTOFMEMORY;
+            if(FAILED(hres))
+                return hres;
         }
     }
 
diff --git a/dlls/mshtml/htmlstylesheet.c b/dlls/mshtml/htmlstylesheet.c
index a4e3254100b..8d535a657a9 100644
--- a/dlls/mshtml/htmlstylesheet.c
+++ b/dlls/mshtml/htmlstylesheet.c
@@ -517,7 +517,9 @@ static HRESULT WINAPI HTMLStyleSheetsCollection_item(IHTMLStyleSheetsCollection
     switch(V_VT(pvarIndex)) {
     case VT_I4: {
         nsIDOMStyleSheet *nsstylesheet;
+        IHTMLStyleSheet *stylesheet;
         nsresult nsres;
+        HRESULT hres;
 
         TRACE("index=%d\n", V_I4(pvarIndex));
 
@@ -528,9 +530,12 @@ static HRESULT WINAPI HTMLStyleSheetsCollection_item(IHTMLStyleSheetsCollection
             return E_INVALIDARG;
         }
 
-        V_VT(pvarResult) = VT_DISPATCH;
-        V_DISPATCH(pvarResult) = (IDispatch*)HTMLStyleSheet_Create(nsstylesheet);
+        hres = create_style_sheet(nsstylesheet, dispex_compat_mode(&This->dispex), &stylesheet);
+        if(FAILED(hres))
+            return hres;
 
+        V_VT(pvarResult) = VT_DISPATCH;
+        V_DISPATCH(pvarResult) = (IDispatch*)stylesheet;
         return S_OK;
     }
 
@@ -938,23 +943,28 @@ static dispex_static_data_t HTMLStyleSheet_dispex = {
     HTMLStyleSheet_iface_tids
 };
 
-IHTMLStyleSheet *HTMLStyleSheet_Create(nsIDOMStyleSheet *nsstylesheet)
+HRESULT create_style_sheet(nsIDOMStyleSheet *nsstylesheet, compat_mode_t compat_mode, IHTMLStyleSheet **ret)
 {
-    HTMLStyleSheet *ret = heap_alloc(sizeof(HTMLStyleSheet));
+    HTMLStyleSheet *style_sheet;
     nsresult nsres;
 
-    ret->IHTMLStyleSheet_iface.lpVtbl = &HTMLStyleSheetVtbl;
-    ret->ref = 1;
-    ret->nsstylesheet = NULL;
+    if(!(style_sheet = heap_alloc(sizeof(HTMLStyleSheet))))
+        return E_OUTOFMEMORY;
 
-    init_dispex(&ret->dispex, (IUnknown*)&ret->IHTMLStyleSheet_iface, &HTMLStyleSheet_dispex);
+    style_sheet->IHTMLStyleSheet_iface.lpVtbl = &HTMLStyleSheetVtbl;
+    style_sheet->ref = 1;
+    style_sheet->nsstylesheet = NULL;
+
+    init_dispex_with_compat_mode(&style_sheet->dispex, (IUnknown*)&style_sheet->IHTMLStyleSheet_iface,
+                                 &HTMLStyleSheet_dispex, compat_mode);
 
     if(nsstylesheet) {
         nsres = nsIDOMStyleSheet_QueryInterface(nsstylesheet, &IID_nsIDOMCSSStyleSheet,
-                (void**)&ret->nsstylesheet);
+                (void**)&style_sheet->nsstylesheet);
         if(NS_FAILED(nsres))
             ERR("Could not get nsICSSStyleSheet interface: %08x\n", nsres);
     }
 
-    return &ret->IHTMLStyleSheet_iface;
+    *ret = &style_sheet->IHTMLStyleSheet_iface;
+    return S_OK;
 }
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index be19d98637f..735f9279b04 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -1019,7 +1019,7 @@ HRESULT get_readystate_string(READYSTATE,BSTR*) DECLSPEC_HIDDEN;
 
 HRESULT HTMLSelectionObject_Create(HTMLDocumentNode*,nsISelection*,IHTMLSelectionObject**) DECLSPEC_HIDDEN;
 HRESULT HTMLTxtRange_Create(HTMLDocumentNode*,nsIDOMRange*,IHTMLTxtRange**) DECLSPEC_HIDDEN;
-IHTMLStyleSheet *HTMLStyleSheet_Create(nsIDOMStyleSheet*) DECLSPEC_HIDDEN;
+HRESULT create_style_sheet(nsIDOMStyleSheet*,compat_mode_t,IHTMLStyleSheet**) DECLSPEC_HIDDEN;
 IHTMLStyleSheetsCollection *HTMLStyleSheetsCollection_Create(nsIDOMStyleSheetList*) DECLSPEC_HIDDEN;
 HRESULT HTMLDOMRange_Create(nsIDOMRange*,IHTMLDOMRange**) DECLSPEC_HIDDEN;
 HRESULT create_markup_pointer(IMarkupPointer**) DECLSPEC_HIDDEN;




More information about the wine-cvs mailing list