ReactOS  0.4.14-dev-556-g4c5b21f
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 
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));
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 
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));
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));
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));
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 
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));
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));
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));
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));
273 }
274 
275 static void perform_test(const struct location_test* test)
276 {
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,
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 
353  test_hostname(location, doc, 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 
371 
372  for(i=0; i < sizeof(location_tests)/sizeof(*location_tests); i++)
374 
375  CoUninitialize();
376 }
const char * href
Definition: htmllocation.c:25
static void test_host(IHTMLLocation *loc, const struct location_test *test)
Definition: htmllocation.c:153
static void test_search(IHTMLLocation *loc, const struct location_test *test)
Definition: htmllocation.c:237
const char * name
Definition: htmllocation.c:22
static void perform_test(const struct location_test *test)
Definition: htmllocation.c:275
#define WideCharToMultiByte
Definition: compat.h:101
const WCHAR * LPCWSTR
Definition: xmlstorage.h:185
const char * protocol
Definition: htmllocation.c:26
#define STGM_SHARE_EXCLUSIVE
Definition: objbase.h:922
LPBATCH_CONTEXT bc
Definition: batch.c:66
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
static void test_href(IHTMLLocation *loc, const struct location_test *test)
Definition: htmllocation.c:109
char * wine_dbgstr_w(const wchar_t *wstr)
Definition: atltest.h:87
#define CP_ACP
Definition: compat.h:99
char CHAR
Definition: xmlstorage.h:175
const char * url
Definition: htmllocation.c:23
int WINAPI lstrcmpA(LPCSTR lpString1, LPCSTR lpString2)
Definition: lstring.c:18
#define test
Definition: rosglue.h:37
OLECHAR * BSTR
Definition: compat.h:1942
const char * hash
Definition: htmllocation.c:32
const char * host
Definition: htmllocation.c:27
static const struct location_test location_tests[]
Definition: htmllocation.c:35
const char * search
Definition: htmllocation.c:31
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
const WCHAR * str
smooth NULL
Definition: ftsmooth.c:416
#define INTERNET_MAX_URL_LENGTH
Definition: session.c:1380
static void test_hostname(IHTMLLocation *loc, IHTMLDocument2 *doc, const struct location_test *test)
Definition: htmllocation.c:172
HRESULT hres
Definition: protocol.c:465
static void test_pathname(IHTMLLocation *loc, const struct location_test *test)
Definition: htmllocation.c:218
HRESULT WINAPI CreateBindCtx(DWORD reserved, LPBC *ppbc)
Definition: bindctx.c:556
static void test_protocol(IHTMLLocation *loc, const struct location_test *test)
Definition: htmllocation.c:134
__wchar_t WCHAR
Definition: xmlstorage.h:180
LONG HRESULT
Definition: typedefs.h:77
static const WCHAR url[]
Definition: encode.c:1432
char * name
Definition: compiler.c:66
static int str_eq_wa(LPCWSTR strw, const char *stra)
Definition: htmllocation.c:98
static void test_port(IHTMLLocation *loc, const struct location_test *test)
Definition: htmllocation.c:199
#define STGM_READWRITE
Definition: objbase.h:918
#define location(file, line)
Definition: kmtest.h:18
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, LPUNKNOWN pUnkOuter, DWORD dwClsContext, REFIID iid, LPVOID *ppv)
Definition: compobj.c:3325
const char * pathname
Definition: htmllocation.c:30
#define S_OK
Definition: intsafe.h:59
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: compobj.c:2067
#define ok(value,...)
Definition: atltest.h:57
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:271
#define MultiByteToWideChar
Definition: compat.h:100
const char * hostname
Definition: htmllocation.c:28
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:1964
const char * port
Definition: htmllocation.c:29
START_TEST(htmllocation)
Definition: htmllocation.c:366
HRESULT WINAPI CreateURLMoniker(IMoniker *pmkContext, LPCWSTR szURL, IMoniker **ppmk)
Definition: umon.c:732
static void test_hash(IHTMLLocation *loc, const struct location_test *test)
Definition: htmllocation.c:256
#define E_POINTER
Definition: winerror.h:2365
static const char * strw(LPCWSTR x)
Definition: actctx.c:49
#define win_skip
Definition: test.h:150