Jacek Caban : mshtml: Properly handle BLOCKED:: URLs in IHTMLImgElement:: get_src.

Alexandre Julliard julliard at winehq.org
Mon Mar 14 14:29:45 CDT 2011


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Mar 14 14:07:09 2011 +0100

mshtml: Properly handle BLOCKED:: URLs in IHTMLImgElement::get_src.

---

 dlls/mshtml/htmlimg.c   |   22 ++++++++++++++++------
 dlls/mshtml/tests/dom.c |   38 ++++++++++++++++++++++++++++++++------
 2 files changed, 48 insertions(+), 12 deletions(-)

diff --git a/dlls/mshtml/htmlimg.c b/dlls/mshtml/htmlimg.c
index 1008f87..1fb0e83 100644
--- a/dlls/mshtml/htmlimg.c
+++ b/dlls/mshtml/htmlimg.c
@@ -287,21 +287,31 @@ static HRESULT WINAPI HTMLImgElement_get_src(IHTMLImgElement *iface, BSTR *p)
     const PRUnichar *src;
     nsAString src_str;
     nsresult nsres;
-    HRESULT hres;
+    HRESULT hres = S_OK;
+
+    static const WCHAR blockedW[] = {'B','L','O','C','K','E','D',':',':',0};
 
     TRACE("(%p)->(%p)\n", This, p);
 
     nsAString_Init(&src_str, NULL);
     nsres = nsIDOMHTMLImageElement_GetSrc(This->nsimg, &src_str);
-    if(NS_FAILED(nsres)) {
+    if(NS_SUCCEEDED(nsres)) {
+        nsAString_GetData(&src_str, &src);
+
+        if(!strncmpiW(src, blockedW, sizeof(blockedW)/sizeof(WCHAR)-1)) {
+            TRACE("returning BLOCKED::\n");
+            *p = SysAllocString(blockedW);
+            if(!*p)
+                hres = E_OUTOFMEMORY;
+        }else {
+            hres = nsuri_to_url(src, TRUE, p);
+        }
+    }else {
         ERR("GetSrc failed: %08x\n", nsres);
-        return E_FAIL;
+        hres = E_FAIL;
     }
 
-    nsAString_GetData(&src_str, &src);
-    hres = nsuri_to_url(src, TRUE, p);
     nsAString_Finish(&src_str);
-
     return hres;
 }
 
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index ec6c7e8..64e0cf2 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -2161,8 +2161,8 @@ static void _elem_get_scroll_left(unsigned line, IUnknown *unk)
     ok(l == l2, "unexpected left %d, expected %d\n", l2, l);
 }
 
-#define test_img_src(i,s) _test_img_src(__LINE__,i,s)
-static void _test_img_src(unsigned line, IUnknown *unk, const char *exsrc)
+#define test_img_src(a,b,c) _test_img_src(__LINE__,a,b,c)
+static void _test_img_src(unsigned line, IUnknown *unk, const char *exsrc, const char *broken_src)
 {
     IHTMLImgElement *img = _get_img_iface(line, unk);
     BSTR src;
@@ -2171,7 +2171,8 @@ static void _test_img_src(unsigned line, IUnknown *unk, const char *exsrc)
     hres = IHTMLImgElement_get_src(img, &src);
     IHTMLImgElement_Release(img);
     ok_(__FILE__,line) (hres == S_OK, "get_src failed: %08x\n", hres);
-    ok_(__FILE__,line) (!strcmp_wa(src, exsrc), "get_src returned %s expected %s\n", wine_dbgstr_w(src), exsrc);
+    ok_(__FILE__,line) (!strcmp_wa(src, exsrc) || (broken_src && broken(!strcmp_wa(src, broken_src))),
+        "get_src returned %s expected %s\n", wine_dbgstr_w(src), exsrc);
     SysFreeString(src);
 }
 
@@ -2187,8 +2188,6 @@ static void _test_img_set_src(unsigned line, IUnknown *unk, const char *src)
     IHTMLImgElement_Release(img);
     SysFreeString(tmp);
     ok_(__FILE__,line) (hres == S_OK, "put_src failed: %08x\n", hres);
-
-    _test_img_src(line, unk, src);
 }
 
 #define test_img_alt(u,a) _test_img_alt(__LINE__,u,a)
@@ -6574,8 +6573,9 @@ static void test_elems(IHTMLDocument2 *doc)
 
     elem = get_elem_by_id(doc, "imgid", TRUE);
     if(elem) {
-        test_img_src((IUnknown*)elem, "");
+        test_img_src((IUnknown*)elem, "", NULL);
         test_img_set_src((IUnknown*)elem, "about:blank");
+        test_img_src((IUnknown*)elem, "about:blank", NULL);
         test_img_alt((IUnknown*)elem, NULL);
         test_img_set_alt((IUnknown*)elem, "alt test");
         test_img_name((IUnknown*)elem, "WineImg");
@@ -6852,6 +6852,31 @@ static void test_attr(IHTMLElement *elem)
     IHTMLDOMAttribute_Release(attr);
 }
 
+static void test_blocked(IHTMLDocument2 *doc, IHTMLElement *outer_elem)
+{
+    IHTMLElement *elem;
+
+    test_elem_set_innerhtml((IUnknown*)outer_elem,
+            "<img id=\"imgid\" src=\"BLOCKED::http://www.winehq.org/img.png\" />");
+    elem = get_elem_by_id(doc, "imgid", TRUE);
+    if(elem) {
+        test_img_src((IUnknown*)elem, "BLOCKED::", "blocked::http://www.winehq.org/img.png");
+        IHTMLElement_Release(elem);
+    }
+
+    test_elem_set_innerhtml((IUnknown*)outer_elem,
+            "<img id=\"imgid\" src=\"BLOCKE::http://www.winehq.org/img.png\" />");
+    elem = get_elem_by_id(doc, "imgid", TRUE);
+    if(elem) {
+        test_img_src((IUnknown*)elem, "blocke::http://www.winehq.org/img.png", NULL);
+        test_img_set_src((IUnknown*)elem, "BLOCKED:http://www.winehq.org/img.png");
+        test_img_src((IUnknown*)elem, "blocked:http://www.winehq.org/img.png", NULL);
+        test_img_set_src((IUnknown*)elem, "blocked::http://www.winehq.org/img.png");
+        test_img_src((IUnknown*)elem, "BLOCKED::", "blocked::http://www.winehq.org/img.png");
+        IHTMLElement_Release(elem);
+    }
+}
+
 static void test_elems2(IHTMLDocument2 *doc)
 {
     IHTMLElement *elem, *elem2, *div;
@@ -6913,6 +6938,7 @@ static void test_elems2(IHTMLDocument2 *doc)
 
     test_attr(div);
     test_style_filters(div);
+    test_blocked(doc, div);
 
     IHTMLElement_Release(div);
 }




More information about the wine-cvs mailing list