mshtml/tests: Handle broken localStorage on native.
[wine.git] / dlls / mshtml / tests / misc.c
blobe4703a3b646e4e2b4f62a3109df232cecbfe1181
1 /*
2 * Copyright 2006 Jacek Caban for CodeWeavers
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.
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.
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
19 #define COBJMACROS
21 #include <wine/test.h>
22 #include <stdarg.h>
24 #include "windef.h"
25 #include "winbase.h"
26 #include "ole2.h"
27 #include "mshtml.h"
28 #include "initguid.h"
29 #include "optary.h"
31 static void test_HTMLLoadOptions(void)
33 IHtmlLoadOptions *loadopts;
34 BYTE buf[100];
35 DWORD size, i, data = 0xdeadbeef;
36 HRESULT hres;
38 hres = CoCreateInstance(&CLSID_HTMLLoadOptions, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
39 &IID_IHtmlLoadOptions, (void**)&loadopts);
40 ok(hres == S_OK, "creating HTMLLoadOptions failed: %08lx\n", hres);
41 if(FAILED(hres))
42 return;
44 for(i=0; i <= HTMLLOADOPTION_FRAMELOAD+3; i++) {
45 size = 0xdeadbeef;
46 memset(buf, 0xdd, sizeof(buf));
47 hres = IHtmlLoadOptions_QueryOption(loadopts, i, NULL, &size);
48 ok(hres == S_OK, "QueryOption failed: %08lx\n", hres);
49 ok(size == 0, "size = %ld\n", size);
50 ok(buf[0] == 0xdd, "buf changed\n");
53 size = 0xdeadbeef;
54 hres = IHtmlLoadOptions_QueryOption(loadopts, HTMLLOADOPTION_CODEPAGE, NULL, &size);
55 ok(hres == S_OK, "QueryOption failed: %08lx\n", hres);
56 ok(size == 0, "size = %ld\n", size);
58 hres = IHtmlLoadOptions_SetOption(loadopts, HTMLLOADOPTION_CODEPAGE, &data, sizeof(data));
59 ok(hres == S_OK, "SetOption failed: %08lx\n", hres);
61 size = sizeof(data);
62 memset(buf, 0xdd, sizeof(buf));
63 hres = IHtmlLoadOptions_QueryOption(loadopts, HTMLLOADOPTION_CODEPAGE, buf, &size);
64 ok(hres == S_OK, "QueryOption failed: %08lx\n", hres);
65 ok(size == sizeof(data), "size = %ld\n", size);
66 ok(*(DWORD*)buf == data, "unexpected buf\n");
68 size = sizeof(data)-1;
69 memset(buf, 0xdd, sizeof(buf));
70 hres = IHtmlLoadOptions_QueryOption(loadopts, HTMLLOADOPTION_CODEPAGE, buf, &size);
71 ok(hres == E_FAIL, "QueryOption failed: %08lx\n", hres);
72 ok(size == sizeof(data) || !size, "size = %ld\n", size);
73 ok(buf[0] == 0xdd, "buf changed\n");
75 data = 100;
76 hres = IHtmlLoadOptions_SetOption(loadopts, HTMLLOADOPTION_CODEPAGE, &data, 0);
77 ok(hres == S_OK, "SetOption failed: %08lx\n", hres);
79 size = 0xdeadbeef;
80 memset(buf, 0xdd, sizeof(buf));
81 hres = IHtmlLoadOptions_QueryOption(loadopts, HTMLLOADOPTION_CODEPAGE, buf, &size);
82 ok(hres == S_OK, "QueryOption failed: %08lx\n", hres);
83 ok(size == 0, "size = %ld\n", size);
84 ok(buf[0] == 0xdd, "buf changed\n");
86 hres = IHtmlLoadOptions_SetOption(loadopts, HTMLLOADOPTION_CODEPAGE, NULL, 0);
87 ok(hres == S_OK, "SetOption failed: %08lx\n", hres);
89 hres = IHtmlLoadOptions_SetOption(loadopts, 1000, &data, sizeof(data));
90 ok(hres == S_OK, "SetOption failed: %08lx\n", hres);
92 size = sizeof(data);
93 memset(buf, 0xdd, sizeof(buf));
94 hres = IHtmlLoadOptions_QueryOption(loadopts, 1000, buf, &size);
95 ok(hres == S_OK, "QueryOption failed: %08lx\n", hres);
96 ok(size == sizeof(data), "size = %ld\n", size);
97 ok(*(DWORD*)buf == data, "unexpected buf\n");
99 hres = IHtmlLoadOptions_SetOption(loadopts, 1000, buf, sizeof(buf));
100 ok(hres == S_OK, "SetOption failed: %08lx\n", hres);
102 size = 0xdeadbeef;
103 hres = IHtmlLoadOptions_QueryOption(loadopts, 1000, buf, &size);
104 ok(hres == S_OK, "QueryOption failed: %08lx\n", hres);
105 ok(size == sizeof(buf), "size = %ld\n", size);
107 IHtmlLoadOptions_Release(loadopts);
110 static IHTMLDocument2 *create_doc_from_url(const WCHAR *start_url)
112 BSTR url;
113 IBindCtx *bc;
114 IMoniker *url_mon;
115 IPersistMoniker *persist_mon;
116 IHTMLDocument2 *doc;
117 HRESULT hres;
119 hres = CreateBindCtx(0, &bc);
120 ok(hres == S_OK, "CreateBindCtx failed: 0x%08lx\n", hres);
122 url = SysAllocString(start_url);
123 hres = CreateURLMoniker(NULL, url, &url_mon);
124 ok(hres == S_OK, "CreateURLMoniker failed: 0x%08lx\n", hres);
126 hres = CoCreateInstance(&CLSID_HTMLDocument, NULL,
127 CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER, &IID_IHTMLDocument2,
128 (void**)&doc);
129 ok(hres == S_OK, "CoCreateInstance failed: 0x%08lx\n", hres);
131 hres = IHTMLDocument2_QueryInterface(doc, &IID_IPersistMoniker,
132 (void**)&persist_mon);
133 ok(hres == S_OK, "IHTMLDocument2_QueryInterface failed: 0x%08lx\n", hres);
135 hres = IPersistMoniker_Load(persist_mon, FALSE, url_mon, bc,
136 STGM_SHARE_EXCLUSIVE | STGM_READWRITE);
137 ok(hres == S_OK, "IPersistMoniker_Load failed: 0x%08lx\n", hres);
139 IPersistMoniker_Release(persist_mon);
140 IMoniker_Release(url_mon);
141 IBindCtx_Release(bc);
142 SysFreeString(url);
143 return doc;
146 static HRESULT get_localstorage(IHTMLDocument2 *doc, IHTMLStorage **storage)
148 IHTMLWindow2 *window;
149 IHTMLWindow6 *window6;
150 HRESULT hres;
152 hres = IHTMLDocument2_get_parentWindow(doc, &window);
153 ok(hres == S_OK, "get_parentWindow failed: %08lx\n", hres);
154 ok(window != NULL, "window == NULL\n");
156 hres = IHTMLWindow2_QueryInterface(window, &IID_IHTMLWindow6, (void**)&window6);
157 IHTMLWindow2_Release(window);
158 if(FAILED(hres)) {
159 win_skip("IHTMLWindow6 not supported\n");
160 return hres;
163 hres = IHTMLWindow6_get_localStorage(window6, storage);
165 /* w10pro64 testbot VM sometimes returns this for some reason */
166 if(hres == WININET_E_INTERNAL_ERROR)
167 win_skip("localStorage is buggy and not available, skipping tests\n");
168 else {
169 ok(hres == S_OK, "get_localStorage failed: %08lx\n", hres);
170 ok(*storage != NULL, "*storage == NULL\n");
173 IHTMLWindow6_Release(window6);
174 return hres;
177 static HRESULT get_sessionstorage(IHTMLDocument2 *doc, IHTMLStorage **storage)
179 IHTMLWindow2 *window;
180 IHTMLWindow6 *window6;
181 HRESULT hres;
183 hres = IHTMLDocument2_get_parentWindow(doc, &window);
184 ok(hres == S_OK, "get_parentWindow failed: %08lx\n", hres);
185 ok(window != NULL, "window == NULL\n");
187 hres = IHTMLWindow2_QueryInterface(window, &IID_IHTMLWindow6, (void**)&window6);
188 IHTMLWindow2_Release(window);
189 if(FAILED(hres)) {
190 win_skip("IHTMLWindow6 not supported\n");
191 return hres;
194 hres = IHTMLWindow6_get_sessionStorage(window6, storage);
195 ok(hres == S_OK, "get_sessionStorage failed: %08lx\n", hres);
196 ok(*storage != NULL, "*storage == NULL\n");
198 IHTMLWindow6_Release(window6);
199 return hres;
202 static void test_HTMLStorage(void)
204 IHTMLDocument2 *doc, *doc2;
205 IHTMLStorage *storage, *storage2;
206 LONG space, length, lval;
207 VARIANT var;
208 BSTR key, value;
209 HRESULT hres;
211 doc = create_doc_from_url(L"http://www.codeweavers.com/");
212 doc2 = create_doc_from_url(L"http://www.codeweavers.com/");
214 hres = get_localstorage(doc, &storage);
215 if(hres != S_OK) {
216 IHTMLDocument2_Release(doc2);
217 IHTMLDocument2_Release(doc);
218 return;
221 hres = get_localstorage(doc2, &storage2);
222 ok(hres == S_OK, "got %08lx\n", hres);
224 key = SysAllocString(L"");
225 V_VT(&var) = 0xdead;
226 hres = IHTMLStorage_getItem(storage, key, &var);
227 ok(hres == S_OK, "getItem failed: %08lx\n", hres);
228 ok(V_VT(&var) == VT_NULL, "got %d\n", V_VT(&var));
230 key = SysAllocString(L"undefined");
231 hres = IHTMLStorage_removeItem(storage, key);
232 ok(hres == S_OK, "removeItem failed: %08lx\n", hres);
234 hres = IHTMLStorage_get_length(storage, &length);
235 ok(hres == S_OK, "get_length failed %08lx\n", hres);
236 ok(length >= 0, "length = %ld\n", length);
238 value = SysAllocString(L"null");
239 hres = IHTMLStorage_setItem(storage, key, value);
240 ok(hres == S_OK, "setItem failed: %08lx\n", hres);
242 V_VT(&var) = 0xdead;
243 hres = IHTMLStorage_getItem(storage, key, &var);
244 ok(hres == S_OK, "getItem failed: %08lx\n", hres);
245 ok(V_VT(&var) == VT_BSTR, "got %d\n", V_VT(&var));
246 if (V_VT(&var) == VT_BSTR) ok(!wcscmp(V_BSTR(&var), L"null"), "got %s\n", wine_dbgstr_w(V_BSTR(&var)));
247 SysFreeString(key);
249 hres = IHTMLStorage_key(storage, 0, &key);
250 ok(hres == S_OK, "key failed %08lx\n", hres);
251 ok(!wcscmp(key, L"undefined"), "key(0) = %s\n", wine_dbgstr_w(key));
252 SysFreeString(key);
254 hres = IHTMLStorage_key(storage, 1, &key);
255 ok(hres == E_INVALIDARG, "key failed %08lx\n", hres);
256 hres = IHTMLStorage_key(storage, -1, &key);
257 ok(hres == E_INVALIDARG, "key failed %08lx\n", hres);
259 key = SysAllocString(L"undefined");
260 hres = IHTMLStorage_removeItem(storage, key);
261 ok(hres == S_OK, "removeItem failed: %08lx\n", hres);
262 SysFreeString(key);
263 SysFreeString(value);
265 key = SysAllocString(L"winetest");
266 value = SysAllocString(L"winetest");
267 hres = IHTMLStorage_setItem(storage, key, value);
268 ok(hres == S_OK, "setItem failed: %08lx\n", hres);
270 /* retrieve value from different storage instance */
271 V_VT(&var) = 0xdead;
272 hres = IHTMLStorage_getItem(storage2, key, &var);
273 ok(hres == S_OK, "getItem failed: %08lx\n", hres);
274 ok(V_VT(&var) == VT_BSTR, "got %d\n", V_VT(&var));
275 if (V_VT(&var) == VT_BSTR) ok(!wcscmp(V_BSTR(&var), L"winetest"), "got %s\n", wine_dbgstr_w(V_BSTR(&var)));
277 hres = IHTMLStorage_removeItem(storage, key);
278 ok(hres == S_OK, "removeItem failed: %08lx\n", hres);
280 V_VT(&var) = 0xdead;
281 hres = IHTMLStorage_getItem(storage2, key, &var);
282 ok(hres == S_OK, "getItem failed: %08lx\n", hres);
283 ok(V_VT(&var) == VT_NULL, "got %d\n", V_VT(&var));
284 SysFreeString(key);
285 SysFreeString(value);
287 /* item doesn't exist */
288 key = SysAllocString(L"nosuch");
289 hres = IHTMLStorage_removeItem(storage, key);
290 ok(hres == S_OK, "removeItem failed: %08lx\n", hres);
292 V_VT(&var) = 0xdead;
293 hres = IHTMLStorage_getItem(storage, key, &var);
294 ok(hres == S_OK, "getItem failed: %08lx\n", hres);
295 ok(V_VT(&var) == VT_NULL, "got %d\n", V_VT(&var));
297 hres = IHTMLStorage_getItem(storage, NULL, NULL);
298 ok(hres == E_POINTER, "getItem returned: %08lx\n", hres);
300 hres = IHTMLStorage_getItem(storage, key, NULL);
301 ok(hres == E_POINTER, "getItem failed: %08lx\n", hres);
302 SysFreeString(key);
304 V_VT(&var) = 0xdead;
305 hres = IHTMLStorage_getItem(storage, NULL, &var);
306 ok(hres == S_OK, "getItem returned: %08lx\n", hres);
307 ok(V_VT(&var) == VT_NULL, "got %d\n", V_VT(&var));
309 hres = IHTMLStorage_setItem(storage, NULL, NULL);
310 ok(hres == S_OK, "setItem failed: %08lx\n", hres);
312 key = SysAllocString(L"winetest2");
313 hres = IHTMLStorage_setItem(storage, key, NULL);
314 ok(hres == S_OK, "setItem failed: %08lx\n", hres);
316 hres = IHTMLStorage_setItem(storage, NULL, key);
317 ok(hres == S_OK, "setItem failed: %08lx\n", hres);
319 hres = IHTMLStorage_removeItem(storage, key);
320 ok(hres == S_OK, "removeItem failed: %08lx\n", hres);
321 SysFreeString(key);
323 hres = IHTMLStorage_removeItem(storage, NULL);
324 ok(hres == S_OK, "removeItem failed: %08lx\n", hres);
326 /* Unicode characters */
327 key = SysAllocString(L"winetest");
328 value = SysAllocString(L"\x20ac");
329 hres = IHTMLStorage_setItem(storage, key, value);
330 ok(hres == S_OK, "setItem failed: %08lx\n", hres);
331 hres = IHTMLStorage_removeItem(storage, key);
332 ok(hres == S_OK, "removeItem failed: %08lx\n", hres);
333 SysFreeString(value);
334 SysFreeString(key);
336 key = SysAllocString(L"\x20ac");
337 value = SysAllocString(L"winetest");
338 hres = IHTMLStorage_setItem(storage, key, value);
339 ok(hres == S_OK, "setItem failed: %08lx\n", hres);
340 hres = IHTMLStorage_removeItem(storage, key);
341 ok(hres == S_OK, "removeItem failed: %08lx\n", hres);
342 SysFreeString(value);
343 SysFreeString(key);
345 IHTMLStorage_Release(storage);
346 IHTMLStorage_Release(storage2);
348 /* Session storage on same docs */
349 hres = get_sessionstorage(doc, &storage);
350 ok(hres == S_OK, "got %08lx\n", hres);
352 hres = get_sessionstorage(doc2, &storage2);
353 ok(hres == S_OK, "got %08lx\n", hres);
355 hres = IHTMLStorage_get_length(storage, &lval);
356 ok(hres == S_OK, "get_length failed %08lx\n", hres);
357 ok(lval == 0, "length = %ld\n", lval);
359 hres = IHTMLStorage_get_remainingSpace(storage, &space);
360 ok(hres == S_OK, "get_remainingSpace failed %08lx\n", hres);
361 ok(space >= 5000000, "remainingSpace = %ld\n", space);
363 key = SysAllocString(L"");
364 V_VT(&var) = 0xdead;
365 hres = IHTMLStorage_getItem(storage, key, &var);
366 ok(hres == S_OK, "getItem failed: %08lx\n", hres);
367 ok(V_VT(&var) == VT_NULL, "got %d\n", V_VT(&var));
368 SysFreeString(key);
370 key = SysAllocString(L"undefined");
371 hres = IHTMLStorage_removeItem(storage, key);
372 ok(hres == S_OK, "removeItem failed: %08lx\n", hres);
374 value = SysAllocString(L"null");
375 hres = IHTMLStorage_setItem(storage, key, value);
376 ok(hres == S_OK, "setItem failed: %08lx\n", hres);
377 SysFreeString(value);
379 hres = IHTMLStorage_get_length(storage, &lval);
380 ok(hres == S_OK, "get_length failed %08lx\n", hres);
381 ok(lval == 1, "length = %ld\n", lval);
382 hres = IHTMLStorage_get_length(storage2, &lval);
383 ok(hres == S_OK, "get_length failed %08lx\n", hres);
384 ok(lval == 1, "length = %ld\n", lval);
386 hres = IHTMLStorage_get_remainingSpace(storage, &lval);
387 ok(hres == S_OK, "get_remainingSpace failed %08lx\n", hres);
388 ok(lval == space - 13, "remainingSpace = %ld\n", lval);
389 hres = IHTMLStorage_get_remainingSpace(storage2, &lval);
390 ok(hres == S_OK, "get_remainingSpace failed %08lx\n", hres);
391 ok(lval == space - 13, "remainingSpace = %ld\n", lval);
393 V_VT(&var) = 0xdead;
394 hres = IHTMLStorage_getItem(storage, key, &var);
395 ok(hres == S_OK, "getItem failed: %08lx\n", hres);
396 ok(V_VT(&var) == VT_BSTR, "got %d\n", V_VT(&var));
397 ok(!wcscmp(V_BSTR(&var), L"null"), "got %s\n", wine_dbgstr_w(V_BSTR(&var)));
398 VariantClear(&var);
400 V_VT(&var) = 0xdead;
401 hres = IHTMLStorage_getItem(storage2, key, &var);
402 ok(hres == S_OK, "getItem failed: %08lx\n", hres);
403 ok(V_VT(&var) == VT_BSTR, "got %d\n", V_VT(&var));
404 ok(!wcscmp(V_BSTR(&var), L"null"), "got %s\n", wine_dbgstr_w(V_BSTR(&var)));
405 VariantClear(&var);
406 SysFreeString(key);
408 value = SysAllocString(L"asdf");
409 hres = IHTMLStorage_setItem(storage, NULL, value);
410 ok(hres == S_OK, "setItem failed: %08lx\n", hres);
411 SysFreeString(value);
413 V_VT(&var) = 0xdead;
414 hres = IHTMLStorage_getItem(storage2, NULL, &var);
415 ok(hres == S_OK, "getItem failed: %08lx\n", hres);
416 ok(V_VT(&var) == VT_BSTR, "got %d\n", V_VT(&var));
417 ok(!wcscmp(V_BSTR(&var), L"asdf"), "got %s\n", wine_dbgstr_w(V_BSTR(&var)));
418 VariantClear(&var);
420 V_VT(&var) = 0xdead;
421 key = SysAllocString(L"");
422 hres = IHTMLStorage_getItem(storage2, key, &var);
423 ok(hres == S_OK, "getItem failed: %08lx\n", hres);
424 ok(V_VT(&var) == VT_BSTR, "got %d\n", V_VT(&var));
425 ok(!wcscmp(V_BSTR(&var), L"asdf"), "got %s\n", wine_dbgstr_w(V_BSTR(&var)));
426 VariantClear(&var);
427 SysFreeString(key);
429 key = SysAllocString(L"null-value");
430 hres = IHTMLStorage_setItem(storage, key, NULL);
431 ok(hres == S_OK, "setItem failed: %08lx\n", hres);
433 V_VT(&var) = 0xdead;
434 hres = IHTMLStorage_getItem(storage2, key, &var);
435 ok(hres == S_OK, "getItem failed: %08lx\n", hres);
436 ok(V_VT(&var) == VT_BSTR, "got %d\n", V_VT(&var));
437 ok(!wcscmp(V_BSTR(&var), L""), "got %s\n", wine_dbgstr_w(V_BSTR(&var)));
438 VariantClear(&var);
440 hres = IHTMLStorage_removeItem(storage, NULL);
441 ok(hres == S_OK, "removeItem failed: %08lx\n", hres);
442 hres = IHTMLStorage_removeItem(storage2, key);
443 ok(hres == S_OK, "removeItem failed: %08lx\n", hres);
444 SysFreeString(key);
446 key = SysAllocString(L"aaaa");
447 value = SysAllocString(L"bbbb");
448 hres = IHTMLStorage_setItem(storage2, key, value);
449 ok(hres == S_OK, "setItem failed: %08lx\n", hres);
450 SysFreeString(value);
452 V_VT(&var) = 0xdead;
453 hres = IHTMLStorage_getItem(storage, key, &var);
454 ok(hres == S_OK, "getItem failed: %08lx\n", hres);
455 ok(V_VT(&var) == VT_BSTR, "got %d\n", V_VT(&var));
456 ok(!wcscmp(V_BSTR(&var), L"bbbb"), "got %s\n", wine_dbgstr_w(V_BSTR(&var)));
457 VariantClear(&var);
458 SysFreeString(key);
460 hres = IHTMLStorage_get_length(storage, &lval);
461 ok(hres == S_OK, "get_length failed %08lx\n", hres);
462 ok(lval == 2, "length = %ld\n", lval);
463 hres = IHTMLStorage_get_length(storage2, &lval);
464 ok(hres == S_OK, "get_length failed %08lx\n", hres);
465 ok(lval == 2, "length = %ld\n", lval);
467 hres = IHTMLStorage_get_remainingSpace(storage, &lval);
468 ok(hres == S_OK, "get_remainingSpace failed %08lx\n", hres);
469 ok(lval == space - 21, "remainingSpace = %ld\n", lval);
470 hres = IHTMLStorage_get_remainingSpace(storage2, &lval);
471 ok(hres == S_OK, "get_remainingSpace failed %08lx\n", hres);
472 ok(lval == space - 21, "remainingSpace = %ld\n", lval);
474 hres = IHTMLStorage_key(storage, 0, &key);
475 ok(hres == S_OK, "key failed %08lx\n", hres);
476 ok(!wcscmp(key, L"undefined"), "key(0) = %s\n", wine_dbgstr_w(key));
477 SysFreeString(key);
479 hres = IHTMLStorage_key(storage, 1, &key);
480 ok(hres == S_OK, "key failed %08lx\n", hres);
481 ok(!wcscmp(key, L"aaaa"), "key(0) = %s\n", wine_dbgstr_w(key));
482 SysFreeString(key);
484 hres = IHTMLStorage_key(storage, 2, &key);
485 ok(hres == E_INVALIDARG, "key failed %08lx\n", hres);
486 hres = IHTMLStorage_key(storage, -1, &key);
487 ok(hres == E_INVALIDARG, "key failed %08lx\n", hres);
489 key = SysAllocString(L"undefined");
490 hres = IHTMLStorage_removeItem(storage2, key);
491 ok(hres == S_OK, "removeItem failed: %08lx\n", hres);
492 SysFreeString(key);
494 hres = IHTMLStorage_key(storage, 0, &key);
495 ok(hres == S_OK, "key failed %08lx\n", hres);
496 ok(!wcscmp(key, L"aaaa"), "key(0) = %s\n", wine_dbgstr_w(key));
497 SysFreeString(key);
499 hres = IHTMLStorage_key(storage, 1, &key);
500 ok(hres == E_INVALIDARG, "key failed %08lx\n", hres);
502 V_VT(&var) = 0xdead;
503 key = SysAllocString(L"undefined");
504 hres = IHTMLStorage_getItem(storage, key, &var);
505 ok(hres == S_OK, "getItem failed: %08lx\n", hres);
506 ok(V_VT(&var) == VT_NULL, "got %d\n", V_VT(&var));
507 SysFreeString(key);
509 hres = IHTMLStorage_clear(storage2);
510 ok(hres == S_OK, "clear failed %08lx\n", hres);
512 hres = IHTMLStorage_get_length(storage, &lval);
513 ok(hres == S_OK, "get_length failed %08lx\n", hres);
514 ok(lval == 0, "length = %ld\n", lval);
515 hres = IHTMLStorage_get_length(storage2, &lval);
516 ok(hres == S_OK, "get_length failed %08lx\n", hres);
517 ok(lval == 0, "length = %ld\n", lval);
519 hres = IHTMLStorage_get_remainingSpace(storage, &lval);
520 ok(hres == S_OK, "get_remainingSpace failed %08lx\n", hres);
521 ok(lval == space, "remainingSpace = %ld\n", lval);
522 hres = IHTMLStorage_get_remainingSpace(storage2, &lval);
523 ok(hres == S_OK, "get_remainingSpace failed %08lx\n", hres);
524 ok(lval == space, "remainingSpace = %ld\n", lval);
526 hres = IHTMLStorage_key(storage, 0, &key);
527 ok(hres == E_INVALIDARG, "key failed %08lx\n", hres);
529 key = SysAllocString(L"foo");
530 value = SysAllocString(L"bar");
531 hres = IHTMLStorage_setItem(storage, key, value);
532 ok(hres == S_OK, "setItem failed: %08lx\n", hres);
534 IHTMLStorage_Release(storage2);
535 IHTMLDocument2_Release(doc2);
537 /* Case insensitive domain */
538 doc2 = create_doc_from_url(L"htTp://www.CodeWeavers.com/");
539 hres = get_sessionstorage(doc2, &storage2);
540 ok(hres == S_OK, "got %08lx\n", hres);
542 V_VT(&var) = 0xdead;
543 hres = IHTMLStorage_getItem(storage2, key, &var);
544 ok(hres == S_OK, "getItem failed: %08lx\n", hres);
545 ok(V_VT(&var) == VT_BSTR, "got %d\n", V_VT(&var));
546 ok(!wcscmp(V_BSTR(&var), L"bar"), "got %s\n", wine_dbgstr_w(V_BSTR(&var)));
547 VariantClear(&var);
549 IHTMLStorage_Release(storage2);
550 IHTMLDocument2_Release(doc2);
552 /* Different schemes */
553 doc2 = create_doc_from_url(L"https://www.codeweavers.com/");
554 hres = get_sessionstorage(doc2, &storage2);
555 ok(hres == S_OK, "got %08lx\n", hres);
557 V_VT(&var) = 0xdead;
558 hres = IHTMLStorage_getItem(storage2, key, &var);
559 ok(hres == S_OK, "getItem failed: %08lx\n", hres);
560 ok(V_VT(&var) == VT_BSTR, "got %d\n", V_VT(&var));
561 ok(!wcscmp(V_BSTR(&var), L"bar"), "got %s\n", wine_dbgstr_w(V_BSTR(&var)));
562 VariantClear(&var);
564 hres = IHTMLStorage_get_remainingSpace(storage, &lval);
565 ok(hres == S_OK, "get_remainingSpace failed %08lx\n", hres);
566 ok(lval == space - 6, "remainingSpace = %ld\n", lval);
568 IHTMLStorage_Release(storage2);
569 IHTMLDocument2_Release(doc2);
571 doc2 = create_doc_from_url(L"ftp://www.codeweavers.com/");
572 hres = get_sessionstorage(doc2, &storage2);
573 ok(hres == S_OK, "got %08lx\n", hres);
575 V_VT(&var) = 0xdead;
576 hres = IHTMLStorage_getItem(storage2, key, &var);
577 ok(hres == S_OK, "getItem failed: %08lx\n", hres);
578 ok(V_VT(&var) == VT_NULL, "got %d\n", V_VT(&var));
580 hres = IHTMLStorage_get_remainingSpace(storage2, &lval);
581 ok(hres == S_OK, "get_remainingSpace failed %08lx\n", hres);
582 ok(lval == space, "remainingSpace = %ld\n", lval);
584 hres = IHTMLStorage_setItem(storage2, key, value);
585 ok(hres == S_OK, "setItem failed: %08lx\n", hres);
587 V_VT(&var) = 0xdead;
588 hres = IHTMLStorage_getItem(storage2, key, &var);
589 ok(hres == S_OK, "getItem failed: %08lx\n", hres);
590 ok(V_VT(&var) == VT_BSTR, "got %d\n", V_VT(&var));
591 ok(!wcscmp(V_BSTR(&var), L"bar"), "got %s\n", wine_dbgstr_w(V_BSTR(&var)));
592 VariantClear(&var);
594 hres = IHTMLStorage_clear(storage2);
595 ok(hres == S_OK, "clear failed %08lx\n", hres);
597 IHTMLStorage_Release(storage2);
598 IHTMLDocument2_Release(doc2);
600 /* Different domain */
601 doc2 = create_doc_from_url(L"https://www.winehq.org/");
602 hres = get_sessionstorage(doc2, &storage2);
603 ok(hres == S_OK, "got %08lx\n", hres);
605 V_VT(&var) = 0xdead;
606 hres = IHTMLStorage_getItem(storage, key, &var);
607 ok(hres == S_OK, "getItem failed: %08lx\n", hres);
608 ok(V_VT(&var) == VT_BSTR, "got %d\n", V_VT(&var));
609 ok(!wcscmp(V_BSTR(&var), L"bar"), "got %s\n", wine_dbgstr_w(V_BSTR(&var)));
610 VariantClear(&var);
611 V_VT(&var) = 0xdead;
612 hres = IHTMLStorage_getItem(storage2, key, &var);
613 ok(hres == S_OK, "getItem failed: %08lx\n", hres);
614 ok(V_VT(&var) == VT_NULL, "got %d\n", V_VT(&var));
616 hres = IHTMLStorage_get_remainingSpace(storage2, &lval);
617 ok(hres == S_OK, "get_remainingSpace failed %08lx\n", hres);
618 ok(lval == space, "remainingSpace = %ld\n", lval);
620 hres = IHTMLStorage_clear(storage);
621 ok(hres == S_OK, "clear failed %08lx\n", hres);
623 IHTMLStorage_Release(storage2);
624 IHTMLStorage_Release(storage);
625 IHTMLDocument2_Release(doc2);
626 IHTMLDocument2_Release(doc);
627 SysFreeString(value);
628 SysFreeString(key);
631 START_TEST(misc)
633 CoInitialize(NULL);
635 test_HTMLLoadOptions();
636 test_HTMLStorage();
638 CoUninitialize();