ReactOS 0.4.17-dev-470-gf9e3448
misc.c
Go to the documentation of this file.
1/*
2 * Copyright 2005-2006 Jacek Caban for CodeWeavers
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19#define COBJMACROS
20#define CONST_VTABLE
21
22#include <wine/test.h>
23#include <stdarg.h>
24#include <stddef.h>
25#include <stdio.h>
26
27#include "windef.h"
28#include "winbase.h"
29#include "ole2.h"
30#include "urlmon.h"
31
32#include "initguid.h"
33
34DEFINE_GUID(CLSID_AboutProtocol, 0x3050F406, 0x98B5, 0x11CF, 0xBB,0x82, 0x00,0xAA,0x00,0xBD,0xCE,0x0B);
35
36#define DEFINE_EXPECT(func) \
37 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
38
39#define SET_EXPECT(func) \
40 expect_ ## func = TRUE
41
42#define CHECK_EXPECT(func) \
43 do { \
44 ok(expect_ ##func, "unexpected call " #func "\n"); \
45 expect_ ## func = FALSE; \
46 called_ ## func = TRUE; \
47 }while(0)
48
49#define CHECK_EXPECT2(func) \
50 do { \
51 ok(expect_ ##func, "unexpected call " #func "\n"); \
52 called_ ## func = TRUE; \
53 }while(0)
54
55#define CHECK_CALLED(func) \
56 do { \
57 ok(called_ ## func, "expected " #func "\n"); \
58 expect_ ## func = called_ ## func = FALSE; \
59 }while(0)
60
61DEFINE_EXPECT(ParseUrl);
62DEFINE_EXPECT(ParseUrl_ENCODE);
63DEFINE_EXPECT(ParseUrl_UNESCAPE);
64DEFINE_EXPECT(QI_IInternetProtocolInfo);
67
68static HRESULT (WINAPI *pCoInternetCompareUrl)(LPCWSTR, LPCWSTR, DWORD);
69static HRESULT (WINAPI *pCoInternetGetSecurityUrl)(LPCWSTR, LPWSTR*, PSUACTION, DWORD);
70static HRESULT (WINAPI *pCoInternetGetSession)(DWORD, IInternetSession **, DWORD);
71static HRESULT (WINAPI *pCoInternetParseUrl)(LPCWSTR, PARSEACTION, DWORD, LPWSTR, DWORD, DWORD *, DWORD);
72static HRESULT (WINAPI *pCoInternetQueryInfo)(LPCWSTR, QUERYOPTION, DWORD, LPVOID, DWORD, DWORD *, DWORD);
73static HRESULT (WINAPI *pCopyStgMedium)(const STGMEDIUM *, STGMEDIUM *);
74static HRESULT (WINAPI *pCopyBindInfo)(const BINDINFO *, BINDINFO *);
75static HRESULT (WINAPI *pFindMimeFromData)(LPBC, LPCWSTR, LPVOID, DWORD, LPCWSTR,
76 DWORD, LPWSTR*, DWORD);
77static HRESULT (WINAPI *pObtainUserAgentString)(DWORD, LPSTR, DWORD*);
78static HRESULT (WINAPI *pReleaseBindInfo)(BINDINFO*);
79static HRESULT (WINAPI *pUrlMkGetSessionOption)(DWORD, LPVOID, DWORD, DWORD *, DWORD);
80static HRESULT (WINAPI *pCompareSecurityIds)(BYTE*,DWORD,BYTE*,DWORD,DWORD);
81static HRESULT (WINAPI *pCoInternetIsFeatureEnabled)(INTERNETFEATURELIST,DWORD);
82static HRESULT (WINAPI *pCoInternetSetFeatureEnabled)(INTERNETFEATURELIST,DWORD,BOOL);
83static HRESULT (WINAPI *pIEInstallScope)(DWORD*);
84static HRESULT (WINAPI *pMapBrowserEmulationModeToUserAgent)(const void*,WCHAR**);
85
86static WCHAR *a2co(const char *str)
87{
88 WCHAR *ret;
89 int len;
90
91 if(!str)
92 return NULL;
93
94 len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
95 ret = CoTaskMemAlloc(len*sizeof(WCHAR));
97
98 return ret;
99}
100
101static void test_CreateFormatEnum(void)
102{
103 IEnumFORMATETC *fenum = NULL, *fenum2 = NULL;
104 FORMATETC fetc[5];
105 ULONG ul;
107
108 static DVTARGETDEVICE dev = {sizeof(dev),0,0,0,0,{0}};
109 static FORMATETC formatetc[] = {
110 {0,&dev,0,0,0},
111 {0,&dev,0,1,0},
112 {0,NULL,0,2,0},
113 {0,NULL,0,3,0},
114 {0,NULL,0,4,0}
115 };
116
117 hres = CreateFormatEnumerator(0, formatetc, &fenum);
118 ok(hres == E_FAIL, "CreateFormatEnumerator failed: %08lx, expected E_FAIL\n", hres);
119 hres = CreateFormatEnumerator(0, formatetc, NULL);
120 ok(hres == E_INVALIDARG, "CreateFormatEnumerator failed: %08lx, expected E_INVALIDARG\n", hres);
121 hres = CreateFormatEnumerator(5, formatetc, NULL);
122 ok(hres == E_INVALIDARG, "CreateFormatEnumerator failed: %08lx, expected E_INVALIDARG\n", hres);
123
124
125 hres = CreateFormatEnumerator(5, formatetc, &fenum);
126 ok(hres == S_OK, "CreateFormatEnumerator failed: %08lx\n", hres);
127 if(FAILED(hres))
128 return;
129
130 hres = IEnumFORMATETC_Next(fenum, 2, NULL, &ul);
131 ok(hres == E_INVALIDARG, "Next failed: %08lx, expected E_INVALIDARG\n", hres);
132 ul = 100;
133 hres = IEnumFORMATETC_Next(fenum, 0, fetc, &ul);
134 ok(hres == S_OK, "Next failed: %08lx\n", hres);
135 ok(ul == 0, "ul=%ld, expected 0\n", ul);
136
137 hres = IEnumFORMATETC_Next(fenum, 2, fetc, &ul);
138 ok(hres == S_OK, "Next failed: %08lx\n", hres);
139 ok(fetc[0].lindex == 0, "fetc[0].lindex=%ld, expected 0\n", fetc[0].lindex);
140 ok(fetc[1].lindex == 1, "fetc[1].lindex=%ld, expected 1\n", fetc[1].lindex);
141 ok(fetc[0].ptd == &dev, "fetc[0].ptd=%p, expected %p\n", fetc[0].ptd, &dev);
142 ok(ul == 2, "ul=%ld, expected 2\n", ul);
143
144 hres = IEnumFORMATETC_Skip(fenum, 1);
145 ok(hres == S_OK, "Skip failed: %08lx\n", hres);
146
147 hres = IEnumFORMATETC_Next(fenum, 4, fetc, &ul);
148 ok(hres == S_FALSE, "Next failed: %08lx, expected S_FALSE\n", hres);
149 ok(fetc[0].lindex == 3, "fetc[0].lindex=%ld, expected 3\n", fetc[0].lindex);
150 ok(fetc[1].lindex == 4, "fetc[1].lindex=%ld, expected 4\n", fetc[1].lindex);
151 ok(fetc[0].ptd == NULL, "fetc[0].ptd=%p, expected NULL\n", fetc[0].ptd);
152 ok(ul == 2, "ul=%ld, expected 2\n", ul);
153
154 hres = IEnumFORMATETC_Next(fenum, 4, fetc, &ul);
155 ok(hres == S_FALSE, "Next failed: %08lx, expected S_FALSE\n", hres);
156 ok(ul == 0, "ul=%ld, expected 0\n", ul);
157 ul = 100;
158 hres = IEnumFORMATETC_Next(fenum, 0, fetc, &ul);
159 ok(hres == S_OK, "Next failed: %08lx\n", hres);
160 ok(ul == 0, "ul=%ld, expected 0\n", ul);
161
162 hres = IEnumFORMATETC_Skip(fenum, 3);
163 ok(hres == S_FALSE, "Skip failed: %08lx, expected S_FALSE\n", hres);
164
165 hres = IEnumFORMATETC_Reset(fenum);
166 ok(hres == S_OK, "Reset failed: %08lx\n", hres);
167
168 hres = IEnumFORMATETC_Next(fenum, 5, fetc, NULL);
169 ok(hres == S_OK, "Next failed: %08lx\n", hres);
170 ok(fetc[0].lindex == 0, "fetc[0].lindex=%ld, expected 0\n", fetc[0].lindex);
171
172 hres = IEnumFORMATETC_Reset(fenum);
173 ok(hres == S_OK, "Reset failed: %08lx\n", hres);
174
175 hres = IEnumFORMATETC_Skip(fenum, 2);
176 ok(hres == S_OK, "Skip failed: %08lx\n", hres);
177
178 hres = IEnumFORMATETC_Clone(fenum, NULL);
179 ok(hres == E_INVALIDARG, "Clone failed: %08lx, expected E_INVALIDARG\n", hres);
180
181 hres = IEnumFORMATETC_Clone(fenum, &fenum2);
182 ok(hres == S_OK, "Clone failed: %08lx\n", hres);
183
184 if(SUCCEEDED(hres)) {
185 ok(fenum != fenum2, "fenum == fenum2\n");
186
187 hres = IEnumFORMATETC_Next(fenum2, 2, fetc, &ul);
188 ok(hres == S_OK, "Next failed: %08lx\n", hres);
189 ok(fetc[0].lindex == 2, "fetc[0].lindex=%ld, expected 2\n", fetc[0].lindex);
190
191 IEnumFORMATETC_Release(fenum2);
192 }
193
194 hres = IEnumFORMATETC_Next(fenum, 2, fetc, &ul);
195 ok(hres == S_OK, "Next failed: %08lx\n", hres);
196 ok(fetc[0].lindex == 2, "fetc[0].lindex=%ld, expected 2\n", fetc[0].lindex);
197
198 hres = IEnumFORMATETC_Skip(fenum, 1);
199 ok(hres == S_OK, "Skip failed: %08lx\n", hres);
200
201 IEnumFORMATETC_Release(fenum);
202}
203
205{
206 IBindCtx *bctx = NULL;
207 IEnumFORMATETC *format = NULL, *format2 = NULL;
208 IUnknown *unk = NULL;
210
211 static FORMATETC formatetc = {0,NULL,0,0,0};
212 static WCHAR wszEnumFORMATETC[] =
213 {'_','E','n','u','m','F','O','R','M','A','T','E','T','C','_',0};
214
215 CreateBindCtx(0, &bctx);
216
217 hres = CreateFormatEnumerator(1, &formatetc, &format);
218 ok(hres == S_OK, "CreateFormatEnumerator failed: %08lx\n", hres);
219 if(FAILED(hres))
220 return;
221
224 "RegisterFormatEnumerator failed: %08lx, expected E_INVALIDARG\n", hres);
227 "RegisterFormatEnumerator failed: %08lx, expected E_INVALIDARG\n", hres);
228
230 ok(hres == S_OK, "RegisterFormatEnumerator failed: %08lx\n", hres);
231
232 hres = IBindCtx_GetObjectParam(bctx, wszEnumFORMATETC, &unk);
233 ok(hres == S_OK, "GetObjectParam failed: %08lx\n", hres);
234 ok(unk == (IUnknown*)format, "unk != format\n");
235
238 "RevokeFormatEnumerator failed: %08lx, expected E_INVALIDARG\n", hres);
239
241 ok(hres == S_OK, "RevokeFormatEnumerator failed: %08lx\n", hres);
242
244 ok(hres == E_FAIL, "RevokeFormatEnumerator failed: %08lx, expected E_FAIL\n", hres);
245
246 hres = IBindCtx_GetObjectParam(bctx, wszEnumFORMATETC, &unk);
247 ok(hres == E_FAIL, "GetObjectParam failed: %08lx, expected E_FAIL\n", hres);
248
250 ok(hres == S_OK, "RegisterFormatEnumerator failed: %08lx\n", hres);
251
252 hres = CreateFormatEnumerator(1, &formatetc, &format2);
253 ok(hres == S_OK, "CreateFormatEnumerator failed: %08lx\n", hres);
254
255 if(SUCCEEDED(hres)) {
257 ok(hres == S_OK, "RevokeFormatEnumerator failed: %08lx\n", hres);
258
259 IEnumFORMATETC_Release(format2);
260 }
261
262 hres = IBindCtx_GetObjectParam(bctx, wszEnumFORMATETC, &unk);
263 ok(hres == E_FAIL, "GetObjectParam failed: %08lx, expected E_FAIL\n", hres);
264
265 IEnumFORMATETC_Release(format);
266
268 ok(hres == S_OK, "RegisterFormatEnumerator failed: %08lx\n", hres);
270 ok(hres == S_OK, "RevokeFormatEnumerator failed: %08lx\n", hres);
271 hres = IBindCtx_GetObjectParam(bctx, wszEnumFORMATETC, &unk);
272 ok(hres == E_FAIL, "GetObjectParam failed: %08lx, expected E_FAIL\n", hres);
273
274 IEnumFORMATETC_Release(format);
275 IBindCtx_Release(bctx);
276}
277static const WCHAR url1[] = {'r','e','s',':','/','/','m','s','h','t','m','l','.','d','l','l',
278 '/','b','l','a','n','k','.','h','t','m',0};
279static const WCHAR url2[] = {'i','n','d','e','x','.','h','t','m',0};
280static const WCHAR url3[] = {'f','i','l','e',':','/','/','c',':','\\','I','n','d','e','x','.','h','t','m',0};
281static const WCHAR url4[] = {'f','i','l','e',':','s','o','m','e','%','2','0','f','i','l','e',
282 '%','2','e','j','p','g',0};
283static const WCHAR url5[] = {'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q',
284 '.','o','r','g',0};
285static const WCHAR url6[] = {'a','b','o','u','t',':','b','l','a','n','k',0};
286static const WCHAR url7[] = {'f','t','p',':','/','/','w','i','n','e','h','q','.','o','r','g','/',
287 'f','i','l','e','.','t','e','s','t',0};
288static const WCHAR url8[] = {'t','e','s','t',':','1','2','3','a','b','c',0};
289static const WCHAR url9[] =
290 {'h','t','t','p',':','/','/','w','w','w','.','w','i','n','e','h','q','.','o','r','g',
291 '/','s','i','t','e','/','a','b','o','u','t',0};
292static const WCHAR url10[] = {'h','t','t','p',':','/','/','g','o','o','g','l','e','.','*','.',
293 'c','o','m',0};
294static const WCHAR url4e[] = {'f','i','l','e',':','s','o','m','e',' ','f','i','l','e',
295 '.','j','p','g',0};
296
297static const WCHAR path3[] = {'c',':','\\','I','n','d','e','x','.','h','t','m',0};
298static const WCHAR path4[] = {'s','o','m','e',' ','f','i','l','e','.','j','p','g',0};
299
300static const WCHAR wszRes[] = {'r','e','s',0};
301static const WCHAR wszFile[] = {'f','i','l','e',0};
302static const WCHAR wszHttp[] = {'h','t','t','p',0};
303static const WCHAR wszAbout[] = {'a','b','o','u','t',0};
304static const WCHAR wszEmpty[] = {0};
305static const WCHAR wszGoogle[] = {'g','o','o','g','l','e','.','*','.','c','o','m',0};
306
307static const WCHAR wszWineHQ[] = {'w','w','w','.','w','i','n','e','h','q','.','o','r','g',0};
308static const WCHAR wszHttpWineHQ[] = {'h','t','t','p',':','/','/','w','w','w','.',
309 'w','i','n','e','h','q','.','o','r','g',0};
310static const WCHAR wszHttpGoogle[] = {'h','t','t','p',':','/','/','g','o','o','g','l','e',
311 '.','*','.','c','o','m',0};
312
324};
325
326static const struct parse_test parse_tests[] = {
334};
335
336static void test_CoInternetParseUrl(void)
337{
339 DWORD size;
340 int i;
341
342 static WCHAR buf[4096];
343
344 memset(buf, 0xf0, sizeof(buf));
345 hres = pCoInternetParseUrl(parse_tests[0].url, PARSE_SCHEMA, 0, buf,
346 3, &size, 0);
347 ok(hres == E_POINTER, "schema failed: %08lx, expected E_POINTER\n", hres);
348
349 for(i = 0; i < ARRAY_SIZE(parse_tests); i++) {
350 memset(buf, 0xf0, sizeof(buf));
351 hres = pCoInternetParseUrl(parse_tests[i].url, PARSE_SECURITY_URL, 0, buf,
352 ARRAY_SIZE(buf), &size, 0);
353 ok(hres == parse_tests[i].secur_hres, "[%d] security url failed: %08lx, expected %08lx\n",
355
356 memset(buf, 0xf0, sizeof(buf));
357 hres = pCoInternetParseUrl(parse_tests[i].url, PARSE_ENCODE, 0, buf,
358 ARRAY_SIZE(buf), &size, 0);
359 ok(hres == S_OK, "[%d] encoding failed: %08lx\n", i, hres);
360 ok(size == lstrlenW(parse_tests[i].encoded_url), "[%d] wrong size\n", i);
361 ok(!lstrcmpW(parse_tests[i].encoded_url, buf), "[%d] wrong encoded url\n", i);
362
363 memset(buf, 0xf0, sizeof(buf));
364 hres = pCoInternetParseUrl(parse_tests[i].url, PARSE_UNESCAPE, 0, buf,
365 ARRAY_SIZE(buf), &size, 0);
366 ok(hres == S_OK, "[%d] encoding failed: %08lx\n", i, hres);
367 ok(size == lstrlenW(parse_tests[i].encoded_url), "[%d] wrong size\n", i);
368 ok(!lstrcmpW(parse_tests[i].encoded_url, buf), "[%d] wrong encoded url\n", i);
369
370 memset(buf, 0xf0, sizeof(buf));
371 hres = pCoInternetParseUrl(parse_tests[i].url, PARSE_PATH_FROM_URL, 0, buf,
372 ARRAY_SIZE(buf), &size, 0);
373 ok(hres == parse_tests[i].path_hres, "[%d] path failed: %08lx, expected %08lx\n",
375 if(parse_tests[i].path) {
376 ok(size == lstrlenW(parse_tests[i].path), "[%d] wrong size\n", i);
377 ok(!lstrcmpW(parse_tests[i].path, buf), "[%d] wrong path\n", i);
378 }
379
380 memset(buf, 0xf0, sizeof(buf));
381 hres = pCoInternetParseUrl(parse_tests[i].url, PARSE_SCHEMA, 0, buf,
382 ARRAY_SIZE(buf), &size, 0);
383 ok(hres == S_OK, "[%d] schema failed: %08lx\n", i, hres);
384 ok(size == lstrlenW(parse_tests[i].schema), "[%d] wrong size\n", i);
385 ok(!lstrcmpW(parse_tests[i].schema, buf), "[%d] wrong schema\n", i);
386
387 if(memcmp(parse_tests[i].url, wszRes, 3*sizeof(WCHAR))
388 && memcmp(parse_tests[i].url, wszAbout, 5*sizeof(WCHAR))) {
389 memset(buf, 0xf0, sizeof(buf));
390 hres = pCoInternetParseUrl(parse_tests[i].url, PARSE_DOMAIN, 0, buf,
391 ARRAY_SIZE(buf), &size, 0);
392 ok(hres == parse_tests[i].domain_hres, "[%d] domain failed: %08lx\n", i, hres);
393 if(parse_tests[i].domain)
394 ok(!lstrcmpW(parse_tests[i].domain, buf), "[%d] wrong domain, received %s\n", i, wine_dbgstr_w(buf));
395 }
396
397 memset(buf, 0xf0, sizeof(buf));
398 hres = pCoInternetParseUrl(parse_tests[i].url, PARSE_ROOTDOCUMENT, 0, buf,
399 ARRAY_SIZE(buf), &size, 0);
400 ok(hres == parse_tests[i].rootdocument_hres, "[%d] rootdocument failed: %08lx\n", i, hres);
402 ok(!lstrcmpW(parse_tests[i].rootdocument, buf), "[%d] wrong rootdocument, received %s\n", i, wine_dbgstr_w(buf));
403 }
404
405 size = 0xdeadbeef;
406 hres = pCoInternetParseUrl(L"http://a/b/../c", PARSE_CANONICALIZE, 0, buf, 3, &size, 0);
407 ok(hres == E_POINTER, "got %#lx\n", hres);
408 ok(size == wcslen(L"http://a/c") + 1, "got %lu\n", size);
409
410 size = 0xdeadbeef;
411 hres = pCoInternetParseUrl(L"http://a/b/../c", PARSE_CANONICALIZE, 0, buf, sizeof(buf), &size, 0);
412 ok(hres == S_OK, "got %#lx\n", hres);
413 ok(!wcscmp(buf, L"http://a/c"), "got %s\n", debugstr_w(buf));
414 ok(size == wcslen(buf), "got %lu\n", size);
415}
416
418{
420
421 hres = pCoInternetCompareUrl(url1, url1, 0);
422 ok(hres == S_OK, "CoInternetCompareUrl failed: %08lx\n", hres);
423
424 hres = pCoInternetCompareUrl(url1, url3, 0);
425 ok(hres == S_FALSE, "CoInternetCompareUrl failed: %08lx\n", hres);
426
427 hres = pCoInternetCompareUrl(url3, url1, 0);
428 ok(hres == S_FALSE, "CoInternetCompareUrl failed: %08lx\n", hres);
429}
430
431static const struct {
434} query_info_tests[] = {
435 {url1, 0},
436 {url2, 0},
437 {url3, 0},
438 {url4, 0},
439 {url5, 0},
440 {url6, 0},
441 {url7, 0},
442 {url8, 0}
444
446{
447 BYTE buf[100];
448 DWORD cb, i;
450
451 for(i = 0; i < ARRAY_SIZE(query_info_tests); i++) {
452 cb = 0xdeadbeef;
453 memset(buf, '?', sizeof(buf));
454 hres = pCoInternetQueryInfo(query_info_tests[0].url, QUERY_USES_NETWORK, 0, buf, sizeof(buf), &cb, 0);
455 ok(hres == S_OK, "[%ld] CoInternetQueryInfo failed: %08lx\n", i, hres);
456 ok(cb == sizeof(DWORD), "[%ld] cb = %ld\n", i, cb);
457 ok(*(DWORD*)buf == query_info_tests[i].uses_net, "[%ld] ret %lx, expected %lx\n",
459
460 hres = pCoInternetQueryInfo(query_info_tests[0].url, QUERY_USES_NETWORK, 0, buf, 3, &cb, 0);
461 ok(hres == E_FAIL, "[%ld] CoInternetQueryInfo failed: %08lx, expected E_FAIL\n", i, hres);
462 hres = pCoInternetQueryInfo(query_info_tests[0].url, QUERY_USES_NETWORK, 0, NULL, sizeof(buf), &cb, 0);
463 ok(hres == E_FAIL, "[%ld] CoInternetQueryInfo failed: %08lx, expected E_FAIL\n", i, hres);
464
465 memset(buf, '?', sizeof(buf));
466 hres = pCoInternetQueryInfo(query_info_tests[0].url, QUERY_USES_NETWORK, 0, buf, sizeof(buf), NULL, 0);
467 ok(hres == S_OK, "[%ld] CoInternetQueryInfo failed: %08lx\n", i, hres);
468 ok(*(DWORD*)buf == query_info_tests[i].uses_net, "[%ld] ret %lx, expected %lx\n",
470 }
471}
472
473static const struct {
474 const WCHAR *url;
475 const WCHAR *mime;
479} mime_tests[] = {
480 {L"res://mshtml.dll/blank.htm", L"text/html", S_OK},
481 {L"index.htm", L"text/html", S_OK},
482 {L"file://c:\\Index.htm", L"text/html", S_OK},
483 {L"file://c:\\Index.htm?q=test", L"text/html", S_OK, TRUE},
484 {L"file://c:\\Index.htm#hash_part", L"text/html", S_OK, TRUE},
485 {L"file://c:\\Index.htm#hash_part.txt", L"text/html", S_OK, FALSE, L"text/plain"},
486 {L"file://some%20file%2ejpg", NULL, E_FAIL},
487 {L"http://www.winehq.org", NULL, __HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)},
488 {L"about:blank", NULL, E_FAIL},
489 {L"ftp://winehq.org/file.test", NULL, __HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)}
491
492static BYTE data1[] = "test data\n";
493static BYTE data2[] = {31,'t','e','s',0xfa,'t',' ','d','a','t','a','\n',0};
494static BYTE data3[] = {0,0,0};
495static BYTE data4[] = {'t','e','s',0xfa,'t',' ','d','a','t','a','\n',0,0};
496static BYTE data5[] = {0xa,0xa,0xa,'x',32,'x',0};
497static BYTE data6[] = {0xfa,0xfa,0xfa,0xfa,'\n','\r','\t','x','x','x',1};
498static BYTE data7[] = "<html>blahblah";
499static BYTE data8[] = {'t','e','s',0xfa,'t',' ','<','h','t','m','l','>','d','a','t','a','\n',0,0};
500static BYTE data9[] = {'t','e',0,'s',0xfa,'t',' ','<','h','t','m','l','>','d','a','t','a','\n',0,0};
501static BYTE data10[] = "<HtmL>blahblah";
502static BYTE data11[] = "blah<HTML>blahblah";
503static BYTE data12[] = "blah<HTMLblahblah";
504static BYTE data13[] = "blahHTML>blahblah";
505static BYTE data14[] = "blah<HTMblahblah";
506static BYTE data15[] = {0xff,0xd8};
507static BYTE data16[] = {0xff,0xd8,'h'};
508static BYTE data17[] = {0,0xff,0xd8};
509static BYTE data18[] = {0xff,0xd8,'<','h','t','m','l','>'};
510static BYTE data19[] = {'G','I','F','8','7','a'};
511static BYTE data20[] = {'G','I','F','8','9','a'};
512static BYTE data21[] = {'G','I','F','8','7'};
513static BYTE data22[] = {'G','i','F','8','7','a'};
514static BYTE data23[] = {'G','i','F','8','8','a'};
515static BYTE data24[] = {'g','i','f','8','7','a'};
516static BYTE data25[] = {'G','i','F','8','7','A'};
517static BYTE data26[] = {'G','i','F','8','7','a','<','h','t','m','l','>'};
518static BYTE data27[] = {0x30,'G','i','F','8','7','A'};
519static BYTE data28[] = {0x42,0x4d,0x6e,0x42,0x1c,0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x00,0x00};
520static BYTE data29[] = {0x42,0x4d,'x','x','x','x',0x00,0x00,0x00,0x00,'x','x','x','x'};
521static BYTE data30[] = {0x42,0x4d,'x','x','x','x',0x00,0x01,0x00,0x00,'x','x','x','x'};
522static BYTE data31[] = {0x42,0x4d,'x','x','x','x',0x00,0x00,0x00,0x00,'<','h','t','m','l','>'};
523static BYTE data32[] = {0x42,0x4d,'x','x','x','x',0x00,0x00,0x00,0x00,'x','x','x'};
524static BYTE data33[] = {0x00,0x42,0x4d,'x','x','x','x',0x00,0x00,0x00,0x00,'x','x','x'};
525static BYTE data34[] = {0x89,'P','N','G',0x0d,0x0a,0x1a,0x0a,'x'};
526static BYTE data35[] = {0x89,'P','N','G',0x0d,0x0a,0x1a,0x0a,'x','x','x','x',0};
527static BYTE data36[] = {0x89,'P','N','G',0x0d,0x0a,0x1a,'x','x'};
528static BYTE data37[] = {0x89,'P','N','G',0x0d,0x0a,0x1a,0x0a,'<','h','t','m','l','>'};
529static BYTE data38[] = {0x00,0x89,'P','N','G',0x0d,0x0a,0x1a,0x0a,'x'};
530static BYTE data39[] = {0x4d,0x4d,0x00,0x2a,0xff};
531static BYTE data40[] = {0x4d,0x4d,0x00,0x2a,'<','h','t','m','l','>',0};
532static BYTE data41[] = {0x4d,0x4d,0xff};
533static BYTE data42[] = {0x4d,0x4d};
534static BYTE data43[] = {0x00,0x4d,0x4d,0x00};
535static BYTE data44[] = {'R','I','F','F',0xff,0xff,0xff,0xff,'A','V','I',0x20,0xff};
536static BYTE data45[] = {'R','I','F','f',0xff,0xff,0xff,0xff,'A','V','I',0x20,0xff};
537static BYTE data46[] = {'R','I','F','F',0xff,0xff,0xff,0xff,'A','V','I',0x20};
538static BYTE data47[] = {'R','I','F','F',0xff,0xff,0xff,0xff,'A','V','I',0x21,0xff};
539static BYTE data48[] = {'R','I','F','F',0xff,0xff,0xff,0xff,'A','V','I',0x20,'<','h','t','m','l','>'};
540static BYTE data49[] = {'R','I','F','F',0x0f,0x0f,0xf0,0xf0,'A','V','I',0x20,0xf0,0x00};
541static BYTE data50[] = {0x00,0x00,0x01,0xb3,0xff};
542static BYTE data51[] = {0x00,0x00,0x01,0xba,0xff};
543static BYTE data52[] = {0x00,0x00,0x01,0xb8,0xff};
544static BYTE data53[] = {0x00,0x00,0x01,0xba};
545static BYTE data54[] = {0x00,0x00,0x01,0xba,'<','h','t','m','l','>'};
546static BYTE data55[] = {0x1f,0x8b,'x'};
547static BYTE data56[] = {0x1f};
548static BYTE data57[] = {0x1f,0x8b,'<','h','t','m','l','>','t','e','s','t',0};
549static BYTE data58[] = {0x1f,0x8b};
550static BYTE data59[] = {0x50,0x4b,'x'};
551static BYTE data60[] = {0x50,0x4b};
552static BYTE data61[] = {0x50,0x4b,'<','h','t','m','l','>',0};
553static BYTE data62[] = {0xca,0xfe,0xba,0xbe,'x'};
554static BYTE data63[] = {0xca,0xfe,0xba,0xbe};
555static BYTE data64[] = {0xca,0xfe,0xba,0xbe,'<','h','t','m','l','>',0};
556static BYTE data65[] = {0x25,0x50,0x44,0x46,'x'};
557static BYTE data66[] = {0x25,0x50,0x44,0x46};
558static BYTE data67[] = {0x25,0x50,0x44,0x46,'x','<','h','t','m','l','>'};
559static BYTE data68[] = {'M','Z','x'};
560static BYTE data69[] = {'M','Z'};
561static BYTE data70[] = {'M','Z','<','h','t','m','l','>',0xff};
562static BYTE data71[] = {'{','\\','r','t','f',0};
563static BYTE data72[] = {'{','\\','r','t','f'};
564static BYTE data73[] = {' ','{','\\','r','t','f',' '};
565static BYTE data74[] = {'{','\\','r','t','f','<','h','t','m','l','>',' '};
566static BYTE data75[] = {'R','I','F','F',0xff,0xff,0xff,0xff,'W','A','V','E',0xff};
567static BYTE data76[] = {'R','I','F','F',0xff,0xff,0xff,0xff,'W','A','V','E'};
568static BYTE data77[] = {'R','I','F','F',0xff,0xff,0xff,0xff,'W','A','V',0xff,0xff};
569static BYTE data78[] = {'R','I','F','F',0xff,0xff,0xff,0xff,'<','h','t','m','l','>',0xff};
570static BYTE data79[] = {'%','!',0xff};
571static BYTE data80[] = {'%','!'};
572static BYTE data81[] = {'%','!','P','S','<','h','t','m','l','>'};
573static BYTE data82[] = {'.','s','n','d',0};
574static BYTE data83[] = {'.','s','n','d'};
575static BYTE data84[] = {'.','s','n','d',0,'<','h','t','m','l','>',1,1};
576static BYTE data85[] = {'.','S','N','D',0};
577static BYTE data86[] = {0x49,0x49,0x2a,0xff};
578static BYTE data87[] = {' ','<','h','e','a','d'};
579static BYTE data88[] = {' ','<','h','e','a','d','>'};
580static BYTE data89[] = {'\t','\r','<','h','e','a','d','>'};
581static BYTE data90[] = {'<','H','e','A','d',' '};
582static BYTE data91[] = {'<','?','x','m','l',' ',0};
583static BYTE data92[] = {'a','b','c','<','?','x','m','l',' ',' '};
584static BYTE data93[] = {'<','?','x','m','l',' ',' ','<','h','t','m','l','>'};
585static BYTE data94[] = {'<','h','t','m','l','>','<','?','x','m','l',' ',' '};
586static BYTE data95[] = {'{','\\','r','t','f','<','?','x','m','l',' ',' '};
587static BYTE data96[] = {'<','?','x','m','l',' '};
588static BYTE data97[] = "<body";
589static BYTE data98[] = "blah<BoDyblahblah";
590
591static const struct {
594 const WCHAR *mime;
596 const WCHAR *broken_mime;
597 const WCHAR *url;
599} mime_tests2[] = {
600 {data1, sizeof(data1), L"text/plain"},
601 {data2, sizeof(data2), L"application/octet-stream", L"image/pjpeg"},
602 {data3, sizeof(data3), L"application/octet-stream", L"image/pjpeg"},
603 {data4, sizeof(data4), L"application/octet-stream", L"image/pjpeg"},
604 {data5, sizeof(data5), L"text/plain"},
605 {data6, sizeof(data6), L"text/plain"},
606 {data7, sizeof(data7), L"text/html", L"text/plain"},
607 {data8, sizeof(data8), L"text/html", L"text/plain"},
608 {data9, sizeof(data9), L"text/html", L"image/pjpeg"},
609 {data10, sizeof(data10), L"text/html", L"text/plain"},
610 {data11, sizeof(data11), L"text/html", L"text/plain"},
611 {data12, sizeof(data12), L"text/html", L"text/plain"},
612 {data13, sizeof(data13), L"text/plain"},
613 {data14, sizeof(data14), L"text/plain"},
614 {data15, sizeof(data15), L"text/plain"},
615 {data16, sizeof(data16), L"image/pjpeg"},
616 {data17, sizeof(data17), L"application/octet-stream", L"image/pjpeg"},
617 {data18, sizeof(data18), L"text/html", L"image/pjpeg"},
618 {data19, sizeof(data19), L"image/gif"},
619 {data20, sizeof(data20), L"image/gif"},
620 {data21, sizeof(data21), L"text/plain"},
621 {data22, sizeof(data22), L"image/gif"},
622 {data23, sizeof(data23), L"text/plain"},
623 {data24, sizeof(data24), L"image/gif"},
624 {data25, sizeof(data25), L"image/gif"},
625 {data26, sizeof(data26), L"text/html", L"image/gif"},
626 {data27, sizeof(data27), L"text/plain"},
627 {data28, sizeof(data28), L"image/bmp"},
628 {data29, sizeof(data29), L"image/bmp"},
629 {data30, sizeof(data30), L"application/octet-stream", L"image/pjpeg"},
630 {data31, sizeof(data31), L"text/html", L"image/bmp"},
631 {data32, sizeof(data32), L"application/octet-stream", L"image/pjpeg"},
632 {data33, sizeof(data33), L"application/octet-stream", L"image/pjpeg"},
633 {data34, sizeof(data34), L"image/x-png"},
634 {data35, sizeof(data35), L"image/x-png"},
635 {data36, sizeof(data36), L"application/octet-stream", L"image/pjpeg"},
636 {data37, sizeof(data37), L"text/html", L"image/x-png"},
637 {data38, sizeof(data38), L"application/octet-stream", L"image/pjpeg"},
638 {data39, sizeof(data39), L"image/tiff"},
639 {data40, sizeof(data40), L"text/html", L"image/tiff"},
640 {data41, sizeof(data41), L"text/plain", NULL, L"image/tiff"},
641 {data42, sizeof(data42), L"text/plain"},
642 {data43, sizeof(data43), L"application/octet-stream", L"image/pjpeg"},
643 {data44, sizeof(data44), L"video/avi"},
644 {data45, sizeof(data45), L"text/plain"},
645 {data46, sizeof(data46), L"text/plain"},
646 {data47, sizeof(data47), L"text/plain"},
647 {data48, sizeof(data48), L"text/html", L"video/avi"},
648 {data49, sizeof(data49), L"video/avi"},
649 {data50, sizeof(data50), L"video/mpeg"},
650 {data51, sizeof(data51), L"video/mpeg"},
651 {data52, sizeof(data52), L"application/octet-stream", L"image/pjpeg"},
652 {data53, sizeof(data53), L"application/octet-stream", L"image/pjpeg", L"image/x-icon"},
653 {data54, sizeof(data54), L"text/html", L"video/mpeg"},
654 {data55, sizeof(data55), L"application/x-gzip-compressed"},
655 {data56, sizeof(data56), L"text/plain"},
656 {data57, sizeof(data57), L"text/html", L"application/x-gzip-compressed"},
657 {data58, sizeof(data58), L"application/octet-stream", L"image/pjpeg"},
658 {data59, sizeof(data59), L"application/x-zip-compressed"},
659 {data60, sizeof(data60), L"text/plain"},
660 {data61, sizeof(data61), L"text/html", L"application/x-zip-compressed"},
661 {data62, sizeof(data62), L"application/java"},
662 {data63, sizeof(data63), L"text/plain"},
663 {data64, sizeof(data64), L"text/html", L"application/java"},
664 {data65, sizeof(data65), L"application/pdf"},
665 {data66, sizeof(data66), L"text/plain"},
666 {data67, sizeof(data67), L"text/html", L"application/pdf"},
667 {data68, sizeof(data68), L"application/x-msdownload"},
668 {data69, sizeof(data69), L"text/plain"},
669 {data70, sizeof(data70), L"text/html", L"application/x-msdownload"},
670 {data71, sizeof(data71), L"text/richtext"},
671 {data72, sizeof(data72), L"text/plain"},
672 {data73, sizeof(data73), L"text/plain"},
673 {data74, sizeof(data74), L"text/html", L"text/richtext"},
674 {data75, sizeof(data75), L"audio/wav"},
675 {data76, sizeof(data76), L"text/plain"},
676 {data77, sizeof(data77), L"text/plain"},
677 {data78, sizeof(data78), L"text/html", L"text/plain"},
678 {data79, sizeof(data79), L"application/postscript"},
679 {data80, sizeof(data80), L"text/plain"},
680 {data81, sizeof(data81), L"text/html", L"application/postscript"},
681 {data82, sizeof(data82), L"audio/basic"},
682 {data83, sizeof(data83), L"text/plain"},
683 {data84, sizeof(data84), L"text/html", L"audio/basic"},
684 {data85, sizeof(data85), L"text/plain"},
685 {data86, sizeof(data86), L"image/tiff", NULL, L"text/plain"},
686 {data87, sizeof(data87), L"text/plain"},
687 {data88, sizeof(data88), L"text/html", L"text/plain"},
688 {data89, sizeof(data89), L"text/html", L"text/plain"},
689 {data90, sizeof(data90), L"text/html", L"text/plain"},
690 {data91, sizeof(data91), L"text/xml", L"text/plain"},
691 {data92, sizeof(data92), L"text/xml", L"text/plain"},
692 {data93, sizeof(data93), L"text/xml", L"text/plain"},
693 {data94, sizeof(data94), L"text/html", L"text/plain"},
694 {data95, sizeof(data95), L"text/xml", L"text/richtext"},
695 {data96, sizeof(data96), L"text/plain"},
696 {data97, sizeof(data97), L"text/html", L"text/plain"},
697 {data98, sizeof(data98), L"text/html", L"text/plain"},
698 {data1, sizeof(data1), L"text/plain", NULL, NULL, L"res://mshtml.dll/blank.htm"},
699 {NULL, 0, L"text/html", NULL, NULL, L"res://mshtml.dll/blank.htm"},
700 {data1, sizeof(data1), L"text/plain", NULL, NULL, L"res://mshtml.dll/blank.htm", L"application/octet-stream"},
701 {data1, sizeof(data1), L"text/plain", NULL, NULL, L"file:some%20file%2ejpg", L"application/octet-stream"},
702 {NULL, sizeof(data1), L"text/html", NULL, NULL, L"res://mshtml.dll/blank.htm"},
703 {data1, sizeof(data1), L"text/css", NULL, NULL, L"http://www.winehq.org/test.css"},
704 {data2, sizeof(data2), L"text/css", NULL, NULL, L"http://www.winehq.org/test.css"},
705 {data10, sizeof(data10), L"text/html", NULL, NULL, L"http://www.winehq.org/test.css"},
706 {data1, sizeof(data1), L"text/css", NULL, NULL, L"http://www.winehq.org/test.css", L"text/plain"},
707 {data1, sizeof(data1), L"text/css", NULL, NULL, L"http://www.winehq.org/test.css", L"application/octet-stream"},
708 {data1, sizeof(data1), L"text/test", NULL, NULL, L"http://www.winehq.org/test.css", L"text/test"}
710
711static void test_FindMimeFromData(void)
712{
713 WCHAR *mime;
715 BYTE b;
716 int i;
717
718 static const WCHAR app_octet_streamW[] =
719 {'a','p','p','l','i','c','a','t','i','o','n','/','o','c','t','e','t','-','s','t','r','e','a','m',0};
720 static const WCHAR image_pjpegW[] = {'i','m','a','g','e','/','p','j','p','e','g',0};
721 static const WCHAR text_htmlW[] = {'t','e','x','t','/','h','t','m','l',0};
722 static const WCHAR text_plainW[] = {'t','e','x','t','/','p','l','a','i','n',0};
723
724 for(i = 0; i < ARRAY_SIZE(mime_tests); i++) {
725 mime = (LPWSTR)0xf0f0f0f0;
726 hres = pFindMimeFromData(NULL, mime_tests[i].url, NULL, 0, NULL, 0, &mime, 0);
727 if(mime_tests[i].mime) {
728 ok(hres == S_OK || broken(mime_tests[i].broken_failure), "[%d] FindMimeFromData failed: %08lx\n", i, hres);
729 if(hres == S_OK) {
732 "[%d] wrong mime: %s\n", i, wine_dbgstr_w(mime));
734 }
735 }else {
736 ok(hres == E_FAIL || hres == mime_tests[i].hres,
737 "[%d] FindMimeFromData failed: %08lx, expected %08lx\n",
738 i, hres, mime_tests[i].hres);
739 ok(mime == (LPWSTR)0xf0f0f0f0, "[%d] mime != 0xf0f0f0f0\n", i);
740 }
741
742 mime = (LPWSTR)0xf0f0f0f0;
743 hres = pFindMimeFromData(NULL, mime_tests[i].url, NULL, 0, text_plainW, 0, &mime, 0);
744 ok(hres == S_OK, "[%d] FindMimeFromData failed: %08lx\n", i, hres);
745 ok(!lstrcmpW(mime, L"text/plain"), "[%d] wrong mime: %s\n", i, wine_dbgstr_w(mime));
747
748 mime = (LPWSTR)0xf0f0f0f0;
749 hres = pFindMimeFromData(NULL, mime_tests[i].url, NULL, 0, app_octet_streamW, 0, &mime, 0);
750 ok(hres == S_OK, "[%d] FindMimeFromData failed: %08lx\n", i, hres);
751 ok(!lstrcmpW(mime, L"application/octet-stream"), "[%d] wrong mime: %s\n", i, wine_dbgstr_w(mime));
753 }
754
755 for(i = 0; i < ARRAY_SIZE(mime_tests2); i++) {
756 hres = pFindMimeFromData(NULL, mime_tests2[i].url, mime_tests2[i].data, mime_tests2[i].size,
758 ok(hres == S_OK, "[%d] FindMimeFromData failed: %08lx\n", i, hres);
761 "[%d] wrong mime: %s\n", i, wine_dbgstr_w(mime));
764 continue;
765
766 hres = pFindMimeFromData(NULL, NULL, mime_tests2[i].data, mime_tests2[i].size,
767 app_octet_streamW, 0, &mime, 0);
768 ok(hres == S_OK, "[%d] FindMimeFromData failed: %08lx\n", i, hres);
771 "[%d] wrong mime: %s\n", i, wine_dbgstr_w(mime));
773
774 hres = pFindMimeFromData(NULL, NULL, mime_tests2[i].data, mime_tests2[i].size,
775 text_plainW, 0, &mime, 0);
776 ok(hres == S_OK, "[%d] FindMimeFromData failed: %08lx\n", i, hres);
779 "[%d] wrong mime: %s\n", i, wine_dbgstr_w(mime));
781
782 hres = pFindMimeFromData(NULL, NULL, mime_tests2[i].data, mime_tests2[i].size,
783 text_htmlW, 0, &mime, 0);
784 ok(hres == S_OK, "[%d] FindMimeFromData failed: %08lx\n", i, hres);
785 if(!lstrcmpW(L"application/octet-stream", mime_tests2[i].mime)
786 || !lstrcmpW(L"text/plain", mime_tests2[i].mime) || i==92)
787 ok(!lstrcmpW(mime, L"text/html"), "[%d] wrong mime: %s\n", i, wine_dbgstr_w(mime));
788 else
789 ok(!lstrcmpW(mime, mime_tests2[i].mime), "[%d] wrong mime: %s\n", i, wine_dbgstr_w(mime));
791
792 hres = pFindMimeFromData(NULL, NULL, mime_tests2[i].data, mime_tests2[i].size,
793 image_pjpegW, 0, &mime, 0);
794 ok(hres == S_OK, "[%d] FindMimeFromData failed: %08lx\n", i, hres);
797 "[%d] wrong mime, got %s\n", i, wine_dbgstr_w(mime));
799 }
800
801 hres = pFindMimeFromData(NULL, NULL, NULL, 0, NULL, 0, &mime, 0);
802 ok(hres == E_INVALIDARG, "FindMimeFromData failed: %08lx, expected E_INVALIDARG\n", hres);
803
804 hres = pFindMimeFromData(NULL, NULL, NULL, 0, text_plainW, 0, &mime, 0);
805 ok(hres == E_INVALIDARG, "FindMimeFromData failed: %08lx, expected E_INVALIDARG\n", hres);
806
807 hres = pFindMimeFromData(NULL, NULL, data1, 0, NULL, 0, &mime, 0);
808 ok(hres == E_FAIL, "FindMimeFromData failed: %08lx, expected E_FAIL\n", hres);
809
810 hres = pFindMimeFromData(NULL, url1, data1, 0, NULL, 0, &mime, 0);
811 ok(hres == E_FAIL, "FindMimeFromData failed: %08lx, expected E_FAIL\n", hres);
812
813 hres = pFindMimeFromData(NULL, NULL, data1, 0, text_plainW, 0, &mime, 0);
814 ok(hres == S_OK, "FindMimeFromData failed: %08lx\n", hres);
815 ok(!lstrcmpW(mime, L"text/plain"), "wrong mime: %s\n", wine_dbgstr_w(mime));
817
818 hres = pFindMimeFromData(NULL, NULL, data1, 0, text_plainW, 0, NULL, 0);
819 ok(hres == E_INVALIDARG, "FindMimeFromData failed: %08lx, expected E_INVALIDARG\n", hres);
820}
821
822static void register_protocols(void)
823{
827
828 static const WCHAR wszAbout[] = {'a','b','o','u','t',0};
829
830 hres = pCoInternetGetSession(0, &session, 0);
831 ok(hres == S_OK, "CoInternetGetSession failed: %08lx\n", hres);
832 if(FAILED(hres))
833 return;
834
835 hres = CoGetClassObject(&CLSID_AboutProtocol, CLSCTX_INPROC_SERVER, NULL,
836 &IID_IClassFactory, (void**)&factory);
837 ok(hres == S_OK, "Could not get AboutProtocol factory: %08lx\n", hres);
838 if(FAILED(hres))
839 return;
840
841 IInternetSession_RegisterNameSpace(session, factory, &CLSID_AboutProtocol,
842 wszAbout, 0, NULL, 0);
843 IClassFactory_Release(factory);
844
845 IInternetSession_Release(session);
846}
847
849 REFIID riid, void **ppv)
850{
851 ok(0, "unexpected call\n");
852 return E_NOINTERFACE;
853}
854
856{
857 return 2;
858}
859
861{
862 return 1;
863}
864
866 PARSEACTION ParseAction, DWORD dwParseFlags, LPWSTR pwzResult, DWORD cchResult,
867 DWORD *pcchResult, DWORD dwReserved)
868{
869 switch(ParseAction) {
870 case PARSE_SECURITY_URL:
871 CHECK_EXPECT2(ParseUrl);
872 if(pcchResult)
873 *pcchResult = ARRAY_SIZE(url1);
874
875 if(cchResult < ARRAY_SIZE(url1))
876 return S_FALSE;
877
878 memcpy(pwzResult, url1, sizeof(url1));
879 return S_OK;
880 case PARSE_ENCODE:
881 CHECK_EXPECT2(ParseUrl_ENCODE);
882 break;
883
884 case PARSE_UNESCAPE:
885 CHECK_EXPECT2(ParseUrl_UNESCAPE);
886 break;
887
888 default:
889 CHECK_EXPECT2(ParseUrl);
890 break;
891 }
892
893 return E_NOTIMPL;
894}
895
897 LPCWSTR pwzBaseUrl, LPCWSTR pwzRelativeUrl, DWORD dwCombineFlags,
898 LPWSTR pwzResult, DWORD cchResult, DWORD *pcchResult, DWORD dwReserved)
899{
900 ok(0, "unexpected call\n");
901 return E_NOTIMPL;
902}
903
905 LPCWSTR pwzUrl1, LPCWSTR pwzUrl2, DWORD dwCompareFlags)
906{
907 ok(0, "unexpected call\n");
908 return E_NOTIMPL;
909}
910
912 LPCWSTR pwzUrl, QUERYOPTION OueryOption, DWORD dwQueryFlags, LPVOID pBuffer,
913 DWORD cbBuffer, DWORD *pcbBuf, DWORD dwReserved)
914{
915 ok(0, "unexpected call\n");
916 return E_NOTIMPL;
917}
918
919static const IInternetProtocolInfoVtbl InternetProtocolInfoVtbl = {
927};
928
930
933
935{
936 if(IsEqualGUID(&IID_IInternetProtocolInfo, riid)) {
937 CHECK_EXPECT2(QI_IInternetProtocolInfo);
938 ok(iface == expect_cf, "unexpected iface\n");
939 *ppv = &protocol_info;
940 return qiret;
941 }
942
943 ok(0, "unexpected call\n");
944 return E_NOINTERFACE;
945}
946
948{
949 return 2;
950}
951
953{
954 return 1;
955}
956
958 REFIID riid, void **ppv)
959{
960 ok(0, "unexpected call\n");
961 return E_NOTIMPL;
962}
963
965 REFIID riid, void **ppv)
966{
968
969 ok(iface == expect_cf, "unexpected iface\n");
970 ok(pOuter == NULL, "pOuter = %p\n", pOuter);
971 ok(IsEqualGUID(&IID_IInternetProtocolInfo, riid), "unexpected riid\n");
972 ok(ppv != NULL, "ppv == NULL\n");
973
974 *ppv = &protocol_info;
975 return S_OK;
976}
977
979{
980 ok(0, "unexpected call\n");
981 return S_OK;
982}
983
984static const IClassFactoryVtbl ClassFactoryVtbl = {
990};
991
992static const IClassFactoryVtbl ProtocolCFVtbl = {
998};
999
1003
1004static void test_NameSpace(void)
1005{
1007 WCHAR buf[200];
1008 LPWSTR sec_url;
1009 DWORD size;
1010 HRESULT hres;
1011
1012 static const WCHAR wszTest[] = {'t','e','s','t',0};
1013
1014 hres = pCoInternetGetSession(0, &session, 0);
1015 ok(hres == S_OK, "CoInternetGetSession failed: %08lx\n", hres);
1016 if(FAILED(hres))
1017 return;
1018
1019 hres = IInternetSession_RegisterNameSpace(session, NULL, &IID_NULL,
1020 wszTest, 0, NULL, 0);
1021 ok(hres == E_INVALIDARG, "RegisterNameSpace failed: %08lx\n", hres);
1022
1023 hres = IInternetSession_RegisterNameSpace(session, &test_protocol_cf, &IID_NULL,
1024 NULL, 0, NULL, 0);
1025 ok(hres == E_INVALIDARG, "RegisterNameSpace failed: %08lx\n", hres);
1026
1027 hres = IInternetSession_RegisterNameSpace(session, &test_protocol_cf, &IID_NULL,
1028 wszTest, 0, NULL, 0);
1029 ok(hres == S_OK, "RegisterNameSpace failed: %08lx\n", hres);
1030
1033 SET_EXPECT(QI_IInternetProtocolInfo);
1035 SET_EXPECT(ParseUrl_ENCODE);
1036
1037 hres = pCoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, ARRAY_SIZE(buf), &size, 0);
1038 ok(hres == S_OK, "CoInternetParseUrl failed: %08lx\n", hres);
1039
1040 CHECK_CALLED(QI_IInternetProtocolInfo);
1042 CHECK_CALLED(ParseUrl_ENCODE);
1043
1044 qiret = S_OK;
1045 SET_EXPECT(QI_IInternetProtocolInfo);
1046 SET_EXPECT(ParseUrl_ENCODE);
1047
1048 hres = pCoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, ARRAY_SIZE(buf), &size, 0);
1049 ok(hres == S_OK, "CoInternetParseUrl failed: %08lx\n", hres);
1050
1051 CHECK_CALLED(QI_IInternetProtocolInfo);
1052 CHECK_CALLED(ParseUrl_ENCODE);
1053
1054 qiret = S_OK;
1055 SET_EXPECT(QI_IInternetProtocolInfo);
1056 SET_EXPECT(ParseUrl_UNESCAPE);
1057
1058 hres = pCoInternetParseUrl(url8, PARSE_UNESCAPE, 0, buf, ARRAY_SIZE(buf), &size, 0);
1059 ok(hres == S_OK, "CoInternetParseUrl failed: %08lx\n", hres);
1060
1061 CHECK_CALLED(QI_IInternetProtocolInfo);
1062 CHECK_CALLED(ParseUrl_UNESCAPE);
1063
1064 SET_EXPECT(QI_IInternetProtocolInfo);
1065 SET_EXPECT(ParseUrl);
1066
1067 hres = pCoInternetParseUrl(url8, PARSE_SECURITY_URL, 0, buf, ARRAY_SIZE(buf), &size, 0);
1068 ok(hres == S_OK, "CoInternetParseUrl failed: %08lx\n", hres);
1069 ok(size == ARRAY_SIZE(url1), "Size = %ld\n", size);
1070 if(size == ARRAY_SIZE(url1))
1071 ok(!memcmp(buf, url1, sizeof(url1)), "Encoded url = %s\n", wine_dbgstr_w(buf));
1072
1073 CHECK_CALLED(QI_IInternetProtocolInfo);
1074 CHECK_CALLED(ParseUrl);
1075
1076 SET_EXPECT(QI_IInternetProtocolInfo);
1077 SET_EXPECT(ParseUrl);
1078
1079 if (pCoInternetGetSecurityUrl) {
1080 hres = pCoInternetGetSecurityUrl(url8, &sec_url, PSU_SECURITY_URL_ONLY, 0);
1081 ok(hres == S_OK, "CoInternetGetSecurityUrl failed: %08lx\n", hres);
1082 if(hres == S_OK) {
1083 ok(lstrlenW(sec_url) > ARRAY_SIZE(wszFile) &&
1084 !memcmp(sec_url, wszFile, sizeof(wszFile)-sizeof(WCHAR)),
1085 "Encoded url = %s\n", wine_dbgstr_w(sec_url));
1086 CoTaskMemFree(sec_url);
1087 }
1088
1089 CHECK_CALLED(QI_IInternetProtocolInfo);
1090 CHECK_CALLED(ParseUrl);
1091 }
1092
1093 hres = IInternetSession_UnregisterNameSpace(session, &test_protocol_cf, wszTest);
1094 ok(hres == S_OK, "UnregisterNameSpace failed: %08lx\n", hres);
1095
1096 hres = pCoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, ARRAY_SIZE(buf), &size, 0);
1097 ok(hres == S_OK, "CoInternetParseUrl failed: %08lx\n", hres);
1098
1099 hres = IInternetSession_RegisterNameSpace(session, &test_protocol_cf2, &IID_NULL,
1100 wszTest, 0, NULL, 0);
1101 ok(hres == S_OK, "RegisterNameSpace failed: %08lx\n", hres);
1102
1103 hres = IInternetSession_RegisterNameSpace(session, &test_protocol_cf, &IID_NULL,
1104 wszTest, 0, NULL, 0);
1105 ok(hres == S_OK, "RegisterNameSpace failed: %08lx\n", hres);
1106
1107 hres = IInternetSession_RegisterNameSpace(session, &test_protocol_cf, &IID_NULL,
1108 wszTest, 0, NULL, 0);
1109 ok(hres == S_OK, "RegisterNameSpace failed: %08lx\n", hres);
1110
1111 SET_EXPECT(QI_IInternetProtocolInfo);
1112 SET_EXPECT(ParseUrl_ENCODE);
1113
1114 hres = pCoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, ARRAY_SIZE(buf), &size, 0);
1115 ok(hres == S_OK, "CoInternetParseUrl failed: %08lx\n", hres);
1116
1117 CHECK_CALLED(QI_IInternetProtocolInfo);
1118 CHECK_CALLED(ParseUrl_ENCODE);
1119
1120 hres = IInternetSession_UnregisterNameSpace(session, &test_protocol_cf, wszTest);
1121 ok(hres == S_OK, "UnregisterNameSpace failed: %08lx\n", hres);
1122
1123 SET_EXPECT(QI_IInternetProtocolInfo);
1124 SET_EXPECT(ParseUrl_ENCODE);
1125
1126 hres = pCoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, ARRAY_SIZE(buf), &size, 0);
1127 ok(hres == S_OK, "CoInternetParseUrl failed: %08lx\n", hres);
1128
1129 CHECK_CALLED(QI_IInternetProtocolInfo);
1130 CHECK_CALLED(ParseUrl_ENCODE);
1131
1132 hres = IInternetSession_UnregisterNameSpace(session, &test_protocol_cf, wszTest);
1133 ok(hres == S_OK, "UnregisterNameSpace failed: %08lx\n", hres);
1134
1136 SET_EXPECT(QI_IInternetProtocolInfo);
1137 SET_EXPECT(ParseUrl_ENCODE);
1138
1139 hres = pCoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, ARRAY_SIZE(buf), &size, 0);
1140 ok(hres == S_OK, "CoInternetParseUrl failed: %08lx\n", hres);
1141
1142 CHECK_CALLED(QI_IInternetProtocolInfo);
1143 CHECK_CALLED(ParseUrl_ENCODE);
1144
1145 hres = IInternetSession_UnregisterNameSpace(session, &test_protocol_cf, wszTest);
1146 ok(hres == S_OK, "UnregisterNameSpace failed: %08lx\n", hres);
1147 hres = IInternetSession_UnregisterNameSpace(session, &test_protocol_cf, wszTest);
1148 ok(hres == S_OK, "UnregisterNameSpace failed: %08lx\n", hres);
1149 hres = IInternetSession_UnregisterNameSpace(session, &test_protocol_cf, NULL);
1150 ok(hres == E_INVALIDARG, "UnregisterNameSpace failed: %08lx\n", hres);
1151 hres = IInternetSession_UnregisterNameSpace(session, NULL, wszTest);
1152 ok(hres == E_INVALIDARG, "UnregisterNameSpace failed: %08lx\n", hres);
1153
1154 hres = IInternetSession_UnregisterNameSpace(session, &test_protocol_cf2, wszTest);
1155 ok(hres == S_OK, "UnregisterNameSpace failed: %08lx\n", hres);
1156
1157 hres = pCoInternetParseUrl(url8, PARSE_ENCODE, 0, buf, ARRAY_SIZE(buf), &size, 0);
1158 ok(hres == S_OK, "CoInternetParseUrl failed: %08lx\n", hres);
1159
1160 IInternetSession_Release(session);
1161}
1162
1163static void test_MimeFilter(void)
1164{
1166 HRESULT hres;
1167
1168 static const WCHAR mimeW[] = {'t','e','s','t','/','m','i','m','e',0};
1169
1170 hres = pCoInternetGetSession(0, &session, 0);
1171 ok(hres == S_OK, "CoInternetGetSession failed: %08lx\n", hres);
1172 if(FAILED(hres))
1173 return;
1174
1175 hres = IInternetSession_RegisterMimeFilter(session, &test_cf, &IID_NULL, mimeW);
1176 ok(hres == S_OK, "RegisterMimeFilter failed: %08lx\n", hres);
1177
1178 hres = IInternetSession_UnregisterMimeFilter(session, &test_cf, mimeW);
1179 ok(hres == S_OK, "UnregisterMimeFilter failed: %08lx\n", hres);
1180
1181 hres = IInternetSession_UnregisterMimeFilter(session, &test_cf, mimeW);
1182 ok(hres == S_OK, "UnregisterMimeFilter failed: %08lx\n", hres);
1183
1184 hres = IInternetSession_UnregisterMimeFilter(session, (void*)0xdeadbeef, mimeW);
1185 ok(hres == S_OK, "UnregisterMimeFilter failed: %08lx\n", hres);
1186
1187 IInternetSession_Release(session);
1188}
1189
1191{
1193 return 0;
1194}
1195
1196static const IUnknownVtbl unk_vtbl = {
1197 (void*)0xdeadbeef,
1198 (void*)0xdeadbeef,
1200};
1201
1202static void test_ReleaseBindInfo(void)
1203{
1204 BINDINFO bi;
1205 IUnknown unk = { &unk_vtbl };
1206
1207 pReleaseBindInfo(NULL); /* shouldn't crash */
1208
1209 memset(&bi, 0, sizeof(bi));
1210 bi.cbSize = sizeof(BINDINFO);
1211 bi.pUnk = &unk;
1213 pReleaseBindInfo(&bi);
1214 ok(bi.cbSize == sizeof(BINDINFO), "bi.cbSize=%ld\n", bi.cbSize);
1215 ok(bi.pUnk == NULL, "bi.pUnk=%p, expected NULL\n", bi.pUnk);
1217
1218 memset(&bi, 0, sizeof(bi));
1219 bi.cbSize = offsetof(BINDINFO, pUnk);
1220 bi.pUnk = &unk;
1221 pReleaseBindInfo(&bi);
1222 ok(bi.cbSize == offsetof(BINDINFO, pUnk), "bi.cbSize=%ld\n", bi.cbSize);
1223 ok(bi.pUnk == &unk, "bi.pUnk=%p, expected %p\n", bi.pUnk, &unk);
1224
1225 memset(&bi, 0, sizeof(bi));
1226 bi.pUnk = &unk;
1227 pReleaseBindInfo(&bi);
1228 ok(!bi.cbSize, "bi.cbSize=%ld, expected 0\n", bi.cbSize);
1229 ok(bi.pUnk == &unk, "bi.pUnk=%p, expected %p\n", bi.pUnk, &unk);
1230}
1231
1232static void test_CopyStgMedium(void)
1233{
1234 STGMEDIUM src, dst;
1235 HGLOBAL empty, hg;
1236 char *ptr1, *ptr2;
1237 HRESULT hres;
1238 int size;
1239
1240 static WCHAR fileW[] = {'f','i','l','e',0};
1241
1242 memset(&src, 0xf0, sizeof(src));
1243 memset(&dst, 0xe0, sizeof(dst));
1244 memset(&empty, 0xf0, sizeof(empty));
1245 src.tymed = TYMED_NULL;
1246 src.pUnkForRelease = NULL;
1247 hres = pCopyStgMedium(&src, &dst);
1248 ok(hres == S_OK, "CopyStgMedium failed: %08lx\n", hres);
1249 ok(dst.tymed == TYMED_NULL, "tymed=%ld\n", dst.tymed);
1250 ok(dst.hGlobal == empty, "u=%p\n", dst.hGlobal);
1251 ok(!dst.pUnkForRelease, "pUnkForRelease=%p, expected NULL\n", dst.pUnkForRelease);
1252
1253 memset(&dst, 0xe0, sizeof(dst));
1254 src.tymed = TYMED_ISTREAM;
1255 src.pstm = NULL;
1256 src.pUnkForRelease = NULL;
1257 hres = pCopyStgMedium(&src, &dst);
1258 ok(hres == S_OK, "CopyStgMedium failed: %08lx\n", hres);
1259 ok(dst.tymed == TYMED_ISTREAM, "tymed=%ld\n", dst.tymed);
1260 ok(!dst.pstm, "pstm=%p\n", dst.pstm);
1261 ok(!dst.pUnkForRelease, "pUnkForRelease=%p, expected NULL\n", dst.pUnkForRelease);
1262
1263 memset(&dst, 0xe0, sizeof(dst));
1264 src.tymed = TYMED_FILE;
1265 src.lpszFileName = fileW;
1266 src.pUnkForRelease = NULL;
1267 hres = pCopyStgMedium(&src, &dst);
1268 ok(hres == S_OK, "CopyStgMedium failed: %08lx\n", hres);
1269 ok(dst.tymed == TYMED_FILE, "tymed=%ld\n", dst.tymed);
1270 ok(dst.lpszFileName && dst.lpszFileName != fileW, "lpszFileName=%p\n", dst.lpszFileName);
1271 ok(!lstrcmpW(dst.lpszFileName, fileW), "wrong file name\n");
1272 ok(!dst.pUnkForRelease, "pUnkForRelease=%p, expected NULL\n", dst.pUnkForRelease);
1274
1275 /* TYMED_HGLOBAL */
1277 ptr1 = GlobalLock(hg);
1278 memset(ptr1, 0xfa, 10);
1279 memset(&dst, 0xe0, sizeof(dst));
1280 src.tymed = TYMED_HGLOBAL;
1281 src.hGlobal = hg;
1282 hres = pCopyStgMedium(&src, &dst);
1283 ok(hres == S_OK, "CopyStgMedium failed: %08lx\n", hres);
1284 ok(dst.tymed == TYMED_HGLOBAL, "tymed=%ld\n", dst.tymed);
1285 ok(dst.hGlobal != hg, "got %p, %p\n", dst.hGlobal, hg);
1286 size = GlobalSize(dst.hGlobal);
1287 ok(size == 10, "got size %d\n", size);
1288 /* compare contents */
1289 ptr2 = GlobalLock(dst.hGlobal);
1290 ok(!memcmp(ptr1, ptr2, 10), "got wrong data\n");
1291 GlobalUnlock(ptr2);
1292 GlobalUnlock(ptr1);
1293 ok(GlobalFlags(dst.hGlobal) == 0, "got 0x%08x\n", GlobalFlags(dst.hGlobal));
1294 GlobalFree(hg);
1296
1297 memset(&dst, 0xe0, sizeof(dst));
1298 src.tymed = TYMED_HGLOBAL;
1299 src.hGlobal = NULL;
1300 hres = pCopyStgMedium(&src, &dst);
1301 ok(hres == S_OK, "CopyStgMedium failed: %08lx\n", hres);
1302 ok(dst.hGlobal == NULL, "got %p\n", dst.hGlobal);
1303
1304 hres = pCopyStgMedium(&src, NULL);
1305 ok(hres == E_POINTER, "CopyStgMedium failed: %08lx, expected E_POINTER\n", hres);
1306 hres = pCopyStgMedium(NULL, &dst);
1307 ok(hres == E_POINTER, "CopyStgMedium failed: %08lx, expected E_POINTER\n", hres);
1308}
1309
1310static void test_CopyBindInfo(void)
1311{
1312 BINDINFO src[2], dest[2];
1313 SECURITY_DESCRIPTOR sec_desc;
1314 HRESULT hres;
1315 int i;
1316
1317 hres = pCopyBindInfo(NULL, NULL);
1318 ok(hres == E_POINTER, "CopyBindInfo returned %08lx, expected E_POINTER\n", hres);
1319
1320 memset(src, 0, sizeof(BINDINFO[2]));
1321 memset(dest, 0xde, sizeof(BINDINFO[2]));
1322 hres = pCopyBindInfo(src, dest);
1323 ok(hres == E_INVALIDARG, "CopyBindInfo returned: %08lx, expected E_INVALIDARG\n", hres);
1324
1325 memset(src, 0, sizeof(BINDINFO[2]));
1326 memset(dest, 0xde, sizeof(BINDINFO[2]));
1327 src[0].cbSize = sizeof(BINDINFO);
1328 dest[0].cbSize = 0;
1329 hres = pCopyBindInfo(src, dest);
1330 ok(hres == E_INVALIDARG, "CopyBindInfo returned: %08lx, expected E_INVALIDARG\n", hres);
1331
1332 memset(src, 0, sizeof(BINDINFO[2]));
1333 memset(dest, 0xde, sizeof(BINDINFO[2]));
1334 src[0].cbSize = 1;
1335 dest[0].cbSize = sizeof(BINDINFO)+sizeof(DWORD);
1336 hres = pCopyBindInfo(src, dest);
1337 ok(hres == S_OK, "CopyBindInfo failed: %08lx\n", hres);
1338 ok(dest[0].cbSize == sizeof(BINDINFO)+sizeof(DWORD), "incorrect cbSize: %ld\n", dest[0].cbSize);
1339 for(i=1; i<dest[0].cbSize/sizeof(int); i++)
1340 ok(((int*)dest)[i] == 0, "unset values should be set to 0, got %d on %d\n", ((int*)dest)[i], i);
1341
1342 memset(src, 0, sizeof(BINDINFO[2]));
1343 memset(dest, 0xde, sizeof(BINDINFO[2]));
1344 src[0].cbSize = sizeof(BINDINFO)+2*sizeof(DWORD);
1345 dest[0].cbSize = sizeof(BINDINFO)+sizeof(DWORD);
1346 hres = pCopyBindInfo(src, dest);
1347 ok(hres == S_OK, "CopyBindInfo failed: %08lx\n", hres);
1348 ok(dest[1].cbSize == src[1].cbSize, "additional data should be copied\n");
1349 ok(dest[1].szExtraInfo != src[1].szExtraInfo,
1350 "data not fitting in destination buffer should not be copied\n");
1351
1352 memset(src, 0xf0, sizeof(BINDINFO[2]));
1353 memset(dest, 0xde, sizeof(BINDINFO[2]));
1354 src[0].cbSize = sizeof(BINDINFO);
1355 src[0].szExtraInfo = CoTaskMemAlloc(sizeof(WCHAR));
1356 src[0].szExtraInfo[0] = 0;
1357 src[0].szCustomVerb = NULL;
1358 src[0].pUnk = NULL;
1359 src[0].stgmedData.tymed = TYMED_NULL;
1360 src[0].stgmedData.pUnkForRelease = NULL;
1361 dest[0].cbSize = sizeof(BINDINFO);
1362 hres = pCopyBindInfo(src, dest);
1363 ok(hres == S_OK, "CopyBindInfo failed: %08lx\n", hres);
1364
1365 ok(dest[0].cbSize == sizeof(BINDINFO), "incorrect cbSize: %ld\n", dest[0].cbSize);
1366 ok(dest[0].szExtraInfo && !dest[0].szExtraInfo[0] && dest[0].szExtraInfo!=src[0].szExtraInfo,
1367 "incorrect szExtraInfo: (%p!=%p) %d\n", dest[0].szExtraInfo,
1368 src[0].szExtraInfo, dest[0].szExtraInfo[0]);
1369 ok(!memcmp(&dest[0].stgmedData, &src[0].stgmedData, sizeof(STGMEDIUM)),
1370 "incorrect stgmedData value\n");
1371 ok(src[0].grfBindInfoF == dest[0].grfBindInfoF, "grfBindInfoF = %lx, expected %lx\n",
1372 dest[0].grfBindInfoF, src[0].grfBindInfoF);
1373 ok(src[0].dwBindVerb == dest[0].dwBindVerb, "dwBindVerb = %lx, expected %lx\n",
1374 dest[0].dwBindVerb, src[0].dwBindVerb);
1375 ok(!dest[0].szCustomVerb, "szCustmoVerb != NULL\n");
1376 ok(src[0].cbstgmedData == dest[0].cbstgmedData, "cbstgmedData = %lx, expected %lx\n",
1377 dest[0].cbstgmedData, src[0].cbstgmedData);
1378 ok(src[0].dwOptions == dest[0].dwOptions, "dwOptions = %lx, expected %lx\n",
1379 dest[0].dwOptions, src[0].dwOptions);
1380 ok(src[0].dwOptionsFlags == dest[0].dwOptionsFlags, "dwOptionsFlags = %lx, expected %lx\n",
1381 dest[0].dwOptionsFlags, src[0].dwOptionsFlags);
1382 ok(src[0].dwCodePage == dest[0].dwCodePage, "dwCodePage = %lx, expected %lx\n",
1383 dest[0].dwCodePage, src[0].dwCodePage);
1384 ok(!dest[0].securityAttributes.nLength,
1385 "unexpected securityAttributes.nLength value: %ld\n",
1386 dest[0].securityAttributes.nLength);
1387 ok(!dest[0].securityAttributes.lpSecurityDescriptor,
1388 "unexpected securityAttributes.lpSecurityDescriptor value: %p\n",
1389 dest[0].securityAttributes.lpSecurityDescriptor);
1390 ok(!dest[0].securityAttributes.bInheritHandle,
1391 "unexpected securityAttributes.bInheritHandle value: %d\n",
1392 dest[0].securityAttributes.bInheritHandle);
1393 ok(!memcmp(&dest[0].iid, &src[0].iid, sizeof(IID)),
1394 "incorrect iid value\n");
1395 ok(!dest[0].pUnk, "pUnk != NULL\n");
1396 ok(src[0].dwReserved == dest[0].dwReserved, "dwReserved = %lx, expected %lx\n",
1397 dest[0].dwReserved, src[0].dwReserved);
1398
1399 CoTaskMemFree(src[0].szExtraInfo);
1400 CoTaskMemFree(dest[0].szExtraInfo);
1401
1402 src[0].szExtraInfo = NULL;
1403 src[0].securityAttributes.nLength = sizeof(SECURITY_ATTRIBUTES);
1405 "InitializeSecurityDescriptor failed\n");
1406 src[0].securityAttributes.lpSecurityDescriptor = (void*)&sec_desc;
1407 src[0].securityAttributes.bInheritHandle = TRUE;
1408 hres = pCopyBindInfo(src, dest);
1409 ok(hres == S_OK, "CopyBindInfo failed: %08lx\n", hres);
1410 ok(!dest[0].securityAttributes.nLength,
1411 "unexpected securityAttributes.nLength value: %ld\n",
1412 dest[0].securityAttributes.nLength);
1413 ok(!dest[0].securityAttributes.lpSecurityDescriptor,
1414 "unexpected securityAttributes.lpSecurityDescriptor value: %p\n",
1415 dest[0].securityAttributes.lpSecurityDescriptor);
1416 ok(!dest[0].securityAttributes.bInheritHandle,
1417 "unexpected securityAttributes.bInheritHandle value: %d\n",
1418 dest[0].securityAttributes.bInheritHandle);
1419}
1420
1422{
1423 DWORD encoding, size;
1424 HRESULT hres;
1425
1426 size = encoding = 0xdeadbeef;
1427 hres = pUrlMkGetSessionOption(URLMON_OPTION_URL_ENCODING, &encoding,
1428 sizeof(encoding), &size, 0);
1429 ok(hres == S_OK, "UrlMkGetSessionOption failed: %08lx\n", hres);
1430 ok(encoding != 0xdeadbeef, "encoding not changed\n");
1431 ok(size == sizeof(encoding), "size=%ld\n", size);
1432
1433 size = encoding = 0xdeadbeef;
1434 hres = pUrlMkGetSessionOption(URLMON_OPTION_URL_ENCODING, &encoding,
1435 sizeof(encoding)+1, &size, 0);
1436 ok(hres == S_OK, "UrlMkGetSessionOption failed: %08lx\n", hres);
1437 ok(encoding != 0xdeadbeef, "encoding not changed\n");
1438 ok(size == sizeof(encoding), "size=%ld\n", size);
1439
1440 size = encoding = 0xdeadbeef;
1441 hres = pUrlMkGetSessionOption(URLMON_OPTION_URL_ENCODING, &encoding,
1442 sizeof(encoding)-1, &size, 0);
1443 ok(hres == E_INVALIDARG, "UrlMkGetSessionOption failed: %08lx\n", hres);
1444 ok(encoding == 0xdeadbeef, "encoding = %08lx, exepcted 0xdeadbeef\n", encoding);
1445 ok(size == 0xdeadbeef, "size=%ld\n", size);
1446
1447 size = encoding = 0xdeadbeef;
1448 hres = pUrlMkGetSessionOption(URLMON_OPTION_URL_ENCODING, NULL,
1449 sizeof(encoding)-1, &size, 0);
1450 ok(hres == E_INVALIDARG, "UrlMkGetSessionOption failed: %08lx\n", hres);
1451 ok(encoding == 0xdeadbeef, "encoding = %08lx, exepcted 0xdeadbeef\n", encoding);
1452 ok(size == 0xdeadbeef, "size=%ld\n", size);
1453
1454 encoding = 0xdeadbeef;
1455 hres = pUrlMkGetSessionOption(URLMON_OPTION_URL_ENCODING, &encoding,
1456 sizeof(encoding)-1, NULL, 0);
1457 ok(hres == E_INVALIDARG, "UrlMkGetSessionOption failed: %08lx\n", hres);
1458 ok(encoding == 0xdeadbeef, "encoding = %08lx, exepcted 0xdeadbeef\n", encoding);
1459}
1460
1461static size_t check_prefix(const char *str, const char *prefix)
1462{
1463 size_t len = strlen(prefix);
1464 if(memcmp(str, prefix, len)) {
1465 ok(0, "no %s prefix in %s\n", wine_dbgstr_a(prefix), wine_dbgstr_a(str));
1466 return 0;
1467 }
1468 return len;
1469}
1470
1471static void test_user_agent(void)
1472{
1473 static const CHAR expected[] = "Mozilla/4.0 (compatible; MSIE ";
1474 static char test_str[] = "test";
1475 static char test2_str[] = "test\0test";
1476 static CHAR str[3];
1477 OSVERSIONINFOW os_info = {sizeof(os_info)};
1478 char ua[1024], buf[64];
1479 unsigned int i;
1480 LPSTR str2 = NULL;
1481 BOOL is_wow = FALSE;
1482 HRESULT hres;
1483 DWORD size, saved;
1484
1485 hres = pObtainUserAgentString(0, NULL, NULL);
1486 ok(hres == E_INVALIDARG, "ObtainUserAgentString failed: %08lx\n", hres);
1487
1488 size = 100;
1489 hres = pObtainUserAgentString(0, NULL, &size);
1490 ok(hres == E_INVALIDARG, "ObtainUserAgentString failed: %08lx\n", hres);
1491 ok(size == 100, "size=%ld, expected %d\n", size, 100);
1492
1493 size = 0;
1494 hres = pObtainUserAgentString(0, str, &size);
1495 ok(hres == E_OUTOFMEMORY, "ObtainUserAgentString failed: %08lx\n", hres);
1496 ok(size > 0, "size=%ld, expected non-zero\n", size);
1497
1498 size = 2;
1499 str[0] = 'a';
1500 hres = pObtainUserAgentString(0, str, &size);
1501 ok(hres == E_OUTOFMEMORY, "ObtainUserAgentString failed: %08lx\n", hres);
1502 ok(size > 0, "size=%ld, expected non-zero\n", size);
1503 ok(str[0] == 'a', "str[0]=%c, expected 'a'\n", str[0]);
1504
1505 size = 0;
1506 hres = pObtainUserAgentString(1, str, &size);
1507 ok(hres == E_OUTOFMEMORY, "ObtainUserAgentString failed: %08lx\n", hres);
1508 ok(size > 0, "size=%ld, expected non-zero\n", size);
1509
1510 str2 = malloc(size + 20);
1511 saved = size;
1512 hres = pObtainUserAgentString(0, str2, &size);
1513 ok(hres == S_OK, "ObtainUserAgentString failed: %08lx\n", hres);
1514 ok(size == saved, "size=%ld, expected %ld\n", size, saved);
1515 ok(strlen(expected) <= strlen(str2) &&
1516 !memcmp(expected, str2, strlen(expected)*sizeof(CHAR)),
1517 "user agent was \"%s\", expected to start with \"%s\"\n",
1518 str2, expected);
1519
1520 GetVersionExW(&os_info);
1521 if (sizeof(void*) == 4) IsWow64Process(GetCurrentProcess(), &is_wow);
1522
1523 for(i = 1; i < 12; i++) {
1524 const char *p = ua;
1525
1526 if (i != 7) {
1527 size = sizeof(ua);
1528 hres = pObtainUserAgentString(i | UAS_EXACTLEGACY, ua, &size);
1529 ok(hres == S_OK, "ObtainUserAgentString failed: %08lx\n", hres);
1530 ok(size == strlen(ua) + 1, "unexpected size %lu, expected %Iu\n", size, strlen(ua) + 1);
1531 ok(!strcmp(ua, str2), "unexpected UA for version %u %s, expected %s\n",
1533 }
1534
1535 size = sizeof(ua);
1536 hres = pObtainUserAgentString(i != 1 ? i : UAS_EXACTLEGACY | 7, ua, &size);
1537 ok(hres == S_OK, "ObtainUserAgentString failed: %08lx\n", hres);
1538 ok(size == strlen(ua) + 1, "unexpected size %lu, expected %Iu\n", size, strlen(ua) + 1);
1539 if(i < 8 && i != 1)
1540 ok(!strcmp(ua, str2), "unexpected UA for version %u %s, expected %s\n",
1542 if (winetest_debug > 1)
1543 trace("version=%u user-agent=%s\n", i, wine_dbgstr_a(ua));
1544
1545 p += check_prefix(p, "Mozilla/");
1546 p += check_prefix(p, i < 9 ? "4.0 (" : "5.0 (");
1547 if(i < 11) {
1548 p += check_prefix(p, "compatible; ");
1549 sprintf(buf, "MSIE %u.0; ", max(i, 7));
1550 p += check_prefix(p, buf);
1551 }
1552 sprintf(buf, "Windows NT %lu.%lu; ", os_info.dwMajorVersion, os_info.dwMinorVersion);
1553 p += check_prefix(p, buf);
1554 if(is_wow) {
1555 p += check_prefix(p, "WOW64; ");
1556 }else if(sizeof(void*) == 8) {
1557 p += check_prefix(p, "Win64; ");
1558#ifdef __x86_64__
1559 todo_wine
1560 p += check_prefix(p, "x64; ");
1561#endif
1562 }
1563 if(i != 1) {
1564 p += check_prefix(p, "Trident/");
1565 ok('5' <= *p && *p <= '8', "unexpected version '%c'\n", *p);
1566 if(*p < '7') {
1567 win_skip("skipping UA tests, too old IE\n");
1568 break;
1569 }
1570 p++; /* skip version number */
1571 p += check_prefix(p, ".0");
1572 }
1573 if(i == 11) {
1574 p += check_prefix(p, "; rv:11.0) like Gecko");
1575 }else if (i >= 9) {
1576 p += check_prefix(p, ")");
1577 }else {
1578#ifdef __x86_64__
1579 todo_wine
1580#endif
1581 /* This assumes that either p points at some property before
1582 * '; .NET', or that there is more than one such occurrence.
1583 */
1584 ok(strstr(p, "; .NET") != NULL, "no '; .NET' in %s\n", wine_dbgstr_a(p));
1585 p = strchr(p, ')');
1586 p += check_prefix(p, ")");
1587 }
1588
1589 ok(!*p, "unexpected suffix %s for version %u\n", wine_dbgstr_a(p), i);
1590 }
1591
1592 size = saved+10;
1593 hres = pObtainUserAgentString(0, str2, &size);
1594 ok(hres == S_OK, "ObtainUserAgentString failed: %08lx\n", hres);
1595 ok(size == saved, "size=%ld, expected %ld\n", size, saved);
1596
1597 size = 0;
1598 hres = pUrlMkGetSessionOption(URLMON_OPTION_USERAGENT, NULL, 0, &size, 0);
1599 ok(hres == E_OUTOFMEMORY, "UrlMkGetSessionOption failed: %08lx\n", hres);
1600 ok(size, "size == 0\n");
1601
1602 size = 0xdeadbeef;
1603 hres = pUrlMkGetSessionOption(URLMON_OPTION_USERAGENT, NULL, 1000, &size, 0);
1604 ok(hres == E_INVALIDARG, "UrlMkGetSessionOption failed: %08lx\n", hres);
1605 ok(size, "size == 0\n");
1606
1607 saved = size;
1608 size = 0;
1609 hres = pUrlMkGetSessionOption(URLMON_OPTION_USERAGENT, str2, saved+10, &size, 0);
1610 ok(hres == E_OUTOFMEMORY, "UrlMkGetSessionOption failed: %08lx\n", hres);
1611 ok(size == saved, "size = %ld, expected %ld\n", size, saved);
1612 ok(sizeof(expected) <= strlen(str2) && !memcmp(expected, str2, sizeof(expected)-1),
1613 "user agent was \"%s\", expected to start with \"%s\"\n",
1614 str2, expected);
1615
1616 size = 0;
1617 str2[0] = 0;
1618 hres = pUrlMkGetSessionOption(URLMON_OPTION_USERAGENT, str2, saved, &size, 0);
1619 ok(hres == E_OUTOFMEMORY, "UrlMkGetSessionOption failed: %08lx\n", hres);
1620 ok(size == saved, "size = %ld, expected %ld\n", size, saved);
1621 ok(sizeof(expected) <= strlen(str2) && !memcmp(expected, str2, sizeof(expected)-1),
1622 "user agent was \"%s\", expected to start with \"%s\"\n",
1623 str2, expected);
1624
1625 size = saved;
1626 str2[0] = 0;
1627 hres = pUrlMkGetSessionOption(URLMON_OPTION_USERAGENT, str2, saved-1, &size, 0);
1628 ok(hres == E_OUTOFMEMORY, "UrlMkGetSessionOption failed: %08lx\n", hres);
1629 ok(size == saved, "size = %ld, expected %ld\n", size, saved);
1630 ok(!str2[0], "buf changed\n");
1631
1632 size = saved;
1633 str2[0] = 0;
1634 hres = pUrlMkGetSessionOption(URLMON_OPTION_USERAGENT, str2, saved, NULL, 0);
1635 ok(hres == E_INVALIDARG, "UrlMkGetSessionOption failed: %08lx\n", hres);
1636 ok(!str2[0], "buf changed\n");
1637
1638 hres = UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, test_str, sizeof(test_str), 0);
1639 ok(hres == S_OK, "UrlMkSetSessionOption failed: %08lx\n", hres);
1640
1641 size = 0;
1642 str2[0] = 0;
1643 hres = pUrlMkGetSessionOption(URLMON_OPTION_USERAGENT, str2, saved, &size, 0);
1644 ok(hres == E_OUTOFMEMORY, "UrlMkGetSessionOption failed: %08lx\n", hres);
1645 ok(size == sizeof(test_str) && !memcmp(str2, test_str, sizeof(test_str)), "wrong user agent\n");
1646
1647 for(i = 0; i < 12; i++) {
1648 size = sizeof(ua);
1649 hres = pObtainUserAgentString(i, ua, &size);
1650 ok(hres == S_OK, "[%u] ObtainUserAgentString failed: %08lx\n", i, hres);
1651 ok(size == strlen(ua) + 1, "[%u] unexpected size %lu, expected %Iu\n", i, size, strlen(ua) + 1);
1652 if(i >= 7)
1653 ok(strcmp(ua, test_str), "[%u] unexpected UA, did not expect \"test\"\n", i);
1654 else
1655 ok(!strcmp(ua, test_str), "[%u] unexpected UA %s, expected \"test\"\n", i, wine_dbgstr_a(ua));
1656
1657 size = sizeof(ua);
1658 hres = pObtainUserAgentString(i | UAS_EXACTLEGACY, ua, &size);
1659 ok(hres == S_OK, "[%u] ObtainUserAgentString failed: %08lx\n", i, hres);
1660 ok(size == strlen(ua) + 1, "[%u] unexpected size %lu, expected %Iu\n", i, size, strlen(ua) + 1);
1661 if(i == 7)
1662 ok(strcmp(ua, test_str), "[%u] unexpected UA, did not expect \"test\"\n", i);
1663 else
1664 ok(!strcmp(ua, test_str), "[%u] unexpected UA %s, expected \"test\"\n", i, wine_dbgstr_a(ua));
1665 }
1666
1667 hres = UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, test2_str, sizeof(test2_str), 0);
1668 ok(hres == S_OK, "UrlMkSetSessionOption failed: %08lx\n", hres);
1669
1670 size = 0;
1671 str2[0] = 0;
1672 hres = pUrlMkGetSessionOption(URLMON_OPTION_USERAGENT, str2, saved, &size, 0);
1673 ok(hres == E_OUTOFMEMORY, "UrlMkGetSessionOption failed: %08lx\n", hres);
1674 ok(size == sizeof(test_str) && !memcmp(str2, test_str, sizeof(test_str)), "wrong user agent\n");
1675
1676 hres = UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, test_str, 2, 0);
1677 ok(hres == S_OK, "UrlMkSetSessionOption failed: %08lx\n", hres);
1678
1679 size = 0;
1680 str2[0] = 0;
1681 hres = pUrlMkGetSessionOption(URLMON_OPTION_USERAGENT, str2, saved, &size, 0);
1682 ok(hres == E_OUTOFMEMORY, "UrlMkGetSessionOption failed: %08lx\n", hres);
1683 ok(size == 3 && !strcmp(str2, "te"), "wrong user agent\n");
1684
1685 hres = UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, test_str, 0, 0);
1686 ok(hres == E_INVALIDARG, "UrlMkSetSessionOption failed: %08lx\n", hres);
1687
1688 hres = UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, NULL, sizeof(test_str), 0);
1689 ok(hres == E_INVALIDARG, "UrlMkSetSessionOption failed: %08lx\n", hres);
1690
1691 hres = UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, NULL, 0, 0);
1692 ok(hres == E_INVALIDARG, "UrlMkSetSessionOption failed: %08lx\n", hres);
1693
1694 free(str2);
1695}
1696
1698{
1699 IMoniker *mon = NULL;
1700 LPWSTR name;
1701 DWORD issys;
1702 ULONG eaten = 0;
1703 IBindCtx *bctx;
1704 HRESULT hres;
1705
1706 static const WCHAR clsid_nameW[] = {'c','l','s','i','d',':',
1707 '2','0','D','0','4','F','E','0','-','3','A','E','A','-','1','0','6','9','-','A','2','D','8',
1708 '-','0','8','0','0','2','B','3','0','3','0','9','D',':',0};
1709
1710 const struct
1711 {
1712 LPBC *ppbc;
1713 LPCWSTR szDisplayName;
1714 ULONG *pchEaten;
1715 LPMONIKER *ppmk;
1716 } invalid_parameters[] =
1717 {
1718 {NULL, NULL, NULL, NULL},
1719 {NULL, NULL, NULL, &mon},
1720 {NULL, NULL, &eaten, NULL},
1721 {NULL, NULL, &eaten, &mon},
1722 {NULL, wszEmpty, NULL, NULL},
1723 {NULL, wszEmpty, NULL, &mon},
1724 {NULL, wszEmpty, &eaten, NULL},
1725 {NULL, wszEmpty, &eaten, &mon},
1726 {&bctx, NULL, NULL, NULL},
1727 {&bctx, NULL, NULL, &mon},
1728 {&bctx, NULL, &eaten, NULL},
1729 {&bctx, NULL, &eaten, &mon},
1730 {&bctx, wszEmpty, NULL, NULL},
1731 {&bctx, wszEmpty, NULL, &mon},
1732 {&bctx, wszEmpty, &eaten, NULL},
1733 {&bctx, wszEmpty, &eaten, &mon},
1734 };
1735
1736 int i;
1737
1738 CreateBindCtx(0, &bctx);
1739
1740 for (i = 0; i < ARRAY_SIZE(invalid_parameters); i++)
1741 {
1742 eaten = 0xdeadbeef;
1743 mon = (IMoniker *)0xdeadbeef;
1744 hres = MkParseDisplayNameEx(invalid_parameters[i].ppbc ? *invalid_parameters[i].ppbc : NULL,
1745 invalid_parameters[i].szDisplayName,
1746 invalid_parameters[i].pchEaten,
1747 invalid_parameters[i].ppmk);
1748 ok(hres == E_INVALIDARG,
1749 "[%d] Expected MkParseDisplayNameEx to return E_INVALIDARG, got %08lx\n", i, hres);
1750 ok(eaten == 0xdeadbeef, "[%d] Expected eaten to be 0xdeadbeef, got %lu\n", i, eaten);
1751 ok(mon == (IMoniker *)0xdeadbeef, "[%d] Expected mon to be 0xdeadbeef, got %p\n", i, mon);
1752 }
1753
1754 hres = MkParseDisplayNameEx(bctx, url9, &eaten, &mon);
1755 ok(hres == S_OK, "MkParseDisplayNameEx failed: %08lx\n", hres);
1756 ok(eaten == ARRAY_SIZE(url9)-1, "eaten=%ld\n", eaten);
1757 ok(mon != NULL, "mon == NULL\n");
1758
1759 hres = IMoniker_GetDisplayName(mon, NULL, 0, &name);
1760 ok(hres == S_OK, "GetDisplayName failed: %08lx\n", hres);
1761 ok(!lstrcmpW(name, url9), "wrong display name %s\n", wine_dbgstr_w(name));
1763
1764 hres = IMoniker_IsSystemMoniker(mon, &issys);
1765 ok(hres == S_OK, "IsSystemMoniker failed: %08lx\n", hres);
1766 ok(issys == MKSYS_URLMONIKER, "issys=%lx\n", issys);
1767
1768 IMoniker_Release(mon);
1769
1770 hres = MkParseDisplayNameEx(bctx, clsid_nameW, &eaten, &mon);
1771 ok(hres == S_OK, "MkParseDisplayNameEx failed: %08lx\n", hres);
1772 ok(eaten == ARRAY_SIZE(clsid_nameW)-1, "eaten=%ld\n", eaten);
1773 ok(mon != NULL, "mon == NULL\n");
1774
1775 hres = IMoniker_IsSystemMoniker(mon, &issys);
1776 ok(hres == S_OK, "IsSystemMoniker failed: %08lx\n", hres);
1777 ok(issys == MKSYS_CLASSMONIKER, "issys=%lx\n", issys);
1778
1779 IMoniker_Release(mon);
1780
1781 hres = MkParseDisplayNameEx(bctx, url8, &eaten, &mon);
1782 ok(FAILED(hres), "MkParseDisplayNameEx succeeded: %08lx\n", hres);
1783
1784 IBindCtx_Release(bctx);
1785}
1786
1787static void test_IsValidURL(void)
1788{
1789 HRESULT hr;
1790 IBindCtx *bctx = NULL;
1791
1792 hr = IsValidURL(NULL, 0, 0);
1793 ok(hr == E_INVALIDARG, "Expected E_INVALIDARG, got %08lx\n", hr);
1794
1796 ok(hr == S_OK, "Expected S_OK, got %08lx\n", hr);
1797
1798 CreateBindCtx(0, &bctx);
1799
1800 hr = IsValidURL(bctx, wszHttpWineHQ, 0);
1801 ok(hr == S_OK, "Expected S_OK, got %08lx\n", hr);
1802
1803 IBindCtx_Release(bctx);
1804}
1805
1806static const struct {
1812 {FEATURE_OBJECT_CACHING,GET_FEATURE_FROM_PROCESS,S_OK},
1813 {FEATURE_ZONE_ELEVATION,GET_FEATURE_FROM_PROCESS,S_FALSE},
1814 {FEATURE_MIME_HANDLING,GET_FEATURE_FROM_PROCESS,S_FALSE},
1815 {FEATURE_MIME_SNIFFING,GET_FEATURE_FROM_PROCESS,S_FALSE},
1816 {FEATURE_WINDOW_RESTRICTIONS,GET_FEATURE_FROM_PROCESS,S_FALSE},
1817 {FEATURE_WEBOC_POPUPMANAGEMENT,GET_FEATURE_FROM_PROCESS,S_FALSE},
1818 {FEATURE_BEHAVIORS,GET_FEATURE_FROM_PROCESS,S_OK},
1819 {FEATURE_DISABLE_MK_PROTOCOL,GET_FEATURE_FROM_PROCESS,S_OK},
1820 {FEATURE_LOCALMACHINE_LOCKDOWN,GET_FEATURE_FROM_PROCESS,S_FALSE},
1821 {FEATURE_SECURITYBAND,GET_FEATURE_FROM_PROCESS,S_FALSE},
1822 {FEATURE_RESTRICT_ACTIVEXINSTALL,GET_FEATURE_FROM_PROCESS,S_FALSE},
1823 {FEATURE_VALIDATE_NAVIGATE_URL,GET_FEATURE_FROM_PROCESS,S_FALSE},
1824 {FEATURE_RESTRICT_FILEDOWNLOAD,GET_FEATURE_FROM_PROCESS,S_FALSE},
1825 {FEATURE_ADDON_MANAGEMENT,GET_FEATURE_FROM_PROCESS,S_FALSE},
1826 {FEATURE_PROTOCOL_LOCKDOWN,GET_FEATURE_FROM_PROCESS,S_FALSE},
1827 {FEATURE_HTTP_USERNAME_PASSWORD_DISABLE,GET_FEATURE_FROM_PROCESS,S_FALSE},
1828 {FEATURE_SAFE_BINDTOOBJECT,GET_FEATURE_FROM_PROCESS,S_FALSE},
1829 {FEATURE_UNC_SAVEDFILECHECK,GET_FEATURE_FROM_PROCESS,S_FALSE},
1830 {FEATURE_GET_URL_DOM_FILEPATH_UNENCODED,GET_FEATURE_FROM_PROCESS,S_OK},
1831 {FEATURE_TABBED_BROWSING,GET_FEATURE_FROM_PROCESS,S_FALSE},
1832 {FEATURE_SSLUX,GET_FEATURE_FROM_PROCESS,S_FALSE},
1833 {FEATURE_DISABLE_NAVIGATION_SOUNDS,GET_FEATURE_FROM_PROCESS,S_FALSE},
1834 {FEATURE_DISABLE_LEGACY_COMPRESSION,GET_FEATURE_FROM_PROCESS,S_OK},
1835 {FEATURE_FORCE_ADDR_AND_STATUS,GET_FEATURE_FROM_PROCESS,S_FALSE},
1836 {FEATURE_XMLHTTP,GET_FEATURE_FROM_PROCESS,S_OK},
1837 {FEATURE_DISABLE_TELNET_PROTOCOL,GET_FEATURE_FROM_PROCESS,S_FALSE},
1838 {FEATURE_FEEDS,GET_FEATURE_FROM_PROCESS,S_FALSE},
1839 {FEATURE_BLOCK_INPUT_PROMPTS,GET_FEATURE_FROM_PROCESS,S_FALSE}
1841
1843 HRESULT hres;
1844 DWORD i;
1845
1846 for(i = 0; i < ARRAY_SIZE(default_feature_tests); ++i) {
1847 hres = pCoInternetIsFeatureEnabled(default_feature_tests[i].feature, default_feature_tests[i].get_flags);
1849 ok(hres == default_feature_tests[i].expected, "CoInternetIsFeatureEnabled returned %08lx, expected %08lx on test %ld\n",
1851 }
1852}
1853
1854/* With older versions of IE (IE 7 and earlier), urlmon caches
1855 * the FeatureControl values from the registry when it's loaded
1856 * into memory. Newer versions of IE conditionally cache the
1857 * the FeatureControl registry values (i.e. When a call to
1858 * CoInternetIsFeatureEnabled and a corresponding CoInternetSetFeatureEnabled
1859 * call hasn't already been made for the specified Feature). Because of
1860 * this we skip these tests on IE 7 and earlier.
1861 */
1862static const char* szFeatureControlKey = "Software\\Microsoft\\Internet Explorer\\Main\\FeatureControl";
1863
1865 HRESULT hres;
1866 DWORD res;
1867 char module[MAX_PATH];
1868 char *name;
1870 HKEY feature;
1871 DWORD value;
1872 BOOL skip_zone;
1873 BOOL delete_feature_key = TRUE;
1874
1875 static const char* szFeatureBehaviorsKey = "FEATURE_BEHAVIORS";
1876 static const char* szFeatureZoneElevationKey = "FEATURE_ZONE_ELEVATION";
1877
1878 if(!pIEInstallScope) {
1879 win_skip("Skipping internet feature registry tests, IE is too old...\n");
1880 return;
1881 }
1882
1884 ok(res, "GetModuleFileName failed: %ld\n", GetLastError());
1885
1886 name = strrchr(module, '\\')+1;
1887
1888 /* Some Windows machines don't have a FeatureControl key in HKCU. */
1890 ok(res == ERROR_SUCCESS, "RegCreateKey failed: %ld\n", res);
1891
1892 res = RegOpenKeyA(feature_control, szFeatureBehaviorsKey, &feature);
1893 if(res == ERROR_SUCCESS) {
1894 /* FEATURE_BEHAVIORS already existed, so don't delete it when we're done. */
1895 delete_feature_key = FALSE;
1896 }else {
1897 res = RegCreateKeyA(feature_control, szFeatureBehaviorsKey, &feature);
1898 ok(res == ERROR_SUCCESS, "RegCreateKey failed: %ld\n", res);
1899 }
1900
1901 value = 0;
1902 res = RegSetValueExA(feature, name, 0, REG_DWORD, (BYTE*)&value, sizeof(DWORD));
1903 ok(res == ERROR_SUCCESS, "RegSetValueEx failed: %ld\n", res);
1904
1905 hres = pCoInternetIsFeatureEnabled(FEATURE_BEHAVIORS, GET_FEATURE_FROM_PROCESS);
1906 ok(hres == S_FALSE, "CoInternetIsFeatureEnabled returned %08lx, expected S_FALSE\n", hres);
1907
1908 if(delete_feature_key) {
1910 RegDeleteKeyA(feature_control, szFeatureBehaviorsKey);
1911 } else {
1914 }
1915
1916 /* IE's feature control cached the value it got from the registry earlier. */
1917 hres = pCoInternetIsFeatureEnabled(FEATURE_BEHAVIORS, GET_FEATURE_FROM_PROCESS);
1918 ok(hres == S_FALSE, "CoInternetIsFeatureEnabled returned %08lx, expected S_FALSE\n", hres);
1919
1920 /* Restore this feature back to its default value. */
1921 hres = pCoInternetSetFeatureEnabled(FEATURE_BEHAVIORS, SET_FEATURE_ON_PROCESS, TRUE);
1922 ok(hres == S_OK, "CoInternetSetFeatureEnabled failed: %08lx\n", hres);
1923
1925
1927 ok(res == ERROR_SUCCESS, "RegOpenKey failed: %ld\n", res);
1928
1929 res = RegOpenKeyA(feature_control, szFeatureZoneElevationKey, &feature);
1930 ok(res == ERROR_SUCCESS, "RegOpenKey failed: %ld\n", res);
1931
1932 value = 1;
1933 res = RegSetValueExA(feature, "*", 0, REG_DWORD, (BYTE*)&value, sizeof(DWORD));
1934 if (res == ERROR_ACCESS_DENIED)
1935 {
1936 skip("Not allowed to modify zone elevation\n");
1937 skip_zone = TRUE;
1938 }
1939 else
1940 {
1941 skip_zone = FALSE;
1942 ok(res == ERROR_SUCCESS, "RegSetValueEx failed: %ld\n", res);
1943
1944 hres = pCoInternetIsFeatureEnabled(FEATURE_ZONE_ELEVATION, GET_FEATURE_FROM_PROCESS);
1945 ok(hres == S_OK, "CoInternetIsFeatureEnabled returned %08lx, expected S_OK\n", hres);
1946 }
1950
1951 /* Value is still cached from last time. */
1952 if (!skip_zone)
1953 {
1954 hres = pCoInternetIsFeatureEnabled(FEATURE_ZONE_ELEVATION, GET_FEATURE_FROM_PROCESS);
1955 ok(hres == S_OK, "CoInternetIsFeatureEnabled returned %08lx, expected S_OK\n", hres);
1956
1957 hres = pCoInternetSetFeatureEnabled(FEATURE_ZONE_ELEVATION, SET_FEATURE_ON_PROCESS, FALSE);
1958 ok(hres == S_OK, "CoInternetSetFeatureEnabled failed: %08lx\n", hres);
1959 }
1960
1962}
1963
1965 HRESULT hres;
1966
1967 hres = pCoInternetIsFeatureEnabled(FEATURE_ENTRY_COUNT, GET_FEATURE_FROM_PROCESS);
1968 ok(hres == E_FAIL, "CoInternetIsFeatureEnabled returned %08lx, expected E_FAIL\n", hres);
1969}
1970
1971static const struct {
1981 {FEATURE_OBJECT_CACHING,SET_FEATURE_ON_PROCESS,FALSE,S_OK,FALSE,GET_FEATURE_FROM_PROCESS,S_FALSE},
1982 {FEATURE_WEBOC_POPUPMANAGEMENT,SET_FEATURE_ON_PROCESS,TRUE,S_OK,FALSE,GET_FEATURE_FROM_PROCESS,S_OK},
1983 {FEATURE_LOCALMACHINE_LOCKDOWN,SET_FEATURE_ON_PROCESS,TRUE,S_OK,FALSE,GET_FEATURE_FROM_PROCESS,S_OK}
1985
1987 HRESULT hres;
1988 DWORD i;
1989
1990 hres = pCoInternetSetFeatureEnabled(FEATURE_ENTRY_COUNT,SET_FEATURE_ON_PROCESS,TRUE);
1991 ok(hres == E_FAIL, "CoInternetSetFeatureEnabled returned %08lx, expected E_FAIL\n", hres);
1992
1993 for(i = 0; i < ARRAY_SIZE(internet_feature_tests); ++i) {
1994 hres = pCoInternetSetFeatureEnabled(internet_feature_tests[i].feature, internet_feature_tests[i].set_flags,
1997 ok(hres == internet_feature_tests[i].set_expected, "CoInternetSetFeatureEnabled returned %08lx, expected %08lx on test %ld\n",
1999
2000 hres = pCoInternetIsFeatureEnabled(internet_feature_tests[i].feature, internet_feature_tests[i].set_flags);
2002 ok(hres == internet_feature_tests[i].get_expected, "CoInternetIsFeatureEnabled returned %08lx, expected %08lx on test %ld\n",
2004
2005 }
2006}
2007
2008static void test_internet_features(void) {
2009 HKEY key;
2010 DWORD res;
2011
2012 if(!pCoInternetIsFeatureEnabled || !pCoInternetSetFeatureEnabled) {
2013 win_skip("Skipping internet feature tests, IE is too old\n");
2014 return;
2015 }
2016
2017 /* IE10 takes FeatureControl key into account only if it's available upon process start. */
2019 if(res != ERROR_SUCCESS) {
2021 STARTUPINFOA si = { 0 };
2022 char cmdline[MAX_PATH];
2023 char **argv;
2024 BOOL ret;
2025
2027 ok(res == ERROR_SUCCESS, "RegCreateKey failed: %ld\n", res);
2028
2029 trace("Running features tests in a separated process.\n");
2030
2032 sprintf(cmdline, "\"%s\" %s internet_features", argv[0], argv[1]);
2033 ret = CreateProcessA(argv[0], cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
2034 ok(ret, "Could not create process: %lu\n", GetLastError());
2038
2040 return;
2041 }
2042
2046}
2047
2048static BINDINFO rem_bindinfo = { sizeof(rem_bindinfo) }, in_bindinfo;
2050
2052{
2053 if(IsEqualGUID(&IID_IBindStatusCallbackEx, riid)
2054 || IsEqualGUID(&IID_IBindStatusCallback, riid)
2056 *ppv = iface;
2057 return S_OK;
2058 }
2059
2060 *ppv = NULL;
2061 return E_NOINTERFACE;
2062}
2063
2065{
2066 return 2;
2067}
2068
2070{
2071 return 1;
2072}
2073
2076{
2077 ok(0, "unexpected call\n");
2078 return S_OK;
2079}
2080
2082{
2083 ok(0, "unexpected call\n");
2084 return E_NOTIMPL;
2085}
2086
2088{
2089 ok(0, "unexpected call\n");
2090 return E_NOTIMPL;
2091}
2092
2094 ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText)
2095{
2096 ok(0, "unexpected call\n");
2097 return S_OK;
2098}
2099
2101{
2102 ok(0, "unexpected call\n");
2103 return S_OK;
2104}
2105
2106static HRESULT WINAPI BindStatusCallback_GetBindInfo(IBindStatusCallbackEx *iface, DWORD *grfBINDF, BINDINFO *pbindinfo)
2107{
2108 in_bindinfo = *pbindinfo;
2109 *grfBINDF = rem_bindf;
2110 *pbindinfo = rem_bindinfo;
2111 return S_OK;
2112}
2113
2114static STGMEDIUM in_stgmed, rem_stgmed;
2115
2117 DWORD dwSize, FORMATETC* pformatetc, STGMEDIUM* pstgmed)
2118{
2119 in_stgmed = *pstgmed;
2120 *pstgmed = rem_stgmed;
2121 return S_OK;
2122}
2123
2125{
2126 ok(0, "unexpected call\n");
2127 return S_OK;
2128}
2129
2131 BINDINFO *pbindinfo, DWORD *grfBINDF2, DWORD *pdwReserved)
2132{
2133 in_bindinfo = *pbindinfo;
2134 *grfBINDF = rem_bindf;
2135 *pbindinfo = rem_bindinfo;
2136 *grfBINDF2 = 11;
2137 *pdwReserved = 12;
2138 return S_OK;
2139}
2140
2141static const IBindStatusCallbackExVtbl BindStatusCallbackExVtbl = {
2154};
2155
2157
2158typedef struct {
2161} RefUnk;
2162
2163static inline RefUnk *impl_from_IUnknown(IUnknown *iface)
2164{
2165 return CONTAINING_RECORD(iface, RefUnk, IUnknown_iface);
2166}
2167
2169{
2170 if(!IsEqualGUID(&IID_IUnknown, riid)) {
2171 *ppv = NULL;
2172 return E_NOINTERFACE;
2173 }
2174
2175 IUnknown_AddRef(iface);
2176 *ppv = iface;
2177 return S_OK;
2178}
2179
2181{
2182 RefUnk *This = impl_from_IUnknown(iface);
2183 return InterlockedIncrement(&This->ref);
2184}
2185
2187{
2188 RefUnk *This = impl_from_IUnknown(iface);
2189 return InterlockedDecrement(&This->ref);
2190}
2191
2192static const IUnknownVtbl RefUnkVtbl = {
2196};
2197
2199
2201
2203{
2204 IStream *stream = arg;
2206 MSG msg;
2207 HRESULT hres;
2208
2210
2211 hres = CoMarshalInterface(stream, &IID_IBindStatusCallback, (IUnknown*)&BindStatusCallback,
2212 MSHCTX_INPROC, NULL, MSHLFLAGS_NORMAL);
2213 ok(hres == S_OK, "CoMarshalInterface failed: %08lx\n", hres);
2214
2215 zero.QuadPart = 0;
2216 hres = IStream_Seek(stream, zero, STREAM_SEEK_SET, NULL);
2217 ok(hres == S_OK, "Seek failed: 0x%08lx\n", hres);
2218
2220
2221 while(GetMessageW(&msg, NULL, 0, 0)) {
2224 }
2225
2227 return 0;
2228}
2229
2230static void test_bsc_marshaling(void)
2231{
2232 FORMATETC formatetc = {0, NULL, 1, -1, TYMED_ISTREAM};
2233 IBindStatusCallbackEx *callbackex;
2235 BINDINFO bindinfo;
2236 IStream *stream, *binding_stream;
2237 HANDLE thread;
2238 WCHAR *extra_info_out;
2239 WCHAR *verb_out;
2241 STGMEDIUM stgmed;
2242 void *buf;
2243 DWORD bindf;
2244 HRESULT hres;
2245
2247 ok(hres == S_OK, "CreateStreamOnHGlobal returned: %08lx\n", hres);
2248
2252
2253 hres = CoUnmarshalInterface(stream, &IID_IBindStatusCallback, (void**)&bsc);
2254 ok(hres == S_OK, "CoUnmarshalInterface failed: %08lx\n", hres);
2255
2256 hres = CreateStreamOnHGlobal(NULL, TRUE, &binding_stream);
2257 ok(hres == S_OK, "CreateStreamOnHGlobal returned: %08lx\n", hres);
2258 hres = IStream_Write(binding_stream, "xxx", 3, NULL);
2259 ok(hres == S_OK, "Write failed: %08lx\n", hres);
2260
2261 rem_bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA;
2262 bindf = 0xdeadbeef;
2263
2264 memset(&bindinfo, 0, sizeof(bindinfo));
2265 bindinfo.cbSize = sizeof(bindinfo);
2266 bindinfo.grfBindInfoF = 12;
2267 bindinfo.dwBindVerb = 13;
2268 bindinfo.cbstgmedData = 19;
2269 bindinfo.dwOptions = 14;
2270 bindinfo.dwOptionsFlags = 15;
2271 bindinfo.dwCodePage = 16;
2272 bindinfo.securityAttributes.nLength = 30;
2273 bindinfo.securityAttributes.lpSecurityDescriptor = (void*)0xdead0001;
2274 bindinfo.securityAttributes.bInheritHandle = 31;
2275 bindinfo.iid.Data1 = 17;
2276 bindinfo.pUnk = (IUnknown*)0xdeadbeef;
2277 bindinfo.dwReserved = 18;
2278 bindinfo.stgmedData.pUnkForRelease = &unk_in.IUnknown_iface;
2279 unk_in.ref = 1;
2280
2281 memset(&rem_bindinfo, 0, sizeof(bindinfo));
2282 rem_bindinfo.cbSize = sizeof(rem_bindinfo);
2283 rem_bindinfo.szExtraInfo = extra_info_out = a2co("extra info out");
2284 rem_bindinfo.grfBindInfoF = 22;
2285 rem_bindinfo.dwBindVerb = 23;
2286 rem_bindinfo.szCustomVerb = verb_out = a2co("custom verb out");
2287 rem_bindinfo.cbstgmedData = 29;
2288 rem_bindinfo.dwOptions = 24;
2289 rem_bindinfo.dwOptionsFlags = 25;
2290 rem_bindinfo.dwCodePage = 16;
2291 rem_bindinfo.securityAttributes.nLength = 40;
2292 rem_bindinfo.securityAttributes.lpSecurityDescriptor = (void*)0xdead0002;
2293 rem_bindinfo.securityAttributes.bInheritHandle = 41;
2294 rem_bindinfo.iid.Data1 = 27;
2295 rem_bindinfo.pUnk = (IUnknown*)0xdeadbeef;
2296 rem_bindinfo.dwReserved = 18;
2297 rem_bindinfo.stgmedData.pUnkForRelease = &unk_out.IUnknown_iface;
2298 unk_out.ref = 1;
2299
2300 hres = IBindStatusCallback_GetBindInfo(bsc, &bindf, &bindinfo);
2301 ok(hres == S_OK, "GetBindInfo failed: %08lx\n", hres);
2302 ok(bindf == rem_bindf, "bindf = %lx, expected %lx\n", bindf, rem_bindf);
2303
2304 ok(in_bindinfo.cbSize == sizeof(in_bindinfo), "cbSize = %lu\n", in_bindinfo.cbSize);
2305 ok(!in_bindinfo.szExtraInfo, "szExtraInfo = %s\n", wine_dbgstr_w(in_bindinfo.szExtraInfo));
2306 ok(in_bindinfo.grfBindInfoF == 12, "cbSize = %lu\n", in_bindinfo.grfBindInfoF);
2307 ok(in_bindinfo.dwBindVerb == 13, "dwBindVerb = %lu\n", in_bindinfo.dwBindVerb);
2308 ok(!in_bindinfo.szCustomVerb, "szCustomVerb = %s\n", wine_dbgstr_w(in_bindinfo.szCustomVerb));
2309 ok(in_bindinfo.cbstgmedData == 19, "cbstgmedData = %lu\n", in_bindinfo.cbstgmedData);
2310 ok(!in_bindinfo.dwOptions, "dwOptions = %lu\n", in_bindinfo.dwOptions);
2311 ok(!in_bindinfo.dwOptionsFlags, "dwOptionsFlags = %lu\n", in_bindinfo.dwOptionsFlags);
2312 ok(!in_bindinfo.dwCodePage, "dwCodePage = %lu\n", in_bindinfo.dwCodePage);
2313 ok(!in_bindinfo.iid.Data1, "iid = %s\n", debugstr_guid(&in_bindinfo.iid));
2314 ok(!in_bindinfo.pUnk, "pUnk = %p\n", in_bindinfo.pUnk);
2315 ok(!in_bindinfo.dwReserved, "dwReserved = %lu\n", in_bindinfo.dwReserved);
2316 ok(!in_bindinfo.securityAttributes.nLength, "securityAttributes.nLength = %lu\n",
2317 in_bindinfo.securityAttributes.nLength);
2318 ok(!in_bindinfo.securityAttributes.lpSecurityDescriptor,
2319 "securityAttributes.lpSecurityDescriptor = %p\n",
2320 in_bindinfo.securityAttributes.lpSecurityDescriptor);
2321 ok(!in_bindinfo.securityAttributes.bInheritHandle, "securityAttributes.bInheritHandle = %u\n",
2322 in_bindinfo.securityAttributes.bInheritHandle);
2323 ok(!in_bindinfo.stgmedData.pUnkForRelease, "pUnkForRelease = %p\n",
2324 in_bindinfo.stgmedData.pUnkForRelease);
2325
2326 ok(bindinfo.cbSize == sizeof(rem_bindinfo), "cbSize = %lu\n", rem_bindinfo.cbSize);
2327 ok(!lstrcmpW(bindinfo.szExtraInfo, L"extra info out"),
2328 "szExtraInfo = %s\n", wine_dbgstr_w(bindinfo.szExtraInfo));
2329 ok(bindinfo.grfBindInfoF == 22, "grfBindInfoF = %lu\n", rem_bindinfo.grfBindInfoF);
2330 ok(bindinfo.dwBindVerb == 23, "dwBindVerb = %lu\n", bindinfo.dwBindVerb);
2331 ok(bindinfo.szCustomVerb != verb_out, "szCustomVerb == inbuf\n");
2332 ok(!lstrcmpW(bindinfo.szCustomVerb, L"custom verb out"), "szCustomVerb = %s\n",
2333 wine_dbgstr_w(bindinfo.szCustomVerb));
2334 ok(bindinfo.cbstgmedData == 29, "cbstgmedData = %lu\n", bindinfo.cbstgmedData);
2335 ok(bindinfo.dwOptions == 24, "dwOptions = %lu\n", bindinfo.dwOptions);
2336 ok(bindinfo.dwOptionsFlags == 25, "dwOptionsFlags = %lu\n", bindinfo.dwOptionsFlags);
2337 ok(bindinfo.dwCodePage, "dwCodePage = %lu\n", bindinfo.dwCodePage);
2338 ok(!bindinfo.iid.Data1, "iid = %s\n", debugstr_guid(&bindinfo.iid));
2339 ok(!bindinfo.pUnk, "pUnk = %p\n", bindinfo.pUnk);
2340 ok(bindinfo.dwReserved == 18, "dwReserved = %lu\n", bindinfo.dwReserved);
2341 ok(bindinfo.securityAttributes.nLength == 30, "securityAttributes.nLength = %lu\n",
2342 bindinfo.securityAttributes.nLength);
2343 ok(bindinfo.securityAttributes.lpSecurityDescriptor == (void*)0xdead0001,
2344 "securityAttributes.lpSecurityDescriptor = %p\n",
2345 bindinfo.securityAttributes.lpSecurityDescriptor);
2346 ok(bindinfo.securityAttributes.bInheritHandle == 31, "securityAttributes.bInheritHandle = %u\n",
2347 bindinfo.securityAttributes.bInheritHandle);
2348 ok(bindinfo.stgmedData.pUnkForRelease == &unk_in.IUnknown_iface, "pUnkForRelease = %p\n",
2349 bindinfo.stgmedData.pUnkForRelease);
2350 ok(unk_out.ref == 1, "unk_out.ref = %lu\n", unk_out.ref);
2351
2352 bindinfo.stgmedData.pUnkForRelease = NULL;
2353 ReleaseBindInfo(&bindinfo);
2354
2355 zero.QuadPart = 0;
2356 hres = IStream_Seek(binding_stream, zero, STREAM_SEEK_SET, NULL);
2357 ok(hres == S_OK, "Seek failed: 0x%08lx\n", hres);
2358
2359 /* Return IStream stgmed from GetBindInfo, it's not marshaled back */
2360 rem_bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA;
2361 bindf = 0xdeadbeef;
2362
2363 memset(&bindinfo, 0, sizeof(bindinfo));
2364 bindinfo.cbSize = sizeof(bindinfo);
2365
2366 memset(&rem_bindinfo, 0, sizeof(rem_bindinfo));
2367 rem_bindinfo.cbSize = sizeof(rem_bindinfo);
2368
2369 rem_bindinfo.stgmedData.tymed = TYMED_ISTREAM;
2370 rem_bindinfo.stgmedData.pstm = binding_stream;
2371 rem_bindinfo.cbstgmedData = 3;
2372 IStream_AddRef(binding_stream);
2373
2374 hres = IBindStatusCallback_GetBindInfo(bsc, &bindf, &bindinfo);
2375 ok(hres == S_OK, "GetBindInfo failed: %08lx\n", hres);
2376 ok(bindf == rem_bindf, "bindf = %lx, expected %lx\n", bindf, rem_bindf);
2377
2378 ok(in_bindinfo.cbSize == sizeof(in_bindinfo), "cbSize = %lu\n", in_bindinfo.cbSize);
2379 ok(!in_bindinfo.pUnk, "pUnk = %p\n", in_bindinfo.pUnk);
2380 ok(in_bindinfo.stgmedData.tymed == TYMED_NULL, "tymed = %lu\n",
2381 in_bindinfo.stgmedData.tymed);
2382
2383 ok(bindinfo.cbSize == sizeof(bindinfo), "cbSize = %lu\n", bindinfo.cbSize);
2384 ok(!bindinfo.pUnk, "pUnk = %p\n", bindinfo.pUnk);
2385 ok(bindinfo.stgmedData.tymed == TYMED_NULL, "tymed = %lu\n",
2386 bindinfo.stgmedData.tymed);
2387 ok(!bindinfo.stgmedData.pstm, "stm = %p\n",
2388 bindinfo.stgmedData.pstm);
2389 ok(!bindinfo.stgmedData.pUnkForRelease, "pUnkForRelease = %p\n",
2390 bindinfo.stgmedData.pUnkForRelease);
2391 ok(bindinfo.cbstgmedData == 3, "cbstgmedData = %lu\n", bindinfo.cbstgmedData);
2392
2393 ReleaseBindInfo(&bindinfo);
2394
2395 /* Same, but with pUnkForRelease, it's not marshaled back */
2396 rem_bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA;
2397 bindf = 0xdeadbeef;
2398
2399 memset(&bindinfo, 0, sizeof(bindinfo));
2400 bindinfo.cbSize = sizeof(bindinfo);
2401
2402 memset(&rem_bindinfo, 0, sizeof(rem_bindinfo));
2403 rem_bindinfo.cbSize = sizeof(rem_bindinfo);
2404
2405 rem_bindinfo.stgmedData.tymed = TYMED_ISTREAM;
2406 rem_bindinfo.stgmedData.pstm = binding_stream;
2407 rem_bindinfo.stgmedData.pUnkForRelease = &unk_out.IUnknown_iface;
2408 unk_out.ref = 1;
2409 rem_bindinfo.cbstgmedData = 3;
2410 IStream_AddRef(binding_stream);
2411
2412 hres = IBindStatusCallback_GetBindInfo(bsc, &bindf, &bindinfo);
2413 ok(hres == S_OK, "GetBindInfo failed: %08lx\n", hres);
2414 ok(bindf == rem_bindf, "bindf = %lx, expected %lx\n", bindf, rem_bindf);
2415
2416 ok(in_bindinfo.cbSize == sizeof(in_bindinfo), "cbSize = %lu\n", in_bindinfo.cbSize);
2417 ok(!in_bindinfo.pUnk, "pUnk = %p\n", in_bindinfo.pUnk);
2418 ok(in_bindinfo.stgmedData.tymed == TYMED_NULL, "tymed = %lu\n",
2419 in_bindinfo.stgmedData.tymed);
2420
2421 ok(bindinfo.cbSize == sizeof(bindinfo), "cbSize = %lu\n", bindinfo.cbSize);
2422 ok(!bindinfo.pUnk, "pUnk = %p\n", bindinfo.pUnk);
2423 ok(bindinfo.stgmedData.tymed == TYMED_NULL, "tymed = %lu\n",
2424 bindinfo.stgmedData.tymed);
2425 ok(!bindinfo.stgmedData.pstm, "stm = %p\n",
2426 bindinfo.stgmedData.pstm);
2427 ok(!bindinfo.stgmedData.pUnkForRelease, "pUnkForRelease = %p\n",
2428 bindinfo.stgmedData.pUnkForRelease);
2429 ok(bindinfo.cbstgmedData == 3, "cbstgmedData = %lu\n", bindinfo.cbstgmedData);
2430
2431 ReleaseBindInfo(&bindinfo);
2432
2433 /* Return HGLOBAL stgmed from GetBindInfo, it's not marshaled back */
2434 rem_bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA;
2435 bindf = 0xdeadbeef;
2436
2437 memset(&bindinfo, 0, sizeof(bindinfo));
2438 bindinfo.cbSize = sizeof(bindinfo);
2439
2440 memset(&rem_bindinfo, 0, sizeof(rem_bindinfo));
2441 rem_bindinfo.cbSize = sizeof(rem_bindinfo);
2442
2443 rem_bindinfo.stgmedData.tymed = TYMED_HGLOBAL;
2444
2445 buf = GlobalAlloc(0, 5);
2446 strcpy(buf, "test");
2447 rem_bindinfo.stgmedData.hGlobal = buf;
2448 rem_bindinfo.cbstgmedData = 5;
2449
2450 hres = IBindStatusCallback_GetBindInfo(bsc, &bindf, &bindinfo);
2451 ok(hres == S_OK, "GetBindInfo failed: %08lx\n", hres);
2452 ok(bindf == rem_bindf, "bindf = %lx, expected %lx\n", bindf, rem_bindf);
2453
2454 ok(in_bindinfo.cbSize == sizeof(in_bindinfo), "cbSize = %lu\n", in_bindinfo.cbSize);
2455 ok(!in_bindinfo.pUnk, "pUnk = %p\n", in_bindinfo.pUnk);
2456 ok(in_bindinfo.stgmedData.tymed == TYMED_NULL, "tymed = %lu\n",
2457 in_bindinfo.stgmedData.tymed);
2458
2459 ok(bindinfo.cbSize == sizeof(bindinfo), "cbSize = %lu\n", bindinfo.cbSize);
2460 ok(!bindinfo.pUnk, "pUnk = %p\n", bindinfo.pUnk);
2461 ok(bindinfo.stgmedData.tymed == TYMED_NULL, "tymed = %lu\n",
2462 bindinfo.stgmedData.tymed);
2463 ok(!bindinfo.stgmedData.pstm, "stm = %p\n",
2464 bindinfo.stgmedData.pstm);
2465 ok(!bindinfo.stgmedData.pUnkForRelease, "pUnkForRelease = %p\n",
2466 bindinfo.stgmedData.pUnkForRelease);
2467 ok(bindinfo.cbstgmedData == 5, "cbstgmedData = %lu\n", bindinfo.cbstgmedData);
2468
2469 ReleaseBindInfo(&bindinfo);
2470
2471 /* Same with GetBindInfoEx */
2472 hres = IBindStatusCallback_QueryInterface(bsc, &IID_IBindStatusCallbackEx, (void**)&callbackex);
2473 if(SUCCEEDED(hres)) {
2474 DWORD bindf2, reserved;
2475
2476 rem_bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA;
2477 bindf = bindf2 = reserved = 0xdeadbeef;
2478
2479 memset(&bindinfo, 0, sizeof(bindinfo));
2480 bindinfo.cbSize = sizeof(bindinfo);
2481 bindinfo.grfBindInfoF = 12;
2482 bindinfo.dwBindVerb = 13;
2483 bindinfo.cbstgmedData = 19;
2484 bindinfo.dwOptions = 14;
2485 bindinfo.dwOptionsFlags = 15;
2486 bindinfo.dwCodePage = 16;
2487 bindinfo.securityAttributes.nLength = 30;
2488 bindinfo.securityAttributes.lpSecurityDescriptor = (void*)0xdead0001;
2489 bindinfo.securityAttributes.bInheritHandle = 31;
2490 bindinfo.iid.Data1 = 17;
2491 bindinfo.pUnk = (IUnknown*)0xdeadbeef;
2492 bindinfo.dwReserved = 18;
2493 bindinfo.stgmedData.pUnkForRelease = &unk_in.IUnknown_iface;
2494 unk_in.ref = 1;
2495
2496 memset(&rem_bindinfo, 0, sizeof(bindinfo));
2497 rem_bindinfo.cbSize = sizeof(rem_bindinfo);
2498 rem_bindinfo.szExtraInfo = extra_info_out = a2co("extra info out");
2499 rem_bindinfo.grfBindInfoF = 22;
2500 rem_bindinfo.dwBindVerb = 23;
2501 rem_bindinfo.szCustomVerb = verb_out = a2co("custom verb out");
2502 rem_bindinfo.cbstgmedData = 29;
2503 rem_bindinfo.dwOptions = 24;
2504 rem_bindinfo.dwOptionsFlags = 25;
2505 rem_bindinfo.dwCodePage = 16;
2506 rem_bindinfo.securityAttributes.nLength = 40;
2507 rem_bindinfo.securityAttributes.lpSecurityDescriptor = (void*)0xdead0002;
2508 rem_bindinfo.securityAttributes.bInheritHandle = 41;
2509 rem_bindinfo.iid.Data1 = 27;
2510 rem_bindinfo.pUnk = (IUnknown*)0xdeadbeef;
2511 rem_bindinfo.dwReserved = 18;
2512 rem_bindinfo.stgmedData.pUnkForRelease = &unk_out.IUnknown_iface;
2513 unk_out.ref = 1;
2514
2515 hres = IBindStatusCallbackEx_GetBindInfoEx(callbackex, &bindf, &bindinfo, &bindf2, &reserved);
2516 ok(hres == S_OK, "GetBindInfo failed: %08lx\n", hres);
2517 ok(bindf == rem_bindf, "bindf = %lx, expected %lx\n", bindf, rem_bindf);
2518 ok(bindf2 == 11, "bindf2 = %lx\n", bindf);
2519 ok(reserved == 12, "reserved = %lx\n", reserved);
2520
2521 ok(in_bindinfo.cbSize == sizeof(in_bindinfo), "cbSize = %lu\n", in_bindinfo.cbSize);
2522 ok(!in_bindinfo.szExtraInfo, "szExtraInfo = %s\n", wine_dbgstr_w(in_bindinfo.szExtraInfo));
2523 ok(in_bindinfo.grfBindInfoF == 12, "cbSize = %lu\n", in_bindinfo.grfBindInfoF);
2524 ok(in_bindinfo.dwBindVerb == 13, "dwBindVerb = %lu\n", in_bindinfo.dwBindVerb);
2525 ok(!in_bindinfo.szCustomVerb, "szCustomVerb = %s\n", wine_dbgstr_w(in_bindinfo.szCustomVerb));
2526 ok(in_bindinfo.cbstgmedData == 19, "cbstgmedData = %lu\n", in_bindinfo.cbstgmedData);
2527 ok(!in_bindinfo.dwOptions, "dwOptions = %lu\n", in_bindinfo.dwOptions);
2528 ok(!in_bindinfo.dwOptionsFlags, "dwOptionsFlags = %lu\n", in_bindinfo.dwOptionsFlags);
2529 ok(!in_bindinfo.dwCodePage, "dwCodePage = %lu\n", in_bindinfo.dwCodePage);
2530 ok(!in_bindinfo.iid.Data1, "iid = %s\n", debugstr_guid(&in_bindinfo.iid));
2531 ok(!in_bindinfo.pUnk, "pUnk = %p\n", in_bindinfo.pUnk);
2532 ok(!in_bindinfo.dwReserved, "dwReserved = %lu\n", in_bindinfo.dwReserved);
2533 ok(!in_bindinfo.securityAttributes.nLength, "securityAttributes.nLength = %lu\n",
2534 in_bindinfo.securityAttributes.nLength);
2535 ok(!in_bindinfo.securityAttributes.lpSecurityDescriptor,
2536 "securityAttributes.lpSecurityDescriptor = %p\n",
2537 in_bindinfo.securityAttributes.lpSecurityDescriptor);
2538 ok(!in_bindinfo.securityAttributes.bInheritHandle, "securityAttributes.bInheritHandle = %u\n",
2539 in_bindinfo.securityAttributes.bInheritHandle);
2540 ok(!in_bindinfo.stgmedData.pUnkForRelease, "pUnkForRelease = %p\n",
2541 in_bindinfo.stgmedData.pUnkForRelease);
2542
2543 ok(bindinfo.cbSize == sizeof(rem_bindinfo), "cbSize = %lu\n", rem_bindinfo.cbSize);
2544 ok(!lstrcmpW(bindinfo.szExtraInfo, L"extra info out"),
2545 "szExtraInfo = %s\n", wine_dbgstr_w(bindinfo.szExtraInfo));
2546 ok(bindinfo.grfBindInfoF == 22, "grfBindInfoF = %lu\n", rem_bindinfo.grfBindInfoF);
2547 ok(bindinfo.dwBindVerb == 23, "dwBindVerb = %lu\n", bindinfo.dwBindVerb);
2548 ok(!lstrcmpW(bindinfo.szCustomVerb, L"custom verb out"), "szCustomVerb = %s\n",
2549 wine_dbgstr_w(bindinfo.szCustomVerb));
2550 ok(bindinfo.cbstgmedData == 29, "cbstgmedData = %lu\n", bindinfo.cbstgmedData);
2551 ok(bindinfo.dwOptions == 24, "dwOptions = %lu\n", bindinfo.dwOptions);
2552 ok(bindinfo.dwOptionsFlags == 25, "dwOptionsFlags = %lu\n", bindinfo.dwOptionsFlags);
2553 ok(bindinfo.dwCodePage, "dwCodePage = %lu\n", bindinfo.dwCodePage);
2554 ok(!bindinfo.iid.Data1, "iid = %s\n", debugstr_guid(&bindinfo.iid));
2555 ok(!bindinfo.pUnk, "pUnk = %p\n", bindinfo.pUnk);
2556 ok(bindinfo.dwReserved == 18, "dwReserved = %lu\n", bindinfo.dwReserved);
2557 ok(bindinfo.securityAttributes.nLength == 30, "securityAttributes.nLength = %lu\n",
2558 bindinfo.securityAttributes.nLength);
2559 ok(bindinfo.securityAttributes.lpSecurityDescriptor == (void*)0xdead0001,
2560 "securityAttributes.lpSecurityDescriptor = %p\n",
2561 bindinfo.securityAttributes.lpSecurityDescriptor);
2562 ok(bindinfo.securityAttributes.bInheritHandle == 31, "securityAttributes.bInheritHandle = %u\n",
2563 bindinfo.securityAttributes.bInheritHandle);
2564 ok(bindinfo.stgmedData.pUnkForRelease == &unk_in.IUnknown_iface, "pUnkForRelease = %p\n",
2565 bindinfo.stgmedData.pUnkForRelease);
2566 ok(unk_out.ref == 1, "unk_out.ref = %lu\n", unk_out.ref);
2567
2568 bindinfo.stgmedData.pUnkForRelease = NULL;
2569 ReleaseBindInfo(&bindinfo);
2570
2571 zero.QuadPart = 0;
2572 hres = IStream_Seek(binding_stream, zero, STREAM_SEEK_SET, NULL);
2573 ok(hres == S_OK, "Seek failed: 0x%08lx\n", hres);
2574
2575 /* Return IStream stgmed from GetBindInfoEx, it's not marshaled back */
2576 rem_bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA;
2577 bindf = bindf2 = reserved = 0xdeadbeef;
2578
2579 memset(&bindinfo, 0, sizeof(bindinfo));
2580 bindinfo.cbSize = sizeof(bindinfo);
2581
2582 memset(&rem_bindinfo, 0, sizeof(rem_bindinfo));
2583 rem_bindinfo.cbSize = sizeof(rem_bindinfo);
2584
2585 rem_bindinfo.stgmedData.tymed = TYMED_ISTREAM;
2586 rem_bindinfo.stgmedData.pstm = binding_stream;
2587 rem_bindinfo.cbstgmedData = 3;
2588 IStream_AddRef(binding_stream);
2589
2590 hres = IBindStatusCallbackEx_GetBindInfoEx(callbackex, &bindf, &bindinfo, &bindf2, &reserved);
2591 ok(hres == S_OK, "GetBindInfoEx failed: %08lx\n", hres);
2592 ok(bindf == rem_bindf, "bindf = %lx, expected %lx\n", bindf, rem_bindf);
2593
2594 ok(in_bindinfo.cbSize == sizeof(in_bindinfo), "cbSize = %lu\n", in_bindinfo.cbSize);
2595 ok(!in_bindinfo.pUnk, "pUnk = %p\n", in_bindinfo.pUnk);
2596 ok(in_bindinfo.stgmedData.tymed == TYMED_NULL, "tymed = %lu\n",
2597 in_bindinfo.stgmedData.tymed);
2598
2599 ok(bindinfo.cbSize == sizeof(bindinfo), "cbSize = %lu\n", bindinfo.cbSize);
2600 ok(!bindinfo.pUnk, "pUnk = %p\n", bindinfo.pUnk);
2601 ok(bindinfo.stgmedData.tymed == TYMED_NULL, "tymed = %lu\n",
2602 bindinfo.stgmedData.tymed);
2603 ok(!bindinfo.stgmedData.pstm, "stm = %p\n",
2604 bindinfo.stgmedData.pstm);
2605 ok(!bindinfo.stgmedData.pUnkForRelease, "pUnkForRelease = %p\n",
2606 bindinfo.stgmedData.pUnkForRelease);
2607 ok(bindinfo.cbstgmedData == 3, "cbstgmedData = %lu\n", bindinfo.cbstgmedData);
2608
2609 ReleaseBindInfo(&bindinfo);
2610
2611 /* Same, but with pUnkForRelease, it's not marshaled back */
2612 rem_bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA;
2613 bindf = bindf2 = reserved = 0xdeadbeef;
2614
2615 memset(&bindinfo, 0, sizeof(bindinfo));
2616 bindinfo.cbSize = sizeof(bindinfo);
2617
2618 memset(&rem_bindinfo, 0, sizeof(rem_bindinfo));
2619 rem_bindinfo.cbSize = sizeof(rem_bindinfo);
2620
2621 rem_bindinfo.stgmedData.tymed = TYMED_ISTREAM;
2622 rem_bindinfo.stgmedData.pstm = binding_stream;
2623 rem_bindinfo.stgmedData.pUnkForRelease = &unk_out.IUnknown_iface;
2624 unk_out.ref = 1;
2625 rem_bindinfo.cbstgmedData = 3;
2626 IStream_AddRef(binding_stream);
2627
2628 hres = IBindStatusCallbackEx_GetBindInfoEx(callbackex, &bindf, &bindinfo, &bindf2, &reserved);
2629 ok(hres == S_OK, "GetBindInfoEx failed: %08lx\n", hres);
2630 ok(bindf == rem_bindf, "bindf = %lx, expected %lx\n", bindf, rem_bindf);
2631
2632 ok(in_bindinfo.cbSize == sizeof(in_bindinfo), "cbSize = %lu\n", in_bindinfo.cbSize);
2633 ok(!in_bindinfo.pUnk, "pUnk = %p\n", in_bindinfo.pUnk);
2634 ok(in_bindinfo.stgmedData.tymed == TYMED_NULL, "tymed = %lu\n",
2635 in_bindinfo.stgmedData.tymed);
2636
2637 ok(bindinfo.cbSize == sizeof(bindinfo), "cbSize = %lu\n", bindinfo.cbSize);
2638 ok(!bindinfo.pUnk, "pUnk = %p\n", bindinfo.pUnk);
2639 ok(bindinfo.stgmedData.tymed == TYMED_NULL, "tymed = %lu\n",
2640 bindinfo.stgmedData.tymed);
2641 ok(!bindinfo.stgmedData.pstm, "stm = %p\n",
2642 bindinfo.stgmedData.pstm);
2643 ok(!bindinfo.stgmedData.pUnkForRelease, "pUnkForRelease = %p\n",
2644 bindinfo.stgmedData.pUnkForRelease);
2645 ok(bindinfo.cbstgmedData == 3, "cbstgmedData = %lu\n", bindinfo.cbstgmedData);
2646
2647 ReleaseBindInfo(&bindinfo);
2648
2649 /* Return HGLOBAL stgmed from GetBindInfoEx, it's not marshaled back */
2650 rem_bindf = BINDF_ASYNCHRONOUS | BINDF_ASYNCSTORAGE | BINDF_PULLDATA;
2651 bindf = bindf2 = reserved = 0xdeadbeef;
2652
2653 memset(&bindinfo, 0, sizeof(bindinfo));
2654 bindinfo.cbSize = sizeof(bindinfo);
2655
2656 memset(&rem_bindinfo, 0, sizeof(rem_bindinfo));
2657 rem_bindinfo.cbSize = sizeof(rem_bindinfo);
2658
2659 rem_bindinfo.stgmedData.tymed = TYMED_HGLOBAL;
2660
2661 buf = GlobalAlloc(0, 5);
2662 strcpy(buf, "test");
2663 rem_bindinfo.stgmedData.hGlobal = buf;
2664 rem_bindinfo.cbstgmedData = 5;
2665
2666 hres = IBindStatusCallbackEx_GetBindInfoEx(callbackex, &bindf, &bindinfo, &bindf2, &reserved);
2667 ok(hres == S_OK, "GetBindInfoEx failed: %08lx\n", hres);
2668 ok(bindf == rem_bindf, "bindf = %lx, expected %lx\n", bindf, rem_bindf);
2669
2670 ok(in_bindinfo.cbSize == sizeof(in_bindinfo), "cbSize = %lu\n", in_bindinfo.cbSize);
2671 ok(!in_bindinfo.pUnk, "pUnk = %p\n", in_bindinfo.pUnk);
2672 ok(in_bindinfo.stgmedData.tymed == TYMED_NULL, "tymed = %lu\n",
2673 in_bindinfo.stgmedData.tymed);
2674
2675 ok(bindinfo.cbSize == sizeof(bindinfo), "cbSize = %lu\n", bindinfo.cbSize);
2676 ok(!bindinfo.pUnk, "pUnk = %p\n", bindinfo.pUnk);
2677 ok(bindinfo.stgmedData.tymed == TYMED_NULL, "tymed = %lu\n",
2678 bindinfo.stgmedData.tymed);
2679 ok(!bindinfo.stgmedData.pstm, "stm = %p\n",
2680 bindinfo.stgmedData.pstm);
2681 ok(!bindinfo.stgmedData.pUnkForRelease, "pUnkForRelease = %p\n",
2682 bindinfo.stgmedData.pUnkForRelease);
2683 ok(bindinfo.cbstgmedData == 5, "cbstgmedData = %lu\n", bindinfo.cbstgmedData);
2684
2685 ReleaseBindInfo(&bindinfo);
2686
2687 IBindStatusCallbackEx_Release(callbackex);
2688 }else {
2689 win_skip("IBindStatusCallbackEx not supported\n");
2690 }
2691
2692 /* Test marshaling stgmed from OnDataAvailable */
2693 memset(&in_stgmed, 0xcc, sizeof(in_stgmed));
2694 stgmed.tymed = TYMED_ISTREAM;
2695 stgmed.pstm = binding_stream;
2696 stgmed.pUnkForRelease = NULL;
2697
2698 hres = IBindStatusCallback_OnDataAvailable(bsc, 1, 10, &formatetc, &stgmed);
2699 ok(hres == S_OK, "OnDataAvailable failed: %08lx\n", hres);
2700
2701 ok(in_stgmed.tymed == TYMED_ISTREAM, "tymed = %lu\n", in_stgmed.tymed);
2702 ok(in_stgmed.pstm != NULL, "pstm = NULL\n");
2703 ok(!in_stgmed.pUnkForRelease, "pUnkForRelease = %p\n", in_stgmed.pUnkForRelease);
2704
2705 /* OnDataAvailable with both IStream and pUnkForRelease */
2706 memset(&in_stgmed, 0xcc, sizeof(in_stgmed));
2707 stgmed.tymed = TYMED_ISTREAM;
2708 stgmed.pstm = binding_stream;
2709 stgmed.pUnkForRelease = &unk_in.IUnknown_iface;
2710 unk_in.ref = 1;
2711
2712 hres = IBindStatusCallback_OnDataAvailable(bsc, 1, 10, &formatetc, &stgmed);
2713 ok(hres == S_OK, "OnDataAvailable failed: %08lx\n", hres);
2714
2715 ok(in_stgmed.tymed == TYMED_ISTREAM, "tymed = %lu\n", in_stgmed.tymed);
2716 ok(in_stgmed.pstm != NULL, "pstm = NULL\n");
2717 ok(in_stgmed.pUnkForRelease != NULL, "pUnkForRelease = %p\n", in_stgmed.pUnkForRelease);
2718 ok(unk_in.ref > 1, "ref = %lu\n", unk_in.ref);
2719
2720 /* OnDataAvailable with TYMED_ISTREAM, but NULL stream */
2721 memset(&in_stgmed, 0xcc, sizeof(in_stgmed));
2722 stgmed.tymed = TYMED_ISTREAM;
2723 stgmed.pstm = binding_stream;
2724 stgmed.pUnkForRelease = NULL;
2725
2726 hres = IBindStatusCallback_OnDataAvailable(bsc, 1, 10, &formatetc, &stgmed);
2727 ok(hres == S_OK, "OnDataAvailable failed: %08lx\n", hres);
2728
2729 ok(in_stgmed.tymed == TYMED_ISTREAM, "tymed = %lu\n", in_stgmed.tymed);
2730 ok(in_stgmed.pstm != NULL, "pstm = NULL\n");
2731 ok(!in_stgmed.pUnkForRelease, "pUnkForRelease = %p\n", in_stgmed.pUnkForRelease);
2732
2733 /* OnDataAvailable with TYMED_NULL and pUnkForRelease */
2734 memset(&in_stgmed, 0xcc, sizeof(in_stgmed));
2735 stgmed.tymed = TYMED_NULL;
2736 stgmed.pstm = binding_stream;
2737 stgmed.pUnkForRelease = &unk_in.IUnknown_iface;
2738 unk_in.ref = 1;
2739
2740 hres = IBindStatusCallback_OnDataAvailable(bsc, 1, 10, &formatetc, &stgmed);
2741 ok(hres == S_OK, "OnDataAvailable failed: %08lx\n", hres);
2742
2743 ok(in_stgmed.tymed == TYMED_NULL, "tymed = %lu\n", in_stgmed.tymed);
2744 ok(!in_stgmed.pstm, "pstm != NULL\n");
2745 ok(in_stgmed.pUnkForRelease != NULL, "pUnkForRelease = %p\n", in_stgmed.pUnkForRelease);
2746 ok(unk_in.ref == 1, "ref = %lu\n", unk_in.ref);
2747
2748 IStream_Release(binding_stream);
2749 IBindStatusCallback_Release(bsc);
2750
2752}
2753
2755{
2756 /* Undocumented structure of unknown size, crashes if it's too small (with arbitrary values from stack) */
2757 struct
2758 {
2759 DWORD version;
2760 char unknown[252];
2761 } arg;
2762 static char test_str[] = "test";
2763 const char *custom_ua_msg = "";
2764 HRESULT hres;
2765 unsigned i;
2766 WCHAR *ua;
2767
2768 if(!pMapBrowserEmulationModeToUserAgent) {
2769 win_skip("MapBrowserEmulationModeToUserAgent not available\n");
2770 return;
2771 }
2772 memset(&arg, 0, sizeof(arg));
2773
2774 if(custom_ua) {
2775 hres = UrlMkSetSessionOption(URLMON_OPTION_USERAGENT, test_str, sizeof(test_str), 0);
2776 ok(hres == S_OK, "UrlMkSetSessionOption failed: %08lx\n", hres);
2777 custom_ua_msg = " (with custom ua)";
2778 }
2779
2780 for(i = 0; i < 12; i++) {
2781 arg.version = i;
2782 ua = (WCHAR*)0xdeadbeef;
2783 hres = pMapBrowserEmulationModeToUserAgent(&arg, &ua);
2784 ok(hres == (i == 5 || i >= 7 || custom_ua ? S_OK : E_FAIL),
2785 "[%u] MapBrowserEmulationModeToUserAgent%s returned %08lx\n", i, custom_ua_msg, hres);
2786 if(hres != S_OK)
2787 ok(ua == NULL, "[%u] ua%s = %p\n", i, custom_ua_msg, ua);
2788 else {
2789 char buf[1024];
2790 DWORD size = sizeof(buf);
2791 WCHAR *ua2;
2792
2793 if(custom_ua)
2794 ua2 = a2co(test_str);
2795 else {
2796 hres = pObtainUserAgentString(i, buf, &size);
2797 ok(hres == S_OK, "[%u] ObtainUserAgentString%s failed: %08lx\n", i, custom_ua_msg, hres);
2798 ua2 = a2co(buf);
2799 }
2800 ok(!lstrcmpW(ua, ua2), "[%u] ua%s = %s, expected %s\n", i, custom_ua_msg, wine_dbgstr_w(ua), wine_dbgstr_w(ua2));
2801 CoTaskMemFree(ua2);
2802 CoTaskMemFree(ua);
2803 }
2804 }
2805}
2806
2808{
2809 HMODULE hurlmon;
2810 int argc;
2811 char **argv;
2812
2814
2815 hurlmon = GetModuleHandleA("urlmon.dll");
2816 pCoInternetCompareUrl = (void *) GetProcAddress(hurlmon, "CoInternetCompareUrl");
2817 pCoInternetGetSecurityUrl = (void*) GetProcAddress(hurlmon, "CoInternetGetSecurityUrl");
2818 pCoInternetGetSession = (void*) GetProcAddress(hurlmon, "CoInternetGetSession");
2819 pCoInternetParseUrl = (void*) GetProcAddress(hurlmon, "CoInternetParseUrl");
2820 pCoInternetQueryInfo = (void*) GetProcAddress(hurlmon, "CoInternetQueryInfo");
2821 pCopyStgMedium = (void*) GetProcAddress(hurlmon, "CopyStgMedium");
2822 pCopyBindInfo = (void*) GetProcAddress(hurlmon, "CopyBindInfo");
2823 pFindMimeFromData = (void*) GetProcAddress(hurlmon, "FindMimeFromData");
2824 pObtainUserAgentString = (void*) GetProcAddress(hurlmon, "ObtainUserAgentString");
2825 pReleaseBindInfo = (void*) GetProcAddress(hurlmon, "ReleaseBindInfo");
2826 pUrlMkGetSessionOption = (void*) GetProcAddress(hurlmon, "UrlMkGetSessionOption");
2827 pCompareSecurityIds = (void*) GetProcAddress(hurlmon, "CompareSecurityIds");
2828 pCoInternetIsFeatureEnabled = (void*) GetProcAddress(hurlmon, "CoInternetIsFeatureEnabled");
2829 pCoInternetSetFeatureEnabled = (void*) GetProcAddress(hurlmon, "CoInternetSetFeatureEnabled");
2830 pIEInstallScope = (void*) GetProcAddress(hurlmon, "IEInstallScope");
2831 pMapBrowserEmulationModeToUserAgent = (void*) GetProcAddress(hurlmon, (const char*)445);
2832
2833 if (!pCoInternetCompareUrl || !pCoInternetGetSecurityUrl ||
2834 !pCoInternetGetSession || !pCoInternetParseUrl || !pCompareSecurityIds) {
2835 win_skip("Various needed functions not present, too old IE\n");
2836 return;
2837 }
2838
2840
2841 if(argc <= 2 || strcmp(argv[2], "internet_features")) {
2843
2862 }
2863
2865
2867}
#define InterlockedIncrement
Definition: armddk.h:53
#define InterlockedDecrement
Definition: armddk.h:52
#define trace
Definition: atltest.h:70
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define broken(x)
Definition: atltest.h:178
#define START_TEST(x)
Definition: atltest.h:75
#define msg(x)
Definition: auth_time.c:54
#define ARRAY_SIZE(A)
Definition: main.h:20
static HANDLE thread
Definition: service.c:33
const GUID IID_IUnknown
const GUID IID_IClassFactory
#define RegCloseKey(hKey)
Definition: registry.h:49
_In_ size_t const _In_ int _In_ bool const _In_ unsigned const _In_ __acrt_rounding_mode const _Inout_ __crt_cached_ptd_host & ptd
Definition: cvt.cpp:355
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_INVALIDARG
Definition: ddrawi.h:101
#define E_NOTIMPL
Definition: ddrawi.h:99
#define E_FAIL
Definition: ddrawi.h:102
#define free
Definition: debug_ros.c:5
#define malloc
Definition: debug_ros.c:4
HRESULT hr
Definition: delayimp.cpp:582
#define ERROR_SUCCESS
Definition: deptool.c:10
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LONG WINAPI RegCreateKeyA(HKEY hKey, LPCSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:1179
LONG WINAPI RegSetValueExA(HKEY hKey, LPCSTR lpValueName, DWORD Reserved, DWORD dwType, CONST BYTE *lpData, DWORD cbData)
Definition: reg.c:4799
LONG WINAPI RegOpenKeyA(HKEY hKey, LPCSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:3234
LONG WINAPI RegDeleteValueA(HKEY hKey, LPCSTR lpValueName)
Definition: reg.c:2287
LONG WINAPI RegDeleteKeyA(_In_ HKEY hKey, _In_ LPCSTR lpSubKey)
Definition: reg.c:1224
BOOL WINAPI InitializeSecurityDescriptor(PSECURITY_DESCRIPTOR pSecurityDescriptor, DWORD dwRevision)
Definition: security.c:929
HRESULT WINAPI DECLSPEC_HOTPATCH CoGetClassObject(REFCLSID rclsid, DWORD clscontext, COSERVERINFO *server_info, REFIID riid, void **obj)
Definition: combase.c:1925
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: combase.c:2842
HRESULT WINAPI CreateStreamOnHGlobal(HGLOBAL hGlobal, BOOL delete_on_release, IStream **stream)
void *WINAPI CoTaskMemAlloc(SIZE_T size)
Definition: malloc.c:381
void WINAPI CoTaskMemFree(void *ptr)
Definition: malloc.c:389
HRESULT WINAPI CoMarshalInterface(IStream *stream, REFIID riid, IUnknown *unk, DWORD dest_context, void *pvDestContext, DWORD mshlFlags)
Definition: marshal.c:483
HRESULT WINAPI CoUnmarshalInterface(IStream *stream, REFIID riid, void **ppv)
Definition: marshal.c:793
static const WCHAR empty[1]
Definition: string.c:47
static WCHAR unknown[MAX_STRING_RESOURCE_LEN]
Definition: object.c:1674
#define CloseHandle
Definition: compat.h:739
struct _SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES
#define CP_ACP
Definition: compat.h:109
#define GetProcAddress(x, y)
Definition: compat.h:753
#define GetCurrentProcess()
Definition: compat.h:759
#define IsWow64Process
Definition: compat.h:760
#define MAX_PATH
Definition: compat.h:34
#define MultiByteToWideChar
Definition: compat.h:110
#define ERROR_ACCESS_DENIED
Definition: compat.h:97
#define lstrlenW
Definition: compat.h:750
static const WCHAR version[]
Definition: asmname.c:66
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
DWORD WINAPI GetModuleFileNameA(HINSTANCE hModule, LPSTR lpFilename, DWORD nSize)
Definition: loader.c:539
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
Definition: thread.c:137
BOOL WINAPI TerminateThread(IN HANDLE hThread, IN DWORD dwExitCode)
Definition: thread.c:587
BOOL WINAPI GetVersionExW(IN LPOSVERSIONINFOW lpVersionInformation)
Definition: version.c:37
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4152
BOOL WINAPI DECLSPEC_HOTPATCH CreateProcessA(const char *app_name, char *cmd_line, SECURITY_ATTRIBUTES *process_attr, SECURITY_ATTRIBUTES *thread_attr, BOOL inherit, DWORD flags, void *env, const char *cur_dir, STARTUPINFOA *startup_info, PROCESS_INFORMATION *info)
Definition: process.c:686
MonoAssembly int argc
Definition: metahost.c:107
static MonoProfilerRuntimeShutdownBeginCallback cb
Definition: metahost.c:118
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
Definition: wcs.c:2988
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1977
_ACRTIMP int __cdecl memcmp(const void *, const void *, size_t)
Definition: string.c:2807
_ACRTIMP char *__cdecl strchr(const char *, int)
Definition: string.c:3291
_ACRTIMP size_t __cdecl strlen(const char *)
Definition: string.c:1597
_ACRTIMP char *__cdecl strstr(const char *, const char *)
Definition: string.c:3420
_ACRTIMP int __cdecl strcmp(const char *, const char *)
Definition: string.c:3324
_ACRTIMP char *__cdecl strrchr(const char *, int)
Definition: string.c:3303
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:531
HRESULT WINAPI DECLSPEC_HOTPATCH OleInitialize(LPVOID reserved)
Definition: ole2.c:162
void WINAPI ReleaseStgMedium(STGMEDIUM *pmedium)
Definition: ole2.c:2014
void WINAPI DECLSPEC_HOTPATCH OleUninitialize(void)
Definition: ole2.c:218
HRESULT WINAPI CreateFormatEnumerator(UINT cfmtetc, FORMATETC *rgfmtetc, IEnumFORMATETC **ppenumfmtetc)
Definition: format.c:177
HRESULT WINAPI RegisterFormatEnumerator(LPBC pBC, IEnumFORMATETC *pEFetc, DWORD reserved)
Definition: format.c:194
static WCHAR wszEnumFORMATETC[]
Definition: format.c:24
HRESULT WINAPI RevokeFormatEnumerator(LPBC pbc, IEnumFORMATETC *pEFetc)
Definition: format.c:210
static const WCHAR fileW[]
Definition: sec_mgr.c:40
HRESULT WINAPI UrlMkSetSessionOption(DWORD dwOption, LPVOID pBuffer, DWORD dwBufferLength, DWORD Reserved)
Definition: session.c:680
unsigned int(__cdecl typeof(jpeg_read_scanlines))(struct jpeg_decompress_struct *
Definition: typeof.h:31
static void *static void *static LPDIRECTPLAY IUnknown * pUnk
Definition: dplayx.c:30
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
r reserved
Definition: btrfs.c:3006
#define INFINITE
Definition: serial.h:102
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLuint res
Definition: glext.h:9613
GLenum src
Definition: glext.h:6340
GLsizeiptr size
Definition: glext.h:5919
GLboolean GLboolean GLboolean b
Definition: glext.h:6204
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLenum GLenum dst
Definition: glext.h:6340
GLfloat GLfloat p
Definition: glext.h:8902
GLboolean enable
Definition: glext.h:11120
GLenum GLsizei len
Definition: glext.h:6722
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
HGLOBAL NTAPI GlobalFree(HGLOBAL hMem)
Definition: heapmem.c:611
UINT NTAPI GlobalFlags(HGLOBAL hMem)
Definition: heapmem.c:520
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
Definition: heapmem.c:1190
HGLOBAL NTAPI GlobalAlloc(UINT uFlags, SIZE_T dwBytes)
Definition: heapmem.c:368
SIZE_T NTAPI GlobalSize(HGLOBAL hMem)
Definition: heapmem.c:1090
REFIID riid
Definition: atlbase.h:39
REFIID LPVOID * ppv
Definition: atlbase.h:39
static CInternetFolder * CreateInstance(void)
Definition: inetfolder.c:330
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
static ERESOURCE GlobalLock
Definition: sys_arch.c:8
#define b
Definition: ke_i.h:79
#define debugstr_guid
Definition: kernel32.h:35
#define debugstr_w
Definition: kernel32.h:32
#define wine_dbgstr_w
Definition: kernel32.h:34
const WCHAR * schema
static const WCHAR text_plainW[]
Definition: mimefilter.c:507
static const WCHAR image_pjpegW[]
Definition: mimefilter.c:491
int winetest_debug
#define win_skip
Definition: minitest.h:67
#define todo_wine_if(is_todo)
Definition: minitest.h:81
#define todo_wine
Definition: minitest.h:80
#define memcpy(s1, s2, n)
Definition: mkisofs.h:878
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
PSDBQUERYRESULT_VISTA PVOID DWORD * dwSize
Definition: env.c:56
#define sprintf
Definition: sprintf.c:45
static LPSTR
Definition: misc.c:33
static LPCWSTR
Definition: misc.c:36
BOOL todo
Definition: filedlg.c:313
HRESULT hres
Definition: protocol.c:465
static DWORD bindf
Definition: protocol.c:70
static PROCESS_INFORMATION pi
Definition: debugger.c:2303
static SYSTEM_INFO si
Definition: virtual.c:39
static char * dest
Definition: rtl.c:149
#define SET_EXPECT(func)
Definition: misc.c:44
#define CHECK_EXPECT(func)
Definition: misc.c:53
#define DEFINE_EXPECT(func)
Definition: misc.c:41
#define CHECK_EXPECT2(func)
Definition: misc.c:47
#define CHECK_CALLED(func)
Definition: misc.c:59
static const WCHAR wszHttpWineHQ[]
Definition: misc.c:308
static RefUnk unk_in
Definition: misc.c:2198
static BYTE data94[]
Definition: misc.c:585
static IClassFactory test_protocol_cf2
Definition: misc.c:1001
static BINDINFO rem_bindinfo
Definition: misc.c:2048
static void test_MkParseDisplayNameEx(void)
Definition: misc.c:1697
static BYTE data1[]
Definition: misc.c:492
static const WCHAR url6[]
Definition: misc.c:285
BOOL enable
Definition: misc.c:1974
static HANDLE thread_ready
Definition: misc.c:2200
static IInternetProtocolInfo protocol_info
Definition: misc.c:929
static BYTE data11[]
Definition: misc.c:502
static DWORD WINAPI bsc_thread(void *arg)
Definition: misc.c:2202
static BYTE data61[]
Definition: misc.c:552
static void test_internet_features_registry(void)
Definition: misc.c:1864
static const IClassFactoryVtbl ProtocolCFVtbl
Definition: misc.c:992
static BYTE data79[]
Definition: misc.c:570
static BYTE data43[]
Definition: misc.c:534
static ULONG WINAPI RefUnk_Release(IUnknown *iface)
Definition: misc.c:2186
static BYTE data81[]
Definition: misc.c:572
static HRESULT WINAPI ClassFactory_LockServer(IClassFactory *iface, BOOL dolock)
Definition: misc.c:978
static void test_RegisterFormatEnumerator(void)
Definition: misc.c:204
static WCHAR **static WCHAR * a2co(const char *str)
Definition: misc.c:86
static const WCHAR wszEmpty[]
Definition: misc.c:304
HRESULT set_expected
Definition: misc.c:1975
static const WCHAR wszRes[]
Definition: misc.c:300
static void test_ReleaseBindInfo(void)
Definition: misc.c:1202
static BYTE data70[]
Definition: misc.c:561
static HRESULT WINAPI ClassFactory_CreateInstance(IClassFactory *iface, IUnknown *pOuter, REFIID riid, void **ppv)
Definition: misc.c:957
static DWORD rem_bindf
Definition: misc.c:2049
static BYTE data40[]
Definition: misc.c:531
static BINDINFO in_bindinfo
Definition: misc.c:2048
static void test_MimeFilter(void)
Definition: misc.c:1163
static HRESULT WINAPI InternetProtocolInfo_QueryInfo(IInternetProtocolInfo *iface, LPCWSTR pwzUrl, QUERYOPTION OueryOption, DWORD dwQueryFlags, LPVOID pBuffer, DWORD cbBuffer, DWORD *pcbBuf, DWORD dwReserved)
Definition: misc.c:911
static const IClassFactoryVtbl ClassFactoryVtbl
Definition: misc.c:984
static HRESULT WINAPI RefUnk_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
Definition: misc.c:2168
static BYTE data6[]
Definition: misc.c:497
static HRESULT WINAPI BindStatusCallback_GetPriority(IBindStatusCallbackEx *iface, LONG *pnPriority)
Definition: misc.c:2081
static BYTE data31[]
Definition: misc.c:522
static void test_CoInternetIsFeatureEnabled(void)
Definition: misc.c:1964
static BYTE data72[]
Definition: misc.c:563
const WCHAR * proposed_mime
Definition: misc.c:598
static BYTE data95[]
Definition: misc.c:586
static void test_CoInternetSetFeatureEnabled(void)
Definition: misc.c:1986
static BYTE data86[]
Definition: misc.c:577
static const WCHAR url1[]
Definition: misc.c:277
static void test_CoInternetCompareUrl(void)
Definition: misc.c:417
static BYTE data37[]
Definition: misc.c:528
static BYTE data93[]
Definition: misc.c:584
static BYTE data50[]
Definition: misc.c:541
static BYTE data42[]
Definition: misc.c:533
static BYTE data21[]
Definition: misc.c:512
static RefUnk unk_out
Definition: misc.c:2198
HRESULT expected
Definition: misc.c:1809
static BYTE data8[]
Definition: misc.c:499
static const WCHAR url5[]
Definition: misc.c:283
static void test_NameSpace(void)
Definition: misc.c:1004
BOOL get_todo
Definition: misc.c:1979
static const struct parse_test parse_tests[]
Definition: misc.c:326
static RefUnk * impl_from_IUnknown(IUnknown *iface)
Definition: misc.c:2163
static HRESULT WINAPI BindStatusCallback_GetBindInfo(IBindStatusCallbackEx *iface, DWORD *grfBINDF, BINDINFO *pbindinfo)
Definition: misc.c:2106
static const char * szFeatureControlKey
Definition: misc.c:1862
static BYTE data56[]
Definition: misc.c:547
static const WCHAR url4[]
Definition: misc.c:281
BOOL broken_failure
Definition: misc.c:477
static HRESULT WINAPI BindStatusCallback_OnObjectAvailable(IBindStatusCallbackEx *iface, REFIID riid, IUnknown *punk)
Definition: misc.c:2124
static ULONG WINAPI ClassFactory_Release(IClassFactory *iface)
Definition: misc.c:952
static BYTE data26[]
Definition: misc.c:517
static ULONG WINAPI unk_Release(IUnknown *iface)
Definition: misc.c:1190
static BYTE data98[]
Definition: misc.c:589
static const struct @1880 internet_feature_tests[]
static IClassFactory test_cf
Definition: misc.c:1002
static HRESULT WINAPI ProtocolCF_CreateInstance(IClassFactory *iface, IUnknown *pOuter, REFIID riid, void **ppv)
Definition: misc.c:964
static void test_CopyBindInfo(void)
Definition: misc.c:1310
static BYTE data71[]
Definition: misc.c:562
static BYTE data67[]
Definition: misc.c:558
static BYTE data89[]
Definition: misc.c:580
static const WCHAR wszGoogle[]
Definition: misc.c:305
static BYTE data16[]
Definition: misc.c:507
static HRESULT qiret
Definition: misc.c:931
static BYTE data78[]
Definition: misc.c:569
INTERNETFEATURELIST feature
Definition: misc.c:1807
static BYTE data41[]
Definition: misc.c:532
static BYTE data45[]
Definition: misc.c:536
static BYTE data53[]
Definition: misc.c:544
static HRESULT WINAPI BindStatusCallback_OnProgress(IBindStatusCallbackEx *iface, ULONG ulProgress, ULONG ulProgressMax, ULONG ulStatusCode, LPCWSTR szStatusText)
Definition: misc.c:2093
static BYTE data22[]
Definition: misc.c:513
static BYTE data12[]
Definition: misc.c:503
static BYTE data34[]
Definition: misc.c:525
static STGMEDIUM in_stgmed
Definition: misc.c:2114
static void test_UrlMkGetSessionOption(void)
Definition: misc.c:1421
static BYTE data13[]
Definition: misc.c:504
const WCHAR * mime_pjpeg
Definition: misc.c:595
static const WCHAR url8[]
Definition: misc.c:288
static HRESULT WINAPI InternetProtocolInfo_CompareUrl(IInternetProtocolInfo *iface, LPCWSTR pwzUrl1, LPCWSTR pwzUrl2, DWORD dwCompareFlags)
Definition: misc.c:904
static BYTE data49[]
Definition: misc.c:540
static BYTE data14[]
Definition: misc.c:505
static BYTE data7[]
Definition: misc.c:498
static BYTE data73[]
Definition: misc.c:564
static BYTE data19[]
Definition: misc.c:510
static HRESULT WINAPI BindStatusCallbackEx_GetBindInfoEx(IBindStatusCallbackEx *iface, DWORD *grfBINDF, BINDINFO *pbindinfo, DWORD *grfBINDF2, DWORD *pdwReserved)
Definition: misc.c:2130
static BYTE data3[]
Definition: misc.c:494
static BYTE data17[]
Definition: misc.c:508
static BYTE data25[]
Definition: misc.c:516
LPCWSTR url
Definition: misc.c:432
static HRESULT WINAPI InternetProtocolInfo_CombineUrl(IInternetProtocolInfo *iface, LPCWSTR pwzBaseUrl, LPCWSTR pwzRelativeUrl, DWORD dwCombineFlags, LPWSTR pwzResult, DWORD cchResult, DWORD *pcchResult, DWORD dwReserved)
Definition: misc.c:896
static BYTE data5[]
Definition: misc.c:496
static BYTE data92[]
Definition: misc.c:583
static BYTE data77[]
Definition: misc.c:568
static BYTE data84[]
Definition: misc.c:575
static ULONG WINAPI RefUnk_AddRef(IUnknown *iface)
Definition: misc.c:2180
static BYTE data68[]
Definition: misc.c:559
static BYTE data64[]
Definition: misc.c:555
static const struct @1878 mime_tests2[]
static void test_FindMimeFromData(void)
Definition: misc.c:711
static HRESULT WINAPI BindStatusCallback_OnStopBinding(IBindStatusCallbackEx *iface, HRESULT hresult, LPCWSTR szError)
Definition: misc.c:2100
static void register_protocols(void)
Definition: misc.c:822
static LPWSTR PSUACTION
Definition: misc.c:69
static BYTE data20[]
Definition: misc.c:511
static BYTE data27[]
Definition: misc.c:518
static ULONG WINAPI InternetProtocolInfo_AddRef(IInternetProtocolInfo *iface)
Definition: misc.c:855
static BYTE data18[]
Definition: misc.c:509
static void test_IsValidURL(void)
Definition: misc.c:1787
static BYTE data59[]
Definition: misc.c:550
static const WCHAR path3[]
Definition: misc.c:297
static HRESULT WINAPI ClassFactory_QueryInterface(IClassFactory *iface, REFIID riid, void **ppv)
Definition: misc.c:934
static BYTE data33[]
Definition: misc.c:524
static BYTE data44[]
Definition: misc.c:535
static BYTE data60[]
Definition: misc.c:551
static const struct @1879 default_feature_tests[]
HRESULT get_expected
Definition: misc.c:1978
static BYTE data51[]
Definition: misc.c:542
static BYTE data66[]
Definition: misc.c:557
static HRESULT WINAPI BindStatusCallback_OnStartBinding(IBindStatusCallbackEx *iface, DWORD dwReserved, IBinding *pib)
Definition: misc.c:2074
static ULONG WINAPI BindStatusCallback_Release(IBindStatusCallbackEx *iface)
Definition: misc.c:2069
static const WCHAR url2[]
Definition: misc.c:279
static BYTE data85[]
Definition: misc.c:576
static HRESULT WINAPI BindStatusCallback_OnLowResource(IBindStatusCallbackEx *iface, DWORD reserved)
Definition: misc.c:2087
static BYTE data63[]
Definition: misc.c:554
static BYTE data48[]
Definition: misc.c:539
static BYTE data97[]
Definition: misc.c:588
static BYTE data32[]
Definition: misc.c:523
static const IUnknownVtbl unk_vtbl
Definition: misc.c:1196
static BYTE data69[]
Definition: misc.c:560
static void test_MapBrowserEmulationModeToUserAgent(BOOL custom_ua)
Definition: misc.c:2754
static PARSEACTION
Definition: misc.c:71
static BYTE data65[]
Definition: misc.c:556
static const WCHAR wszWineHQ[]
Definition: misc.c:307
static BYTE data54[]
Definition: misc.c:545
static const WCHAR wszFile[]
Definition: misc.c:301
static BYTE data10[]
Definition: misc.c:501
static BYTE data35[]
Definition: misc.c:526
static BYTE data88[]
Definition: misc.c:579
static const struct @1877 mime_tests[]
static const IUnknownVtbl RefUnkVtbl
Definition: misc.c:2192
static HRESULT WINAPI BindStatusCallback_OnDataAvailable(IBindStatusCallbackEx *iface, DWORD grfBSCF, DWORD dwSize, FORMATETC *pformatetc, STGMEDIUM *pstgmed)
Definition: misc.c:2116
static const WCHAR url4e[]
Definition: misc.c:294
static void test_bsc_marshaling(void)
Definition: misc.c:2230
static const WCHAR wszHttp[]
Definition: misc.c:302
static BYTE data62[]
Definition: misc.c:553
static LPVOID
Definition: misc.c:72
static ULONG WINAPI ClassFactory_AddRef(IClassFactory *iface)
Definition: misc.c:947
static BYTE data58[]
Definition: misc.c:549
static void test_CoInternetQueryInfo(void)
Definition: misc.c:445
static BYTE data90[]
Definition: misc.c:581
static BYTE data15[]
Definition: misc.c:506
static ULONG WINAPI InternetProtocolInfo_Release(IInternetProtocolInfo *iface)
Definition: misc.c:860
static const WCHAR url9[]
Definition: misc.c:289
static STGMEDIUM rem_stgmed
Definition: misc.c:2114
static BYTE data96[]
Definition: misc.c:587
static HRESULT WINAPI BindStatusCallback_QueryInterface(IBindStatusCallbackEx *iface, REFIID riid, void **ppv)
Definition: misc.c:2051
static IClassFactory test_protocol_cf
Definition: misc.c:1000
static HRESULT WINAPI InternetProtocolInfo_QueryInterface(IInternetProtocolInfo *iface, REFIID riid, void **ppv)
Definition: misc.c:848
static void test_user_agent(void)
Definition: misc.c:1471
static size_t check_prefix(const char *str, const char *prefix)
Definition: misc.c:1461
static BYTE data30[]
Definition: misc.c:521
static BYTE data55[]
Definition: misc.c:546
static const struct @1876 query_info_tests[]
static BYTE data80[]
Definition: misc.c:571
static ULONG WINAPI BindStatusCallback_AddRef(IBindStatusCallbackEx *iface)
Definition: misc.c:2064
static HRESULT WINAPI InternetProtocolInfo_ParseUrl(IInternetProtocolInfo *iface, LPCWSTR pwzUrl, PARSEACTION ParseAction, DWORD dwParseFlags, LPWSTR pwzResult, DWORD cchResult, DWORD *pcchResult, DWORD dwReserved)
Definition: misc.c:865
static BYTE data4[]
Definition: misc.c:495
static BYTE data82[]
Definition: misc.c:573
static BYTE data52[]
Definition: misc.c:543
static IClassFactory * expect_cf
Definition: misc.c:932
static void test_CopyStgMedium(void)
Definition: misc.c:1232
static BYTE data91[]
Definition: misc.c:582
static BYTE data39[]
Definition: misc.c:530
static BYTE data74[]
Definition: misc.c:565
const WCHAR * mime
Definition: misc.c:475
static void test_internet_features(void)
Definition: misc.c:2008
static BYTE data36[]
Definition: misc.c:527
static const WCHAR wszAbout[]
Definition: misc.c:303
static BYTE data47[]
Definition: misc.c:538
static const WCHAR path4[]
Definition: misc.c:298
static QUERYOPTION
Definition: misc.c:72
static BYTE data76[]
Definition: misc.c:567
static BYTE data9[]
Definition: misc.c:500
static BYTE data46[]
Definition: misc.c:537
static const IBindStatusCallbackExVtbl BindStatusCallbackExVtbl
Definition: misc.c:2141
static BYTE data24[]
Definition: misc.c:515
static BYTE data75[]
Definition: misc.c:566
static void test_CreateFormatEnum(void)
Definition: misc.c:101
static void test_internet_feature_defaults(void)
Definition: misc.c:1842
static void test_CoInternetParseUrl(void)
Definition: misc.c:336
static BYTE data87[]
Definition: misc.c:578
DWORD set_flags
Definition: misc.c:1973
static BYTE data23[]
Definition: misc.c:514
static BYTE data57[]
Definition: misc.c:548
DWORD get_flags
Definition: misc.c:1808
static const WCHAR wszHttpGoogle[]
Definition: misc.c:310
static const WCHAR url3[]
Definition: misc.c:280
static BYTE data83[]
Definition: misc.c:574
const WCHAR * broken_mime
Definition: misc.c:478
static const WCHAR url10[]
Definition: misc.c:292
static BYTE data28[]
Definition: misc.c:519
BOOL set_todo
Definition: misc.c:1976
static const IInternetProtocolInfoVtbl InternetProtocolInfoVtbl
Definition: misc.c:919
static BYTE data29[]
Definition: misc.c:520
static BYTE data38[]
Definition: misc.c:529
static const WCHAR url7[]
Definition: misc.c:286
DWORD uses_net
Definition: misc.c:433
static BYTE data2[]
Definition: misc.c:493
CLSID CLSID_AboutProtocol
#define argv
Definition: mplay32.c:18
static const WCHAR text_htmlW[]
Definition: navigate.c:29
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
Definition: mswsock.h:95
#define BOOL
Definition: nt_native.h:43
#define DWORD
Definition: nt_native.h:44
interface IMoniker * LPMONIKER
Definition: objfwd.h:9
interface IBindCtx * LPBC
Definition: objfwd.h:18
HRESULT WINAPI CreateBindCtx(DWORD reserved, IBindCtx **bind_context)
Definition: bindctx.c:491
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
char CHAR
Definition: pedump.c:57
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
Definition: guiddef.h:68
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define REFIID
Definition: guiddef.h:118
#define IID_NULL
Definition: guiddef.h:98
_In_opt_ IUnknown * punk
Definition: shlwapi.h:158
PVOID pBuffer
const WCHAR * str
#define REG_DWORD
Definition: sdbapi.c:615
#define offsetof(TYPE, MEMBER)
strcpy
Definition: string.h:131
const char int int int static __inline const char * wine_dbgstr_a(const char *s)
Definition: debug.h:152
int winetest_get_mainargs(char ***pargv)
#define wait_child_process
Definition: test.h:159
XML_HIDDEN void xmlParserErrors const char const xmlChar const xmlChar * str2
Definition: parser.h:35
#define memset(x, y, z)
Definition: compat.h:39
int zero
Definition: sehframes.cpp:29
DWORD dwOptions
Definition: solitaire.cpp:25
TCHAR * cmdline
Definition: stretchblt.cpp:32
Definition: misc.c:2158
LONG ref
Definition: misc.c:2160
IUnknown IUnknown_iface
Definition: misc.c:2159
ULONG dwMinorVersion
Definition: rtltypes.h:248
ULONG dwMajorVersion
Definition: rtltypes.h:247
Definition: xmldoc.c:231
Definition: tftpd.h:80
Definition: tftpd.h:158
Definition: tftpd.h:126
Definition: tftpd.h:138
Definition: cookie.c:42
Definition: main.c:439
Definition: format.c:58
Definition: copy.c:22
Definition: name.c:39
LPCWSTR schema
Definition: misc.c:319
HRESULT secur_hres
Definition: misc.c:315
LPCWSTR domain
Definition: misc.c:320
LPCWSTR path
Definition: misc.c:318
LPCWSTR url
Definition: misc.c:314
LPCWSTR rootdocument
Definition: misc.c:322
LPCWSTR encoded_url
Definition: misc.c:316
HRESULT rootdocument_hres
Definition: misc.c:323
HRESULT path_hres
Definition: misc.c:317
HRESULT domain_hres
Definition: misc.c:321
Definition: parse.h:23
#define max(a, b)
Definition: svc.c:63
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
Definition: synch.c:82
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
Definition: synch.c:587
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
Definition: synch.c:669
Character const *const prefix
Definition: tempnam.cpp:195
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
const uint16_t * LPCWSTR
Definition: typedefs.h:57
uint16_t * LPWSTR
Definition: typedefs.h:56
char * LPSTR
Definition: typedefs.h:51
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260
uint32_t ULONG
Definition: typedefs.h:59
HRESULT WINAPI MkParseDisplayNameEx(IBindCtx *pbc, LPCWSTR szDisplayName, ULONG *pchEaten, LPMONIKER *ppmk)
Definition: umon.c:795
Definition: pdh_main.c:96
enum FEATURE_SAFE_BINDTOOBJECT
enum FEATURE_MIME_SNIFFING
enum FEATURE_VALIDATE_NAVIGATE_URL
enum FEATURE_WEBOC_POPUPMANAGEMENT
enum FEATURE_DISABLE_MK_PROTOCOL
enum FEATURE_UNC_SAVEDFILECHECK
enum FEATURE_LOCALMACHINE_LOCKDOWN
enum FEATURE_GET_URL_DOM_FILEPATH_UNENCODED
enum FEATURE_DISABLE_LEGACY_COMPRESSION
enum FEATURE_SSLUX
enum FEATURE_BEHAVIORS
enum FEATURE_TABBED_BROWSING
enum INTERNETFEATURELIST
enum FEATURE_WINDOW_RESTRICTIONS
enum FEATURE_PROTOCOL_LOCKDOWN
enum FEATURE_XMLHTTP
enum FEATURE_MIME_HANDLING
enum FEATURE_ZONE_ELEVATION
enum FEATURE_FORCE_ADDR_AND_STATUS
enum FEATURE_DISABLE_TELNET_PROTOCOL
enum FEATURE_DISABLE_NAVIGATION_SOUNDS
enum FEATURE_HTTP_USERNAME_PASSWORD_DISABLE
enum FEATURE_FEEDS
enum FEATURE_ADDON_MANAGEMENT
enum FEATURE_RESTRICT_ACTIVEXINSTALL
enum FEATURE_SECURITYBAND
enum FEATURE_BLOCK_INPUT_PROMPTS
enum FEATURE_RESTRICT_FILEDOWNLOAD
void WINAPI ReleaseBindInfo(BINDINFO *pbindinfo)
Definition: urlmon_main.c:572
HRESULT WINAPI IsValidURL(LPBC pBC, LPCWSTR szURL, DWORD dwReserved)
Definition: urlmon_main.c:525
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
#define GMEM_MOVEABLE
Definition: winbase.h:318
_In_ FONTOBJ _In_ ULONG _In_ HGLYPH hg
Definition: winddi.h:3871
void * arg
Definition: msvc.h:10
#define HRESULT
Definition: msvc.h:7
#define WINAPI
Definition: msvc.h:6
#define S_FALSE
Definition: winerror.h:3451
#define E_NOINTERFACE
Definition: winerror.h:3479
#define __HRESULT_FROM_WIN32(x)
Definition: winerror.h:197
#define E_POINTER
Definition: winerror.h:3480
#define HKEY_LOCAL_MACHINE
Definition: winreg.h:12
#define HKEY_CURRENT_USER
Definition: winreg.h:11
BOOL WINAPI TranslateMessage(_In_ const MSG *)
BOOL WINAPI GetMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT)
LRESULT WINAPI DispatchMessageW(_In_ const MSG *)
#define SECURITY_DESCRIPTOR_REVISION
Definition: setypes.h:58
unsigned char BYTE
Definition: xxhash.c:193