Jacek Caban : mshtml/tests: Added MHTML document tests.

Alexandre Julliard julliard at winehq.org
Mon Feb 6 16:31:19 CST 2017


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Feb  3 18:59:02 2017 +0100

mshtml/tests: Added MHTML document tests.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mshtml/tests/htmldoc.c | 132 +++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 117 insertions(+), 15 deletions(-)

diff --git a/dlls/mshtml/tests/htmldoc.c b/dlls/mshtml/tests/htmldoc.c
index cb6c9b0..2cfc414 100644
--- a/dlls/mshtml/tests/htmldoc.c
+++ b/dlls/mshtml/tests/htmldoc.c
@@ -224,6 +224,7 @@ static BOOL support_wbapp, allow_new_window, no_travellog;
 static BOOL report_mime;
 static BOOL testing_submit;
 static BOOL resetting_document;
+static BOOL is_mhtml;
 static int stream_read, protocol_read;
 static IStream *history_stream;
 static enum load_state_t {
@@ -244,6 +245,22 @@ static const char html_page[] =
 "<body><div>test</div></body>"
 "</html>";
 
+static const char mhtml_page[] =
+    "MIME-Version: 1.0\r\n"
+    "Content-Type: multipart/related; type:=\"text/html\"; boundary=\"----=_NextPart_000_00\"\r\n"
+    "\r\n"
+    "------=_NextPart_000_00\r\n"
+    "Content-Type: text/html; charset=\"Windows-1252\"\r\n"
+    "Content-Transfer-Encoding: quoted-printable\r\n"
+    "\r\n"
+    "<HTML></HTML>\r\n"
+    "------=_NextPart_000_00\r\n"
+    "Content-Type: Image/Jpeg\r\n"
+    "Content-Transfer-Encoding: base64\r\n"
+    "Content-Location: http://winehq.org/mhtmltest.html\r\n"
+    "\r\n\t\t\t\tVGVzdA==\r\n\r\n"
+    "------=_NextPart_000_00--";
+
 static const char css_data[] = "body {color: red; margin: 0}";
 
 static const WCHAR http_urlW[] =
@@ -578,12 +595,15 @@ static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl,
     ok(pOIBindInfo != NULL, "pOIBindInfo == NULL\n");
     ok(!grfPI, "grfPI = %x\n", grfPI);
     ok(!dwReserved, "dwReserved = %lx\n", dwReserved);
+    if(is_mhtml)
+        ok(!strcmp_wa(szUrl, "winetest:doc"), "unexpected URL %s\n", wine_dbgstr_w(szUrl));
 
     memset(&bindinfo, 0, sizeof(bindinfo));
     bindinfo.cbSize = sizeof(bindinfo);
     hres = IInternetBindInfo_GetBindInfo(pOIBindInfo, &bindf, &bindinfo);
     ok(hres == S_OK, "GetBindInfo failed: %08x\n", hres);
     if(!testing_submit)
+        todo_wine_if(is_mhtml)
         ok(bindf == (BINDF_FROMURLMON|BINDF_PULLDATA|BINDF_NEEDFILE|BINDF_ASYNCSTORAGE|BINDF_ASYNCHRONOUS),
            "bindf = %x\n", bindf);
     else
@@ -606,9 +626,11 @@ static HRESULT WINAPI Protocol_Start(IInternetProtocol *iface, LPCWSTR szUrl,
         ok(!memcmp(U(bindinfo.stgmedData).hGlobal, "cmd=TEST", 8), "unexpected hGlobal\n");
     }
     ok(bindinfo.szCustomVerb == 0, "bindinfo.szCustomVerb=%p\n", bindinfo.szCustomVerb);
-    ok(bindinfo.dwOptions == 0x80000 ||
-       bindinfo.dwOptions == 0x4080000, /* win2k3 */
-       "bindinfo.dwOptions=%x\n", bindinfo.dwOptions);
+    if(is_mhtml)
+        ok(!bindinfo.dwOptions, "bindinfo.dwOptions=%x\n", bindinfo.dwOptions);
+    else
+        ok(bindinfo.dwOptions == 0x80000 || bindinfo.dwOptions == 0x4080000, /* win2k3 */
+           "bindinfo.dwOptions=%x\n", bindinfo.dwOptions);
     ok(bindinfo.dwOptionsFlags == 0, "bindinfo.dwOptionsFlags=%d\n", bindinfo.dwOptionsFlags);
     /* TODO: test dwCodePage */
     /* TODO: test securityAttributes */
@@ -672,18 +694,23 @@ static HRESULT WINAPI Protocol_Resume(IInternetProtocol *iface)
 static HRESULT WINAPI Protocol_Read(IInternetProtocol *iface, void *pv,
         ULONG cb, ULONG *pcbRead)
 {
+    const char *data = is_mhtml ? mhtml_page : css_data;
+    unsigned data_len = strlen(data);
+
     CHECK_EXPECT2(Protocol_Read);
 
     ok(pv != NULL, "pv == NULL\n");
-    ok(cb > sizeof(css_data), "cb < sizeof(css_data)\n");
+    ok(cb > data_len, "cb < data_len\n");
     ok(pcbRead != NULL, "pcbRead == NULL\n");
-    ok(!*pcbRead || *pcbRead==sizeof(css_data)-1, "*pcbRead=%d\n", *pcbRead);
+    ok(!*pcbRead || *pcbRead == data_len, "*pcbRead=%d\n", *pcbRead);
 
-    if(protocol_read)
+    if(protocol_read) {
+        *pcbRead = 0;
         return S_FALSE;
+    }
 
-    protocol_read += *pcbRead = sizeof(css_data)-1;
-    memcpy(pv, css_data, sizeof(css_data)-1);
+    protocol_read += *pcbRead = data_len;
+    memcpy(pv, data, data_len);
 
     return S_OK;
 }
@@ -5589,7 +5616,7 @@ static void test_Load(IPersistMoniker *persist, IMoniker *mon)
     SET_EXPECT(OnChanged_READYSTATE);
     SET_EXPECT(Invoke_OnReadyStateChange_Loading);
     SET_EXPECT(IsSystemMoniker);
-    if(mon == &Moniker)
+    if(!is_mhtml && mon == &Moniker)
         SET_EXPECT(BindToStorage);
     SET_EXPECT(SetActiveObject);
     if(set_clientsite) {
@@ -5602,6 +5629,14 @@ static void test_Load(IPersistMoniker *persist, IMoniker *mon)
     }
     SET_EXPECT(Exec_ShellDocView_84);
     SET_EXPECT(GetPendingUrl);
+    if(is_mhtml) {
+        SET_EXPECT(CreateInstance);
+        SET_EXPECT(Start);
+        SET_EXPECT(Protocol_Read);
+        SET_EXPECT(LockRequest);
+        SET_EXPECT(Terminate);
+        SET_EXPECT(UnlockRequest);
+    }
     load_state = LD_DOLOAD;
     expect_LockContainer_fLock = TRUE;
     readystate_set_loading = TRUE;
@@ -5636,7 +5671,7 @@ static void test_Load(IPersistMoniker *persist, IMoniker *mon)
     CHECK_CALLED(OnChanged_READYSTATE);
     CHECK_CALLED(Invoke_OnReadyStateChange_Loading);
     CLEAR_CALLED(IsSystemMoniker); /* IE7 */
-    if(mon == &Moniker)
+    if(!is_mhtml && mon == &Moniker)
         CHECK_CALLED(BindToStorage);
     CLEAR_CALLED(SetActiveObject); /* FIXME */
     if(set_clientsite) {
@@ -5649,10 +5684,21 @@ static void test_Load(IPersistMoniker *persist, IMoniker *mon)
     }
     CHECK_CALLED_BROKEN(Exec_ShellDocView_84);
     todo_wine CHECK_CALLED(GetPendingUrl);
+    if(is_mhtml) {
+        CHECK_CALLED(CreateInstance);
+        CHECK_CALLED(Start);
+        CHECK_CALLED(Protocol_Read);
+        CHECK_CALLED(LockRequest);
+        CHECK_CALLED(Terminate);
+        CHECK_CALLED(UnlockRequest);
+    }
 
     set_clientsite = container_locked = TRUE;
 
-    test_GetCurMoniker((IUnknown*)persist, mon, NULL, FALSE);
+    if(!is_mhtml)
+        test_GetCurMoniker((IUnknown*)persist, mon, NULL, FALSE);
+    else
+        test_GetCurMoniker((IUnknown*)persist, NULL, "mhtml:winetest:doc", FALSE);
 
     IBindCtx_Release(bind);
 
@@ -5697,7 +5743,7 @@ static void test_download(DWORD flags)
         SET_EXPECT(Invoke_AMBIENT_SILENT);
         SET_EXPECT(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
     }
-    if(flags & (DWL_VERBDONE|DWL_HTTP))
+    if(is_mhtml || (flags & (DWL_VERBDONE|DWL_HTTP)))
         SET_EXPECT(Exec_SETPROGRESSMAX);
     if(flags & DWL_EX_GETHOSTINFO)
         SET_EXPECT(GetHostInfo);
@@ -5762,7 +5808,7 @@ static void test_download(DWORD flags)
     }
     if(!is_js && !is_extern) {
         if(!editmode && !(flags & DWL_REFRESH)) {
-            if(!(flags & DWL_EMPTY))
+            if(!is_mhtml && !(flags & DWL_EMPTY))
                 SET_EXPECT(FireNavigateComplete2);
             SET_EXPECT(FireDocumentComplete);
         }
@@ -5788,7 +5834,7 @@ static void test_download(DWORD flags)
         CHECK_CALLED(Invoke_AMBIENT_SILENT);
         CHECK_CALLED(Invoke_AMBIENT_OFFLINEIFNOTCONNECTED);
     }
