From 23ad09865e28cf9ffa4bc816514d4b858cf2a626 Mon Sep 17 00:00:00 2001 From: Jacek Caban Date: Mon, 23 Jun 2008 09:52:40 -0500 Subject: [PATCH] mshtml: Added IHTMLImgElement::put_src implementation. --- dlls/mshtml/htmlimg.c | 24 ++++++++++++++++++++++-- dlls/mshtml/nsiface.idl | 33 +++++++++++++++++++++++++++++++++ dlls/mshtml/tests/dom.c | 26 +++++++++++++++++++++++++- 3 files changed, 80 insertions(+), 3 deletions(-) diff --git a/dlls/mshtml/htmlimg.c b/dlls/mshtml/htmlimg.c index 92647be9a7b..a2494dfb0fb 100644 --- a/dlls/mshtml/htmlimg.c +++ b/dlls/mshtml/htmlimg.c @@ -35,6 +35,8 @@ typedef struct { HTMLElement element; const IHTMLImgElementVtbl *lpHTMLImgElementVtbl; + + nsIDOMHTMLImageElement *nsimg; } HTMLImgElement; #define HTMLIMG(x) ((IHTMLImgElement*) &(x)->lpHTMLImgElementVtbl) @@ -240,8 +242,18 @@ static HRESULT WINAPI HTMLImgElement_get_alt(IHTMLImgElement *iface, BSTR *p) static HRESULT WINAPI HTMLImgElement_put_src(IHTMLImgElement *iface, BSTR v) { HTMLImgElement *This = HTMLIMG_THIS(iface); - FIXME("(%p)->(%s)\n", This, debugstr_w(v)); - return E_NOTIMPL; + nsAString src_str; + nsresult nsres; + + TRACE("(%p)->(%s)\n", This, debugstr_w(v)); + + nsAString_Init(&src_str, v); + nsres = nsIDOMHTMLImageElement_SetSrc(This->nsimg, &src_str); + nsAString_Finish(&src_str); + if(NS_FAILED(nsres)) + ERR("SetSrc failed: %08x\n", nsres); + + return NS_OK; } static HRESULT WINAPI HTMLImgElement_get_src(IHTMLImgElement *iface, BSTR *p) @@ -516,6 +528,9 @@ static void HTMLImgElement_destructor(HTMLDOMNode *iface) { HTMLImgElement *This = HTMLIMG_NODE_THIS(iface); + if(This->nsimg) + nsIDOMHTMLImageElement_Release(This->nsimg); + HTMLElement_destructor(&This->element.node); } @@ -544,10 +559,15 @@ static dispex_static_data_t HTMLImgElement_dispex = { HTMLElement *HTMLImgElement_Create(nsIDOMHTMLElement *nselem) { HTMLImgElement *ret = heap_alloc_zero(sizeof(HTMLImgElement)); + nsresult nsres; ret->lpHTMLImgElementVtbl = &HTMLImgElementVtbl; ret->element.node.vtbl = &HTMLImgElementImplVtbl; + nsres = nsIDOMHTMLElement_QueryInterface(nselem, &IID_nsIDOMHTMLImageElement, (void**)&ret->nsimg); + if(NS_FAILED(nsres)) + ERR("Could not get nsIDOMHTMLImageElement: %08x\n", nsres); + init_dispex(&ret->element.node.dispex, (IUnknown*)HTMLIMG(ret), &HTMLImgElement_dispex); HTMLElement_Init(&ret->element); diff --git a/dlls/mshtml/nsiface.idl b/dlls/mshtml/nsiface.idl index 62bead1d7e0..42e6eb00632 100644 --- a/dlls/mshtml/nsiface.idl +++ b/dlls/mshtml/nsiface.idl @@ -1297,6 +1297,39 @@ interface nsIDOMHTMLScriptElement : nsIDOMHTMLElement [ object, + uuid(a6cf90ab-15b3-11d2-932e-00805f8add32), + local +] +interface nsIDOMHTMLImageElement : nsIDOMHTMLElement +{ + nsresult GetName(nsAString *aName); + nsresult SetName(const nsAString *aName); + nsresult GetAlign(nsAString *aAlign); + nsresult SetAlign(const nsAString *aAlign); + nsresult GetAlt(nsAString *aAlt); + nsresult SetAlt(const nsAString *aAlt); + nsresult GetBorder(nsAString *aBorder); + nsresult SetBorder(const nsAString *aBorder); + nsresult GetHeight(PRInt32 *aHeight); + nsresult SetHeight(PRInt32 aHeight); + nsresult GetHspace(PRInt32 *aHspace); + nsresult SetHspace(PRInt32 aHspace); + nsresult GetIsMap(PRBool *aIsMap); + nsresult SetIsMap(PRBool aIsMap); + nsresult GetLongDesc(nsAString *aLongDesc); + nsresult SetLongDesc(const nsAString *aLongDesc); + nsresult GetSrc(nsAString *aSrc); + nsresult SetSrc(const nsAString *aSrc); + nsresult GetUseMap(nsAString *aUseMap); + nsresult SetUseMap(const nsAString *aUseMap); + nsresult GetVspace(PRInt32 *aVspace); + nsresult SetVspace(PRInt32 aVspace); + nsresult GetWidth(PRInt32 *aWidth); + nsresult SetWidth(PRInt32 aWidth); +} + +[ + object, uuid(94928ab3-8b63-11d3-989d-001083010e9b), local /* FROZEN */ diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c index 56240200c29..6ff42010a85 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -48,7 +48,7 @@ static const char elem_test_str[] = "
" "" "" - "" ""; static const char indent_test_str[] = "testabc
123"; @@ -845,6 +845,23 @@ static long _get_node_type(unsigned line, IUnknown *unk) return type; } +#define test_img_set_src(u,s) _test_img_set_src(__LINE__,u,s) +static void _test_img_set_src(unsigned line, IUnknown *unk, const char *src) +{ + IHTMLImgElement *img; + BSTR tmp; + HRESULT hres; + + hres = IUnknown_QueryInterface(unk, &IID_IHTMLImgElement, (void**)&img); + ok_(__FILE__,line) (hres == S_OK, "Could not get IHTMLImgElement: %08x\n", hres); + + tmp = a2bstr(src); + hres = IHTMLImgElement_put_src(img, tmp); + IHTMLImgElement_Release(img); + SysFreeString(tmp); + ok_(__FILE__,line) (hres == S_OK, "put_src failed: %08x\n", hres); +} + #define test_input_get_disabled(i,b) _test_input_get_disabled(__LINE__,i,b) static void _test_input_get_disabled(unsigned line, IHTMLInputElement *input, VARIANT_BOOL exb) { @@ -1759,6 +1776,7 @@ static void test_elems(IHTMLDocument2 *doc) long type; HRESULT hres; + static const WCHAR imgidW[] = {'i','m','g','i','d',0}; static const WCHAR inW[] = {'i','n',0}; static const WCHAR xW[] = {'x',0}; static const WCHAR sW[] = {'s',0}; @@ -1888,6 +1906,12 @@ static void test_elems(IHTMLDocument2 *doc) IHTMLElement_Release(elem); } + elem = get_elem_by_id(doc, imgidW, TRUE); + if(elem) { + test_img_set_src((IUnknown*)elem, "about:blank"); + IHTMLElement_Release(elem); + } + hres = IHTMLDocument2_get_body(doc, &elem); ok(hres == S_OK, "get_body failed: %08x\n", hres); -- 2.11.4.GIT