Jacek Caban : mshtml: Added GetCurMoniker implementation.

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


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

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

mshtml: Added GetCurMoniker implementation.

---

 dlls/mshtml/persist.c       |   11 ++++++-
 dlls/mshtml/tests/htmldoc.c |   62 ++++++++++++++++++++++++++++++++++++++++--
 2 files changed, 68 insertions(+), 5 deletions(-)

diff --git a/dlls/mshtml/persist.c b/dlls/mshtml/persist.c
index 4b3df40..f933b73 100644
--- a/dlls/mshtml/persist.c
+++ b/dlls/mshtml/persist.c
@@ -384,8 +384,15 @@ static HRESULT WINAPI PersistMoniker_SaveCompleted(IPersistMoniker *iface, IMoni
 static HRESULT WINAPI PersistMoniker_GetCurMoniker(IPersistMoniker *iface, IMoniker **ppimkName)
 {
     HTMLDocument *This = PERSISTMON_THIS(iface);
-    FIXME("(%p)->(%p)\n", This, ppimkName);
-    return E_NOTIMPL;
+
+    TRACE("(%p)->(%p)\n", This, ppimkName);
+
+    if(!This->mon)
+        return E_UNEXPECTED;
+
+    IMoniker_AddRef(This->mon);
+    *ppimkName = This->mon;
+    return S_OK;
 }
 
 static const IPersistMonikerVtbl PersistMonikerVtbl = {
diff --git a/dlls/mshtml/tests/htmldoc.c b/dlls/mshtml/tests/htmldoc.c
index 6196610..af5d7a4 100644
--- a/dlls/mshtml/tests/htmldoc.c
+++ b/dlls/mshtml/tests/htmldoc.c
@@ -146,12 +146,15 @@ static const char html_page[] =
 static const char css_data[] = "body {color: red}";
 
 static const WCHAR doc_url[] = {'w','i','n','e','t','e','s','t',':','d','o','c',0};
+static const WCHAR about_blank_url[] = {'a','b','o','u','t',':','b','l','a','n','k',0};
 
 static HRESULT QueryInterface(REFIID riid, void **ppv);
 static void test_readyState(IUnknown*);
 static void test_MSHTML_QueryStatus(IUnknown*,DWORD);
 static BOOL nogecko = FALSE;
 
+static void test_GetCurMoniker(IUnknown*,IMoniker*,LPCWSTR);
+
 static const WCHAR wszTimesNewRoman[] =
     {'T','i','m','e','s',' ','N','e','w',' ','R','o','m','a','n',0};
 static const WCHAR wszArial[] =
@@ -1852,6 +1855,12 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID
         switch(nCmdID) {
         case 37:
             CHECK_EXPECT2(Exec_ShellDocView_37);
+
+            if(load_from_stream)
+                test_GetCurMoniker(doc_unk, NULL, about_blank_url);
+            else if(!editmode)
+                test_GetCurMoniker(doc_unk, &Moniker, NULL);
+
             ok(pvaOut == NULL, "pvaOut=%p, expected NULL\n", pvaOut);
             ok(pvaIn != NULL, "pvaIn == NULL\n");
             if(pvaIn) {
@@ -2178,6 +2187,43 @@ static void test_ConnectionPointContainer(IUnknown *unk)
     IConnectionPointContainer_Release(container);
 }
 
+static void test_GetCurMoniker(IUnknown *unk, IMoniker *exmon, LPCWSTR exurl)
+{
+    IPersistMoniker *permon;
+    IMoniker *mon = (void*)0xdeadbeef;
+    HRESULT hres;
+
+    hres = IUnknown_QueryInterface(unk, &IID_IPersistMoniker, (void**)&permon);
+    ok(hres == S_OK, "QueryInterface(IID_IPersistMoniker) failed: %08x\n", hres);
+    if(FAILED(hres))
+        return;
+
+    hres = IPersistMoniker_GetCurMoniker(permon, &mon);
+    IPersistMoniker_Release(permon);
+
+    if(exmon) {
+        ok(hres == S_OK, "GetCurrentMoniker failed: %08x\n", hres);
+        ok(mon == exmon, "mon(%p) != exmon(%p)\n", mon, exmon);
+    }else if(exurl) {
+        BSTR url;
+
+        ok(hres == S_OK, "GetCurrentMoniker failed: %08x\n", hres);
+
+        hres = IMoniker_GetDisplayName(mon, NULL, NULL, &url);
+        ok(hres == S_OK, "GetDisplayName failed: %08x\n", hres);
+
+        ok(!lstrcmpW(url, exurl), "unexpected 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);
+    }
+
+    if(mon && mon != (void*)0xdeadbeef)
+        IMoniker_Release(mon);
+}
+
 static void test_Load(IPersistMoniker *persist)
 {
     IBindCtx *bind;
@@ -2258,6 +2304,8 @@ static void test_Load(IPersistMoniker *persist)
 
     set_clientsite = container_locked = TRUE;
 
+    test_GetCurMoniker((IUnknown*)persist, &Moniker, NULL);
+
     IBindCtx_Release(bind);
 
     test_readyState((IUnknown*)persist);
@@ -2585,6 +2633,8 @@ static void test_exec_editmode(IUnknown *unk)
     if(FAILED(hres))
         return;
 
+    editmode = TRUE;
+
     SET_EXPECT(SetStatusText);
     SET_EXPECT(Exec_ShellDocView_37);
     SET_EXPECT(GetHostInfo);
@@ -2609,8 +2659,6 @@ static void test_exec_editmode(IUnknown *unk)
 
     IOleCommandTarget_Release(cmdtrg);
 
-    editmode = TRUE;
-
     hres = IOleCommandTarget_Exec(cmdtrg, &CGID_MSHTML, IDM_EDITMODE,
             OLECMDEXECOPT_DODEFAULT, NULL, NULL);
     ok(hres == S_OK, "Exec failed: %08x\n", hres);
@@ -3145,6 +3193,7 @@ static void test_StreamLoad(IUnknown *unk)
     CHECK_CALLED(Read);
 
     test_timer(EXPECT_SETTITLE);
+    test_GetCurMoniker(unk, NULL, about_blank_url);
 
     IPersistStreamInit_Release(init);
 }
@@ -3190,6 +3239,7 @@ static void test_HTMLDocument(enum load_state_t ls)
     test_IsDirty(unk, S_FALSE);
     test_MSHTML_QueryStatus(unk, OLECMDF_SUPPORTED);
     test_ConnectionPointContainer(unk);
+    test_GetCurMoniker(unk, NULL, NULL);
     test_Persist(unk);
     if(load_state == LD_NO)
         test_OnAmbientPropertyChange2(unk);
@@ -3200,8 +3250,10 @@ static void test_HTMLDocument(enum load_state_t ls)
         return;
     }
 
-    if(load_state == LD_LOADING)
+    if(load_state == LD_LOADING) {
         test_download(FALSE, TRUE);
+        test_GetCurMoniker(unk, &Moniker, NULL);
+    }
 
     test_MSHTML_QueryStatus(unk, OLECMDF_SUPPORTED);
     test_OleCommandTarget_fail(unk);
@@ -3241,6 +3293,7 @@ static void test_HTMLDocument(enum load_state_t ls)
     test_CloseView();
     test_Close(unk, TRUE);
     test_OnAmbientPropertyChange2(unk);
+    test_GetCurMoniker(unk, load_state == LD_NO ? NULL : &Moniker, NULL);
 
     if(view)
         IOleDocumentView_Release(view);
@@ -3270,6 +3323,7 @@ static void test_HTMLDocument_hlink(void)
     doc_unk = unk;
 
     test_ConnectionPointContainer(unk);
+    test_GetCurMoniker(unk, NULL, NULL);
     test_Persist(unk);
     test_Navigate(unk);
 
@@ -3282,6 +3336,7 @@ static void test_HTMLDocument_hlink(void)
     test_InPlaceDeactivate(unk, TRUE);
     test_Close(unk, FALSE);
     test_IsDirty(unk, S_FALSE);
+    test_GetCurMoniker(unk, &Moniker, NULL);
 
     if(view)
         IOleDocumentView_Release(view);
@@ -3320,6 +3375,7 @@ static void test_HTMLDocument_StreamLoad(void)
 
     IOleObject_Release(oleobj);
 
+    test_GetCurMoniker(unk, NULL, NULL);
     test_StreamLoad(unk);
     test_download(TRUE, FALSE);
 




More information about the wine-cvs mailing list