Jacek Caban : mshtml: Expose IHTMLCSSStyleDeclaration2 to scripts.

Alexandre Julliard julliard at winehq.org
Tue Jun 9 15:27:48 CDT 2020


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Tue Jun  9 16:17:00 2020 +0200

mshtml: Expose IHTMLCSSStyleDeclaration2 to scripts.

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

---

 dlls/mshtml/htmlstyle.c           | 62 +++++++++++++++++++++++++++------------
 dlls/mshtml/tests/documentmode.js |  3 ++
 2 files changed, 46 insertions(+), 19 deletions(-)

diff --git a/dlls/mshtml/htmlstyle.c b/dlls/mshtml/htmlstyle.c
index 022d49993f..0971b22375 100644
--- a/dlls/mshtml/htmlstyle.c
+++ b/dlls/mshtml/htmlstyle.c
@@ -328,6 +328,7 @@ static const WCHAR *overflow_values[] = {
 #define ATTR_HEX_INT        0x0008
 #define ATTR_REMOVE_COMMA   0x0010
 #define ATTR_NO_NULL        0x0020
+#define ATTR_COMPAT_IE10    0x0040
 
 static const WCHAR pxW[] = {'p','x',0};
 
@@ -343,7 +344,8 @@ static const style_tbl_entry_t style_tbl[] = {
     {
         L"animation-name",
         DISPID_IHTMLCSSSTYLEDECLARATION2_ANIMATIONNAME,
-        DISPID_UNKNOWN
+        DISPID_UNKNOWN,
+        ATTR_COMPAT_IE10
     },
     {
         backgroundW,
@@ -551,47 +553,56 @@ static const style_tbl_entry_t style_tbl[] = {
     {
         L"column-count",
         DISPID_IHTMLCSSSTYLEDECLARATION2_COLUMNCOUNT,
-        DISPID_UNKNOWN
+        DISPID_UNKNOWN,
+        ATTR_COMPAT_IE10
     },
     {
         L"column-fill",
         DISPID_IHTMLCSSSTYLEDECLARATION2_COLUMNFILL,
-        DISPID_UNKNOWN
+        DISPID_UNKNOWN,
+        ATTR_COMPAT_IE10
     },
     {
         L"column-gap",
         DISPID_IHTMLCSSSTYLEDECLARATION2_COLUMNGAP,
-        DISPID_UNKNOWN
+        DISPID_UNKNOWN,
+        ATTR_COMPAT_IE10
     },
     {
         L"column-rule",
         DISPID_IHTMLCSSSTYLEDECLARATION2_COLUMNRULE,
-        DISPID_UNKNOWN
+        DISPID_UNKNOWN,
+        ATTR_COMPAT_IE10
     },
     {
         L"column-rule-color",
         DISPID_IHTMLCSSSTYLEDECLARATION2_COLUMNRULECOLOR,
-        DISPID_UNKNOWN
+        DISPID_UNKNOWN,
+        ATTR_COMPAT_IE10
     },
     {
         L"column-rule-style",
         DISPID_IHTMLCSSSTYLEDECLARATION2_COLUMNRULESTYLE,
-        DISPID_UNKNOWN
+        DISPID_UNKNOWN,
+        ATTR_COMPAT_IE10
     },
     {
         L"column-rule-width",
         DISPID_IHTMLCSSSTYLEDECLARATION2_COLUMNRULEWIDTH,
-        DISPID_UNKNOWN
+        DISPID_UNKNOWN,
+        ATTR_COMPAT_IE10
     },
     {
         L"column-span",
         DISPID_IHTMLCSSSTYLEDECLARATION2_COLUMNSPAN,
-        DISPID_UNKNOWN
+        DISPID_UNKNOWN,
+        ATTR_COMPAT_IE10
     },
     {
         L"column-width",
         DISPID_IHTMLCSSSTYLEDECLARATION2_COLUMNWIDTH,
-        DISPID_UNKNOWN
+        DISPID_UNKNOWN,
+        ATTR_COMPAT_IE10
     },
     {
         cursorW,
@@ -846,12 +857,14 @@ static const style_tbl_entry_t style_tbl[] = {
     {
         L"transform",
         DISPID_IHTMLCSSSTYLEDECLARATION2_TRANSFORM,
-        DISPID_UNKNOWN
+        DISPID_UNKNOWN,
+        ATTR_COMPAT_IE10
     },
     {
         L"transition",
         DISPID_IHTMLCSSSTYLEDECLARATION2_TRANSITION,
-        DISPID_UNKNOWN
+        DISPID_UNKNOWN,
+        ATTR_COMPAT_IE10
     },
     {
         vertical_alignW,
@@ -898,7 +911,7 @@ C_ASSERT(ARRAY_SIZE(style_tbl) == STYLEID_MAX_VALUE);
 static const WCHAR px_formatW[] = {'%','d','p','x',0};
 static const WCHAR emptyW[] = {0};
 
-static const style_tbl_entry_t *lookup_style_tbl(const WCHAR *name)
+static const style_tbl_entry_t *lookup_style_tbl(CSSStyle *style, const WCHAR *name)
 {
     int c, i, min = 0, max = ARRAY_SIZE(style_tbl)-1;
 
@@ -906,8 +919,11 @@ static const style_tbl_entry_t *lookup_style_tbl(const WCHAR *name)
         i = (min+max)/2;
 
         c = wcscmp(style_tbl[i].name, name);
-        if(!c)
+        if(!c) {
+            if((style_tbl[i].flags & ATTR_COMPAT_IE10) && dispex_compat_mode(&style->dispex) < COMPAT_MODE_IE10)
+                return NULL;
             return style_tbl+i;
+        }
 
         if(c > 0)
             max = i-1;
@@ -3175,7 +3191,7 @@ static HRESULT WINAPI HTMLStyle_removeAttribute(IHTMLStyle *iface, BSTR strAttri
 
     TRACE("(%p)->(%s %08x %p)\n", This, debugstr_w(strAttributeName), lFlags, pfSuccess);
 
-    style_entry = lookup_style_tbl(strAttributeName);
+    style_entry = lookup_style_tbl(&This->css_style, strAttributeName);
     if(!style_entry) {
         compat_mode_t compat_mode = dispex_compat_mode(&This->css_style.dispex);
         DISPID dispid;
@@ -5037,7 +5053,7 @@ static HRESULT WINAPI HTMLCSSStyleDeclaration_getPropertyValue(IHTMLCSSStyleDecl
 
     TRACE("(%p)->(%s %p)\n", This, debugstr_w(name), value);
 
-    style_entry = lookup_style_tbl(name);
+    style_entry = lookup_style_tbl(This, name);
     nsAString_InitDepend(&name_str, style_entry ? style_entry->name : name);
     nsAString_InitDepend(&value_str, NULL);
     nsres = nsIDOMCSSStyleDeclaration_GetPropertyValue(This->nsstyle, &name_str, &value_str);
@@ -5061,7 +5077,7 @@ static HRESULT WINAPI HTMLCSSStyleDeclaration_removeProperty(IHTMLCSSStyleDeclar
 
     TRACE("(%p)->(%s %p)\n", This, debugstr_w(bstrPropertyName), pbstrPropertyValue);
 
-    style_entry = lookup_style_tbl(bstrPropertyName);
+    style_entry = lookup_style_tbl(This, bstrPropertyName);
     nsAString_InitDepend(&name_str, style_entry ? style_entry->name : bstrPropertyName);
     nsAString_Init(&ret_str, NULL);
     nsres = nsIDOMCSSStyleDeclaration_RemoveProperty(This->nsstyle, &name_str, &ret_str);
@@ -5079,7 +5095,7 @@ static HRESULT WINAPI HTMLCSSStyleDeclaration_setProperty(IHTMLCSSStyleDeclarati
 
     TRACE("(%p)->(%s %s %s)\n", This, debugstr_w(name), debugstr_variant(value), debugstr_variant(priority));
 
-    style_entry = lookup_style_tbl(name);
+    style_entry = lookup_style_tbl(This, name);
     hres = var_to_styleval(This, value, style_entry, &value_str);
     if(FAILED(hres))
         return hres;
@@ -10166,11 +10182,17 @@ static const IHTMLCSSStyleDeclaration2Vtbl HTMLCSSStyleDeclaration2Vtbl = {
     HTMLCSSStyleDeclaration2_get_animationFillMode
 };
 
+static inline CSSStyle *impl_from_DispatchEx(DispatchEx *dispex)
+{
+    return CONTAINING_RECORD(dispex, CSSStyle, dispex);
+}
+
 static HRESULT CSSStyle_get_dispid(DispatchEx *dispex, BSTR name, DWORD flags, DISPID *dispid)
 {
+    CSSStyle *This = impl_from_DispatchEx(dispex);
     const style_tbl_entry_t *style_entry;
 
-    style_entry = lookup_style_tbl(name);
+    style_entry = lookup_style_tbl(This, name);
     if(style_entry) {
         DISPID id = dispex_compat_mode(dispex) >= COMPAT_MODE_IE9
             ? style_entry->dispid : style_entry->compat_dispid;
@@ -10188,6 +10210,8 @@ void CSSStyle_init_dispex_info(dispex_data_t *info, compat_mode_t mode)
 {
     if(mode >= COMPAT_MODE_IE9)
         dispex_info_add_interface(info, IHTMLCSSStyleDeclaration_tid, NULL);
+    if(mode >= COMPAT_MODE_IE10)
+        dispex_info_add_interface(info, IHTMLCSSStyleDeclaration2_tid, NULL);
 }
 
 const dispex_static_data_vtbl_t CSSStyle_dispex_vtbl = {
diff --git a/dlls/mshtml/tests/documentmode.js b/dlls/mshtml/tests/documentmode.js
index aa60cd4f8e..82b163a13d 100644
--- a/dlls/mshtml/tests/documentmode.js
+++ b/dlls/mshtml/tests/documentmode.js
@@ -154,6 +154,8 @@ function test_style_props() {
     test_exposed("setProperty", v >= 9);
     test_exposed("removeProperty", v >= 9);
     test_exposed("background-clip", v >= 9);
+    test_exposed("msTransform", v >= 9);
+    test_exposed("transform", v >= 10);
 
     style = document.body.currentStyle;
 
@@ -167,6 +169,7 @@ function test_style_props() {
     test_exposed("setProperty", v >= 9);
     test_exposed("removeProperty", v >= 9);
     test_exposed("background-clip", v >= 9);
+    test_exposed("transform", v >= 10);
 
     if(window.getComputedStyle) {
         style = window.getComputedStyle(document.body);




More information about the wine-cvs mailing list