Jacek Caban : urlmon: Report redirected URL to object created by BindToObject.
Alexandre Julliard
julliard at winehq.org
Wed Dec 16 09:41:31 CST 2009
Module: wine
Branch: master
Commit: c069489a67257212bd0503d35b8866c7dfd4ddf1
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c069489a67257212bd0503d35b8866c7dfd4ddf1
Author: Jacek Caban <jacek at codeweavers.com>
Date: Tue Dec 15 21:16:35 2009 +0100
urlmon: Report redirected URL to object created by BindToObject.
---
dlls/urlmon/binding.c | 6 +++++
dlls/urlmon/tests/url.c | 58 ++++++++++++++++++++++++++++++----------------
2 files changed, 44 insertions(+), 20 deletions(-)
diff --git a/dlls/urlmon/binding.c b/dlls/urlmon/binding.c
index fc21d11..dcf0207 100644
--- a/dlls/urlmon/binding.c
+++ b/dlls/urlmon/binding.c
@@ -98,6 +98,7 @@ struct Binding {
LPWSTR mime;
UINT clipboard_format;
LPWSTR url;
+ LPWSTR redirect_url;
IID iid;
BOOL report_mime;
DWORD state;
@@ -829,6 +830,7 @@ static ULONG WINAPI Binding_Release(IBinding *iface)
This->section.DebugInfo->Spare[0] = 0;
DeleteCriticalSection(&This->section);
heap_free(This->mime);
+ heap_free(This->redirect_url);
heap_free(This->url);
heap_free(This);
@@ -968,6 +970,8 @@ static HRESULT WINAPI InternetProtocolSink_ReportProgress(IInternetProtocolSink
on_progress(This, 0, 0, BINDSTATUS_CONNECTING, szStatusText);
break;
case BINDSTATUS_REDIRECTING:
+ heap_free(This->redirect_url);
+ This->redirect_url = heap_strdupW(szStatusText);
on_progress(This, 0, 0, BINDSTATUS_REDIRECTING, szStatusText);
break;
case BINDSTATUS_BEGINDOWNLOADDATA:
@@ -1477,6 +1481,8 @@ static HRESULT start_binding(IMoniker *mon, Binding *binding_ctx, LPCWSTR url, I
if(binding_ctx) {
set_binding_sink(binding->protocol, PROTSINK(binding));
+ if(binding_ctx->redirect_url)
+ IBindStatusCallback_OnProgress(binding->callback, 0, 0, BINDSTATUS_REDIRECTING, binding_ctx->redirect_url);
report_data(binding, 0, 0, 0);
}else {
hres = IInternetProtocol_Start(binding->protocol, url, PROTSINK(binding),
diff --git a/dlls/urlmon/tests/url.c b/dlls/urlmon/tests/url.c
index ba0c134..11bd2ac 100644
--- a/dlls/urlmon/tests/url.c
+++ b/dlls/urlmon/tests/url.c
@@ -122,6 +122,7 @@ DEFINE_EXPECT(Obj_OnProgress_BEGINSYNCOPERATION);
DEFINE_EXPECT(Obj_OnProgress_ENDSYNCOPERATION);
DEFINE_EXPECT(Obj_OnProgress_FINDINGRESOURCE);
DEFINE_EXPECT(Obj_OnProgress_CONNECTING);
+DEFINE_EXPECT(Obj_OnProgress_REDIRECTING);
DEFINE_EXPECT(Obj_OnProgress_CACHEFILENAMEAVAILABLE);
DEFINE_EXPECT(Start);
DEFINE_EXPECT(Read);
@@ -390,11 +391,17 @@ static DWORD WINAPI thread_proc(PVOID arg)
CHECK_CALLED(OnProgress_SENDINGREQUEST);
if(test_redirect) {
- SET_EXPECT(OnProgress_REDIRECTING);
+ if(bind_to_object)
+ SET_EXPECT(Obj_OnProgress_REDIRECTING);
+ else
+ SET_EXPECT(OnProgress_REDIRECTING);
hres = IInternetProtocolSink_ReportProgress(protocol_sink, BINDSTATUS_REDIRECTING, WINE_ABOUT_URL);
ok(hres == S_OK, "ReportProgress(BINDSTATUS_REFIRECTING) failed: %08x\n", hres);
WaitForSingleObject(complete_event, INFINITE);
- CHECK_CALLED(OnProgress_REDIRECTING);
+ if(bind_to_object)
+ CHECK_CALLED(Obj_OnProgress_REDIRECTING);
+ else
+ CHECK_CALLED(OnProgress_REDIRECTING);
}
test_switch_fail();
@@ -1286,10 +1293,14 @@ static HRESULT WINAPI statusclb_OnProgress(IBindStatusCallbackEx *iface, ULONG u
SetEvent(complete_event);
break;
case BINDSTATUS_REDIRECTING:
- CHECK_EXPECT(OnProgress_REDIRECTING);
+ if(iface == &objbsc)
+ CHECK_EXPECT(Obj_OnProgress_REDIRECTING);
+ else
+ CHECK_EXPECT(OnProgress_REDIRECTING);
ok(!lstrcmpW(szStatusText, WINE_ABOUT_URL), "unexpected status text %s\n",
wine_dbgstr_w(szStatusText));
- SetEvent(complete_event);
+ if(!bind_to_object || iface == &objbsc)
+ SetEvent(complete_event);
break;
case BINDSTATUS_SENDINGREQUEST:
if(iface == &objbsc)
@@ -1716,6 +1727,8 @@ static HRESULT WINAPI PersistMoniker_Load(IPersistMoniker *iface, BOOL fFullyAva
SET_EXPECT(QueryInterface_IBindStatusCallbackEx);
SET_EXPECT(GetBindInfo);
SET_EXPECT(OnStartBinding);
+ if(test_redirect)
+ SET_EXPECT(OnProgress_REDIRECTING);
SET_EXPECT(OnProgress_BEGINDOWNLOADDATA);
if(test_protocol == FILE_TEST)
SET_EXPECT(OnProgress_CACHEFILENAMEAVAILABLE);
@@ -1732,6 +1745,8 @@ static HRESULT WINAPI PersistMoniker_Load(IPersistMoniker *iface, BOOL fFullyAva
CLEAR_CALLED(QueryInterface_IBindStatusCallbackEx); /* IE 8 */
CHECK_CALLED(GetBindInfo);
CHECK_CALLED(OnStartBinding);
+ if(test_redirect)
+ CHECK_CALLED(OnProgress_REDIRECTING);
CHECK_CALLED(OnProgress_BEGINDOWNLOADDATA);
if(test_protocol == FILE_TEST)
CHECK_CALLED(OnProgress_CACHEFILENAMEAVAILABLE);
@@ -2419,7 +2434,7 @@ static void test_BindToStorage(int protocol, DWORD flags, DWORD t)
http_is_first = FALSE;
}
-static void test_BindToObject(int protocol, BOOL emul)
+static void test_BindToObject(int protocol, DWORD flags)
{
IMoniker *mon;
HRESULT hres;
@@ -2430,9 +2445,9 @@ static void test_BindToObject(int protocol, BOOL emul)
IUnknown *unk = (IUnknown*)0x00ff00ff;
IBinding *bind;
- init_bind_test(protocol, BINDTEST_TOOBJECT | (emul ? BINDTEST_EMULATE : 0), TYMED_ISTREAM);
+ init_bind_test(protocol, BINDTEST_TOOBJECT|flags, TYMED_ISTREAM);
- if(emul)
+ if(emulate_protocol)
CoRegisterClassObject(&CLSID_HTMLDocument, (IUnknown *)&mime_cf,
CLSCTX_INPROC_SERVER, REGCLS_MULTIPLEUSE, ®id);
@@ -2523,14 +2538,14 @@ static void test_BindToObject(int protocol, BOOL emul)
}else {
ok(hres == S_OK, "IMoniker_BindToStorage failed: %08x\n", hres);
ok(unk != NULL, "unk == NULL\n");
- if(emul)
+ if(emulate_protocol)
ok(unk == (IUnknown*)&PersistMoniker, "unk != PersistMoniker\n");
}
if(unk)
IUnknown_Release(unk);
while((bindf & BINDF_ASYNCHRONOUS) &&
- !((!emul || stopped_binding) && stopped_obj_binding) && GetMessage(&msg,NULL,0,0)) {
+ !((!emulate_protocol || stopped_binding) && stopped_obj_binding) && GetMessage(&msg,NULL,0,0)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
@@ -2594,7 +2609,7 @@ static void test_BindToObject(int protocol, BOOL emul)
CHECK_CALLED(Obj_OnStopBinding);
}
- if(test_protocol != HTTP_TEST || emul || !(bindf & BINDF_ASYNCHRONOUS)) {
+ if(test_protocol != HTTP_TEST || emulate_protocol || !(bindf & BINDF_ASYNCHRONOUS)) {
ok(IMoniker_Release(mon) == 0, "mon should be destroyed here\n");
ok(IBindCtx_Release(bctx) == 0, "bctx should be destroyed here\n");
}else {
@@ -2602,7 +2617,7 @@ static void test_BindToObject(int protocol, BOOL emul)
IBindCtx_Release(bctx);
}
- if(emul)
+ if(emulate_protocol)
CoRevokeClassObject(regid);
if(test_protocol == HTTP_TEST || test_protocol == HTTPS_TEST)
@@ -2876,13 +2891,13 @@ START_TEST(url)
test_BindToStorage(HTTP_TEST, 0, TYMED_ISTREAM);
trace("synchronous http test (to object)...\n");
- test_BindToObject(HTTP_TEST, FALSE);
+ test_BindToObject(HTTP_TEST, 0);
trace("synchronous file test...\n");
test_BindToStorage(FILE_TEST, 0, TYMED_ISTREAM);
trace("synchronous file test (to object)...\n");
- test_BindToObject(FILE_TEST, FALSE);
+ test_BindToObject(FILE_TEST, 0);
bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA;
@@ -2893,20 +2908,23 @@ START_TEST(url)
test_BindToStorage(HTTP_TEST, 0, TYMED_FILE);
trace("http test (to object)...\n");
- test_BindToObject(HTTP_TEST, FALSE);
+ test_BindToObject(HTTP_TEST, 0);
trace("http test (short response)...\n");
http_is_first = TRUE;
test_BindToStorage(HTTP_TEST, BINDTEST_HTTPRESPONSE, TYMED_ISTREAM);
trace("http test (short response, to object)...\n");
- test_BindToObject(HTTP_TEST, FALSE);
+ test_BindToObject(HTTP_TEST, 0);
trace("emulated http test...\n");
test_BindToStorage(HTTP_TEST, BINDTEST_EMULATE, TYMED_ISTREAM);
trace("emulated http test (to object)...\n");
- test_BindToObject(HTTP_TEST, TRUE);
+ test_BindToObject(HTTP_TEST, BINDTEST_EMULATE);
+
+ trace("emulated http test (to object, redirect)...\n");
+ test_BindToObject(HTTP_TEST, BINDTEST_EMULATE|BINDTEST_REDIRECT);
trace("emulated http test (to file)...\n");
test_BindToStorage(HTTP_TEST, BINDTEST_EMULATE, TYMED_FILE);
@@ -2927,7 +2945,7 @@ START_TEST(url)
test_BindToStorage(ABOUT_TEST, BINDTEST_EMULATE, TYMED_FILE);
trace("about test (to object)...\n");
- test_BindToObject(ABOUT_TEST, FALSE);
+ test_BindToObject(ABOUT_TEST, 0);
trace("emulated about test...\n");
test_BindToStorage(ABOUT_TEST, BINDTEST_EMULATE, TYMED_ISTREAM);
@@ -2936,7 +2954,7 @@ START_TEST(url)
test_BindToStorage(ABOUT_TEST, BINDTEST_EMULATE, TYMED_FILE);
trace("emulated about test (to object)...\n");
- test_BindToObject(ABOUT_TEST, TRUE);
+ test_BindToObject(ABOUT_TEST, BINDTEST_EMULATE);
trace("file test...\n");
test_BindToStorage(FILE_TEST, 0, TYMED_ISTREAM);
@@ -2945,7 +2963,7 @@ START_TEST(url)
test_BindToStorage(FILE_TEST, 0, TYMED_FILE);
trace("file test (to object)...\n");
- test_BindToObject(FILE_TEST, FALSE);
+ test_BindToObject(FILE_TEST, 0);
trace("emulated file test...\n");
test_BindToStorage(FILE_TEST, BINDTEST_EMULATE, TYMED_ISTREAM);
@@ -2954,7 +2972,7 @@ START_TEST(url)
test_BindToStorage(FILE_TEST, BINDTEST_EMULATE, TYMED_FILE);
trace("emulated file test (to object)...\n");
- test_BindToObject(FILE_TEST, TRUE);
+ test_BindToObject(FILE_TEST, BINDTEST_EMULATE);
trace("emulated its test...\n");
test_BindToStorage(ITS_TEST, BINDTEST_EMULATE, TYMED_ISTREAM);
More information about the wine-cvs
mailing list