Jacek Caban : mshtml: Added IHTMLInputElement::src property implementation.

Alexandre Julliard julliard at winehq.org
Tue Sep 15 17:47:19 CDT 2009


Module: wine
Branch: master
Commit: 508aa85c6bf4b04b3f40b65bab1a0a04ff0b27cc
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=508aa85c6bf4b04b3f40b65bab1a0a04ff0b27cc

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Sep 14 00:36:09 2009 +0200

mshtml: Added IHTMLInputElement::src property implementation.

---

 dlls/mshtml/htmlimg.c        |    2 +-
 dlls/mshtml/htmlinput.c      |   35 +++++++++++++++++++++++++++++++----
 dlls/mshtml/mshtml_private.h |    2 +-
 dlls/mshtml/nsio.c           |   12 ++++++++----
 dlls/mshtml/tests/dom.c      |   32 ++++++++++++++++++++++++++++++++
 5 files changed, 73 insertions(+), 10 deletions(-)

diff --git a/dlls/mshtml/htmlimg.c b/dlls/mshtml/htmlimg.c
index f7e2ab5..aac6f6c 100644
--- a/dlls/mshtml/htmlimg.c
+++ b/dlls/mshtml/htmlimg.c
@@ -295,7 +295,7 @@ static HRESULT WINAPI HTMLImgElement_get_src(IHTMLImgElement *iface, BSTR *p)
     }
 
     nsAString_GetData(&src_str, &src);
-    hres = nsuri_to_url(src, p);
+    hres = nsuri_to_url(src, TRUE, p);
     nsAString_Finish(&src_str);
 
     return hres;
diff --git a/dlls/mshtml/htmlinput.c b/dlls/mshtml/htmlinput.c
index 48f19c8..3d69e0c 100644
--- a/dlls/mshtml/htmlinput.c
+++ b/dlls/mshtml/htmlinput.c
@@ -506,15 +506,42 @@ static HRESULT WINAPI HTMLInputElement_get_alt(IHTMLInputElement *iface, BSTR *p
 static HRESULT WINAPI HTMLInputElement_put_src(IHTMLInputElement *iface, BSTR v)
 {
     HTMLInputElement *This = HTMLINPUT_THIS(iface);
-    FIXME("(%p)->(%s)\n", This, debugstr_w(v));
-    return E_NOTIMPL;
+    nsAString nsstr;
+    nsresult nsres;
+
+    TRACE("(%p)->(%s)\n", This, debugstr_w(v));
+
+    nsAString_Init(&nsstr, v);
+    nsres = nsIDOMHTMLInputElement_SetSrc(This->nsinput, &nsstr);
+    nsAString_Finish(&nsstr);
+    if(NS_FAILED(nsres))
+        ERR("SetSrc failed: %08x\n", nsres);
+
+    return S_OK;
 }
 
 static HRESULT WINAPI HTMLInputElement_get_src(IHTMLInputElement *iface, BSTR *p)
 {
     HTMLInputElement *This = HTMLINPUT_THIS(iface);
-    FIXME("(%p)->(%p)\n", This, p);
-    return E_NOTIMPL;
+    const PRUnichar *src;
+    nsAString src_str;
+    nsresult nsres;
+    HRESULT hres;
+
+    TRACE("(%p)->(%p)\n", This, p);
+
+    nsAString_Init(&src_str, NULL);
+    nsres = nsIDOMHTMLInputElement_GetSrc(This->nsinput, &src_str);
+    if(NS_FAILED(nsres)) {
+        ERR("GetSrc failed: %08x\n", nsres);
+        return E_FAIL;
+    }
+
+    nsAString_GetData(&src_str, &src);
+    hres = nsuri_to_url(src, FALSE, p);
+    nsAString_Finish(&src_str);
+
+    return hres;
 }
 
 static HRESULT WINAPI HTMLInputElement_put_lowsrc(IHTMLInputElement *iface, BSTR v)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index e202688..2aedc98 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -554,7 +554,7 @@ void init_nsio(nsIComponentManager*,nsIComponentRegistrar*);
 void release_nsio(void);
 BOOL install_wine_gecko(BOOL);
 
-HRESULT nsuri_to_url(LPCWSTR,BSTR*);
+HRESULT nsuri_to_url(LPCWSTR,BOOL,BSTR*);
 
 void hlink_frame_navigate(HTMLDocument*,IHlinkFrame*,LPCWSTR,nsIInputStream*,DWORD);
 
diff --git a/dlls/mshtml/nsio.c b/dlls/mshtml/nsio.c
index 12e8520..88f2dc6 100644
--- a/dlls/mshtml/nsio.c
+++ b/dlls/mshtml/nsio.c
@@ -77,7 +77,7 @@ static const char *debugstr_nsacstr(const nsACString *nsstr)
     return debugstr_a(data);
 }
 