-    if(flags & DWL_VERBDONE)
+    if(is_mhtml || (flags & DWL_VERBDONE))
         CHECK_CALLED(Exec_SETPROGRESSMAX);
     if(flags & DWL_HTTP)
         SET_CALLED(Exec_SETPROGRESSMAX);
@@ -5874,7 +5920,7 @@ static void test_download(DWORD flags)
     }
     if(!is_js && !is_extern) {
         if(!editmode && !(flags & DWL_REFRESH)) {
-            if(!(flags & DWL_EMPTY)) {
+            if(!is_mhtml && !(flags & DWL_EMPTY)) {
                 todo_wine_if(!support_wbapp)
                     CHECK_CALLED(FireNavigateComplete2);
             }
@@ -7484,6 +7530,7 @@ static void init_test(enum load_state_t ls) {
     complete = FALSE;
     testing_submit = FALSE;
     expect_uihandler_iface = &DocHostUIHandler;
+    is_mhtml = FALSE;
 }
 
 static void test_HTMLDocument(BOOL do_load, BOOL mime)
@@ -7590,6 +7637,60 @@ static void test_HTMLDocument(BOOL do_load, BOOL mime)
     ok(!IsWindow(doc_hwnd), "hwnd is not destroyed\n");
 }
 
+static void test_MHTMLDocument(void)
+{
+    IHTMLDocument2 *doc;
+    IOleObject *oleobj;
+    HRESULT hres;
+
+    if(!is_ie9plus) {
+        win_skip("Skipping MHTML document tests on too old IE.\n");
+        return;
+    }
+
+    trace("Testing MHTMLDocument...\n");
+
+    init_test(LD_DOLOAD);
+    is_mhtml = TRUE;
+    nav_url = nav_serv_url = "mhtml:winetest:doc";
+
+    hres = CoCreateInstance(&CLSID_MHTMLDocument, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
+            &IID_IHTMLDocument2, (void**)&doc);
+    ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
+
+    doc_unk = (IUnknown*)doc;
+
+    test_QueryInterface(doc);
+    test_MSHTML_QueryStatus(doc, OLECMDF_SUPPORTED);
+    test_ViewAdviseSink(doc);
+    test_ConnectionPointContainer(doc);
+
+    hres = IHTMLDocument2_QueryInterface(doc, &IID_IOleObject, (void**)&oleobj);
+    ok(hres == S_OK, "Could not get IOleObject iface: %08x\n", hres);
+    test_ClientSite(oleobj, CLIENTSITE_EXPECTPATH);
+    test_DoVerb(oleobj);
+    IOleObject_Release(oleobj);
+
+    test_GetCurMoniker((IUnknown*)doc, NULL, NULL, FALSE);
+    test_Persist(doc, &Moniker);
+    set_custom_uihandler(doc, &CustomDocHostUIHandler);
+    test_GetCurMoniker((IUnknown*)doc, NULL, "mhtml:winetest:doc", FALSE);
+    test_download(0);
+
+    test_exec_onunload(doc);
+    test_UIDeactivate();
+    test_InPlaceDeactivate(doc, TRUE);
+    test_InPlaceDeactivate(doc, FALSE);
+    test_CloseView();
+    test_Close(doc, TRUE);
+
+    if(view)
+        IOleDocumentView_Release(view);
+    view = NULL;
+
+    release_document(doc);
+}
+
 static void test_HTMLDocument_hlink(DWORD status)
 {
     IHTMLDocument2 *doc;
@@ -8634,6 +8735,7 @@ START_TEST(htmldoc)
     test_HTMLDocument(TRUE, TRUE);
     test_HTMLDocument_StreamLoad();
     test_HTMLDocument_StreamInitNew();
+    test_MHTMLDocument();
     test_editing_mode(FALSE, FALSE);
     test_editing_mode(TRUE, FALSE);
     test_editing_mode(TRUE, TRUE);




More information about the wine-cvs mailing list