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
21 #include <wine/test.h>
31 static void test_HTMLLoadOptions(void)
33 IHtmlLoadOptions
*loadopts
;
35 DWORD size
, i
, data
= 0xdeadbeef;
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
);
44 for(i
=0; i
<= HTMLLOADOPTION_FRAMELOAD
+3; i
++) {
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");
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
);
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");
76 hres
= IHtmlLoadOptions_SetOption(loadopts
, HTMLLOADOPTION_CODEPAGE
, &data
, 0);
77 ok(hres
== S_OK
, "SetOption failed: %08lx\n", hres
);
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
);
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
);
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
)
115 IPersistMoniker
*persist_mon
;
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
,
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
);
146 static HRESULT
get_localstorage(IHTMLDocument2
*doc
, IHTMLStorage
**storage
)
148 IHTMLWindow2
*window
;
149 IHTMLWindow6
*window6
;
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
);
159 win_skip("IHTMLWindow6 not supported\n");
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");
169 ok(hres
== S_OK
, "get_localStorage failed: %08lx\n", hres
);
170 ok(*storage
!= NULL
, "*storage == NULL\n");
173 IHTMLWindow6_Release(window6
);
177 static HRESULT
get_sessionstorage(IHTMLDocument2
*doc
, IHTMLStorage
**storage
)
179 IHTMLWindow2
*window
;
180 IHTMLWindow6
*window6
;
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
);
190 win_skip("IHTMLWindow6 not supported\n");
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
);
202 static void test_HTMLStorage(void)
204 IHTMLDocument2
*doc
, *doc2
;
205 IHTMLStorage
*storage
, *storage2
;
206 LONG space
, length
, lval
;
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
);
216 IHTMLDocument2_Release(doc2
);
217 IHTMLDocument2_Release(doc
);
221 hres
= get_localstorage(doc2
, &storage2
);
222 ok(hres
== S_OK
, "got %08lx\n", hres
);
224 key
= SysAllocString(L
"");
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
);
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
)));
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
));
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
);
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 */
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
);
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
));
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
);
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
);
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
);
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
);
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
);
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
"");
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
));
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
);
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
)));
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
)));
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
);
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
)));
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
)));
429 key
= SysAllocString(L
"null-value");
430 hres
= IHTMLStorage_setItem(storage
, key
, NULL
);
431 ok(hres
== S_OK
, "setItem failed: %08lx\n", hres
);
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
)));
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
);
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
);
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
)));
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
));
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
));
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
);
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
));
499 hres
= IHTMLStorage_key(storage
, 1, &key
);
500 ok(hres
== E_INVALIDARG
, "key failed %08lx\n", hres
);
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
));
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
);
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
)));
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
);
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
)));
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
);
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
);
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
)));
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
);
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
)));
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
);
635 test_HTMLLoadOptions();