Jacek Caban : mshtml: Added IHTMLImgElement::put_src implementation.
Alexandre Julliard
julliard at winehq.org
Mon Jun 23 16:04:01 CDT 2008
Module: wine
Branch: master
Commit: 23ad09865e28cf9ffa4bc816514d4b858cf2a626
URL: http://source.winehq.org/git/wine.git/?a=commit;h=23ad09865e28cf9ffa4bc816514d4b858cf2a626
Author: Jacek Caban <jacek at 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);
More information about the wine-cvs
mailing list