1 /* 2 * Copyright 2009 Andrew Eikum 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 #include "precomp.h" 20 21 struct location_test { 22 const char *name; 23 const char *url; 24 25 const char *href; 26 const char *protocol; 27 const char *host; 28 const char *hostname; 29 const char *port; 30 const char *pathname; 31 const char *search; 32 const char *hash; 33 }; 34 35 static const struct location_test location_tests[] = { 36 { 37 "HTTP", 38 "http://www.winehq.org?search#hash", 39 "http://www.winehq.org/?search#hash", 40 "http:", 41 "www.winehq.org:80", 42 "www.winehq.org", 43 "80", 44 "", 45 "?search", 46 "#hash" 47 }, 48 { 49 "HTTP with file", 50 "http://www.winehq.org/file?search#hash", 51 "http://www.winehq.org/file?search#hash", 52 "http:", 53 "www.winehq.org:80", 54 "www.winehq.org", 55 "80", 56 "file", 57 "?search", 58 "#hash" 59 }, 60 { 61 "FTP", 62 "ftp://ftp.winehq.org/", 63 "ftp://ftp.winehq.org/", 64 "ftp:", 65 "ftp.winehq.org:21", 66 "ftp.winehq.org", 67 "21", 68 "", 69 NULL, 70 NULL 71 }, 72 { 73 "FTP with file", 74 "ftp://ftp.winehq.org/file", 75 "ftp://ftp.winehq.org/file", 76 "ftp:", 77 "ftp.winehq.org:21", 78 "ftp.winehq.org", 79 "21", 80 "file", 81 NULL, 82 NULL 83 }, 84 { 85 "FILE", 86 "file://C:\\windows\\win.ini", 87 "file:///C:/windows/win.ini", 88 "file:", 89 NULL, 90 NULL, 91 "", 92 "C:\\windows\\win.ini", 93 NULL, 94 NULL 95 } 96 }; 97 98 static int str_eq_wa(LPCWSTR strw, const char *stra) 99 { 100 CHAR buf[512]; 101 102 if(!strw || !stra) 103 return (void*)strw == (void*)stra; 104 105 WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), NULL, NULL); 106 return !lstrcmpA(stra, buf); 107 } 108 109 static void test_href(IHTMLLocation *loc, const struct location_test *test) 110 { 111 HRESULT hres; 112 BSTR str; 113 114 hres = IHTMLLocation_get_href(loc, NULL); 115 ok(hres == E_POINTER, 116 "%s: get_href should have failed with E_POINTER (0x%08x), was: 0x%08x\n", 117 test->name, E_POINTER, hres); 118 119 hres = IHTMLLocation_get_href(loc, &str); 120 ok(hres == S_OK, "%s: get_href failed: 0x%08x\n", test->name, hres); 121 if(hres == S_OK) 122 ok(str_eq_wa(str, test->href), 123 "%s: expected retrieved href to be L\"%s\", was: %s\n", 124 test->name, test->href, wine_dbgstr_w(str)); 125 SysFreeString(str); 126 127 hres = IHTMLLocation_toString(loc, &str); 128 ok(hres == S_OK, "%s: toString failed: 0x%08x\n", test->name, hres); 129 ok(str_eq_wa(str, test->href), "%s: toString returned %s, expected %s\n", 130 test->name, wine_dbgstr_w(str), test->href); 131 SysFreeString(str); 132 } 133 134 static void test_protocol(IHTMLLocation *loc, const struct location_test *test) 135 { 136 HRESULT hres; 137 BSTR str; 138 139 hres = IHTMLLocation_get_protocol(loc, NULL); 140 ok(hres == E_POINTER, 141 "%s: get_protocol should have failed with E_POINTER (0x%08x), was: 0x%08x\n", 142 test->name, E_POINTER, hres); 143 144 hres = IHTMLLocation_get_protocol(loc, &str); 145 ok(hres == S_OK, "%s: get_protocol failed: 0x%08x\n", test->name, hres); 146 if(hres == S_OK) 147 ok(str_eq_wa(str, test->protocol), 148 "%s: expected retrieved protocol to be L\"%s\", was: %s\n", 149 test->name, test->protocol, wine_dbgstr_w(str)); 150 SysFreeString(str); 151 } 152 153 static void test_host(IHTMLLocation *loc, const struct location_test *test) 154 { 155 HRESULT hres; 156 BSTR str; 157 158 hres = IHTMLLocation_get_host(loc, NULL); 159 ok(hres == E_POINTER, 160 "%s: get_host should have failed with E_POINTER (0x%08x), was: 0x%08x\n", 161 test->name, E_POINTER, hres); 162 163 hres = IHTMLLocation_get_host(loc, &str); 164 ok(hres == S_OK, "%s: get_host failed: 0x%08x\n", test->name, hres); 165 if(hres == S_OK) 166 ok(str_eq_wa(str, test->host), 167 "%s: expected retrieved host to be L\"%s\", was: %s\n", 168 test->name, test->host, wine_dbgstr_w(str)); 169 SysFreeString(str); 170 } 171 172 static void test_hostname(IHTMLLocation *loc, IHTMLDocument2 *doc, const struct location_test *test) 173 { 174 HRESULT hres; 175 BSTR str; 176 177 hres = IHTMLLocation_get_hostname(loc, NULL); 178 ok(hres == E_POINTER, 179 "%s: get_hostname should have failed with E_POINTER (0x%08x), was: 0x%08x\n", 180 test->name, E_POINTER, hres); 181 182 hres = IHTMLLocation_get_hostname(loc, &str); 183 ok(hres == S_OK, "%s: get_hostname failed: 0x%08x\n", test->name, hres); 184 if(hres == S_OK) 185 ok(str_eq_wa(str, test->hostname), 186 "%s: expected retrieved hostname to be L\"%s\", was: %s\n", 187 test->name, test->hostname, wine_dbgstr_w(str)); 188 SysFreeString(str); 189 190 hres = IHTMLDocument2_get_domain(doc, &str); 191 ok(hres == S_OK, "%s: get_domain failed: 0x%08x\n", test->name, hres); 192 if(hres == S_OK) 193 ok(str_eq_wa(str, test->hostname ? test->hostname : ""), 194 "%s: expected retrieved domain to be L\"%s\", was: %s\n", 195 test->name, test->hostname, wine_dbgstr_w(str)); 196 SysFreeString(str); 197 } 198 199 static void test_port(IHTMLLocation *loc, const struct location_test *test) 200 { 201 HRESULT hres; 202 BSTR str; 203 204 hres = IHTMLLocation_get_port(loc, NULL); 205 ok(hres == E_POINTER, 206 "%s: get_port should have failed with E_POINTER (0x%08x), was: 0x%08x\n", 207 test->name, E_POINTER, hres); 208 209 hres = IHTMLLocation_get_port(loc, &str); 210 ok(hres == S_OK, "%s: get_port failed: 0x%08x\n", test->name, hres); 211 if(hres == S_OK) 212 ok(str_eq_wa(str, test->port), 213 "%s: expected retrieved port to be L\"%s\", was: %s\n", 214 test->name, test->port, wine_dbgstr_w(str)); 215 SysFreeString(str); 216 } 217 218 static void test_pathname(IHTMLLocation *loc, const struct location_test *test) 219 { 220 HRESULT hres; 221 BSTR str; 222 223 hres = IHTMLLocation_get_pathname(loc, NULL); 224 ok(hres == E_POINTER, 225 "%s: get_pathname should have failed with E_POINTER (0x%08x), was: 0x%08x\n", 226 test->name, E_POINTER, hres); 227 228 hres = IHTMLLocation_get_pathname(loc, &str); 229 ok(hres == S_OK, "%s: get_pathname failed: 0x%08x\n", test->name, hres); 230 if(hres == S_OK) 231 ok(str_eq_wa(str, test->pathname), 232 "%s: expected retrieved pathname to be L\"%s\", was: %s\n", 233 test->name, test->pathname, wine_dbgstr_w(str)); 234 SysFreeString(str); 235 } 236 237 static void test_search(IHTMLLocation *loc, const struct location_test *test) 238 { 239 HRESULT hres; 240 BSTR str; 241 242 hres = IHTMLLocation_get_search(loc, NULL); 243 ok(hres == E_POINTER, 244 "%s: get_search should have failed with E_POINTER (0x%08x), was: 0x%08x\n", 245 test->name, E_POINTER, hres); 246 247 hres = IHTMLLocation_get_search(loc, &str); 248 ok(hres == S_OK, "%s: get_search failed: 0x%08x\n", test->name, hres); 249 if(hres == S_OK) 250 ok(str_eq_wa(str, test->search), 251 "%s: expected retrieved search to be L\"%s\", was: %s\n", 252 test->name, test->search, wine_dbgstr_w(str)); 253 SysFreeString(str); 254 } 255 256 static void test_hash(IHTMLLocation *loc, const struct location_test *test) 257 { 258 HRESULT hres; 259 BSTR str; 260 261 hres = IHTMLLocation_get_hash(loc, NULL); 262 ok(hres == E_POINTER, 263 "%s: get_hash should have failed with E_POINTER (0x%08x), was: 0x%08x\n", 264 test->name, E_POINTER, hres); 265 266 hres = IHTMLLocation_get_hash(loc, &str); 267 ok(hres == S_OK, "%s: get_hash failed: 0x%08x\n", test->name, hres); 268 if(hres == S_OK) 269 ok(str_eq_wa(str, test->hash), 270 "%s: expected retrieved hash to be L\"%s\", was: %s\n", 271 test->name, test->hash, wine_dbgstr_w(str)); 272 SysFreeString(str); 273 } 274 275 static void perform_test(const struct location_test* test) 276 { 277 WCHAR url[INTERNET_MAX_URL_LENGTH]; 278 HRESULT hres; 279 IBindCtx *bc; 280 IMoniker *url_mon; 281 IPersistMoniker *persist_mon; 282 IHTMLDocument2 *doc; 283 IHTMLDocument6 *doc6; 284 IHTMLLocation *location; 285 286 hres = CreateBindCtx(0, &bc); 287 ok(hres == S_OK, "%s: CreateBindCtx failed: 0x%08x\n", test->name, hres); 288 if(FAILED(hres)) 289 return; 290 291 MultiByteToWideChar(CP_ACP, 0, test->url, -1, url, sizeof(url)/sizeof(WCHAR)); 292 hres = CreateURLMoniker(NULL, url, &url_mon); 293 ok(hres == S_OK, "%s: CreateURLMoniker failed: 0x%08x\n", test->name, hres); 294 if(FAILED(hres)){ 295 IBindCtx_Release(bc); 296 return; 297 } 298 299 hres = CoCreateInstance(&CLSID_HTMLDocument, NULL, 300 CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER, &IID_IHTMLDocument2, 301 (void**)&doc); 302 ok(hres == S_OK, "%s: CoCreateInstance failed: 0x%08x\n", test->name, hres); 303 if(FAILED(hres)){ 304 IMoniker_Release(url_mon); 305 IBindCtx_Release(bc); 306 return; 307 } 308 309 hres = IHTMLDocument2_QueryInterface(doc, &IID_IHTMLDocument6, (void**)&doc6); 310 if(hres == S_OK){ 311 IHTMLDocument6_Release(doc6); 312 }else{ 313 win_skip("%s: Could not get IHTMLDocument6, probably too old IE. Requires IE 8+\n", test->name); 314 IMoniker_Release(url_mon); 315 IBindCtx_Release(bc); 316 return; 317 } 318 319 hres = IHTMLDocument2_QueryInterface(doc, &IID_IPersistMoniker, 320 (void**)&persist_mon); 321 ok(hres == S_OK, "%s: IHTMlDocument2_QueryInterface failed: 0x%08x\n", test->name, hres); 322 if(FAILED(hres)){ 323 IHTMLDocument2_Release(doc); 324 IMoniker_Release(url_mon); 325 IBindCtx_Release(bc); 326 return; 327 } 328 329 hres = IPersistMoniker_Load(persist_mon, FALSE, url_mon, bc, 330 STGM_SHARE_EXCLUSIVE | STGM_READWRITE); 331 ok(hres == S_OK, "%s: IPersistMoniker_Load failed: 0x%08x\n", test->name, hres); 332 if(FAILED(hres)){ 333 IPersistMoniker_Release(persist_mon); 334 IHTMLDocument2_Release(doc); 335 IMoniker_Release(url_mon); 336 IBindCtx_Release(bc); 337 return; 338 } 339 340 hres = IHTMLDocument2_get_location(doc, &location); 341 ok(hres == S_OK, "%s: IHTMLDocument2_get_location failed: 0x%08x\n", test->name, hres); 342 if(FAILED(hres)){ 343 IPersistMoniker_Release(persist_mon); 344 IHTMLDocument2_Release(doc); 345 IMoniker_Release(url_mon); 346 IBindCtx_Release(bc); 347 return; 348 } 349 350 test_href(location, test); 351 test_protocol(location, test); 352 test_host(location, test); 353 test_hostname(location, doc, test); 354 test_port(location, test); 355 test_pathname(location, test); 356 test_search(location, test); 357 test_hash(location, test); 358 359 IHTMLLocation_Release(location); 360 IPersistMoniker_Release(persist_mon); 361 IHTMLDocument2_Release(doc); 362 IMoniker_Release(url_mon); 363 IBindCtx_Release(bc); 364 } 365 366 START_TEST(htmllocation) 367 { 368 int i; 369 370 CoInitialize(NULL); 371 372 for(i=0; i < sizeof(location_tests)/sizeof(*location_tests); i++) 373 perform_test(location_tests+i); 374 375 CoUninitialize(); 376 } 377