diff --git a/dlls/mshtml/tests/htmldoc.c b/dlls/mshtml/tests/htmldoc.c
index 55e3ac70db5..83f44f49271 100644
--- a/dlls/mshtml/tests/htmldoc.c
+++ b/dlls/mshtml/tests/htmldoc.c
@@ -134,6 +134,7 @@ DEFINE_EXPECT(Exec_UPDATECOMMANDS);
DEFINE_EXPECT(Exec_SETTITLE);
DEFINE_EXPECT(Exec_HTTPEQUIV);
DEFINE_EXPECT(Exec_MSHTML_PARSECOMPLETE);
+DEFINE_EXPECT(Exec_Explorer_38);
DEFINE_EXPECT(Exec_Explorer_69);
DEFINE_EXPECT(Exec_DOCCANNAVIGATE);
DEFINE_EXPECT(Invoke_AMBIENT_USERMODE);
@@ -214,7 +215,7 @@ static enum load_state_t {
} load_state;
static LPCOLESTR expect_status_text = NULL;
-static const char *nav_url, *nav_serv_url;
+static const char *nav_url, *nav_serv_url, *prev_url;
static const char html_page[] =
""
@@ -431,6 +432,24 @@ static void _test_GetCurMoniker(unsigned line, IUnknown *unk, IMoniker *exmon, c
IMoniker_Release(mon);
}
+#define test_current_url(a,b) _test_current_url(__LINE__,a,b)
+static void _test_current_url(unsigned line, IUnknown *unk, const char *exurl)
+{
+ IHTMLDocument2 *doc;
+ BSTR url;
+ HRESULT hres;
+
+ hres = IUnknown_QueryInterface(unk, &IID_IHTMLDocument2, (void**)&doc);
+ ok_(__FILE__,line)(hres == S_OK, "QueryInterface(IID_IHTMLDocument2) failed: %08x\n", hres);
+
+ hres = IHTMLDocument2_get_URL(doc, &url);
+ ok_(__FILE__,line)(hres == S_OK, "get_URL failed: %08x\n", hres);
+ ok_(__FILE__,line)(!strcmp_wa(url, exurl), "Unexpected URL %s, expected %s\n", wine_dbgstr_w(url), exurl);
+ SysFreeString(url);
+
+ IHTMLDocument2_Release(doc);
+}
+
DEFINE_GUID(IID_External_unk,0x30510406,0x98B5,0x11CF,0xBB,0x82,0x00,0xAA,0x00,0xBD,0xCE,0x0B);
static HRESULT WINAPI External_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
@@ -2851,9 +2870,10 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID
HRESULT hres;
ok(pvaIn != NULL, "pvaIn == NULL\n");
- ok(pvaOut != NULL, "pvaOut != NULL\n");
+ ok(pvaOut != NULL || broken(!pvaOut), "pvaOut != NULL\n");
ok(V_VT(pvaIn) == VT_ARRAY, "V_VT(pvaIn) = %d\n", V_VT(pvaIn));
- ok(V_VT(pvaOut) == VT_BOOL, "V_VT(pvaOut) = %d\n", V_VT(pvaOut));
+ if(pvaOut)
+ ok(V_VT(pvaOut) == VT_BOOL, "V_VT(pvaOut) = %d\n", V_VT(pvaOut));
sa = V_ARRAY(pvaIn);
dim = SafeArrayGetDim(sa);
@@ -2903,6 +2923,16 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID
ok(nCmdexecopt == 0, "nCmdexecopts=%08x\n", nCmdexecopt);
switch(nCmdID) {
+ case 38:
+ CHECK_EXPECT2(Exec_Explorer_38);
+ ok(pvaIn != NULL, "pvaIn == NULL\n");
+ ok(V_VT(pvaIn) == VT_I4 , "V_VT(pvaIn) = %d\n", V_VT(pvaIn));
+ ok(!V_I4(pvaIn), "V_I4(pvaIn) = %d\n", V_I4(pvaIn));
+ ok(!pvaOut, "pvaOut != NULL\n");
+
+ test_current_url(doc_unk, prev_url);
+
+ return S_OK;
case 69:
CHECK_EXPECT2(Exec_Explorer_69);
ok(pvaIn == NULL, "pvaIn != NULL\n");
@@ -3082,6 +3112,119 @@ static const IDispatchVtbl EventDispatchVtbl = {
static IDispatch EventDispatch = { &EventDispatchVtbl };
+static HRESULT WINAPI TravelLog_QueryInterface(ITravelLog *iface, REFIID riid, void **ppv)
+{
+ static const IID IID_IIETravelLog2 = {0xb67cefd2,0xe3f1,0x478a,{0x9b,0xfa,0xd8,0x93,0x70,0x37,0x5e,0x94}};
+
+ if(IsEqualGUID(&IID_IUnknown, riid) || IsEqualGUID(&IID_ITravelLog, riid)) {
+ *ppv = iface;
+ return S_OK;
+ }
+
+ if(!IsEqualGUID(&IID_IIETravelLog2, riid))
+ ok(0, "unexpected call %s\n", debugstr_guid(riid));
+
+ *ppv = NULL;
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI TravelLog_AddRef(ITravelLog *iface)
+{
+ return 2;
+}
+
+static ULONG WINAPI TravelLog_Release(ITravelLog *iface)
+{
+ return 1;
+}
+
+static HRESULT WINAPI TravelLog_AddEntry(ITravelLog *iface, IUnknown *punk, BOOL fIsLocalAnchor)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TravelLog_UpdateEntry(ITravelLog *iface, IUnknown *punk, BOOL fIsLocalAnchor)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TravelLog_UpdateExternal(ITravelLog *iface, IUnknown *punk, IUnknown *punkHLBrowseContext)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TravelLog_Travel(ITravelLog *iface, IUnknown *punk, int iOffset)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TravelLog_GetTravelEntry(ITravelLog *iface, IUnknown *punk, int iOffset, ITravelEntry **ppte)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TravelLog_FindTravelEntry(ITravelLog *iface, IUnknown *punk, LPCITEMIDLIST pidl, ITravelEntry **ppte)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TravelLog_GetTooltipText(ITravelLog *iface, IUnknown *punk, int iOffset, int idsTemplate,
+ LPWSTR pwzText, DWORD cchText)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TravelLog_InsertMenuEntries(ITravelLog *iface, IUnknown *punk, HMENU hmenu, int nPos,
+ int idFirst, int idLast, DWORD dwFlags)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TravelLog_Clone(ITravelLog *iface, ITravelLog **pptl)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static DWORD WINAPI TravelLog_CountEntries(ITravelLog *iface, IUnknown *punk)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI TravelLog_Revert(ITravelLog *iface)
+{
+ ok(0, "unexpected call\n");
+ return E_NOTIMPL;
+}
+
+static const ITravelLogVtbl TravelLogVtbl = {
+ TravelLog_QueryInterface,
+ TravelLog_AddRef,
+ TravelLog_Release,
+ TravelLog_AddEntry,
+ TravelLog_UpdateEntry,
+ TravelLog_UpdateExternal,
+ TravelLog_Travel,
+ TravelLog_GetTravelEntry,
+ TravelLog_FindTravelEntry,
+ TravelLog_GetTooltipText,
+ TravelLog_InsertMenuEntries,
+ TravelLog_Clone,
+ TravelLog_CountEntries,
+ TravelLog_Revert
+};
+
+static ITravelLog TravelLog = { &TravelLogVtbl };
+
static HRESULT browserservice_qi(REFIID,void**);
static HRESULT WINAPI DocObjectService_QueryInterface(IDocObjectService* This, REFIID riid, void **ppv)
@@ -3409,12 +3552,17 @@ static HRESULT WINAPI BrowserService_GetOleObject(
return E_NOTIMPL;
}
-static HRESULT WINAPI BrowserService_GetTravelLog(
- IBrowserService* This,
- ITravelLog **pptl)
+static HRESULT WINAPI BrowserService_GetTravelLog(IBrowserService* This, ITravelLog **pptl)
{
CHECK_EXPECT(GetTravelLog);
- return E_NOTIMPL;
+
+ ok(pptl != NULL, "pptl = NULL\n");
+
+ if(!support_wbapp)
+ return E_NOTIMPL;
+
+ *pptl = &TravelLog;
+ return S_OK;
}
static HRESULT WINAPI BrowserService_ShowControlWindow(
@@ -4802,6 +4950,7 @@ static void test_Load(IPersistMoniker *persist, IMoniker *mon)
#define DWL_EMPTY 0x0010
#define DWL_JAVASCRIPT 0x0020
#define DWL_ONREADY_LOADING 0x0040
+#define DWL_EXPECT_HISTUPDATE 0x0080
static void test_download(DWORD flags)
{
@@ -4874,6 +5023,8 @@ static void test_download(DWORD flags)
SET_EXPECT(UpdateUI);
SET_EXPECT(Exec_UPDATECOMMANDS);
SET_EXPECT(Exec_SETTITLE);
+ if(flags & DWL_EXPECT_HISTUPDATE)
+ SET_EXPECT(Exec_Explorer_38);
SET_EXPECT(UpdateBackForwardState);
}
if(!is_js) {
@@ -4961,6 +5112,8 @@ static void test_download(DWORD flags)
CLEAR_CALLED(UpdateUI);
CLEAR_CALLED(Exec_UPDATECOMMANDS);
CLEAR_CALLED(Exec_SETTITLE);
+ if(flags & DWL_EXPECT_HISTUPDATE)
+ todo_wine CHECK_CALLED(Exec_Explorer_38);
todo_wine CHECK_CALLED_BROKEN(UpdateBackForwardState);
}
if(!is_js) {
@@ -5021,7 +5174,8 @@ static void test_Persist(IHTMLDocument2 *doc, IMoniker *mon)
}
}
-static void test_put_href(IHTMLDocument2 *doc, BOOL use_replace, const char *href, const char *new_nav_url, BOOL is_js, BOOL is_hash)
+static void test_put_href(IHTMLDocument2 *doc, BOOL use_replace, const char *href, const char *new_nav_url, BOOL is_js,
+ BOOL is_hash, DWORD dwl_flags)
{
const char *prev_nav_url = NULL;
IHTMLPrivateWindow *priv_window;
@@ -5040,7 +5194,7 @@ static void test_put_href(IHTMLDocument2 *doc, BOOL use_replace, const char *hre
ok(hres == S_OK, "get_location failed: %08x\n", hres);
ok(location != NULL, "location == NULL\n");
- prev_nav_url = nav_url;
+ prev_url = prev_nav_url = nav_url;
nav_url = new_nav_url;
if(!loading_hash)
nav_serv_url = new_nav_url;
@@ -5160,7 +5314,7 @@ static void test_put_href(IHTMLDocument2 *doc, BOOL use_replace, const char *hre
if(is_js)
ignore_external_qi = TRUE;
- test_download(DWL_VERBDONE | (is_js ? DWL_JAVASCRIPT : DWL_ONREADY_LOADING));
+ test_download(DWL_VERBDONE | (is_js ? DWL_JAVASCRIPT : DWL_ONREADY_LOADING) | dwl_flags);
if(is_js)
ignore_external_qi = FALSE;
@@ -6649,13 +6803,12 @@ static void test_HTMLDocument_http(BOOL with_wbapp)
nav_url = nav_serv_url = "http://www.winehq.org/"; /* for valid prev nav_url */
if(support_wbapp) {
- test_put_href(doc, FALSE, "#test", "http://www.winehq.org/#test", FALSE, TRUE);
+ test_put_href(doc, FALSE, "#test", "http://www.winehq.org/#test", FALSE, TRUE, 0);
test_travellog(doc);
}
- test_put_href(doc, FALSE, NULL, "javascript:external&&undefined", TRUE, FALSE);
-
- test_put_href(doc, FALSE, NULL, "about:blank", FALSE, FALSE);
- test_put_href(doc, TRUE, NULL, "about:replace", FALSE, FALSE);
+ test_put_href(doc, FALSE, NULL, "javascript:external&&undefined", TRUE, FALSE, 0);
+ test_put_href(doc, FALSE, NULL, "about:blank", FALSE, FALSE, support_wbapp ? DWL_EXPECT_HISTUPDATE : 0);
+ test_put_href(doc, TRUE, NULL, "about:replace", FALSE, FALSE, 0);
test_open_window(doc, TRUE);
if(!support_wbapp) /* FIXME */