Jacek Caban : mshtml: Added IHTMLBodyElement:: scroll attribute implementation.
Alexandre Julliard
julliard at winehq.org
Mon Nov 11 14:08:16 CST 2013
Module: wine
Branch: master
Commit: ea24a5b1f42bf7cc90ea042370eb1628dec35b98
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ea24a5b1f42bf7cc90ea042370eb1628dec35b98
Author: Jacek Caban <jacek at codeweavers.com>
Date: Mon Nov 11 14:36:43 2013 +0100
mshtml: Added IHTMLBodyElement::scroll attribute implementation.
---
dlls/mshtml/htmlbody.c | 57 +++++++++++++++++++++++++++++++++++++++++++---
dlls/mshtml/htmlstyle.c | 47 +++++++++++++++++++++++++++++++++++---
dlls/mshtml/htmlstyle.h | 3 ++
dlls/mshtml/tests/dom.c | 30 ++++++++++++++++++++++++
4 files changed, 129 insertions(+), 8 deletions(-)
diff --git a/dlls/mshtml/htmlbody.c b/dlls/mshtml/htmlbody.c
index bb5ee34..2b98cf4 100644
--- a/dlls/mshtml/htmlbody.c
+++ b/dlls/mshtml/htmlbody.c
@@ -30,6 +30,7 @@
#include "mshtml_private.h"
#include "htmlevent.h"
+#include "htmlstyle.h"
WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
@@ -602,18 +603,66 @@ static HRESULT WINAPI HTMLBodyElement_get_onunload(IHTMLBodyElement *iface, VARI
return E_NOTIMPL;
}
+static const WCHAR autoW[] = {'a','u','t','o',0};
+static const WCHAR hiddenW[] = {'h','i','d','d','e','n',0};
+static const WCHAR scrollW[] = {'s','c','r','o','l','l',0};
+static const WCHAR visibleW[] = {'v','i','s','i','b','l','e',0};
+static const WCHAR yesW[] = {'y','e','s',0};
+static const WCHAR noW[] = {'n','o',0};
+
static HRESULT WINAPI HTMLBodyElement_put_scroll(IHTMLBodyElement *iface, BSTR v)
{
HTMLBodyElement *This = impl_from_IHTMLBodyElement(iface);
- FIXME("(%p)->(%s)\n", This, debugstr_w(v));
- return E_NOTIMPL;
+ static const WCHAR *val;
+
+ TRACE("(%p)->(%s)\n", This, debugstr_w(v));
+
+ /* Emulate with CSS visibility attribute */
+ if(!strcmpW(v, yesW)) {
+ val = scrollW;
+ }else if(!strcmpW(v, autoW)) {
+ val = visibleW;
+ }else if(!strcmpW(v, noW)) {
+ val = hiddenW;
+ }else {
+ WARN("Invalid argument %s\n", debugstr_w(v));
+ return E_INVALIDARG;
+ }
+
+ return set_elem_style(&This->textcont.element, STYLEID_OVERFLOW, val);
}
static HRESULT WINAPI HTMLBodyElement_get_scroll(IHTMLBodyElement *iface, BSTR *p)
{
HTMLBodyElement *This = impl_from_IHTMLBodyElement(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ const WCHAR *ret;
+ BSTR overflow;
+ HRESULT hres;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ /* Emulate with CSS visibility attribute */
+ hres = get_elem_style(&This->textcont.element, STYLEID_OVERFLOW, &overflow);
+ if(FAILED(hres))
+ return hres;
+
+ if(!overflow || !*overflow) {
+ *p = NULL;
+ return S_OK;
+ }else if(!strcmpW(overflow, visibleW) || !strcmpW(overflow, autoW)) {
+ ret = autoW;
+ }else if(!strcmpW(overflow, scrollW)) {
+ ret = yesW;
+ }else if(!strcmpW(overflow, hiddenW)) {
+ ret = noW;
+ }else {
+ TRACE("Defaulting %s to NULL", debugstr_w(overflow));
+ *p = NULL;
+ return S_OK;
+ }
+
+ *p = SysAllocString(ret);
+ return *p ? S_OK : E_OUTOFMEMORY;
}
static HRESULT WINAPI HTMLBodyElement_put_onselect(IHTMLBodyElement *iface, VARIANT v)
diff --git a/dlls/mshtml/htmlstyle.c b/dlls/mshtml/htmlstyle.c
index 5f4fc67..c85e4db 100644
--- a/dlls/mshtml/htmlstyle.c
+++ b/dlls/mshtml/htmlstyle.c
@@ -3115,11 +3115,9 @@ static dispex_static_data_t HTMLStyle_dispex = {
HTMLStyle_iface_tids
};
-HRESULT HTMLStyle_Create(HTMLElement *elem, HTMLStyle **ret)
+static HRESULT get_style_from_elem(HTMLElement *elem, nsIDOMCSSStyleDeclaration **ret)
{
nsIDOMElementCSSInlineStyle *nselemstyle;
- nsIDOMCSSStyleDeclaration *nsstyle;
- HTMLStyle *style;
nsresult nsres;
if(!elem->nselem) {
@@ -3131,13 +3129,26 @@ HRESULT HTMLStyle_Create(HTMLElement *elem, HTMLStyle **ret)
(void**)&nselemstyle);
assert(nsres == NS_OK);
- nsres = nsIDOMElementCSSInlineStyle_GetStyle(nselemstyle, &nsstyle);
+ nsres = nsIDOMElementCSSInlineStyle_GetStyle(nselemstyle, ret);
nsIDOMElementCSSInlineStyle_Release(nselemstyle);
if(NS_FAILED(nsres)) {
ERR("GetStyle failed: %08x\n", nsres);
return E_FAIL;
}
+ return S_OK;
+}
+
+HRESULT HTMLStyle_Create(HTMLElement *elem, HTMLStyle **ret)
+{
+ nsIDOMCSSStyleDeclaration *nsstyle;
+ HTMLStyle *style;
+ HRESULT hres;
+
+ hres = get_style_from_elem(elem, &nsstyle);
+ if(FAILED(hres))
+ return hres;
+
style = heap_alloc_zero(sizeof(HTMLStyle));
if(!style) {
nsIDOMCSSStyleDeclaration_Release(nsstyle);
@@ -3158,3 +3169,31 @@ HRESULT HTMLStyle_Create(HTMLElement *elem, HTMLStyle **ret)
*ret = style;
return S_OK;
}
+
+HRESULT get_elem_style(HTMLElement *elem, styleid_t styleid, BSTR *ret)
+{
+ nsIDOMCSSStyleDeclaration *style;
+ HRESULT hres;
+
+ hres = get_style_from_elem(elem, &style);
+ if(FAILED(hres))
+ return hres;
+
+ hres = get_nsstyle_attr(style, styleid, ret, 0);
+ nsIDOMCSSStyleDeclaration_Release(style);
+ return hres;
+}
+
+HRESULT set_elem_style(HTMLElement *elem, styleid_t styleid, const WCHAR *val)
+{
+ nsIDOMCSSStyleDeclaration *style;
+ HRESULT hres;
+
+ hres = get_style_from_elem(elem, &style);
+ if(FAILED(hres))
+ return hres;
+
+ hres = set_nsstyle_attr(style, styleid, val, 0);
+ nsIDOMCSSStyleDeclaration_Release(style);
+ return hres;
+}
diff --git a/dlls/mshtml/htmlstyle.h b/dlls/mshtml/htmlstyle.h
index 382a226..9294015 100644
--- a/dlls/mshtml/htmlstyle.h
+++ b/dlls/mshtml/htmlstyle.h
@@ -120,6 +120,9 @@ HRESULT set_nsstyle_attr(nsIDOMCSSStyleDeclaration*,styleid_t,LPCWSTR,DWORD) DEC
HRESULT set_nsstyle_attr_var(nsIDOMCSSStyleDeclaration *nsstyle, styleid_t sid, VARIANT *value, DWORD flags) DECLSPEC_HIDDEN;
HRESULT get_nsstyle_attr_var(nsIDOMCSSStyleDeclaration *nsstyle, styleid_t sid, VARIANT *p, DWORD flags) DECLSPEC_HIDDEN;
+HRESULT get_elem_style(HTMLElement*,styleid_t,BSTR*) DECLSPEC_HIDDEN;
+HRESULT set_elem_style(HTMLElement*,styleid_t,const WCHAR*) DECLSPEC_HIDDEN;
+
#define ATTR_FIX_PX 0x0001
#define ATTR_FIX_URL 0x0002
#define ATTR_STR_TO_INT 0x0004
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index f1155d8..e43c754 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -5171,6 +5171,31 @@ static void test_default_body(IHTMLBodyElement *body)
VariantClear(&v);
}
+#define test_body_scroll(a,b) _test_body_scroll(__LINE__,a,b)
+static void _test_body_scroll(unsigned line, IHTMLBodyElement *body, const char *ex)
+{
+ BSTR str;
+ HRESULT hres;
+
+ hres = IHTMLBodyElement_get_scroll(body, &str);
+ ok_(__FILE__,line)(hres == S_OK, "get_scroll failed: %08x\n", hres);
+ ok_(__FILE__,line)(ex ? !strcmp_wa(str, ex) : !str, "scroll = %s\n", wine_dbgstr_w(str));
+ SysFreeString(str);
+}
+
+#define set_body_scroll(a,b) _set_body_scroll(__LINE__,a,b)
+static void _set_body_scroll(unsigned line, IHTMLBodyElement *body, const char *val)
+{
+ BSTR str = a2bstr(val);
+ HRESULT hres;
+
+ hres = IHTMLBodyElement_put_scroll(body, str);
+ ok_(__FILE__,line)(hres == S_OK, "put_scroll failed: %08x\n", hres);
+ SysFreeString(str);
+
+ _test_body_scroll(line, body, val);
+}
+
static void test_body_funs(IHTMLBodyElement *body)
{
VARIANT vbg, vDefaultbg;
@@ -5197,6 +5222,11 @@ static void test_body_funs(IHTMLBodyElement *body)
hres = IHTMLBodyElement_put_bgColor(body, vDefaultbg);
ok(hres == S_OK, "put_bgColor failed: %08x\n", hres);
VariantClear(&vDefaultbg);
+
+ test_body_scroll(body, NULL);
+ set_body_scroll(body, "yes");
+ set_body_scroll(body, "no");
+ set_body_scroll(body, "auto");
}
static void test_history(IHTMLWindow2 *window)
More information about the wine-cvs
mailing list