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