Module: wine Branch: master Commit: cbc186b8652cf7da159cb2c52c5fd72d0b6afd78 URL: http://source.winehq.org/git/wine.git/?a=commit;h=cbc186b8652cf7da159cb2c52c...
Author: Jacek Caban jacek@codeweavers.com Date: Tue Oct 7 14:45:21 2008 -0500
mshtml: Added support for accessing style attributes by CSS syntax.
---
dlls/mshtml/htmlstyle.c | 95 +++++++++++++++++++++++++++++++---------------- dlls/mshtml/htmlstyle.h | 2 +- 2 files changed, 64 insertions(+), 33 deletions(-)
diff --git a/dlls/mshtml/htmlstyle.c b/dlls/mshtml/htmlstyle.c index f2b98cd..61a644d 100644 --- a/dlls/mshtml/htmlstyle.c +++ b/dlls/mshtml/htmlstyle.c @@ -24,6 +24,7 @@ #include "winbase.h" #include "winuser.h" #include "ole2.h" +#include "mshtmdid.h"
#include "mshtml_private.h" #include "htmlstyle.h" @@ -84,32 +85,35 @@ static const WCHAR attrWidth[] = static const WCHAR attrZIndex[] = {'z','-','i','n','d','e','x',0};
-static const LPCWSTR style_strings[] = { - attrBackground, - attrBackgroundColor, - attrBackgroundImage, - attrBorder, - attrBorderLeft, - attrColor, - attrCursor, - attrDisplay, - attrFontFamily, - attrFontSize, - attrFontStyle, - attrFontWeight, - attrHeight, - attrLeft, - attrMargin, - attrMarginLeft, - attrMarginRight, - attrPaddingLeft, - attrPosition, - attrTextDecoration, - attrTop, - attrVerticalAlign, - attrVisibility, - attrWidth, - attrZIndex +static const struct{ + const WCHAR *name; + DISPID dispid; +} style_tbl[] = { + {attrBackground, DISPID_IHTMLSTYLE_BACKGROUND}, + {attrBackgroundColor, DISPID_IHTMLSTYLE_BACKGROUNDCOLOR}, + {attrBackgroundImage, DISPID_IHTMLSTYLE_BACKGROUNDIMAGE}, + {attrBorder, DISPID_IHTMLSTYLE_BORDER}, + {attrBorderLeft, DISPID_IHTMLSTYLE_BORDERLEFT}, + {attrColor, DISPID_IHTMLSTYLE_COLOR}, + {attrCursor, DISPID_IHTMLSTYLE_CURSOR}, + {attrDisplay, DISPID_IHTMLSTYLE_DISPLAY}, + {attrFontFamily, DISPID_IHTMLSTYLE_FONTFAMILY}, + {attrFontSize, DISPID_IHTMLSTYLE_FONTSIZE}, + {attrFontStyle, DISPID_IHTMLSTYLE_FONTSTYLE}, + {attrFontWeight, DISPID_IHTMLSTYLE_FONTWEIGHT}, + {attrHeight, DISPID_IHTMLSTYLE_HEIGHT}, + {attrLeft, DISPID_IHTMLSTYLE_LEFT}, + {attrMargin, DISPID_IHTMLSTYLE_MARGIN}, + {attrMarginLeft, DISPID_IHTMLSTYLE_MARGINLEFT}, + {attrMarginRight, DISPID_IHTMLSTYLE_MARGINRIGHT}, + {attrPaddingLeft, DISPID_IHTMLSTYLE_PADDINGLEFT}, + {attrPosition, DISPID_IHTMLSTYLE2_POSITION}, + {attrTextDecoration, DISPID_IHTMLSTYLE_TEXTDECORATION}, + {attrTop, DISPID_IHTMLSTYLE_TOP}, + {attrVerticalAlign, DISPID_IHTMLSTYLE_VERTICALALIGN}, + {attrVisibility, DISPID_IHTMLSTYLE_VISIBILITY}, + {attrWidth, DISPID_IHTMLSTYLE_WIDTH}, + {attrZIndex, DISPID_IHTMLSTYLE_ZINDEX} };
static const WCHAR valLineThrough[] = @@ -192,7 +196,7 @@ HRESULT set_nsstyle_attr(nsIDOMCSSStyleDeclaration *nsstyle, styleid_t sid, LPCW if(flags & ATTR_FIX_URL) val = fix_url_value(value);
- nsAString_Init(&str_name, style_strings[sid]); + nsAString_Init(&str_name, style_tbl[sid].name); nsAString_Init(&str_value, val ? val : value); nsAString_Init(&str_empty, wszEmpty); heap_free(val); @@ -218,7 +222,7 @@ static HRESULT get_nsstyle_attr_nsval(nsIDOMCSSStyleDeclaration *nsstyle, stylei nsAString str_name; nsresult nsres;
- nsAString_Init(&str_name, style_strings[sid]); + nsAString_Init(&str_name, style_tbl[sid].name);
nsres = nsIDOMCSSStyleDeclaration_GetPropertyValue(nsstyle, &str_name, value); if(NS_FAILED(nsres)) { @@ -245,7 +249,7 @@ HRESULT get_nsstyle_attr(nsIDOMCSSStyleDeclaration *nsstyle, styleid_t sid, BSTR
nsAString_Finish(&str_value);
- TRACE("%s -> %s\n", debugstr_w(style_strings[sid]), debugstr_w(*p)); + TRACE("%s -> %s\n", debugstr_w(style_tbl[sid].name), debugstr_w(*p)); return S_OK; }
@@ -296,7 +300,7 @@ HRESULT get_nsstyle_attr_var(nsIDOMCSSStyleDeclaration *nsstyle, styleid_t sid,
nsAString_Finish(&str_value);
- TRACE("%s -> %s\n", debugstr_w(style_strings[sid]), debugstr_variant(p)); + TRACE("%s -> %s\n", debugstr_w(style_tbl[sid].name), debugstr_variant(p)); return S_OK; }
@@ -318,7 +322,7 @@ static HRESULT check_style_attr_value(HTMLStyle *This, styleid_t sid, LPCWSTR ex *p = strcmpW(value, exval) ? VARIANT_FALSE : VARIANT_TRUE; nsAString_Finish(&str_value);
- TRACE("%s -> %x\n", debugstr_w(style_strings[sid]), *p); + TRACE("%s -> %x\n", debugstr_w(style_tbl[sid].name), *p); return S_OK; }
@@ -1907,6 +1911,28 @@ static HRESULT WINAPI HTMLStyle_toString(IHTMLStyle *iface, BSTR *String) return E_NOTIMPL; }
+static HRESULT HTMLStyle_get_dispid(IUnknown *iface, BSTR name, DWORD flags, DISPID *dispid) +{ + int c, i, min=0, max = sizeof(style_tbl)/sizeof(*style_tbl)-1; + + while(min <= max) { + i = (min+max)/2; + + c = strcmpW(style_tbl[i].name, name); + if(!c) { + *dispid = style_tbl[i].dispid; + return S_OK; + } + + if(c > 0) + max = i-1; + else + min = i+1; + } + + return DISP_E_UNKNOWNNAME; +} + static const IHTMLStyleVtbl HTMLStyleVtbl = { HTMLStyle_QueryInterface, HTMLStyle_AddRef, @@ -2096,13 +2122,18 @@ static const IHTMLStyleVtbl HTMLStyleVtbl = { HTMLStyle_toString };
+static const dispex_static_data_vtbl_t HTMLStyle_dispex_vtbl = { + HTMLStyle_get_dispid, + NULL +}; + static const tid_t HTMLStyle_iface_tids[] = { IHTMLStyle_tid, IHTMLStyle2_tid, 0 }; static dispex_static_data_t HTMLStyle_dispex = { - NULL, + &HTMLStyle_dispex_vtbl, DispHTMLStyle_tid, NULL, HTMLStyle_iface_tids diff --git a/dlls/mshtml/htmlstyle.h b/dlls/mshtml/htmlstyle.h index a6d1a4a..e07f48b 100644 --- a/dlls/mshtml/htmlstyle.h +++ b/dlls/mshtml/htmlstyle.h @@ -29,7 +29,7 @@ typedef struct { #define HTMLSTYLE(x) ((IHTMLStyle*) &(x)->lpHTMLStyleVtbl) #define HTMLSTYLE2(x) ((IHTMLStyle2*) &(x)->lpHTMLStyle2Vtbl)
-/* NOTE: Make sure to keep in sync with stryle_strings in htmlstrle.c */ +/* NOTE: Make sure to keep in sync with style_tbl in htmlstyle.c */ typedef enum { STYLEID_BACKGROUND, STYLEID_BACKGROUND_COLOR,