-sync mshtml_winetest with wine 1.1.31

svn path=/trunk/; revision=43657
This commit is contained in:
Christoph von Wittich 2009-10-20 19:28:26 +00:00
parent ed7ac63c3c
commit 75b56cce43
8 changed files with 3156 additions and 368 deletions

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,5 +1,5 @@
/* /*
* Copyright 2005-2007 Jacek Caban for CodeWeavers * Copyright 2005-2009 Jacek Caban for CodeWeavers
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
@ -37,6 +37,7 @@
#include "idispids.h" #include "idispids.h"
#include "shlguid.h" #include "shlguid.h"
#include "perhist.h" #include "perhist.h"
#include "mshtml_test.h"
DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
DEFINE_GUID(IID_IProxyManager,0x00000008,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46); DEFINE_GUID(IID_IProxyManager,0x00000008,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
@ -104,6 +105,7 @@ DEFINE_EXPECT(Exec_ShellDocView_37);
DEFINE_EXPECT(Exec_ShellDocView_84); DEFINE_EXPECT(Exec_ShellDocView_84);
DEFINE_EXPECT(Exec_ShellDocView_103); DEFINE_EXPECT(Exec_ShellDocView_103);
DEFINE_EXPECT(Exec_ShellDocView_105); DEFINE_EXPECT(Exec_ShellDocView_105);
DEFINE_EXPECT(Exec_ShellDocView_140);
DEFINE_EXPECT(Exec_UPDATECOMMANDS); DEFINE_EXPECT(Exec_UPDATECOMMANDS);
DEFINE_EXPECT(Exec_SETTITLE); DEFINE_EXPECT(Exec_SETTITLE);
DEFINE_EXPECT(Exec_HTTPEQUIV); DEFINE_EXPECT(Exec_HTTPEQUIV);
@ -121,6 +123,7 @@ DEFINE_EXPECT(Navigate);
DEFINE_EXPECT(OnFrameWindowActivate); DEFINE_EXPECT(OnFrameWindowActivate);
DEFINE_EXPECT(OnChanged_READYSTATE); DEFINE_EXPECT(OnChanged_READYSTATE);
DEFINE_EXPECT(OnChanged_1005); DEFINE_EXPECT(OnChanged_1005);
DEFINE_EXPECT(OnChanged_1012);
DEFINE_EXPECT(GetDisplayName); DEFINE_EXPECT(GetDisplayName);
DEFINE_EXPECT(BindToStorage); DEFINE_EXPECT(BindToStorage);
DEFINE_EXPECT(IsSystemMoniker); DEFINE_EXPECT(IsSystemMoniker);
@ -144,8 +147,10 @@ DEFINE_EXPECT(EnableModeless_TRUE);
DEFINE_EXPECT(EnableModeless_FALSE); DEFINE_EXPECT(EnableModeless_FALSE);
DEFINE_EXPECT(Frame_EnableModeless_TRUE); DEFINE_EXPECT(Frame_EnableModeless_TRUE);
DEFINE_EXPECT(Frame_EnableModeless_FALSE); DEFINE_EXPECT(Frame_EnableModeless_FALSE);
DEFINE_EXPECT(Frame_GetWindow);
static IUnknown *doc_unk; static IUnknown *doc_unk;
static IMoniker *doc_mon;
static BOOL expect_LockContainer_fLock; static BOOL expect_LockContainer_fLock;
static BOOL expect_InPlaceUIWindow_SetActiveObject_active = TRUE; static BOOL expect_InPlaceUIWindow_SetActiveObject_active = TRUE;
static BOOL ipsex; static BOOL ipsex;
@ -182,8 +187,6 @@ static BOOL nogecko = FALSE;
#define test_readyState(u) _test_readyState(__LINE__,u) #define test_readyState(u) _test_readyState(__LINE__,u)
static void _test_readyState(unsigned,IUnknown*); static void _test_readyState(unsigned,IUnknown*);
static void test_GetCurMoniker(IUnknown*,IMoniker*,LPCWSTR);
static const WCHAR wszTimesNewRoman[] = static const WCHAR wszTimesNewRoman[] =
{'T','i','m','e','s',' ','N','e','w',' ','R','o','m','a','n',0}; {'T','i','m','e','s',' ','N','e','w',' ','R','o','m','a','n',0};
static const WCHAR wszArial[] = static const WCHAR wszArial[] =
@ -201,15 +204,17 @@ static const char *debugstr_guid(REFIID riid)
return buf; return buf;
} }
static const char *debugstr_w(LPCWSTR str) static int strcmp_wa(LPCWSTR strw, const char *stra)
{ {
static char buf[1024]; CHAR buf[512];
WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), NULL, NULL);
return lstrcmpA(stra, buf);
}
if(!str) static BOOL is_english(void)
return "(null)"; {
return PRIMARYLANGID(GetSystemDefaultLangID()) == LANG_ENGLISH
WideCharToMultiByte(CP_ACP, 0, str, -1, buf, sizeof(buf), NULL, NULL); && PRIMARYLANGID(GetUserDefaultLangID()) == LANG_ENGLISH;
return buf;
} }
#define EXPECT_UPDATEUI 1 #define EXPECT_UPDATEUI 1
@ -241,6 +246,75 @@ static void test_timer(DWORD flags)
CHECK_CALLED(Exec_SETTITLE); CHECK_CALLED(Exec_SETTITLE);
} }
static IMoniker Moniker;
#define test_GetCurMoniker(u,m,v) _test_GetCurMoniker(__LINE__,u,m,v)
static void _test_GetCurMoniker(unsigned line, 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);
ok(hres == S_OK, "QueryInterface(IID_IPersistMoniker) failed: %08x\n", hres);
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) {
LPOLESTR url;
BOOL exb = expect_GetDisplayName;
BOOL clb = called_GetDisplayName;
ok_(__FILE__,line)(hres == S_OK, "GetCurrentMoniker failed: %08x\n", hres);
ok_(__FILE__,line)(mon == exmon, "mon(%p) != exmon(%p)\n", mon, exmon);
if(mon == &Moniker)
SET_EXPECT(GetDisplayName);
hres = IMoniker_GetDisplayName(mon, NULL, NULL, &url);
ok(hres == S_OK, "GetDisplayName failed: %08x\n", hres);
if(mon == &Moniker)
CHECK_CALLED(GetDisplayName);
expect_GetDisplayName = exb;
called_GetDisplayName = clb;
ok(!lstrcmpW(url, doc_url), "url != doc_url\n");
CoTaskMemFree(url);
}else if(exurl) {
LPOLESTR 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");
ok(!lstrcmpW(url, doc_url), "url != doc_url\n");
CoTaskMemFree(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);
}
DEFINE_GUID(IID_External_unk,0x30510406,0x98B5,0x11CF,0xBB,0x82,0x00,0xAA,0x00,0xBD,0xCE,0x0B); 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) static HRESULT WINAPI External_QueryInterface(IDispatch *iface, REFIID riid, void **ppv)
@ -672,6 +746,13 @@ static HRESULT WINAPI PropertyNotifySink_OnChanged(IPropertyNotifySink *iface, D
test_readyState(NULL); test_readyState(NULL);
readystate_set_interactive = (load_state != LD_INTERACTIVE); readystate_set_interactive = (load_state != LD_INTERACTIVE);
return S_OK; return S_OK;
case 1012:
CHECK_EXPECT(OnChanged_1012);
return S_OK;
case 3000029:
case 3000030:
/* TODO */
return S_OK;
} }
ok(0, "unexpected id %d\n", dispID); ok(0, "unexpected id %d\n", dispID);
@ -1204,7 +1285,12 @@ static IOleContainer OleContainer = { &OleContainerVtbl };
static HRESULT WINAPI InPlaceFrame_QueryInterface(IOleInPlaceFrame *iface, REFIID riid, void **ppv) static HRESULT WINAPI InPlaceFrame_QueryInterface(IOleInPlaceFrame *iface, REFIID riid, void **ppv)
{ {
ok(0, "unexpected call\n"); static const GUID undocumented_frame_iid = {0xfbece6c9,0x48d7,0x4a37,{0x8f,0xe3,0x6a,0xd4,0x27,0x2f,0xdd,0xac}};
if(!IsEqualGUID(&undocumented_frame_iid, riid))
ok(0, "unexpected riid %s\n", debugstr_guid(riid));
*ppv = NULL;
return E_NOINTERFACE; return E_NOINTERFACE;
} }
@ -1220,7 +1306,7 @@ static ULONG WINAPI InPlaceFrame_Release(IOleInPlaceFrame *iface)
static HRESULT WINAPI InPlaceFrame_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd) static HRESULT WINAPI InPlaceFrame_GetWindow(IOleInPlaceFrame *iface, HWND *phwnd)
{ {
ok(0, "unexpected call\n"); CHECK_EXPECT(Frame_GetWindow);
return E_NOTIMPL; return E_NOTIMPL;
} }
@ -1260,7 +1346,7 @@ static HRESULT WINAPI InPlaceUIWindow_SetActiveObject(IOleInPlaceFrame *iface,
if(expect_InPlaceUIWindow_SetActiveObject_active) { if(expect_InPlaceUIWindow_SetActiveObject_active) {
ok(pActiveObject != NULL, "pActiveObject = NULL\n"); ok(pActiveObject != NULL, "pActiveObject = NULL\n");
if(pActiveObject && PRIMARYLANGID(GetSystemDefaultLangID()) == LANG_ENGLISH) if(pActiveObject && is_english())
ok(!lstrcmpW(wszHTML_Document, pszObjName), "pszObjName != \"HTML Document\"\n"); ok(!lstrcmpW(wszHTML_Document, pszObjName), "pszObjName != \"HTML Document\"\n");
} }
else { else {
@ -1280,7 +1366,7 @@ static HRESULT WINAPI InPlaceFrame_SetActiveObject(IOleInPlaceFrame *iface,
if(pActiveObject) { if(pActiveObject) {
CHECK_EXPECT2(SetActiveObject); CHECK_EXPECT2(SetActiveObject);
if(pActiveObject && PRIMARYLANGID(GetSystemDefaultLangID()) == LANG_ENGLISH) if(pActiveObject && is_english())
ok(!lstrcmpW(wszHTML_Document, pszObjName), "pszObjName != \"HTML Document\"\n"); ok(!lstrcmpW(wszHTML_Document, pszObjName), "pszObjName != \"HTML Document\"\n");
}else { }else {
CHECK_EXPECT(SetActiveObject_null); CHECK_EXPECT(SetActiveObject_null);
@ -1323,9 +1409,9 @@ static HRESULT WINAPI InPlaceFrame_SetStatusText(IOleInPlaceFrame *iface, LPCOLE
static HRESULT WINAPI InPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable) static HRESULT WINAPI InPlaceFrame_EnableModeless(IOleInPlaceFrame *iface, BOOL fEnable)
{ {
if(fEnable) if(fEnable)
CHECK_EXPECT(Frame_EnableModeless_TRUE); CHECK_EXPECT2(Frame_EnableModeless_TRUE);
else else
CHECK_EXPECT(Frame_EnableModeless_FALSE); CHECK_EXPECT2(Frame_EnableModeless_FALSE);
return E_NOTIMPL; return E_NOTIMPL;
} }
@ -1386,7 +1472,7 @@ static ULONG WINAPI InPlaceSite_Release(IOleInPlaceSiteEx *iface)
static HRESULT WINAPI InPlaceSite_GetWindow(IOleInPlaceSiteEx *iface, HWND *phwnd) static HRESULT WINAPI InPlaceSite_GetWindow(IOleInPlaceSiteEx *iface, HWND *phwnd)
{ {
CHECK_EXPECT(GetWindow); CHECK_EXPECT2(GetWindow);
ok(phwnd != NULL, "phwnd = NULL\n"); ok(phwnd != NULL, "phwnd = NULL\n");
*phwnd = container_hwnd; *phwnd = container_hwnd;
return S_OK; return S_OK;
@ -1943,9 +2029,9 @@ static HRESULT WINAPI DocHostUIHandler_UpdateUI(IDocHostUIHandler2 *iface)
static HRESULT WINAPI DocHostUIHandler_EnableModeless(IDocHostUIHandler2 *iface, BOOL fEnable) static HRESULT WINAPI DocHostUIHandler_EnableModeless(IDocHostUIHandler2 *iface, BOOL fEnable)
{ {
if(fEnable) if(fEnable)
CHECK_EXPECT(EnableModeless_TRUE); CHECK_EXPECT2(EnableModeless_TRUE);
else else
CHECK_EXPECT(EnableModeless_FALSE); CHECK_EXPECT2(EnableModeless_FALSE);
return E_NOTIMPL; return E_NOTIMPL;
} }
@ -2168,8 +2254,12 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID
return S_OK; return S_OK;
case OLECMDID_HTTPEQUIV: case OLECMDID_HTTPEQUIV:
CHECK_EXPECT2(Exec_HTTPEQUIV); CHECK_EXPECT2(Exec_HTTPEQUIV);
ok(nCmdexecopt == OLECMDEXECOPT_DONTPROMPTUSER, "nCmdexecopts=%08x\n", nCmdexecopt); ok(!nCmdexecopt, "nCmdexecopts=%08x\n", nCmdexecopt);
/* TODO */ ok(pvaIn != NULL, "pvaIn == NULL\n");
ok(pvaOut == NULL, "pvaOut=%p\n", pvaOut);
ok(V_VT(pvaIn) == VT_BSTR, "V_VT(pvaIn)=%d\n", V_VT(pvaIn));
ok(V_BSTR(pvaIn) != NULL, "V_BSTR(pvaIn) = NULL\n");
test_readyState(NULL);
return S_OK; return S_OK;
default: default:
ok(0, "unexpected command %d\n", nCmdID); ok(0, "unexpected command %d\n", nCmdID);
@ -2187,7 +2277,7 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID
if(load_from_stream) if(load_from_stream)
test_GetCurMoniker(doc_unk, NULL, about_blank_url); test_GetCurMoniker(doc_unk, NULL, about_blank_url);
else if(!editmode) else if(!editmode)
test_GetCurMoniker(doc_unk, &Moniker, NULL); test_GetCurMoniker(doc_unk, doc_mon, NULL);
ok(pvaOut == NULL, "pvaOut=%p, expected NULL\n", pvaOut); ok(pvaOut == NULL, "pvaOut=%p, expected NULL\n", pvaOut);
ok(pvaIn != NULL, "pvaIn == NULL\n"); ok(pvaIn != NULL, "pvaIn == NULL\n");
@ -2222,6 +2312,14 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID
return E_NOTIMPL; return E_NOTIMPL;
case 140:
CHECK_EXPECT2(Exec_ShellDocView_140);
ok(pvaIn == NULL, "pvaIn != NULL\n");
ok(pvaOut == NULL, "pvaOut != NULL\n");
return E_NOTIMPL;
default: default:
ok(0, "unexpected command %d\n", nCmdID); ok(0, "unexpected command %d\n", nCmdID);
return E_FAIL; return E_FAIL;
@ -2267,6 +2365,9 @@ static HRESULT WINAPI OleCommandTarget_Exec(IOleCommandTarget *iface, const GUID
ok(pvaIn == NULL, "pvaIn != NULL\n"); ok(pvaIn == NULL, "pvaIn != NULL\n");
ok(pvaOut == NULL, "pvaOut != NULL\n"); ok(pvaOut == NULL, "pvaOut != NULL\n");
return S_OK; return S_OK;
case OLECMDID_SHOWSCRIPTERROR:
/* TODO */
return S_OK;
default: default:
ok(0, "unexpected command %d\n", nCmdID); ok(0, "unexpected command %d\n", nCmdID);
return E_FAIL; return E_FAIL;
@ -2408,8 +2509,10 @@ static const IServiceProviderVtbl ServiceProviderVtbl = {
static IServiceProvider ServiceProvider = { &ServiceProviderVtbl }; static IServiceProvider ServiceProvider = { &ServiceProviderVtbl };
DEFINE_GUID(IID_unk1, 0xD48A6EC6,0x6A4A,0x11CF,0x94,0xA7,0x44,0x45,0x53,0x54,0x00,0x00); /* HTMLWindow2 ? */ DEFINE_GUID(IID_unk1, 0xD48A6EC6,0x6A4A,0x11CF,0x94,0xA7,0x44,0x45,0x53,0x54,0x00,0x00); /* HTMLWindow2 ? */
DEFINE_GUID(IID_unk2, 0x7BB0B520,0xB1A7,0x11D2,0xBB,0x23,0x00,0xC0,0x4F,0x79,0xAB,0xCD); DEFINE_GUID(IID_IThumbnailView, 0x7BB0B520,0xB1A7,0x11D2,0xBB,0x23,0x00,0xC0,0x4F,0x79,0xAB,0xCD);
DEFINE_GUID(IID_unk3, 0x000670BA,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46); DEFINE_GUID(IID_IRenMailEditor, 0x000670BA,0x0000,0x0000,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
DEFINE_GUID(IID_unk4, 0x305104a6,0x98b5,0x11cf,0xbb,0x82,0x00,0xaa,0x00,0xbd,0xce,0x0b);
DEFINE_GUID(IID_IDocHostUIHandlerPriv, 0xf0d241d1,0x5d0e,0x4e85,0xbc,0xb4,0xfa,0xd7,0xf7,0xc5,0x52,0x8c);
static HRESULT QueryInterface(REFIID riid, void **ppv) static HRESULT QueryInterface(REFIID riid, void **ppv)
{ {
@ -2441,9 +2544,13 @@ static HRESULT QueryInterface(REFIID riid, void **ppv)
return E_NOINTERFACE; /* ? */ return E_NOINTERFACE; /* ? */
else if(IsEqualGUID(&IID_unk1, riid)) else if(IsEqualGUID(&IID_unk1, riid))
return E_NOINTERFACE; /* HTMLWindow2 ? */ return E_NOINTERFACE; /* HTMLWindow2 ? */
else if(IsEqualGUID(&IID_unk2, riid)) else if(IsEqualGUID(&IID_IThumbnailView, riid))
return E_NOINTERFACE; /* ? */ return E_NOINTERFACE; /* ? */
else if(IsEqualGUID(&IID_unk3, riid)) else if(IsEqualGUID(&IID_IRenMailEditor, riid))
return E_NOINTERFACE; /* ? */
else if(IsEqualGUID(&IID_unk4, riid))
return E_NOINTERFACE; /* ? */
else if(IsEqualGUID(&IID_IDocHostUIHandlerPriv, riid))
return E_NOINTERFACE; /* ? */ return E_NOINTERFACE; /* ? */
else else
ok(0, "unexpected riid %s\n", debugstr_guid(riid)); ok(0, "unexpected riid %s\n", debugstr_guid(riid));
@ -2466,18 +2573,13 @@ static void _test_readyState(unsigned line, IUnknown *unk)
VARIANT out; VARIANT out;
HRESULT hres; HRESULT hres;
static const WCHAR wszUninitialized[] = {'u','n','i','n','i','t','i','a','l','i','z','e','d',0}; static const LPCSTR expected_state[] = {
static const WCHAR wszLoading[] = {'l','o','a','d','i','n','g',0}; "uninitialized",
static const WCHAR wszInteractive[] = {'i','n','t','e','r','a','c','t','i','v','e',0}; "loading",
static const WCHAR wszComplete[] = {'c','o','m','p','l','e','t','e',0};
static const LPCWSTR expected_state[] = {
wszUninitialized,
wszLoading,
NULL, NULL,
wszInteractive, "interactive",
wszComplete, "complete",
wszUninitialized "uninitialized"
}; };
if(!unk) if(!unk)
@ -2493,9 +2595,13 @@ static void _test_readyState(unsigned line, IUnknown *unk)
hres = IHTMLDocument2_get_readyState(htmldoc, &state); hres = IHTMLDocument2_get_readyState(htmldoc, &state);
ok(hres == S_OK, "get_ReadyState failed: %08x\n", hres); ok(hres == S_OK, "get_ReadyState failed: %08x\n", hres);
if(!strcmp_wa(state, "interactive") && load_state == LD_LOADING)
load_state = LD_INTERACTIVE;
ok_(__FILE__, line) ok_(__FILE__, line)
(!lstrcmpW(state, expected_state[load_state]), "unexpected state \"%s\", expected %d\n", (!strcmp_wa(state, expected_state[load_state]), "unexpected state %s, expected %d\n",
debugstr_w(state), load_state); wine_dbgstr_w(state), load_state);
SysFreeString(state); SysFreeString(state);
dispparams.cArgs = 0; dispparams.cArgs = 0;
@ -2570,71 +2676,7 @@ static void test_ConnectionPointContainer(IUnknown *unk)
IConnectionPointContainer_Release(container); IConnectionPointContainer_Release(container);
} }
static void test_GetCurMoniker(IUnknown *unk, IMoniker *exmon, LPCWSTR exurl) static void test_Load(IPersistMoniker *persist, IMoniker *mon)
{
IHTMLDocument2 *doc;
IPersistMoniker *permon;
IMoniker *mon = (void*)0xdeadbeef;
BSTR doc_url = (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 = 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) {
LPOLESTR 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;
ok(!lstrcmpW(url, doc_url), "url != doc_url\n");
CoTaskMemFree(url);
}else if(exurl) {
LPOLESTR 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");
ok(!lstrcmpW(url, doc_url), "url != doc_url\n");
CoTaskMemFree(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);
}
static void test_Load(IPersistMoniker *persist)
{ {
IBindCtx *bind; IBindCtx *bind;
HRESULT hres; HRESULT hres;
@ -2644,11 +2686,14 @@ static void test_Load(IPersistMoniker *persist)
test_readyState((IUnknown*)persist); test_readyState((IUnknown*)persist);
doc_mon = mon;
CreateBindCtx(0, &bind); CreateBindCtx(0, &bind);
IBindCtx_RegisterObjectParam(bind, sz_html_clientsite_objectparam, IBindCtx_RegisterObjectParam(bind, sz_html_clientsite_objectparam,
(IUnknown*)&ClientSite); (IUnknown*)&ClientSite);
SET_EXPECT(GetDisplayName); if(mon == &Moniker)
SET_EXPECT(GetDisplayName);
if(!set_clientsite) { if(!set_clientsite) {
SET_EXPECT(Invoke_AMBIENT_USERMODE); SET_EXPECT(Invoke_AMBIENT_USERMODE);
SET_EXPECT(GetHostInfo); SET_EXPECT(GetHostInfo);
@ -2672,7 +2717,8 @@ static void test_Load(IPersistMoniker *persist)
SET_EXPECT(OnChanged_READYSTATE); SET_EXPECT(OnChanged_READYSTATE);
SET_EXPECT(Exec_ShellDocView_84); SET_EXPECT(Exec_ShellDocView_84);
SET_EXPECT(IsSystemMoniker); SET_EXPECT(IsSystemMoniker);
SET_EXPECT(BindToStorage); if(mon == &Moniker)
SET_EXPECT(BindToStorage);
SET_EXPECT(SetActiveObject); SET_EXPECT(SetActiveObject);
if(set_clientsite) { if(set_clientsite) {
SET_EXPECT(Invoke_AMBIENT_SILENT); SET_EXPECT(Invoke_AMBIENT_SILENT);
@ -2683,10 +2729,11 @@ static void test_Load(IPersistMoniker *persist)
expect_LockContainer_fLock = TRUE; expect_LockContainer_fLock = TRUE;
readystate_set_loading = TRUE; readystate_set_loading = TRUE;
hres = IPersistMoniker_Load(persist, FALSE, &Moniker, bind, 0x12); hres = IPersistMoniker_Load(persist, FALSE, mon, bind, 0x12);
ok(hres == S_OK, "Load failed: %08x\n", hres); ok(hres == S_OK, "Load failed: %08x\n", hres);
CHECK_CALLED(GetDisplayName); if(mon == &Moniker)
CHECK_CALLED(GetDisplayName);
if(!set_clientsite) { if(!set_clientsite) {
CHECK_CALLED(Invoke_AMBIENT_USERMODE); CHECK_CALLED(Invoke_AMBIENT_USERMODE);
CHECK_CALLED(GetHostInfo); CHECK_CALLED(GetHostInfo);
@ -2711,7 +2758,8 @@ static void test_Load(IPersistMoniker *persist)
CHECK_CALLED(OnChanged_READYSTATE); CHECK_CALLED(OnChanged_READYSTATE);
SET_CALLED(IsSystemMoniker); /* IE7 */ SET_CALLED(IsSystemMoniker); /* IE7 */
SET_CALLED(Exec_ShellDocView_84); SET_CALLED(Exec_ShellDocView_84);
CHECK_CALLED(BindToStorage); if(mon == &Moniker)
CHECK_CALLED(BindToStorage);
SET_CALLED(SetActiveObject); /* FIXME */ SET_CALLED(SetActiveObject); /* FIXME */
if(set_clientsite) { if(set_clientsite) {
CHECK_CALLED(Invoke_AMBIENT_SILENT); CHECK_CALLED(Invoke_AMBIENT_SILENT);
@ -2721,14 +2769,19 @@ static void test_Load(IPersistMoniker *persist)
set_clientsite = container_locked = TRUE; set_clientsite = container_locked = TRUE;
test_GetCurMoniker((IUnknown*)persist, &Moniker, NULL); test_GetCurMoniker((IUnknown*)persist, mon, NULL);
IBindCtx_Release(bind); IBindCtx_Release(bind);
test_readyState((IUnknown*)persist); test_readyState((IUnknown*)persist);
} }
static void test_download(BOOL verb_done, BOOL css_dwl, BOOL css_try_dwl) #define DWL_VERBDONE 0x0001
#define DWL_CSS 0x0002
#define DWL_TRYCSS 0x0004
#define DWL_HTTP 0x0008
static void test_download(DWORD flags)
{ {
HWND hwnd; HWND hwnd;
MSG msg; MSG msg;
@ -2738,17 +2791,16 @@ static void test_download(BOOL verb_done, BOOL css_dwl, BOOL css_try_dwl)
test_readyState(NULL); test_readyState(NULL);
if(verb_done) { if(flags & (DWL_VERBDONE|DWL_HTTP))
SET_EXPECT(Exec_SETPROGRESSMAX); SET_EXPECT(Exec_SETPROGRESSMAX);
if(!load_from_stream) if((flags & DWL_VERBDONE) && !load_from_stream)
SET_EXPECT(GetHostInfo); SET_EXPECT(GetHostInfo);
}
SET_EXPECT(SetStatusText); SET_EXPECT(SetStatusText);
SET_EXPECT(Exec_SETDOWNLOADSTATE_1); SET_EXPECT(Exec_SETDOWNLOADSTATE_1);
SET_EXPECT(GetDropTarget); SET_EXPECT(GetDropTarget);
if(css_try_dwl) if(flags & DWL_TRYCSS)
SET_EXPECT(Exec_ShellDocView_84); SET_EXPECT(Exec_ShellDocView_84);
if(css_dwl) { if(flags & DWL_CSS) {
SET_EXPECT(CreateInstance); SET_EXPECT(CreateInstance);
SET_EXPECT(Start); SET_EXPECT(Start);
SET_EXPECT(LockRequest); SET_EXPECT(LockRequest);
@ -2761,12 +2813,18 @@ static void test_download(BOOL verb_done, BOOL css_dwl, BOOL css_try_dwl)
SET_EXPECT(Frame_EnableModeless_TRUE); /* IE7 */ SET_EXPECT(Frame_EnableModeless_TRUE); /* IE7 */
SET_EXPECT(EnableModeless_FALSE); /* IE7 */ SET_EXPECT(EnableModeless_FALSE); /* IE7 */
SET_EXPECT(Frame_EnableModeless_FALSE); /* IE7 */ SET_EXPECT(Frame_EnableModeless_FALSE); /* IE7 */
if(doc_mon != &Moniker) {
SET_EXPECT(OnChanged_1012);
SET_EXPECT(Exec_HTTPEQUIV);
SET_EXPECT(Exec_SETTITLE);
}
SET_EXPECT(OnChanged_1005); SET_EXPECT(OnChanged_1005);
SET_EXPECT(OnChanged_READYSTATE); SET_EXPECT(OnChanged_READYSTATE);
SET_EXPECT(Exec_SETPROGRESSPOS); SET_EXPECT(Exec_SETPROGRESSPOS);
SET_EXPECT(Exec_SETDOWNLOADSTATE_0); SET_EXPECT(Exec_SETDOWNLOADSTATE_0);
SET_EXPECT(Exec_ShellDocView_103); SET_EXPECT(Exec_ShellDocView_103);
SET_EXPECT(Exec_ShellDocView_105); SET_EXPECT(Exec_ShellDocView_105);
SET_EXPECT(Exec_ShellDocView_140);
SET_EXPECT(Exec_MSHTML_PARSECOMPLETE); SET_EXPECT(Exec_MSHTML_PARSECOMPLETE);
SET_EXPECT(Exec_HTTPEQUIV_DONE); SET_EXPECT(Exec_HTTPEQUIV_DONE);
SET_EXPECT(SetStatusText); SET_EXPECT(SetStatusText);
@ -2777,17 +2835,18 @@ static void test_download(BOOL verb_done, BOOL css_dwl, BOOL css_try_dwl)
DispatchMessage(&msg); DispatchMessage(&msg);
} }
if(verb_done) { if(flags & DWL_VERBDONE)
CHECK_CALLED(Exec_SETPROGRESSMAX); CHECK_CALLED(Exec_SETPROGRESSMAX);
if(!load_from_stream) if(flags & DWL_HTTP)
CHECK_CALLED(GetHostInfo); SET_CALLED(Exec_SETPROGRESSMAX);
} if((flags & DWL_VERBDONE) && !load_from_stream)
CHECK_CALLED(GetHostInfo);
CHECK_CALLED(SetStatusText); CHECK_CALLED(SetStatusText);
CHECK_CALLED(Exec_SETDOWNLOADSTATE_1); CHECK_CALLED(Exec_SETDOWNLOADSTATE_1);
CHECK_CALLED(GetDropTarget); CHECK_CALLED(GetDropTarget);
if(css_try_dwl) if(flags & DWL_TRYCSS)
SET_CALLED(Exec_ShellDocView_84); SET_CALLED(Exec_ShellDocView_84);
if(css_dwl) { if(flags & DWL_CSS) {
if(called_CreateInstance) { if(called_CreateInstance) {
CHECK_CALLED(CreateInstance); CHECK_CALLED(CreateInstance);
CHECK_CALLED(Start); CHECK_CALLED(Start);
@ -2814,12 +2873,18 @@ static void test_download(BOOL verb_done, BOOL css_dwl, BOOL css_try_dwl)
SET_CALLED(Frame_EnableModeless_TRUE); /* IE7 */ SET_CALLED(Frame_EnableModeless_TRUE); /* IE7 */
SET_CALLED(EnableModeless_FALSE); /* IE7 */ SET_CALLED(EnableModeless_FALSE); /* IE7 */
SET_CALLED(Frame_EnableModeless_FALSE); /* IE7 */ SET_CALLED(Frame_EnableModeless_FALSE); /* IE7 */
if(doc_mon != &Moniker) todo_wine {
CHECK_CALLED(OnChanged_1012);
CHECK_CALLED(Exec_HTTPEQUIV);
CHECK_CALLED(Exec_SETTITLE);
}
CHECK_CALLED(OnChanged_1005); CHECK_CALLED(OnChanged_1005);
CHECK_CALLED(OnChanged_READYSTATE); CHECK_CALLED(OnChanged_READYSTATE);
CHECK_CALLED(Exec_SETPROGRESSPOS); CHECK_CALLED(Exec_SETPROGRESSPOS);
CHECK_CALLED(Exec_SETDOWNLOADSTATE_0); CHECK_CALLED(Exec_SETDOWNLOADSTATE_0);
SET_CALLED(Exec_ShellDocView_103); SET_CALLED(Exec_ShellDocView_103);
SET_CALLED(Exec_ShellDocView_105); SET_CALLED(Exec_ShellDocView_105);
SET_CALLED(Exec_ShellDocView_140);
CHECK_CALLED(Exec_MSHTML_PARSECOMPLETE); CHECK_CALLED(Exec_MSHTML_PARSECOMPLETE);
CHECK_CALLED(Exec_HTTPEQUIV_DONE); CHECK_CALLED(Exec_HTTPEQUIV_DONE);
SET_CALLED(SetStatusText); SET_CALLED(SetStatusText);
@ -2829,7 +2894,7 @@ static void test_download(BOOL verb_done, BOOL css_dwl, BOOL css_try_dwl)
test_readyState(NULL); test_readyState(NULL);
} }
static void test_Persist(IUnknown *unk) static void test_Persist(IUnknown *unk, IMoniker *mon)
{ {
IPersistMoniker *persist_mon; IPersistMoniker *persist_mon;
IPersistFile *persist_file; IPersistFile *persist_file;
@ -2860,7 +2925,7 @@ static void test_Persist(IUnknown *unk)
ok(IsEqualGUID(&CLSID_HTMLDocument, &guid), "guid != CLSID_HTMLDocument\n"); ok(IsEqualGUID(&CLSID_HTMLDocument, &guid), "guid != CLSID_HTMLDocument\n");
if(load_state == LD_DOLOAD) if(load_state == LD_DOLOAD)
test_Load(persist_mon); test_Load(persist_mon, mon);
test_readyState(unk); test_readyState(unk);
@ -3173,7 +3238,7 @@ static void test_exec_fontname(IUnknown *unk, LPCWSTR name, LPCWSTR exname)
if(V_VT(out) == VT_BSTR) { if(V_VT(out) == VT_BSTR) {
if(exname) if(exname)
ok(!lstrcmpW(V_BSTR(out), name ? name : exname), ok(!lstrcmpW(V_BSTR(out), name ? name : exname),
"unexpected fontname \"%s\"\n", debugstr_w(name)); "unexpected fontname %s\n", wine_dbgstr_w(name));
else else
ok(V_BSTR(out) == NULL, "V_BSTR(out) != NULL\n"); ok(V_BSTR(out) == NULL, "V_BSTR(out) != NULL\n");
} }
@ -3826,14 +3891,14 @@ static void test_HTMLDocument(BOOL do_load)
test_external(unk, FALSE); test_external(unk, FALSE);
test_ConnectionPointContainer(unk); test_ConnectionPointContainer(unk);
test_GetCurMoniker(unk, NULL, NULL); test_GetCurMoniker(unk, NULL, NULL);
test_Persist(unk); test_Persist(unk, &Moniker);
if(!do_load) if(!do_load)
test_OnAmbientPropertyChange2(unk); test_OnAmbientPropertyChange2(unk);
test_Activate(unk, CLIENTSITE_EXPECTPATH); test_Activate(unk, CLIENTSITE_EXPECTPATH);
if(do_load) { if(do_load) {
test_download(FALSE, TRUE, TRUE); test_download(DWL_CSS|DWL_TRYCSS);
test_GetCurMoniker(unk, &Moniker, NULL); test_GetCurMoniker(unk, &Moniker, NULL);
} }
@ -3921,14 +3986,14 @@ static void test_HTMLDocument_hlink(void)
test_ConnectionPointContainer(unk); test_ConnectionPointContainer(unk);
test_GetCurMoniker(unk, NULL, NULL); test_GetCurMoniker(unk, NULL, NULL);
test_Persist(unk); test_Persist(unk, &Moniker);
test_Navigate(unk); test_Navigate(unk);
if(show_failed) { if(show_failed) {
IUnknown_Release(unk); IUnknown_Release(unk);
return; return;
} }
test_download(FALSE, TRUE, TRUE); test_download(DWL_CSS|DWL_TRYCSS);
test_IsDirty(unk, S_FALSE); test_IsDirty(unk, S_FALSE);
test_MSHTML_QueryStatus(unk, OLECMDF_SUPPORTED); test_MSHTML_QueryStatus(unk, OLECMDF_SUPPORTED);
@ -3948,6 +4013,62 @@ static void test_HTMLDocument_hlink(void)
ok(ref == 0, "ref=%d, expected 0\n", ref); ok(ref == 0, "ref=%d, expected 0\n", ref);
} }
static void test_HTMLDocument_http(void)
{
IMoniker *http_mon;
IUnknown *unk;
ULONG ref;
HRESULT hres;
static const WCHAR http_urlW[] =
{'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q','.','o','r','g',0};
trace("Testing HTMLDocument (http)...\n");
hres = CreateURLMoniker(NULL, http_urlW, &http_mon);
ok(hres == S_OK, "CreateURLMoniker failed: %08x\n", hres);
init_test(LD_DOLOAD);
ipsex = TRUE;
hres = create_document(&unk);
if(FAILED(hres))
return;
doc_unk = unk;
test_ConnectionPointContainer(unk);
test_GetCurMoniker(unk, NULL, NULL);
test_Persist(unk, http_mon);
test_Navigate(unk);
if(show_failed) {
IUnknown_Release(unk);
return;
}
if (winetest_interactive || ! is_ie_hardened())
test_download(DWL_HTTP);
else
win_skip("IE running in Enhanced Security Configuration\n");
test_IsDirty(unk, S_FALSE);
test_MSHTML_QueryStatus(unk, OLECMDF_SUPPORTED);
test_InPlaceDeactivate(unk, TRUE);
test_Close(unk, FALSE);
test_IsDirty(unk, S_FALSE);
test_GetCurMoniker(unk, http_mon, NULL);
if(view)
IOleDocumentView_Release(view);
view = NULL;
ref = IUnknown_Release(unk);
ok(!ref, "ref=%d, expected 0\n", ref);
ref = IMoniker_Release(http_mon);
ok(!ref, "ref=%d, expected 0\n", ref);
}
static void test_HTMLDocument_StreamLoad(void) static void test_HTMLDocument_StreamLoad(void)
{ {
IOleObject *oleobj; IOleObject *oleobj;
@ -3979,7 +4100,7 @@ static void test_HTMLDocument_StreamLoad(void)
test_GetCurMoniker(unk, NULL, NULL); test_GetCurMoniker(unk, NULL, NULL);
test_StreamLoad(unk); test_StreamLoad(unk);
test_download(TRUE, FALSE, TRUE); test_download(DWL_VERBDONE|DWL_TRYCSS);
test_MSHTML_QueryStatus(unk, OLECMDF_SUPPORTED); test_MSHTML_QueryStatus(unk, OLECMDF_SUPPORTED);
test_UIDeactivate(); test_UIDeactivate();
@ -4052,7 +4173,7 @@ static void test_editing_mode(BOOL do_load)
test_MSHTML_QueryStatus(unk, OLECMDF_SUPPORTED); test_MSHTML_QueryStatus(unk, OLECMDF_SUPPORTED);
if(do_load) if(do_load)
test_Persist(unk); test_Persist(unk, &Moniker);
stream_read = protocol_read = 0; stream_read = protocol_read = 0;
test_exec_editmode(unk, do_load); test_exec_editmode(unk, do_load);
test_UIDeactivate(); test_UIDeactivate();
@ -4060,7 +4181,7 @@ static void test_editing_mode(BOOL do_load)
IOleObject_Release(oleobj); IOleObject_Release(oleobj);
test_MSHTML_QueryStatus(unk, OLECMDF_SUPPORTED); test_MSHTML_QueryStatus(unk, OLECMDF_SUPPORTED);
test_download(TRUE, do_load, do_load); test_download(DWL_VERBDONE | (do_load ? DWL_CSS|DWL_TRYCSS : 0));
SET_EXPECT(SetStatusText); /* ignore race in native mshtml */ SET_EXPECT(SetStatusText); /* ignore race in native mshtml */
test_timer(EXPECT_UPDATEUI); test_timer(EXPECT_UPDATEUI);
@ -4214,6 +4335,7 @@ START_TEST(htmldoc)
test_HTMLDocument_StreamLoad(); test_HTMLDocument_StreamLoad();
test_editing_mode(FALSE); test_editing_mode(FALSE);
test_editing_mode(TRUE); test_editing_mode(TRUE);
test_HTMLDocument_http();
} }
test_HTMLDoc_ISupportErrorInfo(); test_HTMLDoc_ISupportErrorInfo();
test_IPersistHistory(); test_IPersistHistory();

View file

@ -5,6 +5,7 @@
<include base="mshtml_winetest">.</include> <include base="mshtml_winetest">.</include>
<define name="__ROS_LONG64__" /> <define name="__ROS_LONG64__" />
<file>dom.c</file> <file>dom.c</file>
<file>events.c</file>
<file>htmldoc.c</file> <file>htmldoc.c</file>
<file>misc.c</file> <file>misc.c</file>
<file>protocol.c</file> <file>protocol.c</file>

View file

@ -0,0 +1,38 @@
/*
* Copyright 2009 Ge van Geldorp for VMware, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
/* Check if Internet Explorer is configured to run in "Enhanced Security Configuration" (aka hardened mode) */
/* Note: this code is duplicated in dlls/mshtml/tests/mshtml_test.h and dlls/urlmon/tests/sec_mgr.c */
static BOOL is_ie_hardened(void)
{
HKEY zone_map;
DWORD ie_harden, type, size;
ie_harden = 0;
if(RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ZoneMap",
0, KEY_QUERY_VALUE, &zone_map) == ERROR_SUCCESS) {
size = sizeof(DWORD);
if (RegQueryValueEx(zone_map, "IEHarden", NULL, &type, (LPBYTE) &ie_harden, &size) != ERROR_SUCCESS ||
type != REG_DWORD) {
ie_harden = 0;
}
RegCloseKey(zone_map);
}
return ie_harden != 0;
}

View file

@ -20,6 +20,7 @@
#include <wine/test.h> #include <wine/test.h>
#include <stdarg.h> #include <stdarg.h>
#include <stdio.h>
#include "windef.h" #include "windef.h"
#include "winbase.h" #include "winbase.h"
@ -56,6 +57,7 @@
DEFINE_GUID(CLSID_ResProtocol, 0x3050F3BC, 0x98B5, 0x11CF, 0xBB,0x82, 0x00,0xAA,0x00,0xBD,0xCE,0x0B); DEFINE_GUID(CLSID_ResProtocol, 0x3050F3BC, 0x98B5, 0x11CF, 0xBB,0x82, 0x00,0xAA,0x00,0xBD,0xCE,0x0B);
DEFINE_GUID(CLSID_AboutProtocol, 0x3050F406, 0x98B5, 0x11CF, 0xBB,0x82, 0x00,0xAA,0x00,0xBD,0xCE,0x0B); DEFINE_GUID(CLSID_AboutProtocol, 0x3050F406, 0x98B5, 0x11CF, 0xBB,0x82, 0x00,0xAA,0x00,0xBD,0xCE,0x0B);
DEFINE_GUID(CLSID_JSProtocol, 0x3050F3B2, 0x98B5, 0x11CF, 0xBB,0x82, 0x00,0xAA,0x00,0xBD,0xCE,0x0B);
DEFINE_EXPECT(GetBindInfo); DEFINE_EXPECT(GetBindInfo);
DEFINE_EXPECT(ReportProgress); DEFINE_EXPECT(ReportProgress);
@ -69,11 +71,17 @@ static DWORD bindf;
static const WCHAR about_blank_url[] = {'a','b','o','u','t',':','b','l','a','n','k',0}; static const WCHAR about_blank_url[] = {'a','b','o','u','t',':','b','l','a','n','k',0};
static const WCHAR about_test_url[] = {'a','b','o','u','t',':','t','e','s','t',0}; static const WCHAR about_test_url[] = {'a','b','o','u','t',':','t','e','s','t',0};
static const WCHAR about_res_url[] = {'r','e','s',':','b','l','a','n','k',0}; static const WCHAR about_res_url[] = {'r','e','s',':','b','l','a','n','k',0};
static const WCHAR javascript_test_url[] = {'j','a','v','a','s','c','r','i','p','t',':','t','e','s','t','(',')',0};
static const char *debugstr_w(LPCWSTR str) static const char *debugstr_guid(REFIID riid)
{ {
static char buf[1024]; static char buf[50];
WideCharToMultiByte(CP_ACP, 0, str, -1, buf, sizeof(buf), NULL, NULL);
sprintf(buf, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
riid->Data1, riid->Data2, riid->Data3, riid->Data4[0],
riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4],
riid->Data4[5], riid->Data4[6], riid->Data4[7]);
return buf; return buf;
} }
@ -83,6 +91,9 @@ static HRESULT WINAPI ProtocolSink_QueryInterface(IInternetProtocolSink *iface,
*ppv = iface; *ppv = iface;
return S_OK; return S_OK;
} }
*ppv = NULL;
ok(0, "unexpected riid %s\n", debugstr_guid(riid));
return E_NOINTERFACE; return E_NOINTERFACE;
} }
@ -167,6 +178,9 @@ static HRESULT WINAPI BindInfo_QueryInterface(IInternetBindInfo *iface, REFIID r
*ppv = iface; *ppv = iface;
return S_OK; return S_OK;
} }
*ppv = NULL;
ok(0, "unexpected riid %s\n", debugstr_guid(riid));
return E_NOINTERFACE; return E_NOINTERFACE;
} }
@ -278,7 +292,7 @@ static void res_sec_url_cmp(LPCWSTR url, DWORD size, LPCWSTR file)
len += sizeof(fileW)/sizeof(WCHAR)+1; len += sizeof(fileW)/sizeof(WCHAR)+1;
ok(len == size, "wrong size %u, expected %u\n", size, len); ok(len == size, "wrong size %u, expected %u\n", size, len);
ok(!lstrcmpW(url + sizeof(fileW)/sizeof(WCHAR), buf), "wrong file part %s\n", debugstr_w(url)); ok(!lstrcmpW(url + sizeof(fileW)/sizeof(WCHAR), buf), "wrong file part %s\n", wine_dbgstr_w(url));
} }
static void test_res_protocol(void) static void test_res_protocol(void)
@ -350,14 +364,18 @@ static void test_res_protocol(void)
sizeof(buf)/sizeof(buf[0]), &size, 0); sizeof(buf)/sizeof(buf[0]), &size, 0);
ok(hres == S_OK || hres == E_FAIL, "ParseUrl failed: %08x\n", hres); ok(hres == S_OK || hres == E_FAIL, "ParseUrl failed: %08x\n", hres);
ok(buf[0] == '?', "buf changed\n"); ok(buf[0] == '?', "buf changed\n");
ok(size == sizeof(blank_url)/sizeof(WCHAR), "size=%d\n", size); ok(size == sizeof(blank_url)/sizeof(WCHAR) ||
size == sizeof(buf)/sizeof(buf[0]), /* IE8 */
"size=%d\n", size);
size = 0xdeadbeef; size = 0xdeadbeef;
hres = IInternetProtocolInfo_ParseUrl(protocol_info, wrong_url1, PARSE_DOMAIN, 0, buf, hres = IInternetProtocolInfo_ParseUrl(protocol_info, wrong_url1, PARSE_DOMAIN, 0, buf,
sizeof(buf)/sizeof(buf[0]), &size, 0); sizeof(buf)/sizeof(buf[0]), &size, 0);
ok(hres == S_OK || hres == E_FAIL, "ParseUrl failed: %08x\n", hres); ok(hres == S_OK || hres == E_FAIL, "ParseUrl failed: %08x\n", hres);
ok(buf[0] == '?', "buf changed\n"); ok(buf[0] == '?', "buf changed\n");
ok(size == sizeof(wrong_url1)/sizeof(WCHAR), "size=%d\n", size); ok(size == sizeof(wrong_url1)/sizeof(WCHAR) ||
size == sizeof(buf)/sizeof(buf[0]), /* IE8 */
"size=%d\n", size);
if (0) if (0)
{ {
@ -653,7 +671,9 @@ static void test_about_protocol(void)
sizeof(buf)/sizeof(buf[0]), &size, 0); sizeof(buf)/sizeof(buf[0]), &size, 0);
ok(hres == S_OK || hres == E_FAIL, "ParseUrl failed: %08x\n", hres); ok(hres == S_OK || hres == E_FAIL, "ParseUrl failed: %08x\n", hres);
ok(buf[0] == '?', "buf changed\n"); ok(buf[0] == '?', "buf changed\n");
ok(size == sizeof(about_blank_url)/sizeof(WCHAR), "size=%d\n", size); ok(size == sizeof(about_blank_url)/sizeof(WCHAR) ||
size == sizeof(buf)/sizeof(buf[0]), /* IE8 */
"size=%d\n", size);
if (0) if (0)
{ {
@ -774,12 +794,108 @@ static void test_about_protocol(void)
IUnknown_Release(unk); IUnknown_Release(unk);
} }
static void test_javascript_protocol(void)
{
IInternetProtocolInfo *protocol_info;
IUnknown *unk;
IClassFactory *factory;
HRESULT hres;
hres = CoGetClassObject(&CLSID_JSProtocol, CLSCTX_INPROC_SERVER, NULL, &IID_IUnknown, (void**)&unk);
ok(hres == S_OK, "CoGetClassObject failed: %08x\n", hres);
if(FAILED(hres))
return;
hres = IUnknown_QueryInterface(unk, &IID_IInternetProtocolInfo, (void**)&protocol_info);
ok(hres == S_OK, "Could not get IInternetProtocolInfo interface: %08x\n", hres);
if(SUCCEEDED(hres)) {
WCHAR buf[128];
DWORD size;
int i;
for(i = PARSE_CANONICALIZE; i <= PARSE_UNESCAPE; i++) {
if(i != PARSE_SECURITY_URL && i != PARSE_DOMAIN) {
hres = IInternetProtocolInfo_ParseUrl(protocol_info, javascript_test_url, i, 0, buf,
sizeof(buf)/sizeof(buf[0]), &size, 0);
ok(hres == INET_E_DEFAULT_ACTION,
"[%d] failed: %08x, expected INET_E_DEFAULT_ACTION\n", i, hres);
}
}
hres = IInternetProtocolInfo_ParseUrl(protocol_info, javascript_test_url, PARSE_UNESCAPE+1, 0, buf,
sizeof(buf)/sizeof(buf[0]), &size, 0);
ok(hres == INET_E_DEFAULT_ACTION,
"ParseUrl failed: %08x, expected INET_E_DEFAULT_ACTION\n", hres);
size = 0xdeadbeef;
hres = IInternetProtocolInfo_CombineUrl(protocol_info, javascript_test_url, javascript_test_url,
0, buf, sizeof(buf)/sizeof(buf[0]), &size, 0);
ok(hres == INET_E_USE_DEFAULT_PROTOCOLHANDLER, "CombineUrl failed: %08x\n", hres);
ok(size == 0xdeadbeef, "size=%d\n", size);
hres = IInternetProtocolInfo_CompareUrl(protocol_info, javascript_test_url, javascript_test_url, 0);
ok(hres == E_NOTIMPL, "CompareUrl failed: %08x\n", hres);
for(i=0; i<30; i++) {
switch(i) {
case QUERY_USES_NETWORK:
case QUERY_IS_SECURE:
break;
default:
hres = IInternetProtocolInfo_QueryInfo(protocol_info, javascript_test_url, i, 0,
buf, sizeof(buf), &size, 0);
ok(hres == INET_E_USE_DEFAULT_PROTOCOLHANDLER,
"QueryInfo(%d) returned: %08x, expected INET_E_USE_DEFAULT_PROTOCOLHANDLER\n", i, hres);
}
}
memset(buf, '?', sizeof(buf));
hres = IInternetProtocolInfo_QueryInfo(protocol_info, javascript_test_url, QUERY_USES_NETWORK, 0,
buf, sizeof(buf), &size, 0);
ok(hres == S_OK, "QueryInfo(QUERY_USES_NETWORK) failed: %08x\n", hres);
ok(size == sizeof(DWORD), "size=%d\n", size);
ok(!*(DWORD*)buf, "buf=%d\n", *(DWORD*)buf);
memset(buf, '?', sizeof(buf));
hres = IInternetProtocolInfo_QueryInfo(protocol_info, javascript_test_url, QUERY_USES_NETWORK, 0,
buf, sizeof(buf), NULL, 0);
ok(hres == S_OK, "QueryInfo(QUERY_USES_NETWORK) failed: %08x\n", hres);
ok(!*(DWORD*)buf, "buf=%d\n", *(DWORD*)buf);
hres = IInternetProtocolInfo_QueryInfo(protocol_info, javascript_test_url, QUERY_USES_NETWORK, 0,
buf, 3, &size, 0);
ok(hres == E_FAIL, "QueryInfo(QUERY_USES_NETWORK) failed: %08x, expected E_FAIL\n", hres);
hres = IInternetProtocolInfo_QueryInfo(protocol_info, javascript_test_url, QUERY_USES_NETWORK, 0,
NULL, sizeof(buf), &size, 0);
ok(hres == E_FAIL, "QueryInfo(QUERY_USES_NETWORK) failed: %08x, expected E_FAIL\n", hres);
hres = IInternetProtocolInfo_QueryInfo(protocol_info, javascript_test_url, 60, 0,
NULL, sizeof(buf), &size, 0);
ok(hres == INET_E_USE_DEFAULT_PROTOCOLHANDLER,
"QueryInfo failed: %08x, expected INET_E_USE_DEFAULT_PROTOCOLHANDLER\n", hres);
/* FIXME: test QUERY_IS_SECURE */
IInternetProtocolInfo_Release(protocol_info);
}
hres = IUnknown_QueryInterface(unk, &IID_IClassFactory, (void**)&factory);
ok(hres == S_OK, "Could not get IClassFactory interface\n");
if(SUCCEEDED(hres))
IClassFactory_Release(factory);
IUnknown_Release(unk);
}
START_TEST(protocol) START_TEST(protocol)
{ {
OleInitialize(NULL); OleInitialize(NULL);
test_res_protocol(); test_res_protocol();
test_about_protocol(); test_about_protocol();
test_javascript_protocol();
OleUninitialize(); OleUninitialize();
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright 2008 Jacek Caban for CodeWeavers * Copyright 2008-2009 Jacek Caban for CodeWeavers
* *
* This library is free software; you can redistribute it and/or * This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public * modify it under the terms of the GNU Lesser General Public
@ -33,9 +33,14 @@
#include "activdbg.h" #include "activdbg.h"
#include "objsafe.h" #include "objsafe.h"
#include "mshtmdid.h" #include "mshtmdid.h"
#include "mshtml_test.h"
DEFINE_GUID(CLSID_IdentityUnmarshal,0x0000001b,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46); DEFINE_GUID(CLSID_IdentityUnmarshal,0x0000001b,0x0000,0x0000,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x46);
/* Defined as extern in urlmon.idl, but not exported by uuid.lib */
const GUID GUID_CUSTOM_CONFIRMOBJECTSAFETY =
{0x10200490,0xfa38,0x11d0,{0xac,0x0e,0x00,0xa0,0xc9,0xf,0xff,0xc0}};
#ifdef _WIN64 #ifdef _WIN64
#define CTXARG_T DWORDLONG #define CTXARG_T DWORDLONG
@ -74,6 +79,12 @@ DEFINE_GUID(CLSID_IdentityUnmarshal,0x0000001b,0x0000,0x0000,0xc0,0x00,0x00,0x00
expect_ ## func = called_ ## func = FALSE; \ expect_ ## func = called_ ## func = FALSE; \
}while(0) }while(0)
#define CHECK_CALLED_BROKEN(func) \
do { \
ok(called_ ## func || broken(!called_ ## func), "expected " #func "\n"); \
expect_ ## func = called_ ## func = FALSE; \
}while(0)
#define CHECK_NOT_CALLED(func) \ #define CHECK_NOT_CALLED(func) \
do { \ do { \
ok(!called_ ## func, "unexpected " #func "\n"); \ ok(!called_ ## func, "unexpected " #func "\n"); \
@ -89,7 +100,9 @@ DEFINE_EXPECT(GetInterfaceSafetyOptions);
DEFINE_EXPECT(SetInterfaceSafetyOptions); DEFINE_EXPECT(SetInterfaceSafetyOptions);
DEFINE_EXPECT(InitNew); DEFINE_EXPECT(InitNew);
DEFINE_EXPECT(Close); DEFINE_EXPECT(Close);
DEFINE_EXPECT(SetProperty); DEFINE_EXPECT(SetProperty_HACK_TRIDENTEVENTSINK);
DEFINE_EXPECT(SetProperty_INVOKEVERSIONING);
DEFINE_EXPECT(SetProperty_ABBREVIATE_GLOBALNAME_RESOLUTION);
DEFINE_EXPECT(SetScriptSite); DEFINE_EXPECT(SetScriptSite);
DEFINE_EXPECT(GetScriptState); DEFINE_EXPECT(GetScriptState);
DEFINE_EXPECT(SetScriptState_STARTED); DEFINE_EXPECT(SetScriptState_STARTED);
@ -99,22 +112,26 @@ DEFINE_EXPECT(AddNamedItem);
DEFINE_EXPECT(ParseScriptText); DEFINE_EXPECT(ParseScriptText);
DEFINE_EXPECT(GetScriptDispatch); DEFINE_EXPECT(GetScriptDispatch);
DEFINE_EXPECT(funcDisp); DEFINE_EXPECT(funcDisp);
DEFINE_EXPECT(script_testprop_d);
DEFINE_EXPECT(script_testprop_i);
DEFINE_EXPECT(AXQueryInterface_IActiveScript);
DEFINE_EXPECT(AXQueryInterface_IObjectSafety);
DEFINE_EXPECT(AXGetInterfaceSafetyOptions);
DEFINE_EXPECT(AXSetInterfaceSafetyOptions);
#define TESTSCRIPT_CLSID "{178fc163-f585-4e24-9c13-4bb7faf80746}" #define TESTSCRIPT_CLSID "{178fc163-f585-4e24-9c13-4bb7faf80746}"
#define DISPID_SCRIPT_TESTPROP 0x100000
static const GUID CLSID_TestScript = static const GUID CLSID_TestScript =
{0x178fc163,0xf585,0x4e24,{0x9c,0x13,0x4b,0xb7,0xfa,0xf8,0x07,0x46}}; {0x178fc163,0xf585,0x4e24,{0x9c,0x13,0x4b,0xb7,0xfa,0xf8,0x07,0x46}};
static const GUID CLSID_TestActiveX =
{0x178fc163,0xf585,0x4e24,{0x9c,0x13,0x4b,0xb7,0xfa,0xf8,0x06,0x46}};
static IHTMLDocument2 *notif_doc; static IHTMLDocument2 *notif_doc;
static IDispatchEx *window_dispex; static IDispatchEx *window_dispex;
static BOOL doc_complete; static BOOL doc_complete;
static IDispatch *script_disp;
static const char *debugstr_w(LPCWSTR str)
{
static char buf[1024];
WideCharToMultiByte(CP_ACP, 0, str, -1, buf, sizeof(buf), NULL, NULL);
return buf;
}
static const char *debugstr_guid(REFIID riid) static const char *debugstr_guid(REFIID riid)
{ {
@ -128,6 +145,25 @@ static const char *debugstr_guid(REFIID riid)
return buf; return buf;
} }
static int strcmp_wa(LPCWSTR strw, const char *stra)
{
CHAR buf[512];
WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), NULL, NULL);
return lstrcmpA(stra, buf);
}
static BSTR a2bstr(const char *str)
{
BSTR ret;
int len;
len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
ret = SysAllocStringLen(NULL, len);
MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
return ret;
}
static HRESULT WINAPI PropertyNotifySink_QueryInterface(IPropertyNotifySink *iface, static HRESULT WINAPI PropertyNotifySink_QueryInterface(IPropertyNotifySink *iface,
REFIID riid, void**ppv) REFIID riid, void**ppv)
{ {
@ -240,7 +276,7 @@ static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember,
static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex) static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
{ {
ok(0, "unexpected call %s %x\n", debugstr_w(bstrName), grfdex); ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
return E_NOTIMPL; return E_NOTIMPL;
} }
@ -324,6 +360,67 @@ static IDispatchExVtbl testObjVtbl = {
static IDispatchEx funcDisp = { &testObjVtbl }; static IDispatchEx funcDisp = { &testObjVtbl };
static HRESULT WINAPI scriptDisp_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
{
if(!strcmp_wa(bstrName, "testProp")) {
CHECK_EXPECT(script_testprop_d);
ok(grfdex == fdexNameCaseSensitive, "grfdex = %x\n", grfdex);
*pid = DISPID_SCRIPT_TESTPROP;
return S_OK;
}
ok(0, "unexpected call\n");
return E_NOTIMPL;
}
static HRESULT WINAPI scriptDisp_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
{
switch(id) {
case DISPID_SCRIPT_TESTPROP:
CHECK_EXPECT(script_testprop_i);
ok(lcid == 0, "lcid = %x\n", lcid);
ok(wFlags == DISPATCH_PROPERTYGET, "wFlags = %x\n", wFlags);
ok(pdp != NULL, "pdp == NULL\n");
ok(pdp->cArgs == 0, "pdp->cArgs = %d\n", pdp->cArgs);
ok(pdp->cNamedArgs == 0, "pdp->cNamedArgs = %d\n", pdp->cNamedArgs);
ok(!pdp->rgdispidNamedArgs, "pdp->rgdispidNamedArgs != NULL\n");
ok(!pdp->rgvarg, "rgvarg != NULL\n");
ok(pvarRes != NULL, "pvarRes == NULL\n");
ok(pei != NULL, "pei == NULL\n");
ok(!pspCaller, "pspCaller != NULL\n");
V_VT(pvarRes) = VT_NULL;
break;
default:
ok(0, "unexpected call\n");
return E_NOTIMPL;
}
return S_OK;
}
static IDispatchExVtbl scriptDispVtbl = {
DispatchEx_QueryInterface,
DispatchEx_AddRef,
DispatchEx_Release,
DispatchEx_GetTypeInfoCount,
DispatchEx_GetTypeInfo,
DispatchEx_GetIDsOfNames,
DispatchEx_Invoke,
scriptDisp_GetDispID,
scriptDisp_InvokeEx,
DispatchEx_DeleteMemberByName,
DispatchEx_DeleteMemberByDispID,
DispatchEx_GetMemberProperties,
DispatchEx_GetMemberName,
DispatchEx_GetNextDispID,
DispatchEx_GetNameSpaceParent
};
static IDispatchEx scriptDisp = { &scriptDispVtbl };
static IHTMLDocument2 *create_document(void) static IHTMLDocument2 *create_document(void)
{ {
IHTMLDocument2 *doc; IHTMLDocument2 *doc;
@ -430,7 +527,7 @@ static SCRIPTSTATE state;
static HRESULT WINAPI ObjectSafety_QueryInterface(IObjectSafety *iface, REFIID riid, void **ppv) static HRESULT WINAPI ObjectSafety_QueryInterface(IObjectSafety *iface, REFIID riid, void **ppv)
{ {
*ppv = NULL; *ppv = NULL;
ok(0, "unexpected call\n"); ok(0, "unexpected call %s\n", debugstr_guid(riid));
return E_NOINTERFACE; return E_NOINTERFACE;
} }
@ -484,6 +581,110 @@ static const IObjectSafetyVtbl ObjectSafetyVtbl = {
static IObjectSafety ObjectSafety = { &ObjectSafetyVtbl }; static IObjectSafety ObjectSafety = { &ObjectSafetyVtbl };
static HRESULT WINAPI AXObjectSafety_QueryInterface(IObjectSafety *iface, REFIID riid, void **ppv)
{
*ppv = NULL;
if(IsEqualGUID(&IID_IActiveScript, riid)) {
CHECK_EXPECT(AXQueryInterface_IActiveScript);
return E_NOINTERFACE;
}
if(IsEqualGUID(&IID_IObjectSafety, riid)) {
CHECK_EXPECT(AXQueryInterface_IObjectSafety);
*ppv = iface;
return S_OK;
}
ok(0, "unexpected call %s\n", debugstr_guid(riid));
return E_NOINTERFACE;
}
static HRESULT WINAPI AXObjectSafety_GetInterfaceSafetyOptions(IObjectSafety *iface, REFIID riid,
DWORD *pdwSupportedOptions, DWORD *pdwEnabledOptions)
{
CHECK_EXPECT(AXGetInterfaceSafetyOptions);
ok(IsEqualGUID(&IID_IDispatchEx, riid), "unexpected riid %s\n", debugstr_guid(riid));
ok(pdwSupportedOptions != NULL, "pdwSupportedOptions == NULL\n");
ok(pdwEnabledOptions != NULL, "pdwEnabledOptions == NULL\n");
*pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA|INTERFACE_USES_DISPEX|INTERFACE_USES_SECURITY_MANAGER;
*pdwEnabledOptions = INTERFACE_USES_DISPEX;
return S_OK;
}
static HRESULT WINAPI AXObjectSafety_SetInterfaceSafetyOptions(IObjectSafety *iface, REFIID riid,
DWORD dwOptionSetMask, DWORD dwEnabledOptions)
{
CHECK_EXPECT(AXSetInterfaceSafetyOptions);
ok(IsEqualGUID(&IID_IDispatchEx, riid), "unexpected riid %s\n", debugstr_guid(riid));
ok(dwOptionSetMask == (INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACE_USES_SECURITY_MANAGER),
"dwOptionSetMask=%x\n", dwOptionSetMask);
ok(dwEnabledOptions == (INTERFACESAFE_FOR_UNTRUSTED_CALLER|INTERFACE_USES_SECURITY_MANAGER),
"dwEnabledOptions=%x\n", dwOptionSetMask);
return S_OK;
}
static const IObjectSafetyVtbl AXObjectSafetyVtbl = {
AXObjectSafety_QueryInterface,
ObjectSafety_AddRef,
ObjectSafety_Release,
AXObjectSafety_GetInterfaceSafetyOptions,
AXObjectSafety_SetInterfaceSafetyOptions
};
static IObjectSafety AXObjectSafety = { &AXObjectSafetyVtbl };
static void test_security(void)
{
IInternetHostSecurityManager *sec_mgr;
IServiceProvider *sp;
DWORD policy, policy_size;
struct CONFIRMSAFETY cs;
BYTE *ppolicy;
HRESULT hres;
hres = IActiveScriptSite_QueryInterface(site, &IID_IServiceProvider, (void**)&sp);
ok(hres == S_OK, "Could not get IServiceProvider iface: %08x\n", hres);
hres = IServiceProvider_QueryService(sp, &SID_SInternetHostSecurityManager,
&IID_IInternetHostSecurityManager, (void**)&sec_mgr);
IServiceProvider_Release(sp);
ok(hres == S_OK, "QueryService failed: %08x\n", hres);
hres = IInternetHostSecurityManager_ProcessUrlAction(sec_mgr, URLACTION_ACTIVEX_RUN, (BYTE*)&policy, sizeof(policy),
(BYTE*)&CLSID_TestActiveX, sizeof(CLSID), 0, 0);
ok(hres == S_OK, "ProcessUrlAction failed: %08x\n", hres);
ok(policy == URLPOLICY_ALLOW, "policy = %x\n", policy);
cs.clsid = CLSID_TestActiveX;
cs.pUnk = (IUnknown*)&AXObjectSafety;
cs.dwFlags = 0;
SET_EXPECT(AXQueryInterface_IActiveScript);
SET_EXPECT(AXQueryInterface_IObjectSafety);
SET_EXPECT(AXGetInterfaceSafetyOptions);
SET_EXPECT(AXSetInterfaceSafetyOptions);
hres = IInternetHostSecurityManager_QueryCustomPolicy(sec_mgr, &GUID_CUSTOM_CONFIRMOBJECTSAFETY,
&ppolicy, &policy_size, (BYTE*)&cs, sizeof(cs), 0);
CHECK_CALLED(AXQueryInterface_IActiveScript);
CHECK_CALLED(AXQueryInterface_IObjectSafety);
CHECK_CALLED(AXGetInterfaceSafetyOptions);
CHECK_CALLED(AXSetInterfaceSafetyOptions);
ok(hres == S_OK, "QueryCusromPolicy failed: %08x\n", hres);
ok(policy_size == sizeof(DWORD), "policy_size = %d\n", policy_size);
ok(*(DWORD*)ppolicy == URLPOLICY_ALLOW, "policy = %x\n", *(DWORD*)ppolicy);
CoTaskMemFree(ppolicy);
IInternetHostSecurityManager_Release(sec_mgr);
}
static HRESULT WINAPI ActiveScriptProperty_QueryInterface(IActiveScriptProperty *iface, REFIID riid, void **ppv) static HRESULT WINAPI ActiveScriptProperty_QueryInterface(IActiveScriptProperty *iface, REFIID riid, void **ppv)
{ {
*ppv = NULL; *ppv = NULL;
@ -511,15 +712,31 @@ static HRESULT WINAPI ActiveScriptProperty_GetProperty(IActiveScriptProperty *if
static HRESULT WINAPI ActiveScriptProperty_SetProperty(IActiveScriptProperty *iface, DWORD dwProperty, static HRESULT WINAPI ActiveScriptProperty_SetProperty(IActiveScriptProperty *iface, DWORD dwProperty,
VARIANT *pvarIndex, VARIANT *pvarValue) VARIANT *pvarIndex, VARIANT *pvarValue)
{ {
CHECK_EXPECT(SetProperty); switch(dwProperty) {
case SCRIPTPROP_HACK_TRIDENTEVENTSINK:
CHECK_EXPECT(SetProperty_HACK_TRIDENTEVENTSINK);
ok(V_VT(pvarValue) == VT_BOOL, "V_VT(pvarValue)=%d\n", V_VT(pvarValue));
ok(V_BOOL(pvarValue) == VARIANT_TRUE, "V_BOOL(pvarValue)=%x\n", V_BOOL(pvarValue));
break;
case SCRIPTPROP_INVOKEVERSIONING:
CHECK_EXPECT(SetProperty_INVOKEVERSIONING);
ok(V_VT(pvarValue) == VT_I4, "V_VT(pvarValue)=%d\n", V_VT(pvarValue));
ok(V_I4(pvarValue) == 1, "V_I4(pvarValue)=%d\n", V_I4(pvarValue));
break;
case SCRIPTPROP_ABBREVIATE_GLOBALNAME_RESOLUTION:
CHECK_EXPECT(SetProperty_ABBREVIATE_GLOBALNAME_RESOLUTION);
ok(V_VT(pvarValue) == VT_BOOL, "V_VT(pvarValue)=%d\n", V_VT(pvarValue));
ok(V_BOOL(pvarValue) == VARIANT_TRUE, "V_BOOL(pvarValue)=%x\n", V_BOOL(pvarValue));
break;
default:
ok(0, "unexpected property %x\n", dwProperty);
return E_NOTIMPL;
}
ok(dwProperty == SCRIPTPROP_HACK_TRIDENTEVENTSINK, "unexpected property %d\n", dwProperty);
ok(!pvarIndex, "pvarIndex != NULL\n"); ok(!pvarIndex, "pvarIndex != NULL\n");
ok(pvarValue != NULL, "pvarValue == NULL\n"); ok(pvarValue != NULL, "pvarValue == NULL\n");
ok(V_VT(pvarValue) == VT_BOOL, "V_VT(pvarValue)=%d\n", V_VT(pvarValue));
ok(V_BOOL(pvarValue) == VARIANT_TRUE, "V_BOOL(pvarValue)=%x\n", V_BOOL(pvarValue));
return E_NOTIMPL; return S_OK;
} }
static const IActiveScriptPropertyVtbl ActiveScriptPropertyVtbl = { static const IActiveScriptPropertyVtbl ActiveScriptPropertyVtbl = {
@ -600,17 +817,117 @@ static HRESULT WINAPI ActiveScriptParse_AddScriptlet(IActiveScriptParse *iface,
return E_NOTIMPL; return E_NOTIMPL;
} }
static HRESULT dispex_propput(IDispatchEx *obj, DISPID id, VARIANT *var)
{
DISPID propput_arg = DISPID_PROPERTYPUT;
DISPPARAMS dp = {var, &propput_arg, 1, 1};
EXCEPINFO ei = {0};
return IDispatchEx_InvokeEx(obj, id, LOCALE_NEUTRAL, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL);
}
static void test_func(IDispatchEx *obj)
{
DISPID id;
IDispatchEx *dispex;
IDispatch *disp;
EXCEPINFO ei;
DISPPARAMS dp;
BSTR str;
VARIANT var;
HRESULT hres;
str = a2bstr("toString");
hres = IDispatchEx_GetDispID(obj, str, fdexNameCaseSensitive, &id);
SysFreeString(str);
ok(hres == S_OK, "GetDispID failed: %08x\n", hres);
ok(id == DISPID_IOMNAVIGATOR_TOSTRING, "id = %x\n", id);
memset(&dp, 0, sizeof(dp));
memset(&ei, 0, sizeof(ei));
VariantInit(&var);
hres = IDispatchEx_InvokeEx(obj, id, LOCALE_NEUTRAL, DISPATCH_PROPERTYGET, &dp, &var, &ei, NULL);
ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
ok(V_VT(&var) == VT_DISPATCH, "V_VT(var)=%d\n", V_VT(&var));
ok(V_DISPATCH(&var) != NULL, "V_DISPATCH(var) == NULL\n");
disp = V_DISPATCH(&var);
hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
IDispatch_Release(disp);
ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
/* FIXME: Test InvokeEx(DISPATCH_METHOD) */
memset(&dp, 0, sizeof(dp));
memset(&ei, 0, sizeof(ei));
VariantInit(&var);
hres = IDispatchEx_Invoke(dispex, DISPID_VALUE, &IID_NULL, LOCALE_NEUTRAL, DISPATCH_METHOD, &dp, &var, &ei, NULL);
ok(hres == S_OK || broken(E_ACCESSDENIED), "InvokeEx failed: %08x\n", hres);
if(SUCCEEDED(hres)) {
ok(V_VT(&var) == VT_BSTR, "V_VT(var)=%d\n", V_VT(&var));
ok(!strcmp_wa(V_BSTR(&var), "[object]"), "V_BSTR(var) = %s\n", wine_dbgstr_w(V_BSTR(&var)));
VariantClear(&var);
}
V_VT(&var) = VT_I4;
V_I4(&var) = 100;
hres = dispex_propput(obj, id, &var);
ok(hres == E_NOTIMPL, "InvokeEx failed: %08x\n", hres);
IDispatchEx_Release(dispex);
}
static void test_nextdispid(IDispatchEx *dispex)
{
DISPID last_id = DISPID_STARTENUM, id, dyn_id;
BSTR name;
VARIANT var;
HRESULT hres;
name = a2bstr("dynVal");
hres = IDispatchEx_GetDispID(dispex, name, fdexNameCaseSensitive|fdexNameEnsure, &dyn_id);
ok(hres == S_OK, "GetDispID failed: %08x\n", hres);
SysFreeString(name);
V_VT(&var) = VT_EMPTY;
hres = dispex_propput(dispex, dyn_id, &var);
while(last_id != dyn_id) {
hres = IDispatchEx_GetNextDispID(dispex, fdexEnumAll, last_id, &id);
ok(hres == S_OK, "GetNextDispID returned: %08x\n", hres);
ok(id != DISPID_STARTENUM, "id == DISPID_STARTENUM\n");
ok(id != DISPID_IOMNAVIGATOR_TOSTRING, "id == DISPID_IOMNAVIGATOR_TOSTRING\n");
hres = IDispatchEx_GetMemberName(dispex, id, &name);
ok(hres == S_OK, "GetMemberName failed: %08x\n", hres);
if(id == dyn_id)
ok(!strcmp_wa(name, "dynVal"), "name = %s\n", wine_dbgstr_w(name));
else if(id == DISPID_IOMNAVIGATOR_PLATFORM)
ok(!strcmp_wa(name, "platform"), "name = %s\n", wine_dbgstr_w(name));
SysFreeString(name);
last_id = id;
}
hres = IDispatchEx_GetNextDispID(dispex, 0, id, &id);
ok(hres == S_FALSE, "GetNextDispID returned: %08x\n", hres);
ok(id == DISPID_STARTENUM, "id != DISPID_STARTENUM\n");
}
static HRESULT WINAPI ActiveScriptParse_ParseScriptText(IActiveScriptParse *iface, static HRESULT WINAPI ActiveScriptParse_ParseScriptText(IActiveScriptParse *iface,
LPCOLESTR pstrCode, LPCOLESTR pstrItemName, IUnknown *punkContext, LPCOLESTR pstrCode, LPCOLESTR pstrItemName, IUnknown *punkContext,
LPCOLESTR pstrDelimiter, CTXARG_T dwSourceContextCookie, ULONG ulStartingLine, LPCOLESTR pstrDelimiter, CTXARG_T dwSourceContextCookie, ULONG ulStartingLine,
DWORD dwFlags, VARIANT *pvarResult, EXCEPINFO *pexcepinfo) DWORD dwFlags, VARIANT *pvarResult, EXCEPINFO *pexcepinfo)
{ {
IDispatchEx *document; IDispatchEx *document, *dispex;
IHTMLWindow2 *window;
IOmNavigator *navigator;
IUnknown *unk; IUnknown *unk;
VARIANT var, arg; VARIANT var, arg;
DISPPARAMS dp; DISPPARAMS dp;
EXCEPINFO ei; EXCEPINFO ei;
DISPID id, named_arg = DISPID_PROPERTYPUT; DISPID id;
BSTR tmp; BSTR tmp;
HRESULT hres; HRESULT hres;
@ -628,7 +945,7 @@ static HRESULT WINAPI ActiveScriptParse_ParseScriptText(IActiveScriptParse *ifac
ok(hres == S_OK, "GetDispID(document) failed: %08x\n", hres); ok(hres == S_OK, "GetDispID(document) failed: %08x\n", hres);
ok(id == DISPID_IHTMLWINDOW2_DOCUMENT, "id=%x\n", id); ok(id == DISPID_IHTMLWINDOW2_DOCUMENT, "id=%x\n", id);
todo_wine CHECK_CALLED(GetScriptDispatch); CHECK_CALLED(GetScriptDispatch);
VariantInit(&var); VariantInit(&var);
memset(&dp, 0, sizeof(dp)); memset(&dp, 0, sizeof(dp));
@ -657,14 +974,9 @@ static HRESULT WINAPI ActiveScriptParse_ParseScriptText(IActiveScriptParse *ifac
ok(hres == S_OK, "GetDispID(document) failed: %08x\n", hres); ok(hres == S_OK, "GetDispID(document) failed: %08x\n", hres);
ok(id, "id == 0\n"); ok(id, "id == 0\n");
dp.cArgs = 1;
dp.rgvarg = &var;
dp.cNamedArgs = 1;
dp.rgdispidNamedArgs = &named_arg;
V_VT(&var) = VT_I4; V_VT(&var) = VT_I4;
V_I4(&var) = 100; V_I4(&var) = 100;
hres = dispex_propput(document, id, &var);
hres = IDispatchEx_InvokeEx(document, id, LOCALE_NEUTRAL, INVOKE_PROPERTYPUT, &dp, NULL, &ei, NULL);
ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
tmp = SysAllocString(testW); tmp = SysAllocString(testW);
@ -698,7 +1010,6 @@ static HRESULT WINAPI ActiveScriptParse_ParseScriptText(IActiveScriptParse *ifac
dp.rgdispidNamedArgs = NULL; dp.rgdispidNamedArgs = NULL;
V_VT(&var) = VT_DISPATCH; V_VT(&var) = VT_DISPATCH;
V_DISPATCH(&var) = (IDispatch*)&funcDisp; V_DISPATCH(&var) = (IDispatch*)&funcDisp;
hres = IDispatchEx_InvokeEx(document, id, LOCALE_NEUTRAL, INVOKE_PROPERTYPUT, &dp, NULL, &ei, NULL); hres = IDispatchEx_InvokeEx(document, id, LOCALE_NEUTRAL, INVOKE_PROPERTYPUT, &dp, NULL, &ei, NULL);
ok(hres == S_OK, "InvokeEx failed: %08x\n", hres); ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
@ -720,6 +1031,51 @@ static HRESULT WINAPI ActiveScriptParse_ParseScriptText(IActiveScriptParse *ifac
IDispatchEx_Release(document); IDispatchEx_Release(document);
hres = IDispatchEx_QueryInterface(window_dispex, &IID_IHTMLWindow2, (void**)&window);
ok(hres == S_OK, "Could not get IHTMLWindow2 iface: %08x\n", hres);
hres = IHTMLWindow2_get_navigator(window, &navigator);
IHTMLWindow2_Release(window);
ok(hres == S_OK, "get_navigator failed: %08x\n", hres);
hres = IOmNavigator_QueryInterface(navigator, &IID_IDispatchEx, (void**)&dispex);
IOmNavigator_Release(navigator);
ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
test_func(dispex);
test_nextdispid(dispex);
IDispatchEx_Release(dispex);
script_disp = (IDispatch*)&scriptDisp;
SET_EXPECT(GetScriptDispatch);
SET_EXPECT(script_testprop_d);
tmp = a2bstr("testProp");
hres = IDispatchEx_GetDispID(window_dispex, tmp, fdexNameCaseSensitive, &id);
ok(hres == S_OK, "GetDispID failed: %08x\n", hres);
ok(id != DISPID_SCRIPT_TESTPROP, "id == DISPID_SCRIPT_TESTPROP\n");
CHECK_CALLED(GetScriptDispatch);
CHECK_CALLED(script_testprop_d);
SysFreeString(tmp);
tmp = a2bstr("testProp");
hres = IDispatchEx_GetDispID(window_dispex, tmp, fdexNameCaseSensitive, &id);
ok(hres == S_OK, "GetDispID failed: %08x\n", hres);
ok(id != DISPID_SCRIPT_TESTPROP, "id == DISPID_SCRIPT_TESTPROP\n");
SysFreeString(tmp);
SET_EXPECT(GetScriptDispatch);
SET_EXPECT(script_testprop_i);
memset(&ei, 0, sizeof(ei));
memset(&dp, 0, sizeof(dp));
hres = IDispatchEx_InvokeEx(window_dispex, id, 0, DISPATCH_PROPERTYGET, &dp, &var, &ei, NULL);
ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
ok(V_VT(&var) == VT_NULL, "V_VT(var) = %d\n", V_VT(&var));
CHECK_CALLED(GetScriptDispatch);
CHECK_CALLED(script_testprop_i);
test_security();
return S_OK; return S_OK;
} }
@ -763,6 +1119,9 @@ static HRESULT WINAPI ActiveScript_QueryInterface(IActiveScript *iface, REFIID r
return S_OK; return S_OK;
} }
if(IsEqualGUID(&IID_IActiveScriptDebug, riid))
return E_NOINTERFACE;
ok(0, "unexpected riid %s\n", debugstr_guid(riid)); ok(0, "unexpected riid %s\n", debugstr_guid(riid));
return E_NOINTERFACE; return E_NOINTERFACE;
} }
@ -810,7 +1169,7 @@ static HRESULT WINAPI ActiveScript_SetScriptSite(IActiveScript *iface, IActiveSc
ok(hres == E_NOINTERFACE, "Could not get IID_ICanHandleException interface: %08x\n", hres); ok(hres == E_NOINTERFACE, "Could not get IID_ICanHandleException interface: %08x\n", hres);
hres = IActiveScriptSite_QueryInterface(pass, &IID_IServiceProvider, (void**)&service); hres = IActiveScriptSite_QueryInterface(pass, &IID_IServiceProvider, (void**)&service);
todo_wine ok(hres == S_OK, "Could not get IServiceProvider interface: %08x\n", hres); ok(hres == S_OK, "Could not get IServiceProvider interface: %08x\n", hres);
if(SUCCEEDED(hres)) if(SUCCEEDED(hres))
IServiceProvider_Release(service); IServiceProvider_Release(service);
@ -876,7 +1235,7 @@ static HRESULT WINAPI ActiveScript_AddNamedItem(IActiveScript *iface,
CHECK_EXPECT(AddNamedItem); CHECK_EXPECT(AddNamedItem);
ok(!lstrcmpW(pstrName, windowW), "pstrName=%s\n", debugstr_w(pstrName)); ok(!lstrcmpW(pstrName, windowW), "pstrName=%s\n", wine_dbgstr_w(pstrName));
ok(dwFlags == (SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS), "dwFlags=%x\n", dwFlags); ok(dwFlags == (SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS), "dwFlags=%x\n", dwFlags);
hres = IActiveScriptSite_GetItemInfo(site, windowW, SCRIPTINFO_IUNKNOWN, &unk, NULL); hres = IActiveScriptSite_GetItemInfo(site, windowW, SCRIPTINFO_IUNKNOWN, &unk, NULL);
@ -911,7 +1270,14 @@ static HRESULT WINAPI ActiveScript_GetScriptDispatch(IActiveScript *iface, LPCOL
IDispatch **ppdisp) IDispatch **ppdisp)
{ {
CHECK_EXPECT(GetScriptDispatch); CHECK_EXPECT(GetScriptDispatch);
return E_NOTIMPL;
ok(!strcmp_wa(pstrItemName, "window"), "pstrItemName = %s\n", wine_dbgstr_w(pstrItemName));
if(!script_disp)
return E_NOTIMPL;
*ppdisp = script_disp;
return S_OK;
} }
static HRESULT WINAPI ActiveScript_GetCurrentScriptThreadID(IActiveScript *iface, static HRESULT WINAPI ActiveScript_GetCurrentScriptThreadID(IActiveScript *iface,
@ -1035,12 +1401,14 @@ static void test_simple_script(void)
SET_EXPECT(CreateInstance); SET_EXPECT(CreateInstance);
SET_EXPECT(GetInterfaceSafetyOptions); SET_EXPECT(GetInterfaceSafetyOptions);
SET_EXPECT(SetInterfaceSafetyOptions); SET_EXPECT(SetInterfaceSafetyOptions);
SET_EXPECT(SetProperty); SET_EXPECT(SetProperty_INVOKEVERSIONING); /* IE8 */
SET_EXPECT(SetProperty_HACK_TRIDENTEVENTSINK);
SET_EXPECT(InitNew); SET_EXPECT(InitNew);
SET_EXPECT(SetScriptSite); SET_EXPECT(SetScriptSite);
SET_EXPECT(GetScriptState); SET_EXPECT(GetScriptState);
SET_EXPECT(SetScriptState_STARTED); SET_EXPECT(SetScriptState_STARTED);
SET_EXPECT(AddNamedItem); SET_EXPECT(AddNamedItem);
SET_EXPECT(SetProperty_ABBREVIATE_GLOBALNAME_RESOLUTION); /* IE8 */
SET_EXPECT(ParseScriptText); SET_EXPECT(ParseScriptText);
SET_EXPECT(SetScriptState_CONNECTED); SET_EXPECT(SetScriptState_CONNECTED);
@ -1050,12 +1418,14 @@ static void test_simple_script(void)
CHECK_CALLED(CreateInstance); CHECK_CALLED(CreateInstance);
CHECK_CALLED(GetInterfaceSafetyOptions); CHECK_CALLED(GetInterfaceSafetyOptions);
CHECK_CALLED(SetInterfaceSafetyOptions); CHECK_CALLED(SetInterfaceSafetyOptions);
CHECK_CALLED(SetProperty); CHECK_CALLED_BROKEN(SetProperty_INVOKEVERSIONING); /* IE8 */
CHECK_CALLED(SetProperty_HACK_TRIDENTEVENTSINK);
CHECK_CALLED(InitNew); CHECK_CALLED(InitNew);
CHECK_CALLED(SetScriptSite); CHECK_CALLED(SetScriptSite);
CHECK_CALLED(GetScriptState); CHECK_CALLED(GetScriptState);
CHECK_CALLED(SetScriptState_STARTED); CHECK_CALLED(SetScriptState_STARTED);
CHECK_CALLED(AddNamedItem); CHECK_CALLED(AddNamedItem);
CHECK_CALLED_BROKEN(SetProperty_ABBREVIATE_GLOBALNAME_RESOLUTION); /* IE8 */
CHECK_CALLED(ParseScriptText); CHECK_CALLED(ParseScriptText);
CHECK_CALLED(SetScriptState_CONNECTED); CHECK_CALLED(SetScriptState_CONNECTED);
@ -1151,27 +1521,6 @@ static void gecko_installer_workaround(BOOL disable)
RegCloseKey(hkey); RegCloseKey(hkey);
} }
/* Check if Internet Explorer is configured to run in "Enhanced Security Configuration" (aka hardened mode) */
/* Note: this code is duplicated in dlls/mshtml/tests/dom.c, dlls/mshtml/tests/script.c and dlls/urlmon/tests/misc.c */
static BOOL is_ie_hardened(void)
{
HKEY zone_map;
DWORD ie_harden, type, size;
ie_harden = 0;
if(RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\ZoneMap",
0, KEY_QUERY_VALUE, &zone_map) == ERROR_SUCCESS) {
size = sizeof(DWORD);
if (RegQueryValueEx(zone_map, "IEHarden", NULL, &type, (LPBYTE) &ie_harden, &size) != ERROR_SUCCESS ||
type != REG_DWORD) {
ie_harden = 0;
}
RegCloseKey(zone_map);
}
return ie_harden != 0;
}
START_TEST(script) START_TEST(script)
{ {
gecko_installer_workaround(TRUE); gecko_installer_workaround(TRUE);

View file

@ -7,6 +7,7 @@
#include "wine/test.h" #include "wine/test.h"
extern void func_dom(void); extern void func_dom(void);
extern void func_events(void);
extern void func_htmldoc(void); extern void func_htmldoc(void);
extern void func_misc(void); extern void func_misc(void);
extern void func_protocol(void); extern void func_protocol(void);
@ -15,7 +16,8 @@ extern void func_script(void);
const struct test winetest_testlist[] = const struct test winetest_testlist[] =
{ {
{ "dom", func_dom }, { "dom", func_dom },
{ "htmldoc", func_htmldoc }, { "events", func_events },
{ "htmldoc", func_htmldoc },
{ "misc", func_misc }, { "misc", func_misc },
{ "protocol", func_protocol }, { "protocol", func_protocol },
{ "script", func_script }, { "script", func_script },