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