Module: wine Branch: master Commit: 23ad09865e28cf9ffa4bc816514d4b858cf2a626 URL: http://source.winehq.org/git/wine.git/?a=commit;h=23ad09865e28cf9ffa4bc81651...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Jun 23 09:52:40 2008 -0500
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 92647be..a2494df 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 62bead1..42e6eb0 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 5624020..6ff4201 100644 --- a/dlls/mshtml/tests/dom.c +++ b/dlls/mshtml/tests/dom.c @@ -48,7 +48,7 @@ static const char elem_test_str[] = "<table><tbody></tbody></table>" "<script id="sc" type="text/javascript"></script>" "<test />" - "<img /" + "<img id="imgid"/>" "</body></html>"; static const char indent_test_str[] = "<html><head><title>test</title></head><body>abc<br /><a href="about:blank">123</a></body></html>"; @@ -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);