-HRESULT nsuri_to_url(LPCWSTR nsuri, BSTR *ret)
+HRESULT nsuri_to_url(LPCWSTR nsuri, BOOL ret_empty, BSTR *ret)
 {
     const WCHAR *ptr = nsuri;
 
@@ -86,9 +86,13 @@ HRESULT nsuri_to_url(LPCWSTR nsuri, BSTR *ret)
     if(!strncmpW(nsuri, wine_prefixW, sizeof(wine_prefixW)/sizeof(WCHAR)))
         ptr += sizeof(wine_prefixW)/sizeof(WCHAR);
 
-    *ret = SysAllocString(ptr);
-    if(!*ret)
-        return E_OUTOFMEMORY;
+    if(*ptr || ret_empty) {
+        *ret = SysAllocString(ptr);
+        if(!*ret)
+            return E_OUTOFMEMORY;
+    }else {
+        *ret = NULL;
+    }
 
     TRACE("%s -> %s\n", debugstr_w(nsuri), debugstr_w(*ret));
     return S_OK;
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index b9a3ff8..bdf859f 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -1586,6 +1586,35 @@ static void _test_input_put_value(unsigned line, IUnknown *unk, const char *val)
     IHTMLInputElement_Release(input);
 }
 
+#define test_input_src(i,s) _test_input_src(__LINE__,i,s)
+static void _test_input_src(unsigned line, IHTMLInputElement *input, const char *exsrc)
+{
+    BSTR src;
+    HRESULT hres;
+
+    hres = IHTMLInputElement_get_src(input, &src);
+    ok_(__FILE__,line) (hres == S_OK, "get_src failed: %08x\n", hres);
+    if(exsrc)
+        ok_(__FILE__,line) (!strcmp_wa(src, exsrc), "get_src returned %s expected %s\n", wine_dbgstr_w(src), exsrc);
+    else
+        ok_(__FILE__,line) (!src, "get_src returned %s expected NULL\n", wine_dbgstr_w(src));
+    SysFreeString(src);
+}
+
+#define test_input_set_src(u,s) _test_input_set_src(__LINE__,u,s)
+static void _test_input_set_src(unsigned line, IHTMLInputElement *input, const char *src)
+{
+    BSTR tmp;
+    HRESULT hres;
+
+    tmp = a2bstr(src);
+    hres = IHTMLInputElement_put_src(input, tmp);
+    SysFreeString(tmp);
+    ok_(__FILE__,line) (hres == S_OK, "put_src failed: %08x\n", hres);
+
+    _test_input_src(line, input, src);
+}
+
 #define test_elem_class(u,c) _test_elem_class(__LINE__,u,c)
 static void _test_elem_class(unsigned line, IUnknown *unk, const char *exclass)
 {
@@ -4622,6 +4651,9 @@ static void test_elems(IHTMLDocument2 *doc)
         test_input_set_checked(input, VARIANT_TRUE);
         test_input_set_checked(input, VARIANT_FALSE);
 
+        test_input_src(input, NULL);
+        test_input_set_src(input, "about:blank");
+
         IHTMLInputElement_Release(input);
         IHTMLElement_Release(elem);
     }




More information about the wine-cvs mailing list