Jacek Caban : mshtml: Added get_URL implementation.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Jun 12 06:30:44 CDT 2007


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Jun 11 17:37:20 2007 +0200

mshtml: Added get_URL implementation.

---

 dlls/mshtml/htmldoc.c        |   11 +++++++++--
 dlls/mshtml/mshtml_private.h |    1 +
 dlls/mshtml/persist.c        |   23 ++++++++++++++++++++---
 dlls/mshtml/tests/htmldoc.c  |   27 +++++++++++++++++++++++++++
 4 files changed, 57 insertions(+), 5 deletions(-)

diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index ba57e3e..a606dac 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -508,8 +508,15 @@ static HRESULT WINAPI HTMLDocument_put_URL(IHTMLDocument2 *iface, BSTR v)
 
 static HRESULT WINAPI HTMLDocument_get_URL(IHTMLDocument2 *iface, BSTR *p)
 {
-    FIXME("(%p)->(%p)\n", iface, p);
-    return E_NOTIMPL;
+    HTMLDocument *This = HTMLDOC_THIS(iface);
+
+    static const WCHAR about_blank_url[] =
+        {'a','b','o','u','t',':','b','l','a','n','k',0};
+
+    TRACE("(%p)->(%p)\n", iface, p);
+
+    *p = SysAllocString(This->url ? This->url : about_blank_url);
+    return S_OK;
 }
 
 static HRESULT WINAPI HTMLDocument_put_domain(IHTMLDocument2 *iface, BSTR v)
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index b9f5d61..5623736 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -102,6 +102,7 @@ struct HTMLDocument {
 
     BSCallback *bscallback;
     IMoniker *mon;
+    BSTR url;
 
     HWND hwnd;
     HWND tooltips_hwnd;
diff --git a/dlls/mshtml/persist.c b/dlls/mshtml/persist.c
index f933b73..58ca422 100644
--- a/dlls/mshtml/persist.c
+++ b/dlls/mshtml/persist.c
@@ -115,11 +115,27 @@ static nsIInputStream *get_post_data_stream(IBindCtx *bctx)
 
 void set_current_mon(HTMLDocument *This, IMoniker *mon)
 {
-    if(This->mon)
+    HRESULT hres;
+
+    if(This->mon) {
         IMoniker_Release(This->mon);
-    if(mon)
-        IMoniker_AddRef(mon);
+        This->mon = NULL;
+    }
+
+    if(This->url) {
+        SysFreeString(This->url);
+        This->url = NULL;
+    }
+
+    if(!mon)
+        return;
+
+    IMoniker_AddRef(mon);
     This->mon = mon;
+
+    hres = IMoniker_GetDisplayName(mon, NULL, NULL, &This->url);
+    if(FAILED(hres))
+        WARN("GetDisplayName failed: %08x\n", hres);
 }
 
 static HRESULT set_moniker(HTMLDocument *This, IMoniker *mon, IBindCtx *pibc, BOOL *bind_complete)
@@ -674,4 +690,5 @@ void HTMLDocument_Persist_Init(HTMLDocument *This)
 
     This->bscallback = NULL;
     This->mon = NULL;
+    This->url = NULL;
 }
diff --git a/dlls/mshtml/tests/htmldoc.c b/dlls/mshtml/tests/htmldoc.c
index af5d7a4..619d36e 100644
--- a/dlls/mshtml/tests/htmldoc.c
+++ b/dlls/mshtml/tests/htmldoc.c
@@ -2189,8 +2189,10 @@ static void test_ConnectionPointContainer(IUnknown *unk)
 
 static void test_GetCurMoniker(IUnknown *unk, IMoniker *exmon, LPCWSTR exurl)
 {
+    IHTMLDocument2 *doc;
     IPersistMoniker *permon;
     IMoniker *mon = (void*)0xdeadbeef;
+    BSTR doc_url = (void*)0xdeadbeef;
     HRESULT hres;
 
     hres = IUnknown_QueryInterface(unk, &IID_IPersistMoniker, (void**)&permon);
@@ -2198,12 +2200,32 @@ static void test_GetCurMoniker(IUnknown *unk, IMoniker *exmon, LPCWSTR exurl)
     if(FAILED(hres))
         return;
 
+    hres = IUnknown_QueryInterface(unk, &IID_IHTMLDocument2, (void**)&doc);
+    ok(hres == S_OK, "QueryInterface(IID_IHTMLDocument2) failed: %08x\n", hres);
+
+    hres = IHTMLDocument2_get_URL(doc, &doc_url);
+    ok(hres == S_OK, "get_URL failed: %08x\n", hres);
+
     hres = IPersistMoniker_GetCurMoniker(permon, &mon);
     IPersistMoniker_Release(permon);
 
     if(exmon) {
+        BSTR url;
+        BOOL exb = expect_GetDisplayName;
+        BOOL clb = called_GetDisplayName;
+
         ok(hres == S_OK, "GetCurrentMoniker failed: %08x\n", hres);
         ok(mon == exmon, "mon(%p) != exmon(%p)\n", mon, exmon);
+
+        SET_EXPECT(GetDisplayName);
+        hres = IMoniker_GetDisplayName(mon, NULL, NULL, &url);
+        ok(hres == S_OK, "GetDisplayName failed: %08x\n", hres);
+        CHECK_CALLED(GetDisplayName);
+        expect_GetDisplayName = exb;
+        called_GetDisplayName = clb;
+
+        SysFreeString(url);
+        ok(!lstrcmpW(url, doc_url), "url != doc_url\n");
     }else if(exurl) {
         BSTR url;
 
@@ -2213,13 +2235,18 @@ static void test_GetCurMoniker(IUnknown *unk, IMoniker *exmon, LPCWSTR exurl)
         ok(hres == S_OK, "GetDisplayName failed: %08x\n", hres);
 
         ok(!lstrcmpW(url, exurl), "unexpected url\n");
+        ok(!lstrcmpW(url, doc_url), "url != doc_url\n");
+
         SysFreeString(url);
     }else {
         ok(hres == E_UNEXPECTED,
            "GetCurrentMoniker failed: %08x, expected E_UNEXPECTED\n", hres);
         ok(mon == (IMoniker*)0xdeadbeef, "mon=%p\n", mon);
+        ok(!lstrcmpW(doc_url, about_blank_url), "doc_url is not about:blank\n");
     }
 
+    SysFreeString(doc_url);
+    IHTMLDocument_Release(doc);
     if(mon && mon != (void*)0xdeadbeef)
         IMoniker_Release(mon);
 }




More information about the wine-cvs mailing list