ReactOS 0.4.15-dev-7918-g2a2556c
htmllocation.c
Go to the documentation of this file.
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
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
35static 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
98static 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
109static void test_href(IHTMLLocation *loc, const struct location_test *test)
110{
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",
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));
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);
132}
133
134static void test_protocol(IHTMLLocation *loc, const struct location_test *test)
135{
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",
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));
151}
152
153static void test_host(IHTMLLocation *loc, const struct location_test *test)
154{
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",
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));
170}
171
172static void test_hostname(IHTMLLocation *loc, IHTMLDocument2 *doc, const struct location_test *test)
173{
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",
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));
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));
197}
198
199static void test_port(IHTMLLocation *loc, const struct location_test *test)
200{
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",
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));
216}
217
218static void test_pathname(IHTMLLocation *loc, const struct location_test *test)
219{
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",
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));
235}
236
237static void test_search(IHTMLLocation *loc, const struct location_test *test)
238{
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",
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));
254}
255
256static void test_hash(IHTMLLocation *loc, const struct location_test *test)
257{
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",
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));
273}
274
275static void perform_test(const struct location_test* test)
276{
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,
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
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
366START_TEST(htmllocation)
367{
368 int i;
369
371
372 for(i=0; i < sizeof(location_tests)/sizeof(*location_tests); i++)
374
376}
#define ok(value,...)
Definition: atltest.h:57
#define START_TEST(x)
Definition: atltest.h:75
PBATCH_CONTEXT bc
Definition: batch.c:67
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
#define CP_ACP
Definition: compat.h:109
OLECHAR * BSTR
Definition: compat.h:2293
#define WideCharToMultiByte
Definition: compat.h:111
#define MultiByteToWideChar
Definition: compat.h:110
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:2067
#define INTERNET_MAX_URL_LENGTH
Definition: session.c:1418
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
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
#define S_OK
Definition: intsafe.h:52
#define FAILED(hr)
Definition: intsafe.h:51
#define wine_dbgstr_w
Definition: kernel32.h:34
#define location(file, line)
Definition: kmtest.h:18
int WINAPI lstrcmpA(LPCSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:18
static const WCHAR url[]
Definition: encode.c:1432
HRESULT hres
Definition: protocol.c:465
static enum @1664 test_protocol
static const char * strw(LPCWSTR x)
Definition: actctx.c:49
static void perform_test(const struct location_test *test)
Definition: htmllocation.c:275
static void test_hostname(IHTMLLocation *loc, IHTMLDocument2 *doc, const struct location_test *test)
Definition: htmllocation.c:172
static void test_pathname(IHTMLLocation *loc, const struct location_test *test)
Definition: htmllocation.c:218
static void test_host(IHTMLLocation *loc, const struct location_test *test)
Definition: htmllocation.c:153
static void test_port(IHTMLLocation *loc, const struct location_test *test)
Definition: htmllocation.c:199
static void test_hash(IHTMLLocation *loc, const struct location_test *test)
Definition: htmllocation.c:256
static void test_search(IHTMLLocation *loc, const struct location_test *test)
Definition: htmllocation.c:237
static const struct location_test location_tests[]
Definition: htmllocation.c:35
static int str_eq_wa(LPCWSTR strw, const char *stra)
Definition: htmllocation.c:98
static void test_href(IHTMLLocation *loc, const struct location_test *test)
Definition: htmllocation.c:109
#define STGM_READWRITE
Definition: objbase.h:919
#define STGM_SHARE_EXCLUSIVE
Definition: objbase.h:923
HRESULT WINAPI CreateBindCtx(DWORD reserved, LPBC *ppbc)
Definition: bindctx.c:556
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
#define test
Definition: rosglue.h:37
const WCHAR * str
#define win_skip
Definition: test.h:160
char * name
Definition: compiler.c:66
const char * name
Definition: htmllocation.c:22
const char * search
Definition: htmllocation.c:31
const char * href
Definition: htmllocation.c:25
const char * hostname
Definition: htmllocation.c:28
const char * url
Definition: htmllocation.c:23
const char * protocol
Definition: htmllocation.c:26
const char * host
Definition: htmllocation.c:27
const char * port
Definition: htmllocation.c:29
const char * hash
Definition: htmllocation.c:32
const char * pathname
Definition: htmllocation.c:30
HRESULT WINAPI CreateURLMoniker(IMoniker *pmkContext, LPCWSTR szURL, IMoniker **ppmk)
Definition: umon.c:732
#define E_POINTER
Definition: winerror.h:2365
__wchar_t WCHAR
Definition: xmlstorage.h:180
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
char CHAR
Definition: xmlstorage.h:175