2 * Copyright 2007-2008 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
22 #include <wine/test.h>
35 static const char doc_blank
[] = "<html></html>";
36 static const char doc_str1
[] = "<html><body>test</body></html>";
37 static const char range_test_str
[] =
38 "<html><body>test \na<font size=\"2\">bc\t123<br /> it's\r\n \t</font>text<br /></body></html>";
39 static const char range_test2_str
[] =
40 "<html><body>abc<hr />123<br /><hr />def</body></html>";
41 static const char elem_test_str
[] =
42 "<html><head><title>test</title><style>.body { margin-right: 0px; }</style>"
43 "<body>text test<!-- a comment -->"
44 "<a href=\"http://test\" name=\"x\">link</a>"
45 "<input id=\"in\" class=\"testclass\" tabIndex=\"2\" title=\"test title\" />"
46 "<select id=\"s\"><option id=\"x\" value=\"val1\">opt1</option><option id=\"y\">opt2</option></select>"
47 "<textarea id=\"X\">text text</textarea>"
48 "<table id=\"tbl\"><tbody><tr></tr><tr id=\"row2\"><td>td1 text</td><td>td2 text</td></tr></tbody></table>"
49 "<script id=\"sc\" type=\"text/javascript\"></script>"
52 "<iframe src=\"about:blank\" id=\"ifr\"></iframe>"
54 static const char indent_test_str
[] =
55 "<html><head><title>test</title></head><body>abc<br /><a href=\"about:blank\">123</a></body></html>";
57 static const WCHAR noneW
[] = {'N','o','n','e',0};
59 static WCHAR characterW
[] = {'c','h','a','r','a','c','t','e','r',0};
60 static WCHAR texteditW
[] = {'t','e','x','t','e','d','i','t',0};
61 static WCHAR wordW
[] = {'w','o','r','d',0};
63 static const WCHAR text_javascriptW
[] = {'t','e','x','t','/','j','a','v','a','s','c','r','i','p','t',0};
65 static const WCHAR idW
[] = {'i','d',0};
94 static const IID
* const none_iids
[] = {
99 static const IID
* const elem_iids
[] = {
106 &IID_IConnectionPointContainer
,
110 static const IID
* const body_iids
[] = {
116 &IID_IHTMLTextContainer
,
117 &IID_IHTMLBodyElement
,
119 &IID_IConnectionPointContainer
,
123 static const IID
* const anchor_iids
[] = {
129 &IID_IHTMLAnchorElement
,
131 &IID_IConnectionPointContainer
,
135 static const IID
* const input_iids
[] = {
141 &IID_IHTMLInputElement
,
142 &IID_IHTMLInputTextElement
,
144 &IID_IConnectionPointContainer
,
148 static const IID
* const select_iids
[] = {
154 &IID_IHTMLSelectElement
,
156 &IID_IConnectionPointContainer
,
160 static const IID
* const textarea_iids
[] = {
166 &IID_IHTMLTextAreaElement
,
168 &IID_IConnectionPointContainer
,
172 static const IID
* const option_iids
[] = {
178 &IID_IHTMLOptionElement
,
180 &IID_IConnectionPointContainer
,
184 static const IID
* const table_iids
[] = {
192 &IID_IConnectionPointContainer
,
196 static const IID
* const script_iids
[] = {
202 &IID_IHTMLScriptElement
,
204 &IID_IConnectionPointContainer
,
208 static const IID
* const text_iids
[] = {
211 &IID_IHTMLDOMTextNode
,
215 static const IID
* const location_iids
[] = {
221 static const IID
* const window_iids
[] = {
229 static const IID
* const comment_iids
[] = {
235 &IID_IHTMLCommentElement
,
237 &IID_IConnectionPointContainer
,
241 static const IID
* const img_iids
[] = {
248 &IID_IHTMLImgElement
,
249 &IID_IConnectionPointContainer
,
253 static const IID
* const tr_iids
[] = {
261 &IID_IConnectionPointContainer
,
265 static const IID
* const td_iids
[] = {
272 &IID_IConnectionPointContainer
,
276 static const IID
* const iframe_iids
[] = {
282 &IID_IHTMLFrameBase2
,
284 &IID_IConnectionPointContainer
,
288 static const IID
* const generic_iids
[] = {
294 &IID_IHTMLGenericElement
,
296 &IID_IConnectionPointContainer
,
300 static const IID
* const style_iids
[] = {
309 static const IID
* const cstyle_iids
[] = {
313 &IID_IHTMLCurrentStyle
,
323 static const elem_type_info_t elem_type_infos
[] = {
324 {"", none_iids
, NULL
},
325 {"HTML", elem_iids
, NULL
},
326 {"HEAD", elem_iids
, NULL
},
327 {"TITLE", elem_iids
, NULL
},
328 {"BODY", body_iids
, &DIID_DispHTMLBody
},
329 {"A", anchor_iids
, NULL
},
330 {"INPUT", input_iids
, &DIID_DispHTMLInputElement
},
331 {"SELECT", select_iids
, &DIID_DispHTMLSelectElement
},
332 {"TEXTAREA", textarea_iids
, NULL
},
333 {"OPTION", option_iids
, &DIID_DispHTMLOptionElement
},
334 {"STYLE", elem_iids
, NULL
},
335 {"BLOCKQUOTE",elem_iids
, NULL
},
336 {"P", elem_iids
, NULL
},
337 {"BR", elem_iids
, NULL
},
338 {"TABLE", table_iids
, &DIID_DispHTMLTable
},
339 {"TBODY", elem_iids
, NULL
},
340 {"SCRIPT", script_iids
, NULL
},
341 {"TEST", elem_iids
, &DIID_DispHTMLUnknownElement
},
342 {"TEST", generic_iids
, &DIID_DispHTMLGenericElement
},
343 {"!", comment_iids
, &DIID_DispHTMLCommentElement
},
344 {"IMG", img_iids
, &DIID_DispHTMLImg
},
345 {"TR", tr_iids
, &DIID_DispHTMLTableRow
},
346 {"TD", td_iids
, NULL
},
347 {"IFRAME", iframe_iids
, &DIID_DispHTMLIFrame
}
350 static const char *dbgstr_w(LPCWSTR str
)
352 static char buf
[512];
355 WideCharToMultiByte(CP_ACP
, 0, str
, -1, buf
, sizeof(buf
), NULL
, NULL
);
359 static const char *dbgstr_guid(REFIID riid
)
363 sprintf(buf
, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
364 riid
->Data1
, riid
->Data2
, riid
->Data3
, riid
->Data4
[0],
365 riid
->Data4
[1], riid
->Data4
[2], riid
->Data4
[3], riid
->Data4
[4],
366 riid
->Data4
[5], riid
->Data4
[6], riid
->Data4
[7]);
371 static int strcmp_wa(LPCWSTR strw
, const char *stra
)
374 MultiByteToWideChar(CP_ACP
, 0, stra
, -1, buf
, sizeof(buf
)/sizeof(WCHAR
));
375 return lstrcmpW(strw
, buf
);
378 static BSTR
a2bstr(const char *str
)
383 len
= MultiByteToWideChar(CP_ACP
, 0, str
, -1, NULL
, 0);
384 ret
= SysAllocStringLen(NULL
, len
);
385 MultiByteToWideChar(CP_ACP
, 0, str
, -1, ret
, len
);
390 static BOOL
iface_cmp(IUnknown
*iface1
, IUnknown
*iface2
)
392 IUnknown
*unk1
, *unk2
;
397 IUnknown_QueryInterface(iface1
, &IID_IUnknown
, (void**)&unk1
);
398 IUnknown_Release(unk1
);
399 IUnknown_QueryInterface(iface1
, &IID_IUnknown
, (void**)&unk2
);
400 IUnknown_Release(unk2
);
405 static IHTMLDocument2
*create_document(void)
410 hres
= CoCreateInstance(&CLSID_HTMLDocument
, NULL
, CLSCTX_INPROC_SERVER
|CLSCTX_INPROC_HANDLER
,
411 &IID_IHTMLDocument2
, (void**)&doc
);
412 ok(hres
== S_OK
, "CoCreateInstance failed: %08x\n", hres
);
417 #define test_ifaces(i,ids) _test_ifaces(__LINE__,i,ids)
418 static void _test_ifaces(unsigned line
, IUnknown
*iface
, REFIID
*iids
)
420 const IID
* const *piid
;
424 for(piid
= iids
; *piid
; piid
++) {
425 hres
= IDispatch_QueryInterface(iface
, *piid
, (void**)&unk
);
426 ok_(__FILE__
,line
) (hres
== S_OK
, "Could not get %s interface: %08x\n", dbgstr_guid(*piid
), hres
);
428 IUnknown_Release(unk
);
432 #define test_disp(u,id) _test_disp(__LINE__,u,id)
433 static void _test_disp(unsigned line
, IUnknown
*unk
, const IID
*diid
)
440 hres
= IUnknown_QueryInterface(unk
, &IID_IDispatchEx
, (void**)&dispex
);
441 ok_(__FILE__
,line
) (hres
== S_OK
, "Could not get IDispatch: %08x\n", hres
);
446 hres
= IDispatchEx_GetTypeInfoCount(dispex
, &ticnt
);
447 ok_(__FILE__
,line
) (hres
== S_OK
, "GetTypeInfoCount failed: %08x\n", hres
);
448 ok_(__FILE__
,line
) (ticnt
== 1, "ticnt=%u\n", ticnt
);
450 hres
= IDispatchEx_GetTypeInfo(dispex
, 0, 0, &typeinfo
);
451 ok_(__FILE__
,line
) (hres
== S_OK
, "GetTypeInfo failed: %08x\n", hres
);
453 if(SUCCEEDED(hres
)) {
456 hres
= ITypeInfo_GetTypeAttr(typeinfo
, &type_attr
);
457 ok_(__FILE__
,line
) (hres
== S_OK
, "GetTypeAttr failed: %08x\n", hres
);
458 ok_(__FILE__
,line
) (IsEqualGUID(&type_attr
->guid
, diid
), "unexpected guid %s\n", dbgstr_guid(&type_attr
->guid
));
460 ITypeInfo_ReleaseTypeAttr(typeinfo
, type_attr
);
461 ITypeInfo_Release(typeinfo
);
464 IDispatchEx_Release(dispex
);
467 #define get_elem_iface(u) _get_elem_iface(__LINE__,u)
468 static IHTMLElement
*_get_elem_iface(unsigned line
, IUnknown
*unk
)
473 hres
= IUnknown_QueryInterface(unk
, &IID_IHTMLElement
, (void**)&elem
);
474 ok_(__FILE__
,line
) (hres
== S_OK
, "Coule not get IHTMLElement: %08x\n", hres
);
478 #define get_elem2_iface(u) _get_elem2_iface(__LINE__,u)
479 static IHTMLElement2
*_get_elem2_iface(unsigned line
, IUnknown
*unk
)
484 hres
= IUnknown_QueryInterface(unk
, &IID_IHTMLElement2
, (void**)&elem
);
485 ok_(__FILE__
,line
) (hres
== S_OK
, "Coule not get IHTMLElement2: %08x\n", hres
);
489 #define get_elem3_iface(u) _get_elem3_iface(__LINE__,u)
490 static IHTMLElement3
*_get_elem3_iface(unsigned line
, IUnknown
*unk
)
495 hres
= IUnknown_QueryInterface(unk
, &IID_IHTMLElement3
, (void**)&elem
);
496 ok_(__FILE__
,line
) (hres
== S_OK
, "Coule not get IHTMLElement3: %08x\n", hres
);
500 #define get_node_iface(u) _get_node_iface(__LINE__,u)
501 static IHTMLDOMNode
*_get_node_iface(unsigned line
, IUnknown
*unk
)
506 hres
= IUnknown_QueryInterface(unk
, &IID_IHTMLDOMNode
, (void**)&node
);
507 ok_(__FILE__
,line
) (hres
== S_OK
, "Coule not get IHTMLDOMNode: %08x\n", hres
);
511 #define get_img_iface(u) _get_img_iface(__LINE__,u)
512 static IHTMLImgElement
*_get_img_iface(unsigned line
, IUnknown
*unk
)
514 IHTMLImgElement
*img
;
517 hres
= IUnknown_QueryInterface(unk
, &IID_IHTMLImgElement
, (void**)&img
);
518 ok_(__FILE__
,line
) (hres
== S_OK
, "Could not get IHTMLImgElement: %08x\n", hres
);
522 #define test_node_name(u,n) _test_node_name(__LINE__,u,n)
523 static void _test_node_name(unsigned line
, IUnknown
*unk
, const char *exname
)
525 IHTMLDOMNode
*node
= _get_node_iface(line
, unk
);
529 hres
= IHTMLDOMNode_get_nodeName(node
, &name
);
530 IHTMLDOMNode_Release(node
);
531 ok_(__FILE__
, line
) (hres
== S_OK
, "get_nodeName failed: %08x\n", hres
);
532 ok_(__FILE__
, line
) (!strcmp_wa(name
, exname
), "got name: %s, expected %s\n", dbgstr_w(name
), exname
);
537 #define test_elem_tag(u,n) _test_elem_tag(__LINE__,u,n)
538 static void _test_elem_tag(unsigned line
, IUnknown
*unk
, const char *extag
)
540 IHTMLElement
*elem
= _get_elem_iface(line
, unk
);
544 hres
= IHTMLElement_get_tagName(elem
, &tag
);
545 IHTMLElement_Release(elem
);
546 ok_(__FILE__
, line
) (hres
== S_OK
, "get_tagName failed: %08x\n", hres
);
547 ok_(__FILE__
, line
) (!strcmp_wa(tag
, extag
), "got tag: %s, expected %s\n", dbgstr_w(tag
), extag
);
552 #define test_elem_type(ifc,t) _test_elem_type(__LINE__,ifc,t)
553 static void _test_elem_type(unsigned line
, IUnknown
*unk
, elem_type_t type
)
555 _test_elem_tag(line
, unk
, elem_type_infos
[type
].tag
);
556 _test_ifaces(line
, unk
, elem_type_infos
[type
].iids
);
558 if(elem_type_infos
[type
].dispiid
)
559 _test_disp(line
, unk
, elem_type_infos
[type
].dispiid
);
562 #define test_elem_attr(e,n,v) _test_elem_attr(__LINE__,e,n,v)
563 static void _test_elem_attr(unsigned line
, IHTMLElement
*elem
, LPCWSTR name
, LPCWSTR exval
)
571 tmp
= SysAllocString(name
);
572 hres
= IHTMLElement_getAttribute(elem
, tmp
, 0, &value
);
574 ok_(__FILE__
,line
) (hres
== S_OK
, "getAttribute failed: %08x\n", hres
);
577 ok_(__FILE__
,line
) (V_VT(&value
) == VT_BSTR
, "vt=%d\n", V_VT(&value
));
578 ok_(__FILE__
,line
) (!lstrcmpW(exval
, V_BSTR(&value
)), "unexpected value %s\n", dbgstr_w(V_BSTR(&value
)));
580 ok_(__FILE__
,line
) (V_VT(&value
) == VT_NULL
, "vt=%d\n", V_VT(&value
));
583 VariantClear(&value
);
586 #define test_elem_offset(u) _test_elem_offset(__LINE__,u)
587 static void _test_elem_offset(unsigned line
, IUnknown
*unk
)
589 IHTMLElement
*elem
= _get_elem_iface(line
, unk
);
593 hres
= IHTMLElement_get_offsetTop(elem
, &l
);
594 ok_(__FILE__
,line
) (hres
== S_OK
, "get_offsetTop failed: %08x\n", hres
);
596 hres
= IHTMLElement_get_offsetHeight(elem
, &l
);
597 ok_(__FILE__
,line
) (hres
== S_OK
, "get_offsetHeight failed: %08x\n", hres
);
599 hres
= IHTMLElement_get_offsetWidth(elem
, &l
);
600 ok_(__FILE__
,line
) (hres
== S_OK
, "get_offsetWidth failed: %08x\n", hres
);
602 IHTMLElement_Release(elem
);
605 static void test_doc_elem(IHTMLDocument2
*doc
)
608 IHTMLDocument3
*doc3
;
611 hres
= IHTMLDocument2_QueryInterface(doc
, &IID_IHTMLDocument3
, (void**)&doc3
);
612 ok(hres
== S_OK
, "QueryInterface(IID_IHTMLDocument3) failed: %08x\n", hres
);
614 hres
= IHTMLDocument3_get_documentElement(doc3
, &elem
);
615 IHTMLDocument3_Release(doc3
);
616 ok(hres
== S_OK
, "get_documentElement failed: %08x\n", hres
);
618 test_node_name((IUnknown
*)elem
, "HTML");
619 test_elem_tag((IUnknown
*)elem
, "HTML");
621 IHTMLElement_Release(elem
);
624 #define get_doc_elem(d) _get_doc_elem(__LINE__,d)
625 static IHTMLElement
*_get_doc_elem(unsigned line
, IHTMLDocument2
*doc
)
628 IHTMLDocument3
*doc3
;
631 hres
= IHTMLDocument2_QueryInterface(doc
, &IID_IHTMLDocument3
, (void**)&doc3
);
632 ok_(__FILE__
,line
) (hres
== S_OK
, "Could not get IHTMLDocument3 interface: %08x\n", hres
);
633 hres
= IHTMLDocument3_get_documentElement(doc3
, &elem
);
634 ok_(__FILE__
,line
) (hres
== S_OK
, "get_documentElement failed: %08x\n", hres
);
635 IHTMLDocument3_Release(doc3
);
640 #define test_option_text(o,t) _test_option_text(__LINE__,o,t)
641 static void _test_option_text(unsigned line
, IHTMLOptionElement
*option
, const char *text
)
646 hres
= IHTMLOptionElement_get_text(option
, &bstr
);
647 ok_(__FILE__
,line
) (hres
== S_OK
, "get_text failed: %08x\n", hres
);
648 ok_(__FILE__
,line
) (!strcmp_wa(bstr
, text
), "text=%s\n", dbgstr_w(bstr
));
652 #define test_option_put_text(o,t) _test_option_put_text(__LINE__,o,t)
653 static void _test_option_put_text(unsigned line
, IHTMLOptionElement
*option
, const char *text
)
659 hres
= IHTMLOptionElement_put_text(option
, bstr
);
661 ok(hres
== S_OK
, "put_text failed: %08x\n", hres
);
663 _test_option_text(line
, option
, text
);
666 #define test_option_value(o,t) _test_option_value(__LINE__,o,t)
667 static void _test_option_value(unsigned line
, IHTMLOptionElement
*option
, const char *value
)
672 hres
= IHTMLOptionElement_get_value(option
, &bstr
);
673 ok_(__FILE__
,line
) (hres
== S_OK
, "get_value failed: %08x\n", hres
);
674 ok_(__FILE__
,line
) (!strcmp_wa(bstr
, value
), "value=%s\n", dbgstr_w(bstr
));
678 #define test_option_put_value(o,t) _test_option_put_value(__LINE__,o,t)
679 static void _test_option_put_value(unsigned line
, IHTMLOptionElement
*option
, const char *value
)
684 bstr
= a2bstr(value
);
685 hres
= IHTMLOptionElement_put_value(option
, bstr
);
687 ok(hres
== S_OK
, "put_value failed: %08x\n", hres
);
689 _test_option_value(line
, option
, value
);
692 #define create_option_elem(d,t,v) _create_option_elem(__LINE__,d,t,v)
693 static IHTMLOptionElement
*_create_option_elem(unsigned line
, IHTMLDocument2
*doc
,
694 const char *txt
, const char *val
)
696 IHTMLOptionElementFactory
*factory
;
697 IHTMLOptionElement
*option
;
698 IHTMLWindow2
*window
;
699 VARIANT text
, value
, empty
;
702 hres
= IHTMLDocument2_get_parentWindow(doc
, &window
);
703 ok_(__FILE__
,line
) (hres
== S_OK
, "get_parentElement failed: %08x\n", hres
);
705 hres
= IHTMLWindow2_get_Option(window
, &factory
);
706 IHTMLWindow2_Release(window
);
707 ok_(__FILE__
,line
) (hres
== S_OK
, "get_Option failed: %08x\n", hres
);
709 V_VT(&text
) = VT_BSTR
;
710 V_BSTR(&text
) = a2bstr(txt
);
711 V_VT(&value
) = VT_BSTR
;
712 V_BSTR(&value
) = a2bstr(val
);
713 V_VT(&empty
) = VT_EMPTY
;
715 hres
= IHTMLOptionElementFactory_create(factory
, text
, value
, empty
, empty
, &option
);
716 ok_(__FILE__
,line
) (hres
== S_OK
, "create failed: %08x\n", hres
);
718 IHTMLOptionElementFactory_Release(factory
);
720 VariantClear(&value
);
722 _test_option_text(line
, option
, txt
);
723 _test_option_value(line
, option
, val
);
728 #define test_select_length(s,l) _test_select_length(__LINE__,s,l)
729 static void _test_select_length(unsigned line
, IHTMLSelectElement
*select
, long length
)
731 long len
= 0xdeadbeef;
734 hres
= IHTMLSelectElement_get_length(select
, &len
);
735 ok_(__FILE__
,line
) (hres
== S_OK
, "get_length failed: %08x\n", hres
);
736 ok_(__FILE__
,line
) (len
== length
, "len=%ld, expected %ld\n", len
, length
);
739 #define test_select_selidx(s,i) _test_select_selidx(__LINE__,s,i)
740 static void _test_select_selidx(unsigned line
, IHTMLSelectElement
*select
, long index
)
742 long idx
= 0xdeadbeef;
745 hres
= IHTMLSelectElement_get_selectedIndex(select
, &idx
);
746 ok_(__FILE__
,line
) (hres
== S_OK
, "get_selectedIndex failed: %08x\n", hres
);
747 ok_(__FILE__
,line
) (idx
== index
, "idx=%ld, expected %ld\n", idx
, index
);
750 #define test_select_put_selidx(s,i) _test_select_put_selidx(__LINE__,s,i)
751 static void _test_select_put_selidx(unsigned line
, IHTMLSelectElement
*select
, long index
)
755 hres
= IHTMLSelectElement_put_selectedIndex(select
, index
);
756 ok_(__FILE__
,line
) (hres
== S_OK
, "get_selectedIndex failed: %08x\n", hres
);
757 _test_select_selidx(line
, select
, index
);
760 #define test_select_value(s,v) _test_select_value(__LINE__,s,v)
761 static void _test_select_value(unsigned line
, IHTMLSelectElement
*select
, const char *exval
)
766 hres
= IHTMLSelectElement_get_value(select
, &val
);
767 ok_(__FILE__
,line
) (hres
== S_OK
, "get_value failed: %08x\n", hres
);
769 ok_(__FILE__
,line
) (!strcmp_wa(val
, exval
), "unexpected value %s\n", dbgstr_w(val
));
771 ok_(__FILE__
,line
) (val
== NULL
, "val=%s, expected NULL\n", dbgstr_w(val
));
774 #define test_select_set_value(s,v) _test_select_set_value(__LINE__,s,v)
775 static void _test_select_set_value(unsigned line
, IHTMLSelectElement
*select
, const char *val
)
781 hres
= IHTMLSelectElement_put_value(select
, bstr
);
783 ok_(__FILE__
,line
) (hres
== S_OK
, "put_value failed: %08x\n", hres
);
786 #define test_select_type(s,t) _test_select_type(__LINE__,s,t)
787 static void _test_select_type(unsigned line
, IHTMLSelectElement
*select
, const char *extype
)
792 hres
= IHTMLSelectElement_get_type(select
, &type
);
793 ok_(__FILE__
,line
) (hres
== S_OK
, "get_type failed: %08x\n", hres
);
794 ok_(__FILE__
,line
) (!strcmp_wa(type
, extype
), "type=%s, expected %s\n", dbgstr_w(type
), extype
);
797 #define test_range_text(r,t) _test_range_text(__LINE__,r,t)
798 static void _test_range_text(unsigned line
, IHTMLTxtRange
*range
, const char *extext
)
803 hres
= IHTMLTxtRange_get_text(range
, &text
);
804 ok_(__FILE__
, line
) (hres
== S_OK
, "get_text failed: %08x\n", hres
);
807 ok_(__FILE__
, line
) (text
!= NULL
, "text == NULL\n");
808 ok_(__FILE__
, line
) (!strcmp_wa(text
, extext
), "text=\"%s\", expected \"%s\"\n", dbgstr_w(text
), extext
);
810 ok_(__FILE__
, line
) (text
== NULL
, "text=\"%s\", expected NULL\n", dbgstr_w(text
));
817 #define test_range_collapse(r,b) _test_range_collapse(__LINE__,r,b)
818 static void _test_range_collapse(unsigned line
, IHTMLTxtRange
*range
, BOOL b
)
822 hres
= IHTMLTxtRange_collapse(range
, b
);
823 ok_(__FILE__
, line
) (hres
== S_OK
, "collapse failed: %08x\n", hres
);
824 _test_range_text(line
, range
, NULL
);
827 #define test_range_expand(r,u,b,t) _test_range_expand(__LINE__,r,u,b,t)
828 static void _test_range_expand(unsigned line
, IHTMLTxtRange
*range
, LPWSTR unit
,
829 VARIANT_BOOL exb
, const char *extext
)
831 VARIANT_BOOL b
= 0xe0e0;
834 hres
= IHTMLTxtRange_expand(range
, unit
, &b
);
835 ok_(__FILE__
,line
) (hres
== S_OK
, "expand failed: %08x\n", hres
);
836 ok_(__FILE__
,line
) (b
== exb
, "b=%x, expected %x\n", b
, exb
);
837 _test_range_text(line
, range
, extext
);
840 #define test_range_move(r,u,c,e) _test_range_move(__LINE__,r,u,c,e)
841 static void _test_range_move(unsigned line
, IHTMLTxtRange
*range
, LPWSTR unit
, long cnt
, long excnt
)
846 hres
= IHTMLTxtRange_move(range
, unit
, cnt
, &c
);
847 ok_(__FILE__
,line
) (hres
== S_OK
, "move failed: %08x\n", hres
);
848 ok_(__FILE__
,line
) (c
== excnt
, "count=%ld, expected %ld\n", c
, excnt
);
849 _test_range_text(line
, range
, NULL
);
852 #define test_range_movestart(r,u,c,e) _test_range_movestart(__LINE__,r,u,c,e)
853 static void _test_range_movestart(unsigned line
, IHTMLTxtRange
*range
,
854 LPWSTR unit
, long cnt
, long excnt
)
859 hres
= IHTMLTxtRange_moveStart(range
, unit
, cnt
, &c
);
860 ok_(__FILE__
,line
) (hres
== S_OK
, "move failed: %08x\n", hres
);
861 ok_(__FILE__
,line
) (c
== excnt
, "count=%ld, expected %ld\n", c
, excnt
);
864 #define test_range_moveend(r,u,c,e) _test_range_moveend(__LINE__,r,u,c,e)
865 static void _test_range_moveend(unsigned line
, IHTMLTxtRange
*range
, LPWSTR unit
, long cnt
, long excnt
)
870 hres
= IHTMLTxtRange_moveEnd(range
, unit
, cnt
, &c
);
871 ok_(__FILE__
,line
) (hres
== S_OK
, "move failed: %08x\n", hres
);
872 ok_(__FILE__
,line
) (c
== excnt
, "count=%ld, expected %ld\n", c
, excnt
);
875 #define test_range_put_text(r,t) _test_range_put_text(__LINE__,r,t)
876 static void _test_range_put_text(unsigned line
, IHTMLTxtRange
*range
, const char *text
)
879 BSTR bstr
= a2bstr(text
);
881 hres
= IHTMLTxtRange_put_text(range
, bstr
);
882 ok_(__FILE__
,line
) (hres
== S_OK
, "put_text failed: %08x\n", hres
);
884 _test_range_text(line
, range
, NULL
);
887 #define test_range_inrange(r1,r2,b) _test_range_inrange(__LINE__,r1,r2,b)
888 static void _test_range_inrange(unsigned line
, IHTMLTxtRange
*range1
, IHTMLTxtRange
*range2
, VARIANT_BOOL exb
)
894 hres
= IHTMLTxtRange_inRange(range1
, range2
, &b
);
895 ok_(__FILE__
,line
) (hres
== S_OK
, "(1->2) isEqual failed: %08x\n", hres
);
896 ok_(__FILE__
,line
) (b
== exb
, "(1->2) b=%x, expected %x\n", b
, exb
);
899 #define test_range_isequal(r1,r2,b) _test_range_isequal(__LINE__,r1,r2,b)
900 static void _test_range_isequal(unsigned line
, IHTMLTxtRange
*range1
, IHTMLTxtRange
*range2
, VARIANT_BOOL exb
)
906 hres
= IHTMLTxtRange_isEqual(range1
, range2
, &b
);
907 ok_(__FILE__
,line
) (hres
== S_OK
, "(1->2) isEqual failed: %08x\n", hres
);
908 ok_(__FILE__
,line
) (b
== exb
, "(1->2) b=%x, expected %x\n", b
, exb
);
911 hres
= IHTMLTxtRange_isEqual(range2
, range1
, &b
);
912 ok_(__FILE__
,line
) (hres
== S_OK
, "(2->1) isEqual failed: %08x\n", hres
);
913 ok_(__FILE__
,line
) (b
== exb
, "(2->1) b=%x, expected %x\n", b
, exb
);
916 test_range_inrange(range1
, range2
, VARIANT_TRUE
);
917 test_range_inrange(range2
, range1
, VARIANT_TRUE
);
921 #define test_range_parent(r,t) _test_range_parent(__LINE__,r,t)
922 static void _test_range_parent(unsigned line
, IHTMLTxtRange
*range
, elem_type_t type
)
927 hres
= IHTMLTxtRange_parentElement(range
, &elem
);
928 ok_(__FILE__
,line
) (hres
== S_OK
, "parentElement failed: %08x\n", hres
);
930 _test_elem_type(line
, (IUnknown
*)elem
, type
);
932 IHTMLElement_Release(elem
);
935 #define test_elem_collection(c,t,l) _test_elem_collection(__LINE__,c,t,l)
936 static void _test_elem_collection(unsigned line
, IUnknown
*unk
,
937 const elem_type_t
*elem_types
, long exlen
)
939 IHTMLElementCollection
*col
;
946 hres
= IUnknown_QueryInterface(unk
, &IID_IHTMLElementCollection
, (void**)&col
);
947 ok_(__FILE__
,line
) (hres
== S_OK
, "Could not get IHTMLElementCollection: %08x\n", hres
);
949 test_disp((IUnknown
*)col
, &DIID_DispHTMLElementCollection
);
951 hres
= IHTMLElementCollection_get_length(col
, &len
);
952 ok_(__FILE__
,line
) (hres
== S_OK
, "get_length failed: %08x\n", hres
);
953 ok_(__FILE__
,line
) (len
== exlen
, "len=%ld, expected %ld\n", len
, exlen
);
958 V_VT(&index
) = VT_EMPTY
;
961 for(i
=0; i
<len
; i
++) {
963 disp
= (void*)0xdeadbeef;
964 hres
= IHTMLElementCollection_item(col
, name
, index
, &disp
);
965 ok_(__FILE__
,line
) (hres
== S_OK
, "item(%d) failed: %08x\n", i
, hres
);
966 ok_(__FILE__
,line
) (disp
!= NULL
, "item returned NULL\n");
967 if(FAILED(hres
) || !disp
)
970 _test_elem_type(line
, (IUnknown
*)disp
, elem_types
[i
]);
971 IDispatch_Release(disp
);
975 disp
= (void*)0xdeadbeef;
976 hres
= IHTMLElementCollection_item(col
, name
, index
, &disp
);
977 ok_(__FILE__
,line
) (hres
== S_OK
, "item failed: %08x\n", hres
);
978 ok_(__FILE__
,line
) (disp
== NULL
, "disp != NULL\n");
981 disp
= (void*)0xdeadbeef;
982 hres
= IHTMLElementCollection_item(col
, name
, index
, &disp
);
983 ok_(__FILE__
,line
) (hres
== E_INVALIDARG
, "item failed: %08x, expected E_INVALIDARG\n", hres
);
984 ok_(__FILE__
,line
) (disp
== NULL
, "disp != NULL\n");
986 IHTMLElementCollection_Release(col
);
989 #define test_elem_getelembytag(u,t,l) _test_elem_getelembytag(__LINE__,u,t,l)
990 static void _test_elem_getelembytag(unsigned line
, IUnknown
*unk
, elem_type_t type
, long exlen
)
992 IHTMLElement2
*elem
= _get_elem2_iface(line
, unk
);
993 IHTMLElementCollection
*col
= NULL
;
994 elem_type_t
*types
= NULL
;
999 tmp
= a2bstr(elem_type_infos
[type
].tag
);
1000 hres
= IHTMLElement2_getElementsByTagName(elem
, tmp
, &col
);
1002 IHTMLElement2_Release(elem
);
1003 ok_(__FILE__
,line
) (hres
== S_OK
, "getElementByTagName failed: %08x\n", hres
);
1004 ok_(__FILE__
,line
) (col
!= NULL
, "col == NULL\n");
1007 types
= HeapAlloc(GetProcessHeap(), 0, exlen
*sizeof(elem_type_t
));
1008 for(i
=0; i
<exlen
; i
++)
1012 _test_elem_collection(line
, (IUnknown
*)col
, types
, exlen
);
1014 HeapFree(GetProcessHeap(), 0, types
);
1017 #define get_first_child(n) _get_first_child(__LINE__,n)
1018 static IHTMLDOMNode
*_get_first_child(unsigned line
, IUnknown
*unk
)
1020 IHTMLDOMNode
*node
= _get_node_iface(line
, unk
);
1021 IHTMLDOMNode
*child
= NULL
;
1024 hres
= IHTMLDOMNode_get_firstChild(node
, &child
);
1025 IHTMLDOMNode_Release(node
);
1026 ok_(__FILE__
,line
) (hres
== S_OK
, "get_firstChild failed: %08x\n", hres
);
1031 #define test_node_has_child(u,b) _test_node_has_child(__LINE__,u,b)
1032 static void _test_node_has_child(unsigned line
, IUnknown
*unk
, VARIANT_BOOL exb
)
1034 IHTMLDOMNode
*node
= _get_node_iface(line
, unk
);
1035 VARIANT_BOOL b
= 0xdead;
1038 hres
= IHTMLDOMNode_hasChildNodes(node
, &b
);
1039 ok_(__FILE__
,line
) (hres
== S_OK
, "hasChildNodes failed: %08x\n", hres
);
1040 ok_(__FILE__
,line
) (b
== exb
, "hasChildNodes=%x, expected %x\n", b
, exb
);
1042 IHTMLDOMNode_Release(node
);
1045 #define test_node_get_parent(u) _test_node_get_parent(__LINE__,u)
1046 static IHTMLDOMNode
*_test_node_get_parent(unsigned line
, IUnknown
*unk
)
1048 IHTMLDOMNode
*node
= _get_node_iface(line
, unk
);
1049 IHTMLDOMNode
*parent
;
1052 hres
= IHTMLDOMNode_get_parentNode(node
, &parent
);
1053 IHTMLDOMNode_Release(node
);
1054 ok_(__FILE__
,line
) (hres
== S_OK
, "get_parentNode failed: %08x\n", hres
);
1059 #define get_node_type(n) _get_node_type(__LINE__,n)
1060 static long _get_node_type(unsigned line
, IUnknown
*unk
)
1062 IHTMLDOMNode
*node
= _get_node_iface(line
, unk
);
1066 hres
= IHTMLDOMNode_get_nodeType(node
, &type
);
1067 ok(hres
== S_OK
, "get_nodeType failed: %08x\n", hres
);
1069 IHTMLDOMNode_Release(node
);
1074 #define test_elem_get_parent(u) _test_elem_get_parent(__LINE__,u)
1075 static IHTMLElement
*_test_elem_get_parent(unsigned line
, IUnknown
*unk
)
1077 IHTMLElement
*elem
= _get_elem_iface(line
, unk
);
1078 IHTMLElement
*parent
;
1081 hres
= IHTMLElement_get_parentElement(elem
, &parent
);
1082 IHTMLElement_Release(elem
);
1083 ok_(__FILE__
,line
) (hres
== S_OK
, "get_parentElement failed: %08x\n", hres
);
1088 #define test_elem3_get_disabled(i,b) _test_elem3_get_disabled(__LINE__,i,b)
1089 static void _test_elem3_get_disabled(unsigned line
, IUnknown
*unk
, VARIANT_BOOL exb
)
1091 IHTMLElement3
*elem3
= _get_elem3_iface(line
, unk
);
1092 VARIANT_BOOL disabled
= 100;
1095 hres
= IHTMLElement3_get_disabled(elem3
, &disabled
);
1096 ok_(__FILE__
,line
) (hres
== S_OK
, "get_disabled failed: %08x\n", hres
);
1097 ok_(__FILE__
,line
) (disabled
== exb
, "disabled=%x, expected %x\n", disabled
, exb
);
1098 IHTMLElement3_Release(elem3
);
1101 #define test_elem3_set_disabled(i,b) _test_elem3_set_disabled(__LINE__,i,b)
1102 static void _test_elem3_set_disabled(unsigned line
, IUnknown
*unk
, VARIANT_BOOL b
)
1104 IHTMLElement3
*elem3
= _get_elem3_iface(line
, unk
);
1107 hres
= IHTMLElement3_put_disabled(elem3
, b
);
1108 ok_(__FILE__
,line
) (hres
== S_OK
, "get_disabled failed: %08x\n", hres
);
1110 IHTMLElement3_Release(elem3
);
1111 _test_elem3_get_disabled(line
, unk
, b
);
1114 #define test_select_get_disabled(i,b) _test_select_get_disabled(__LINE__,i,b)
1115 static void _test_select_get_disabled(unsigned line
, IHTMLSelectElement
*select
, VARIANT_BOOL exb
)
1117 VARIANT_BOOL disabled
= 100;
1120 hres
= IHTMLSelectElement_get_disabled(select
, &disabled
);
1121 ok_(__FILE__
,line
) (hres
== S_OK
, "get_disabled failed: %08x\n", hres
);
1122 ok_(__FILE__
,line
) (disabled
== exb
, "disabled=%x, expected %x\n", disabled
, exb
);
1124 _test_elem3_get_disabled(line
, (IUnknown
*)select
, exb
);
1127 #define test_select_set_disabled(i,b) _test_select_set_disabled(__LINE__,i,b)
1128 static void _test_select_set_disabled(unsigned line
, IHTMLSelectElement
*select
, VARIANT_BOOL b
)
1132 hres
= IHTMLSelectElement_put_disabled(select
, b
);
1133 ok_(__FILE__
,line
) (hres
== S_OK
, "get_disabled failed: %08x\n", hres
);
1135 _test_select_get_disabled(line
, select
, b
);
1138 #define elem_get_scroll_height(u) _elem_get_scroll_height(__LINE__,u)
1139 static long _elem_get_scroll_height(unsigned line
, IUnknown
*unk
)
1141 IHTMLElement2
*elem
= _get_elem2_iface(line
, unk
);
1142 IHTMLTextContainer
*txtcont
;
1143 long l
= -1, l2
= -1;
1146 hres
= IHTMLElement2_get_scrollHeight(elem
, &l
);
1147 ok_(__FILE__
,line
) (hres
== S_OK
, "get_scrollHeight failed: %08x\n", hres
);
1148 IHTMLElement2_Release(elem
);
1150 hres
= IUnknown_QueryInterface(unk
, &IID_IHTMLTextContainer
, (void**)&txtcont
);
1151 ok_(__FILE__
,line
) (hres
== S_OK
, "Could not get IHTMLTextContainer: %08x\n", hres
);
1153 hres
= IHTMLTextContainer_get_scrollHeight(txtcont
, &l2
);
1154 IHTMLTextContainer_Release(txtcont
);
1155 ok_(__FILE__
,line
) (hres
== S_OK
, "IHTMLTextContainer::get_scrollHeight failed: %ld\n", l2
);
1156 ok_(__FILE__
,line
) (l
== l2
, "unexpected height %ld, expected %ld\n", l2
, l
);
1161 #define elem_get_scroll_width(u) _elem_get_scroll_width(__LINE__,u)
1162 static long _elem_get_scroll_width(unsigned line
, IUnknown
*unk
)
1164 IHTMLElement2
*elem
= _get_elem2_iface(line
, unk
);
1165 IHTMLTextContainer
*txtcont
;
1166 long l
= -1, l2
= -1;
1169 hres
= IHTMLElement2_get_scrollWidth(elem
, &l
);
1170 ok_(__FILE__
,line
) (hres
== S_OK
, "get_scrollWidth failed: %08x\n", hres
);
1171 IHTMLElement2_Release(elem
);
1173 hres
= IUnknown_QueryInterface(unk
, &IID_IHTMLTextContainer
, (void**)&txtcont
);
1174 ok_(__FILE__
,line
) (hres
== S_OK
, "Could not get IHTMLTextContainer: %08x\n", hres
);
1176 hres
= IHTMLTextContainer_get_scrollWidth(txtcont
, &l2
);
1177 IHTMLTextContainer_Release(txtcont
);
1178 ok_(__FILE__
,line
) (hres
== S_OK
, "IHTMLTextContainer::get_scrollWidth failed: %ld\n", l2
);
1179 ok_(__FILE__
,line
) (l
== l2
, "unexpected width %ld, expected %ld\n", l2
, l
);
1184 #define elem_get_scroll_top(u) _elem_get_scroll_top(__LINE__,u)
1185 static long _elem_get_scroll_top(unsigned line
, IUnknown
*unk
)
1187 IHTMLElement2
*elem
= _get_elem2_iface(line
, unk
);
1188 IHTMLTextContainer
*txtcont
;
1189 long l
= -1, l2
= -1;
1192 hres
= IHTMLElement2_get_scrollTop(elem
, &l
);
1193 ok_(__FILE__
,line
) (hres
== S_OK
, "get_scrollTop failed: %08x\n", hres
);
1194 IHTMLElement2_Release(elem
);
1196 hres
= IUnknown_QueryInterface(unk
, &IID_IHTMLTextContainer
, (void**)&txtcont
);
1197 ok_(__FILE__
,line
) (hres
== S_OK
, "Could not get IHTMLTextContainer: %08x\n", hres
);
1199 hres
= IHTMLTextContainer_get_scrollTop(txtcont
, &l2
);
1200 IHTMLTextContainer_Release(txtcont
);
1201 ok_(__FILE__
,line
) (hres
== S_OK
, "IHTMLTextContainer::get_scrollTop failed: %ld\n", l2
);
1202 ok_(__FILE__
,line
) (l
== l2
, "unexpected top %ld, expected %ld\n", l2
, l
);
1207 #define elem_get_scroll_left(u) _elem_get_scroll_left(__LINE__,u)
1208 static void _elem_get_scroll_left(unsigned line
, IUnknown
*unk
)
1210 IHTMLElement2
*elem
= _get_elem2_iface(line
, unk
);
1211 IHTMLTextContainer
*txtcont
;
1212 long l
= -1, l2
= -1;
1215 hres
= IHTMLElement2_get_scrollLeft(elem
, NULL
);
1216 ok(hres
== E_INVALIDARG
, "expect E_INVALIDARG got 0x%08x\n", hres
);
1218 hres
= IHTMLElement2_get_scrollLeft(elem
, &l
);
1219 ok(hres
== S_OK
, "get_scrollTop failed: %08x\n", hres
);
1220 IHTMLElement2_Release(elem
);
1222 hres
= IUnknown_QueryInterface(unk
, &IID_IHTMLTextContainer
, (void**)&txtcont
);
1223 ok(hres
== S_OK
, "Could not get IHTMLTextContainer: %08x\n", hres
);
1225 hres
= IHTMLTextContainer_get_scrollLeft(txtcont
, &l2
);
1226 IHTMLTextContainer_Release(txtcont
);
1227 ok(hres
== S_OK
, "IHTMLTextContainer::get_scrollLeft failed: %ld\n", l2
);
1228 ok(l
== l2
, "unexpected left %ld, expected %ld\n", l2
, l
);
1231 #define test_img_set_src(u,s) _test_img_set_src(__LINE__,u,s)
1232 static void _test_img_set_src(unsigned line
, IUnknown
*unk
, const char *src
)
1234 IHTMLImgElement
*img
= _get_img_iface(line
, unk
);
1239 hres
= IHTMLImgElement_put_src(img
, tmp
);
1240 IHTMLImgElement_Release(img
);
1242 ok_(__FILE__
,line
) (hres
== S_OK
, "put_src failed: %08x\n", hres
);
1245 #define test_img_alt(u,a) _test_img_alt(__LINE__,u,a)
1246 static void _test_img_alt(unsigned line
, IUnknown
*unk
, const char *exalt
)
1248 IHTMLImgElement
*img
= _get_img_iface(line
, unk
);
1252 hres
= IHTMLImgElement_get_alt(img
, &alt
);
1253 ok_(__FILE__
,line
) (hres
== S_OK
, "get_alt failed: %08x\n", hres
);
1255 ok_(__FILE__
,line
) (!strcmp_wa(alt
, exalt
), "inexopected alt %s\n", dbgstr_w(alt
));
1257 ok_(__FILE__
,line
) (!alt
, "alt != NULL\n");
1261 #define test_img_set_alt(u,a) _test_img_set_alt(__LINE__,u,a)
1262 static void _test_img_set_alt(unsigned line
, IUnknown
*unk
, const char *alt
)
1264 IHTMLImgElement
*img
= _get_img_iface(line
, unk
);
1269 hres
= IHTMLImgElement_put_alt(img
, tmp
);
1270 ok_(__FILE__
,line
) (hres
== S_OK
, "get_alt failed: %08x\n", hres
);
1273 _test_img_alt(line
, unk
, alt
);
1276 #define test_input_get_disabled(i,b) _test_input_get_disabled(__LINE__,i,b)
1277 static void _test_input_get_disabled(unsigned line
, IHTMLInputElement
*input
, VARIANT_BOOL exb
)
1279 VARIANT_BOOL disabled
= 100;
1282 hres
= IHTMLInputElement_get_disabled(input
, &disabled
);
1283 ok_(__FILE__
,line
) (hres
== S_OK
, "get_disabled failed: %08x\n", hres
);
1284 ok_(__FILE__
,line
) (disabled
== exb
, "disabled=%x, expected %x\n", disabled
, exb
);
1286 _test_elem3_get_disabled(line
, (IUnknown
*)input
, exb
);
1289 #define test_input_set_disabled(i,b) _test_input_set_disabled(__LINE__,i,b)
1290 static void _test_input_set_disabled(unsigned line
, IHTMLInputElement
*input
, VARIANT_BOOL b
)
1294 hres
= IHTMLInputElement_put_disabled(input
, b
);
1295 ok_(__FILE__
,line
) (hres
== S_OK
, "get_disabled failed: %08x\n", hres
);
1297 _test_input_get_disabled(line
, input
, b
);
1300 #define test_input_value(o,t) _test_input_value(__LINE__,o,t)
1301 static void _test_input_value(unsigned line
, IUnknown
*unk
, const char *exval
)
1303 IHTMLInputElement
*input
;
1307 hres
= IUnknown_QueryInterface(unk
, &IID_IHTMLInputElement
, (void**)&input
);
1308 ok_(__FILE__
,line
) (hres
== S_OK
, "Could not get IHTMLInputElement: %08x\n", hres
);
1312 hres
= IHTMLInputElement_get_value(input
, &bstr
);
1313 ok_(__FILE__
,line
) (hres
== S_OK
, "get_value failed: %08x\n", hres
);
1315 ok_(__FILE__
,line
) (!strcmp_wa(bstr
, exval
), "value=%s\n", dbgstr_w(bstr
));
1317 ok_(__FILE__
,line
) (!exval
, "exval != NULL\n");
1318 SysFreeString(bstr
);
1319 IHTMLInputElement_Release(input
);
1322 #define test_input_put_value(o,v) _test_input_put_value(__LINE__,o,v)
1323 static void _test_input_put_value(unsigned line
, IUnknown
*unk
, const char *val
)
1325 IHTMLInputElement
*input
;
1329 hres
= IUnknown_QueryInterface(unk
, &IID_IHTMLInputElement
, (void**)&input
);
1330 ok_(__FILE__
,line
) (hres
== S_OK
, "Could not get IHTMLInputElement: %08x\n", hres
);
1335 hres
= IHTMLInputElement_get_value(input
, &bstr
);
1336 ok_(__FILE__
,line
) (hres
== S_OK
, "get_value failed: %08x\n", hres
);
1337 SysFreeString(bstr
);
1338 IHTMLInputElement_Release(input
);
1341 #define get_child_nodes(u) _get_child_nodes(__LINE__,u)
1342 static IHTMLDOMChildrenCollection
*_get_child_nodes(unsigned line
, IUnknown
*unk
)
1344 IHTMLDOMNode
*node
= _get_node_iface(line
, unk
);
1345 IHTMLDOMChildrenCollection
*col
= NULL
;
1349 hres
= IHTMLDOMNode_get_childNodes(node
, &disp
);
1350 IHTMLDOMNode_Release(node
);
1351 ok_(__FILE__
,line
) (hres
== S_OK
, "get_childNodes failed: %08x\n", hres
);
1355 hres
= IDispatch_QueryInterface(disp
, &IID_IHTMLDOMChildrenCollection
, (void**)&col
);
1356 IDispatch_Release(disp
);
1357 ok_(__FILE__
,line
) (hres
== S_OK
, "Could not get IHTMLDOMChildrenCollection: %08x\n", hres
);
1362 #define test_elem_class(u,c) _test_elem_class(__LINE__,u,c)
1363 static void _test_elem_class(unsigned line
, IUnknown
*unk
, const char *exclass
)
1365 IHTMLElement
*elem
= _get_elem_iface(line
, unk
);
1366 BSTR
class = (void*)0xdeadbeef;
1369 hres
= IHTMLElement_get_className(elem
, &class);
1370 IHTMLElement_Release(elem
);
1371 ok_(__FILE__
,line
) (hres
== S_OK
, "get_className failed: %08x\n", hres
);
1373 ok_(__FILE__
,line
) (!strcmp_wa(class, exclass
), "unexpected className %s\n", dbgstr_w(class));
1375 ok_(__FILE__
,line
) (!class, "class != NULL\n");
1376 SysFreeString(class);
1379 #define test_elem_tabindex(u,i) _test_elem_tabindex(__LINE__,u,i)
1380 static void _test_elem_tabindex(unsigned line
, IUnknown
*unk
, short exindex
)
1382 IHTMLElement2
*elem2
= _get_elem2_iface(line
, unk
);
1386 hres
= IHTMLElement2_get_tabIndex(elem2
, &index
);
1387 IHTMLElement2_Release(elem2
);
1388 ok_(__FILE__
,line
) (hres
== S_OK
, "get_tabIndex failed: %08x\n", hres
);
1389 ok_(__FILE__
,line
) (index
== exindex
, "unexpected index %d\n", index
);
1392 #define test_elem_set_tabindex(u,i) _test_elem_set_tabindex(__LINE__,u,i)
1393 static void _test_elem_set_tabindex(unsigned line
, IUnknown
*unk
, short index
)
1395 IHTMLElement2
*elem2
= _get_elem2_iface(line
, unk
);
1398 hres
= IHTMLElement2_put_tabIndex(elem2
, index
);
1399 IHTMLElement2_Release(elem2
);
1400 ok_(__FILE__
,line
) (hres
== S_OK
, "get_tabIndex failed: %08x\n", hres
);
1402 _test_elem_tabindex(line
, unk
, index
);
1405 #define test_elem_set_class(u,c) _test_elem_set_class(__LINE__,u,c)
1406 static void _test_elem_set_class(unsigned line
, IUnknown
*unk
, const char *class)
1408 IHTMLElement
*elem
= _get_elem_iface(line
, unk
);
1412 tmp
= class ? a2bstr(class) : NULL
;
1413 hres
= IHTMLElement_put_className(elem
, tmp
);
1414 IHTMLElement_Release(elem
);
1415 ok_(__FILE__
,line
) (hres
== S_OK
, "put_className failed: %08x\n", hres
);
1418 _test_elem_class(line
, unk
, class);
1421 #define get_child_item(c,i) _get_child_item(__LINE__,c,i)
1422 static IHTMLDOMNode
*_get_child_item(unsigned line
, IHTMLDOMChildrenCollection
*col
, long idx
)
1424 IHTMLDOMNode
*node
= NULL
;
1428 hres
= IHTMLDOMChildrenCollection_item(col
, idx
, &disp
);
1429 ok(hres
== S_OK
, "item failed: %08x\n", hres
);
1431 node
= _get_node_iface(line
, (IUnknown
*)disp
);
1432 IDispatch_Release(disp
);
1437 #define test_elem_id(e,i) _test_elem_id(__LINE__,e,i)
1438 static void _test_elem_id(unsigned line
, IUnknown
*unk
, const char *exid
)
1440 IHTMLElement
*elem
= _get_elem_iface(line
, unk
);
1441 BSTR id
= (void*)0xdeadbeef;
1444 hres
= IHTMLElement_get_id(elem
, &id
);
1445 IHTMLElement_Release(elem
);
1446 ok_(__FILE__
,line
) (hres
== S_OK
, "get_id failed: %08x\n", hres
);
1449 ok_(__FILE__
,line
) (!strcmp_wa(id
, exid
), "unexpected id %s\n", dbgstr_w(id
));
1451 ok_(__FILE__
,line
) (!id
, "id=%s\n", dbgstr_w(id
));
1456 #define test_elem_put_id(u,i) _test_elem_put_id(__LINE__,u,i)
1457 static void _test_elem_put_id(unsigned line
, IUnknown
*unk
, const char *new_id
)
1459 IHTMLElement
*elem
= _get_elem_iface(line
, unk
);
1460 BSTR tmp
= a2bstr(new_id
);
1463 hres
= IHTMLElement_put_id(elem
, tmp
);
1464 IHTMLElement_Release(elem
);
1466 ok_(__FILE__
,line
) (hres
== S_OK
, "put_id failed: %08x\n", hres
);
1468 _test_elem_id(line
, unk
, new_id
);
1471 #define test_elem_title(u,t) _test_elem_title(__LINE__,u,t)
1472 static void _test_elem_title(unsigned line
, IUnknown
*unk
, const char *extitle
)
1474 IHTMLElement
*elem
= _get_elem_iface(line
, unk
);
1478 hres
= IHTMLElement_get_title(elem
, &title
);
1479 IHTMLElement_Release(elem
);
1480 ok_(__FILE__
,line
) (hres
== S_OK
, "get_title failed: %08x\n", hres
);
1482 ok_(__FILE__
,line
) (!strcmp_wa(title
, extitle
), "unexpected title %s\n", dbgstr_w(title
));
1484 ok_(__FILE__
,line
) (!title
, "title=%s, expected NULL\n", dbgstr_w(title
));
1486 SysFreeString(title
);
1489 #define test_elem_set_title(u,t) _test_elem_set_title(__LINE__,u,t)
1490 static void _test_elem_set_title(unsigned line
, IUnknown
*unk
, const char *title
)
1492 IHTMLElement
*elem
= _get_elem_iface(line
, unk
);
1496 tmp
= a2bstr(title
);
1497 hres
= IHTMLElement_put_title(elem
, tmp
);
1498 ok_(__FILE__
,line
) (hres
== S_OK
, "get_title failed: %08x\n", hres
);
1500 IHTMLElement_Release(elem
);
1504 #define test_node_get_value_str(u,e) _test_node_get_value_str(__LINE__,u,e)
1505 static void _test_node_get_value_str(unsigned line
, IUnknown
*unk
, const char *exval
)
1507 IHTMLDOMNode
*node
= _get_node_iface(line
, unk
);
1511 hres
= IHTMLDOMNode_get_nodeValue(node
, &var
);
1512 IHTMLDOMNode_Release(node
);
1513 ok_(__FILE__
,line
) (hres
== S_OK
, "get_nodeValue failed: %08x, expected VT_BSTR\n", hres
);
1516 ok_(__FILE__
,line
) (V_VT(&var
) == VT_BSTR
, "vt=%d\n", V_VT(&var
));
1517 ok_(__FILE__
,line
) (!strcmp_wa(V_BSTR(&var
), exval
), "unexpected value %s\n", dbgstr_w(V_BSTR(&var
)));
1519 ok_(__FILE__
,line
) (V_VT(&var
) == VT_NULL
, "vt=%d, expected VT_NULL\n", V_VT(&var
));
1525 #define test_node_put_value_str(u,v) _test_node_put_value_str(__LINE__,u,v)
1526 static void _test_node_put_value_str(unsigned line
, IUnknown
*unk
, const char *val
)
1528 IHTMLDOMNode
*node
= _get_node_iface(line
, unk
);
1532 V_VT(&var
) = VT_BSTR
;
1533 V_BSTR(&var
) = a2bstr(val
);
1535 hres
= IHTMLDOMNode_put_nodeValue(node
, var
);
1536 ok_(__FILE__
,line
) (hres
== S_OK
, "get_nodeValue failed: %08x, expected VT_BSTR\n", hres
);
1537 IHTMLDOMNode_Release(node
);
1541 #define test_elem_client_size(u) _test_elem_client_size(__LINE__,u)
1542 static void _test_elem_client_size(unsigned line
, IUnknown
*unk
)
1544 IHTMLElement2
*elem
= _get_elem2_iface(line
, unk
);
1548 hres
= IHTMLElement2_get_clientWidth(elem
, &l
);
1549 ok_(__FILE__
,line
) (hres
== S_OK
, "get_clientWidth failed: %08x\n", hres
);
1550 hres
= IHTMLElement2_get_clientHeight(elem
, &l
);
1551 ok_(__FILE__
,line
) (hres
== S_OK
, "get_clientHeight failed: %08x\n", hres
);
1553 IHTMLElement2_Release(elem
);
1556 #define test_create_elem(d,t) _test_create_elem(__LINE__,d,t)
1557 static IHTMLElement
*_test_create_elem(unsigned line
, IHTMLDocument2
*doc
, const char *tag
)
1559 IHTMLElement
*elem
= NULL
;
1564 hres
= IHTMLDocument2_createElement(doc
, tmp
, &elem
);
1565 ok_(__FILE__
,line
) (hres
== S_OK
, "createElement failed: %08x\n", hres
);
1566 ok_(__FILE__
,line
) (elem
!= NULL
, "elem == NULL\n");
1571 #define test_create_text(d,t) _test_create_text(__LINE__,d,t)
1572 static IHTMLDOMNode
*_test_create_text(unsigned line
, IHTMLDocument2
*doc
, const char *text
)
1574 IHTMLDocument3
*doc3
;
1575 IHTMLDOMNode
*node
= NULL
;
1579 hres
= IHTMLDocument2_QueryInterface(doc
, &IID_IHTMLDocument3
, (void**)&doc3
);
1580 ok_(__FILE__
,line
) (hres
== S_OK
, "Could not get IHTMLDocument3: %08x\n", hres
);
1583 hres
= IHTMLDocument3_createTextNode(doc3
, tmp
, &node
);
1584 IHTMLDocument3_Release(doc3
);
1585 ok_(__FILE__
,line
) (hres
== S_OK
, "createElement failed: %08x\n", hres
);
1586 ok_(__FILE__
,line
) (node
!= NULL
, "node == NULL\n");
1591 #define test_node_append_child(n,c) _test_node_append_child(__LINE__,n,c)
1592 static IHTMLDOMNode
*_test_node_append_child(unsigned line
, IUnknown
*node_unk
, IUnknown
*child_unk
)
1594 IHTMLDOMNode
*node
= _get_node_iface(line
, node_unk
);
1595 IHTMLDOMNode
*child
= _get_node_iface(line
, child_unk
);
1596 IHTMLDOMNode
*new_child
= NULL
;
1599 hres
= IHTMLDOMNode_appendChild(node
, child
, &new_child
);
1600 ok_(__FILE__
,line
) (hres
== S_OK
, "appendChild failed: %08x\n", hres
);
1601 ok_(__FILE__
,line
) (new_child
!= NULL
, "new_child == NULL\n");
1602 /* TODO ok_(__FILE__,line) (new_child != child, "new_child == child\n"); */
1604 IHTMLDOMNode_Release(node
);
1605 IHTMLDOMNode_Release(child
);
1610 #define test_node_remove_child(n,c) _test_node_remove_child(__LINE__,n,c)
1611 static void _test_node_remove_child(unsigned line
, IUnknown
*unk
, IHTMLDOMNode
*child
)
1613 IHTMLDOMNode
*node
= _get_node_iface(line
, unk
);
1614 IHTMLDOMNode
*new_node
= NULL
;
1617 hres
= IHTMLDOMNode_removeChild(node
, child
, &new_node
);
1618 ok_(__FILE__
,line
) (hres
== S_OK
, "appendChild failed: %08x\n", hres
);
1619 ok_(__FILE__
,line
) (new_node
!= NULL
, "new_node == NULL\n");
1620 /* TODO ok_(__FILE__,line) (new_node != child, "new_node == child\n"); */
1622 IHTMLDOMNode_Release(node
);
1623 IHTMLDOMNode_Release(new_node
);
1626 #define test_doc_title(d,t) _test_doc_title(__LINE__,d,t)
1627 static void _test_doc_title(unsigned line
, IHTMLDocument2
*doc
, const char *extitle
)
1632 hres
= IHTMLDocument2_get_title(doc
, &title
);
1633 ok_(__FILE__
,line
) (hres
== S_OK
, "get_title failed: %08x\n", hres
);
1634 ok_(__FILE__
,line
) (!strcmp_wa(title
, extitle
), "unexpected title %s\n", dbgstr_w(title
));
1635 SysFreeString(title
);
1638 #define test_doc_set_title(d,t) _test_doc_set_title(__LINE__,d,t)
1639 static void _test_doc_set_title(unsigned line
, IHTMLDocument2
*doc
, const char *title
)
1644 tmp
= a2bstr(title
);
1645 hres
= IHTMLDocument2_put_title(doc
, tmp
);
1646 ok_(__FILE__
,line
) (hres
== S_OK
, "get_title failed: %08x\n", hres
);
1650 static void test_elem_col_item(IHTMLElementCollection
*col
, LPCWSTR n
,
1651 const elem_type_t
*elem_types
, long len
)
1654 VARIANT name
, index
;
1658 V_VT(&index
) = VT_EMPTY
;
1659 V_VT(&name
) = VT_BSTR
;
1660 V_BSTR(&name
) = SysAllocString(n
);
1662 hres
= IHTMLElementCollection_item(col
, name
, index
, &disp
);
1663 ok(hres
== S_OK
, "item failed: %08x\n", hres
);
1665 test_elem_collection((IUnknown
*)disp
, elem_types
, len
);
1666 IDispatch_Release(disp
);
1667 ok(hres
== S_OK
, "Could not get IHTMLElementCollection interface: %08x\n", hres
);
1671 V_VT(&index
) = VT_I4
;
1673 for(i
=0; i
<len
; i
++) {
1675 disp
= (void*)0xdeadbeef;
1676 hres
= IHTMLElementCollection_item(col
, name
, index
, &disp
);
1677 ok(hres
== S_OK
, "item failed: %08x\n", hres
);
1678 ok(disp
!= NULL
, "disp == NULL\n");
1679 if(FAILED(hres
) || !disp
)
1682 test_elem_type((IUnknown
*)disp
, elem_types
[i
]);
1684 IDispatch_Release(disp
);
1688 disp
= (void*)0xdeadbeef;
1689 hres
= IHTMLElementCollection_item(col
, name
, index
, &disp
);
1690 ok(hres
== S_OK
, "item failed: %08x\n", hres
);
1691 ok(disp
== NULL
, "disp != NULL\n");
1694 disp
= (void*)0xdeadbeef;
1695 hres
= IHTMLElementCollection_item(col
, name
, index
, &disp
);
1696 ok(hres
== E_INVALIDARG
, "item failed: %08x, expected E_INVALIDARG\n", hres
);
1697 ok(disp
== NULL
, "disp != NULL\n");
1700 SysFreeString(V_BSTR(&name
));
1703 static IHTMLElement
*get_elem_by_id(IHTMLDocument2
*doc
, LPCWSTR id
, BOOL expect_success
)
1705 IHTMLElementCollection
*col
;
1707 IDispatch
*disp
= (void*)0xdeadbeef;
1708 VARIANT name
, index
;
1711 hres
= IHTMLDocument2_get_all(doc
, &col
);
1712 ok(hres
== S_OK
, "get_all failed: %08x\n", hres
);
1713 ok(col
!= NULL
, "col == NULL\n");
1714 if(FAILED(hres
) || !col
)
1717 V_VT(&index
) = VT_EMPTY
;
1718 V_VT(&name
) = VT_BSTR
;
1719 V_BSTR(&name
) = SysAllocString(id
);
1721 hres
= IHTMLElementCollection_item(col
, name
, index
, &disp
);
1722 IHTMLElementCollection_Release(col
);
1723 SysFreeString(V_BSTR(&name
));
1724 ok(hres
== S_OK
, "item failed: %08x\n", hres
);
1725 if(!expect_success
) {
1726 ok(disp
== NULL
, "disp != NULL\n");
1730 ok(disp
!= NULL
, "disp == NULL\n");
1734 elem
= get_elem_iface((IUnknown
*)disp
);
1735 IDispatch_Release(disp
);
1740 static IHTMLElement
*get_doc_elem_by_id(IHTMLDocument2
*doc
, LPCWSTR id
)
1742 IHTMLDocument3
*doc3
;
1747 hres
= IHTMLDocument2_QueryInterface(doc
, &IID_IHTMLDocument3
, (void**)&doc3
);
1748 ok(hres
== S_OK
, "Could not get IHTMLDocument3 iface: %08x\n", hres
);
1750 tmp
= SysAllocString(id
);
1751 hres
= IHTMLDocument3_getElementById(doc3
, tmp
, &elem
);
1753 ok(hres
== S_OK
, "getElementById(%s) failed: %08x\n", dbgstr_w(id
), hres
);
1755 IHTMLDocument3_Release(doc3
);
1760 static void test_select_elem(IHTMLSelectElement
*select
)
1762 test_select_type(select
, "select-one");
1763 test_select_length(select
, 2);
1764 test_select_selidx(select
, 0);
1765 test_select_put_selidx(select
, 1);
1767 test_select_set_value(select
, "val1");
1768 test_select_value(select
, "val1");
1770 test_select_get_disabled(select
, VARIANT_FALSE
);
1771 test_select_set_disabled(select
, VARIANT_TRUE
);
1772 test_select_set_disabled(select
, VARIANT_FALSE
);
1775 static void test_create_option_elem(IHTMLDocument2
*doc
)
1777 IHTMLOptionElement
*option
;
1779 option
= create_option_elem(doc
, "test text", "test value");
1781 test_option_put_text(option
, "new text");
1782 test_option_put_value(option
, "new value");
1784 IHTMLOptionElement_Release(option
);
1787 static IHTMLTxtRange
*test_create_body_range(IHTMLDocument2
*doc
)
1789 IHTMLBodyElement
*body
;
1790 IHTMLTxtRange
*range
;
1794 hres
= IHTMLDocument2_get_body(doc
, &elem
);
1795 ok(hres
== S_OK
, "get_body failed: %08x\n", hres
);
1797 hres
= IHTMLElement_QueryInterface(elem
, &IID_IHTMLBodyElement
, (void**)&body
);
1798 IHTMLElement_Release(elem
);
1800 hres
= IHTMLBodyElement_createTextRange(body
, &range
);
1801 IHTMLBodyElement_Release(body
);
1802 ok(hres
== S_OK
, "createTextRange failed: %08x\n", hres
);
1807 static void test_txtrange(IHTMLDocument2
*doc
)
1809 IHTMLTxtRange
*body_range
, *range
, *range2
;
1810 IHTMLSelectionObject
*selection
;
1811 IDispatch
*disp_range
;
1814 body_range
= test_create_body_range(doc
);
1816 test_range_text(body_range
, "test abc 123\r\nit's text");
1818 hres
= IHTMLTxtRange_duplicate(body_range
, &range
);
1819 ok(hres
== S_OK
, "duplicate failed: %08x\n", hres
);
1821 hres
= IHTMLTxtRange_duplicate(body_range
, &range2
);
1822 ok(hres
== S_OK
, "duplicate failed: %08x\n", hres
);
1823 test_range_isequal(range
, range2
, VARIANT_TRUE
);
1825 test_range_text(range
, "test abc 123\r\nit's text");
1826 test_range_text(body_range
, "test abc 123\r\nit's text");
1828 test_range_collapse(range
, TRUE
);
1829 test_range_isequal(range
, range2
, VARIANT_FALSE
);
1830 test_range_inrange(range
, range2
, VARIANT_FALSE
);
1831 test_range_inrange(range2
, range
, VARIANT_TRUE
);
1832 IHTMLTxtRange_Release(range2
);
1834 test_range_expand(range
, wordW
, VARIANT_TRUE
, "test ");
1835 test_range_expand(range
, wordW
, VARIANT_FALSE
, "test ");
1836 test_range_move(range
, characterW
, 2, 2);
1837 test_range_expand(range
, wordW
, VARIANT_TRUE
, "test ");
1839 test_range_collapse(range
, FALSE
);
1840 test_range_expand(range
, wordW
, VARIANT_TRUE
, "abc ");
1842 test_range_collapse(range
, FALSE
);
1843 test_range_expand(range
, wordW
, VARIANT_TRUE
, "123");
1844 test_range_expand(range
, wordW
, VARIANT_FALSE
, "123");
1845 test_range_move(range
, characterW
, 2, 2);
1846 test_range_expand(range
, wordW
, VARIANT_TRUE
, "123");
1847 test_range_moveend(range
, characterW
, -5, -5);
1848 test_range_text(range
, NULL
);
1849 test_range_moveend(range
, characterW
, 3, 3);
1850 test_range_text(range
, "c 1");
1851 test_range_expand(range
, texteditW
, VARIANT_TRUE
, "test abc 123\r\nit's text");
1852 test_range_collapse(range
, TRUE
);
1853 test_range_move(range
, characterW
, 4, 4);
1854 test_range_moveend(range
, characterW
, 1, 1);
1855 test_range_text(range
, " ");
1856 test_range_move(range
, wordW
, 1, 1);
1857 test_range_moveend(range
, characterW
, 2, 2);
1858 test_range_text(range
, "ab");
1860 IHTMLTxtRange_Release(range
);
1862 hres
= IHTMLTxtRange_duplicate(body_range
, &range
);
1863 ok(hres
== S_OK
, "duplicate failed: %08x\n", hres
);
1865 test_range_text(range
, "test abc 123\r\nit's text");
1866 test_range_move(range
, characterW
, 3, 3);
1867 test_range_moveend(range
, characterW
, 1, 1);
1868 test_range_text(range
, "t");
1869 test_range_moveend(range
, characterW
, 3, 3);
1870 test_range_text(range
, "t ab");
1871 test_range_moveend(range
, characterW
, -2, -2);
1872 test_range_text(range
, "t ");
1873 test_range_move(range
, characterW
, 6, 6);
1874 test_range_moveend(range
, characterW
, 3, 3);
1875 test_range_text(range
, "123");
1876 test_range_moveend(range
, characterW
, 2, 2);
1877 test_range_text(range
, "123\r\ni");
1879 IHTMLTxtRange_Release(range
);
1881 hres
= IHTMLTxtRange_duplicate(body_range
, &range
);
1882 ok(hres
== S_OK
, "duplicate failed: %08x\n", hres
);
1884 test_range_move(range
, wordW
, 1, 1);
1885 test_range_moveend(range
, characterW
, 2, 2);
1886 test_range_text(range
, "ab");
1888 test_range_move(range
, characterW
, -2, -2);
1889 test_range_moveend(range
, characterW
, 2, 2);
1890 test_range_text(range
, "t ");
1892 test_range_move(range
, wordW
, 3, 3);
1893 test_range_move(range
, wordW
, -2, -2);
1894 test_range_moveend(range
, characterW
, 2, 2);
1895 test_range_text(range
, "ab");
1897 test_range_move(range
, characterW
, -6, -5);
1898 test_range_moveend(range
, characterW
, -1, 0);
1899 test_range_moveend(range
, characterW
, -6, 0);
1900 test_range_move(range
, characterW
, 2, 2);
1901 test_range_moveend(range
, characterW
, 2, 2);
1902 test_range_text(range
, "st");
1903 test_range_moveend(range
, characterW
, -6, -4);
1904 test_range_moveend(range
, characterW
, 2, 2);
1906 IHTMLTxtRange_Release(range
);
1908 hres
= IHTMLTxtRange_duplicate(body_range
, &range
);
1909 ok(hres
== S_OK
, "duplicate failed: %08x\n", hres
);
1911 test_range_move(range
, wordW
, 2, 2);
1912 test_range_moveend(range
, characterW
, 2, 2);
1913 test_range_text(range
, "12");
1915 test_range_move(range
, characterW
, 15, 14);
1916 test_range_move(range
, characterW
, -2, -2);
1917 test_range_moveend(range
, characterW
, 3, 2);
1918 test_range_text(range
, "t");
1919 test_range_moveend(range
, characterW
, -1, -1);
1920 test_range_text(range
, "t");
1921 test_range_expand(range
, wordW
, VARIANT_TRUE
, "text");
1922 test_range_move(range
, characterW
, -2, -2);
1923 test_range_moveend(range
, characterW
, 2, 2);
1924 test_range_text(range
, "s ");
1925 test_range_move(range
, characterW
, 100, 7);
1926 test_range_move(range
, wordW
, 1, 0);
1927 test_range_move(range
, characterW
, -2, -2);
1928 test_range_moveend(range
, characterW
, 3, 2);
1929 test_range_text(range
, "t");
1931 IHTMLTxtRange_Release(range
);
1933 hres
= IHTMLTxtRange_duplicate(body_range
, &range
);
1934 ok(hres
== S_OK
, "duplicate failed: %08x\n", hres
);
1936 test_range_collapse(range
, TRUE
);
1937 test_range_expand(range
, wordW
, VARIANT_TRUE
, "test ");
1938 test_range_put_text(range
, "word");
1939 test_range_text(body_range
, "wordabc 123\r\nit's text");
1940 test_range_text(range
, NULL
);
1941 test_range_moveend(range
, characterW
, 3, 3);
1942 test_range_text(range
, "abc");
1943 test_range_movestart(range
, characterW
, -2, -2);
1944 test_range_text(range
, "rdabc");
1945 test_range_movestart(range
, characterW
, 3, 3);
1946 test_range_text(range
, "bc");
1947 test_range_movestart(range
, characterW
, 4, 4);
1948 test_range_text(range
, NULL
);
1949 test_range_movestart(range
, characterW
, -3, -3);
1950 test_range_text(range
, "c 1");
1951 test_range_movestart(range
, characterW
, -7, -6);
1952 test_range_text(range
, "wordabc 1");
1953 test_range_movestart(range
, characterW
, 100, 22);
1954 test_range_text(range
, NULL
);
1956 IHTMLTxtRange_Release(range
);
1957 IHTMLTxtRange_Release(body_range
);
1959 hres
= IHTMLDocument2_get_selection(doc
, &selection
);
1960 ok(hres
== S_OK
, "IHTMLDocument2_get_selection failed: %08x\n", hres
);
1962 hres
= IHTMLSelectionObject_createRange(selection
, &disp_range
);
1963 ok(hres
== S_OK
, "IHTMLSelectionObject_createRange failed: %08x\n", hres
);
1964 IHTMLSelectionObject_Release(selection
);
1966 hres
= IDispatch_QueryInterface(disp_range
, &IID_IHTMLTxtRange
, (void **)&range
);
1967 ok(hres
== S_OK
, "Could not get IID_IHTMLTxtRange interface: 0x%08x\n", hres
);
1968 IDispatch_Release(disp_range
);
1970 test_range_text(range
, NULL
);
1971 test_range_moveend(range
, characterW
, 3, 3);
1972 test_range_text(range
, "wor");
1973 test_range_parent(range
, ET_BODY
);
1974 test_range_expand(range
, texteditW
, VARIANT_TRUE
, "wordabc 123\r\nit's text");
1975 test_range_expand(range
, texteditW
, VARIANT_TRUE
, "wordabc 123\r\nit's text");
1976 test_range_move(range
, characterW
, 3, 3);
1977 test_range_expand(range
, wordW
, VARIANT_TRUE
, "wordabc ");
1978 test_range_moveend(range
, characterW
, -4, -4);
1979 test_range_put_text(range
, "abc def ");
1980 test_range_expand(range
, texteditW
, VARIANT_TRUE
, "abc def abc 123\r\nit's text");
1981 test_range_move(range
, wordW
, 1, 1);
1982 test_range_movestart(range
, characterW
, -1, -1);
1983 test_range_text(range
, " ");
1984 test_range_move(range
, wordW
, 1, 1);
1985 test_range_moveend(range
, characterW
, 3, 3);
1986 test_range_text(range
, "def");
1987 test_range_put_text(range
, "xyz");
1988 test_range_moveend(range
, characterW
, 1, 1);
1989 test_range_move(range
, wordW
, 1, 1);
1990 test_range_moveend(range
, characterW
, 2, 2);
1991 test_range_text(range
, "ab");
1993 IHTMLTxtRange_Release(range
);
1996 static void test_txtrange2(IHTMLDocument2
*doc
)
1998 IHTMLTxtRange
*range
;
2000 range
= test_create_body_range(doc
);
2002 test_range_text(range
, "abc\r\n\r\n123\r\n\r\n\r\ndef");
2003 test_range_move(range
, characterW
, 5, 5);
2004 test_range_moveend(range
, characterW
, 1, 1);
2005 test_range_text(range
, "2");
2006 test_range_move(range
, characterW
, -3, -3);
2007 test_range_moveend(range
, characterW
, 3, 3);
2008 test_range_text(range
, "c\r\n\r\n1");
2009 test_range_collapse(range
, VARIANT_FALSE
);
2010 test_range_moveend(range
, characterW
, 4, 4);
2011 test_range_text(range
, "23");
2012 test_range_moveend(range
, characterW
, 1, 1);
2013 test_range_text(range
, "23\r\n\r\n\r\nd");
2014 test_range_moveend(range
, characterW
, -1, -1);
2015 test_range_text(range
, "23");
2016 test_range_moveend(range
, characterW
, -1, -1);
2017 test_range_text(range
, "23");
2018 test_range_moveend(range
, characterW
, -2, -2);
2019 test_range_text(range
, "2");
2021 IHTMLTxtRange_Release(range
);
2024 static void test_compatmode(IHTMLDocument2
*doc
)
2026 IHTMLDocument5
*doc5
;
2030 hres
= IHTMLDocument2_QueryInterface(doc
, &IID_IHTMLDocument5
, (void**)&doc5
);
2031 ok(hres
== S_OK
, "Could not get IHTMLDocument5 interface: %08x\n", hres
);
2035 hres
= IHTMLDocument5_get_compatMode(doc5
, &mode
);
2036 IHTMLDocument5_Release(doc5
);
2037 ok(hres
== S_OK
, "get_compatMode failed: %08x\n", hres
);
2038 ok(!strcmp_wa(mode
, "BackCompat"), "compatMode=%s\n", dbgstr_w(mode
));
2039 SysFreeString(mode
);
2042 static void test_location(IHTMLDocument2
*doc
)
2044 IHTMLLocation
*location
, *location2
;
2048 hres
= IHTMLDocument2_get_location(doc
, &location
);
2049 ok(hres
== S_OK
, "get_location failed: %08x\n", hres
);
2051 hres
= IHTMLDocument2_get_location(doc
, &location2
);
2052 ok(hres
== S_OK
, "get_location failed: %08x\n", hres
);
2054 ok(location
== location2
, "location != location2\n");
2056 test_ifaces((IUnknown
*)location
, location_iids
);
2058 IHTMLLocation_Release(location2
);
2059 ref
= IHTMLLocation_Release(location
);
2060 ok(!ref
, "location chould be destroyed here\n");
2063 static void test_navigator(IHTMLDocument2
*doc
)
2065 IHTMLWindow2
*window
;
2066 IOmNavigator
*navigator
, *navigator2
;
2071 hres
= IHTMLDocument2_get_parentWindow(doc
, &window
);
2072 ok(hres
== S_OK
, "parentWidnow failed: %08x\n", hres
);
2074 hres
= IHTMLWindow2_get_navigator(window
, &navigator
);
2075 ok(hres
== S_OK
, "get_navigator failed: %08x\n", hres
);
2076 ok(navigator
!= NULL
, "navigator == NULL\n");
2077 test_disp((IUnknown
*)navigator
, &IID_IOmNavigator
);
2079 hres
= IHTMLWindow2_get_navigator(window
, &navigator2
);
2080 ok(hres
== S_OK
, "get_navigator failed: %08x\n", hres
);
2081 ok(navigator
!= navigator2
, "navigator2 != navihgator\n");
2083 IHTMLWindow2_Release(window
);
2084 IOmNavigator_Release(navigator2
);
2086 hres
= IOmNavigator_get_appCodeName(navigator
, &bstr
);
2087 ok(hres
== S_OK
, "get_appCodeName failed: %08x\n", hres
);
2088 ok(!strcmp_wa(bstr
, "Mozilla"), "Unexpected appCodeName %s\n", dbgstr_w(bstr
));
2089 SysFreeString(bstr
);
2092 hres
= IOmNavigator_get_platform(navigator
, &bstr
);
2093 ok(hres
== S_OK
, "get_appMinorVersion failed: %08x\n", hres
);
2094 ok(!strcmp_wa(bstr
, "Win32"), "unexpected platform %s\n", dbgstr_w(bstr
));
2095 SysFreeString(bstr
);
2097 ref
= IOmNavigator_Release(navigator
);
2098 ok(!ref
, "navigator should be destroyed here\n");
2101 static void test_current_style(IHTMLCurrentStyle
*current_style
)
2106 test_disp((IUnknown
*)current_style
, &DIID_DispHTMLCurrentStyle
);
2107 test_ifaces((IUnknown
*)current_style
, cstyle_iids
);
2109 hres
= IHTMLCurrentStyle_get_display(current_style
, &str
);
2110 ok(hres
== S_OK
, "get_display failed: %08x\n", hres
);
2111 ok(!strcmp_wa(str
, "block"), "get_display returned %s\n", dbgstr_w(str
));
2115 static void test_style2(IHTMLStyle2
*style2
)
2120 str
= (void*)0xdeadbeef;
2121 hres
= IHTMLStyle2_get_position(style2
, &str
);
2122 ok(hres
== S_OK
, "get_position failed: %08x\n", hres
);
2123 ok(!str
, "str != NULL\n");
2125 str
= a2bstr("absolute");
2126 hres
= IHTMLStyle2_put_position(style2
, str
);
2127 ok(hres
== S_OK
, "get_position failed: %08x\n", hres
);
2131 hres
= IHTMLStyle2_get_position(style2
, &str
);
2132 ok(hres
== S_OK
, "get_position failed: %08x\n", hres
);
2133 ok(!strcmp_wa(str
, "absolute"), "get_position returned %s\n", dbgstr_w(str
));
2137 static void test_default_style(IHTMLStyle
*style
)
2139 IHTMLStyle2
*style2
;
2145 test_disp((IUnknown
*)style
, &DIID_DispHTMLStyle
);
2146 test_ifaces((IUnknown
*)style
, style_iids
);
2148 str
= (void*)0xdeadbeef;
2149 hres
= IHTMLStyle_get_fontFamily(style
, &str
);
2150 ok(hres
== S_OK
, "get_fontFamily failed: %08x\n", hres
);
2151 ok(!str
, "fontFamily = %s\n", dbgstr_w(str
));
2153 str
= (void*)0xdeadbeef;
2154 hres
= IHTMLStyle_get_fontWeight(style
, &str
);
2155 ok(hres
== S_OK
, "get_fontWeight failed: %08x\n", hres
);
2156 ok(!str
, "fontWeight = %s\n", dbgstr_w(str
));
2158 str
= (void*)0xdeadbeef;
2159 hres
= IHTMLStyle_get_display(style
, &str
);
2160 ok(hres
== S_OK
, "get_display failed: %08x\n", hres
);
2161 ok(!str
, "display = %s\n", dbgstr_w(str
));
2163 str
= (void*)0xdeadbeef;
2164 hres
= IHTMLStyle_get_visibility(style
, &str
);
2165 ok(hres
== S_OK
, "get_visibility failed: %08x\n", hres
);
2166 ok(!str
, "visibility = %s\n", dbgstr_w(str
));
2169 hres
= IHTMLStyle_get_fontSize(style
, &v
);
2170 ok(hres
== S_OK
, "get_fontSize failed: %08x\n", hres
);
2171 ok(V_VT(&v
) == VT_BSTR
, "V_VT(fontSize) = %d\n", V_VT(&v
));
2172 ok(!V_BSTR(&v
), "V_BSTR(fontSize) = %s\n", dbgstr_w(V_BSTR(&v
)));
2175 hres
= IHTMLStyle_get_color(style
, &v
);
2176 ok(hres
== S_OK
, "get_color failed: %08x\n", hres
);
2177 ok(V_VT(&v
) == VT_BSTR
, "V_VT(color) = %d\n", V_VT(&v
));
2178 ok(!V_BSTR(&v
), "V_BSTR(color) = %s\n", dbgstr_w(V_BSTR(&v
)));
2181 hres
= IHTMLStyle_get_textDecorationUnderline(style
, &b
);
2182 ok(hres
== S_OK
, "get_textDecorationUnderline failed: %08x\n", hres
);
2183 ok(b
== VARIANT_FALSE
, "textDecorationUnderline = %x\n", b
);
2186 hres
= IHTMLStyle_get_textDecorationLineThrough(style
, &b
);
2187 ok(hres
== S_OK
, "get_textDecorationLineThrough failed: %08x\n", hres
);
2188 ok(b
== VARIANT_FALSE
, "textDecorationLineThrough = %x\n", b
);
2190 V_VT(&v
) = VT_EMPTY
;
2191 hres
= IHTMLStyle_get_width(style
, &v
);
2192 ok(hres
== S_OK
, "get_width failed: %08x\n", hres
);
2193 ok(V_VT(&v
) == VT_BSTR
, "V_VT(v)=%d\n", V_VT(&v
));
2194 ok(!V_BSTR(&v
), "V_BSTR(v)=%p\n", V_BSTR(&v
));
2197 V_BSTR(&v
) = a2bstr("auto");
2198 hres
= IHTMLStyle_put_width(style
, v
);
2199 ok(hres
== S_OK
, "put_width failed: %08x\n", hres
);
2202 V_VT(&v
) = VT_EMPTY
;
2203 hres
= IHTMLStyle_get_width(style
, &v
);
2204 ok(hres
== S_OK
, "get_width failed: %08x\n", hres
);
2205 ok(V_VT(&v
) == VT_BSTR
, "V_VT(v)=%d\n", V_VT(&v
));
2206 ok(!strcmp_wa(V_BSTR(&v
), "auto"), "V_BSTR(v)=%s\n", dbgstr_w(V_BSTR(&v
)));
2210 str
= (void*)0xdeadbeef;
2211 hres
= IHTMLStyle_get_margin(style
, &str
);
2212 ok(hres
== S_OK
, "get_margin failed: %08x\n", hres
);
2213 ok(!str
, "margin = %s\n", dbgstr_w(str
));
2216 hres
= IHTMLStyle_put_margin(style
, str
);
2217 ok(hres
== S_OK
, "get_margin failed: %08x\n", hres
);
2220 hres
= IHTMLStyle_get_margin(style
, &str
);
2221 ok(hres
== S_OK
, "get_margin failed: %08x\n", hres
);
2222 ok(strcmp_wa(str
, "1"), "margin = %s\n", dbgstr_w(str
));
2224 hres
= IHTMLStyle_put_margin(style
, NULL
);
2225 ok(hres
== S_OK
, "get_margin failed: %08x\n", hres
);
2228 hres
= IHTMLStyle_get_border(style
, &str
);
2229 ok(hres
== S_OK
, "get_border failed: %08x\n", hres
);
2230 ok(!str
|| !*str
, "str is not empty\n");
2233 str
= a2bstr("1px");
2234 hres
= IHTMLStyle_put_border(style
, str
);
2235 ok(hres
== S_OK
, "get_border failed: %08x\n", hres
);
2238 V_VT(&v
) = VT_EMPTY
;
2239 hres
= IHTMLStyle_get_left(style
, &v
);
2240 ok(hres
== S_OK
, "get_left failed: %08x\n", hres
);
2241 ok(V_VT(&v
) == VT_BSTR
, "V_VT(v)=%d\n", V_VT(&v
));
2242 ok(!V_BSTR(&v
), "V_BSTR(v) != NULL\n");
2246 V_BSTR(&v
) = a2bstr("3px");
2247 hres
= IHTMLStyle_put_left(style
, v
);
2248 ok(hres
== S_OK
, "put_left failed: %08x\n", hres
);
2251 V_VT(&v
) = VT_EMPTY
;
2252 hres
= IHTMLStyle_get_left(style
, &v
);
2253 ok(hres
== S_OK
, "get_left failed: %08x\n", hres
);
2254 ok(V_VT(&v
) == VT_BSTR
, "V_VT(v)=%d\n", V_VT(&v
));
2255 ok(!strcmp_wa(V_BSTR(&v
), "3px"), "V_BSTR(v) = %s\n", dbgstr_w(V_BSTR(&v
)));
2258 V_VT(&v
) = VT_EMPTY
;
2259 hres
= IHTMLStyle_get_top(style
, &v
);
2260 ok(hres
== S_OK
, "get_top failed: %08x\n", hres
);
2261 ok(V_VT(&v
) == VT_BSTR
, "V_VT(v)=%d\n", V_VT(&v
));
2262 ok(!V_BSTR(&v
), "V_BSTR(v) != NULL\n");
2266 V_BSTR(&v
) = a2bstr("3px");
2267 hres
= IHTMLStyle_put_top(style
, v
);
2268 ok(hres
== S_OK
, "put_top failed: %08x\n", hres
);
2271 V_VT(&v
) = VT_EMPTY
;
2272 hres
= IHTMLStyle_get_top(style
, &v
);
2273 ok(hres
== S_OK
, "get_top failed: %08x\n", hres
);
2274 ok(V_VT(&v
) == VT_BSTR
, "V_VT(v)=%d\n", V_VT(&v
));
2275 ok(!strcmp_wa(V_BSTR(&v
), "3px"), "V_BSTR(v) = %s\n", dbgstr_w(V_BSTR(&v
)));
2278 V_VT(&v
) = VT_EMPTY
;
2279 hres
= IHTMLStyle_get_height(style
, &v
);
2280 ok(hres
== S_OK
, "get_height failed: %08x\n", hres
);
2281 ok(V_VT(&v
) == VT_BSTR
, "V_VT(v)=%d\n", V_VT(&v
));
2282 ok(!V_BSTR(&v
), "V_BSTR(v) != NULL\n");
2286 V_BSTR(&v
) = a2bstr("64px");
2287 hres
= IHTMLStyle_put_height(style
, v
);
2288 ok(hres
== S_OK
, "put_height failed: %08x\n", hres
);
2291 V_VT(&v
) = VT_EMPTY
;
2292 hres
= IHTMLStyle_get_height(style
, &v
);
2293 ok(hres
== S_OK
, "get_height failed: %08x\n", hres
);
2294 ok(V_VT(&v
) == VT_BSTR
, "V_VT(v)=%d\n", V_VT(&v
));
2295 ok(!strcmp_wa(V_BSTR(&v
), "64px"), "V_BSTR(v) = %s\n", dbgstr_w(V_BSTR(&v
)));
2298 str
= (void*)0xdeadbeef;
2299 hres
= IHTMLStyle_get_cursor(style
, &str
);
2300 ok(hres
== S_OK
, "get_cursor failed: %08x\n", hres
);
2301 ok(!str
, "get_cursor != NULL\n");
2304 str
= a2bstr("default");
2305 hres
= IHTMLStyle_put_cursor(style
, str
);
2306 ok(hres
== S_OK
, "get_cursor failed: %08x\n", hres
);
2310 hres
= IHTMLStyle_get_cursor(style
, &str
);
2311 ok(hres
== S_OK
, "get_cursor failed: %08x\n", hres
);
2312 ok(!strcmp_wa(str
, "default"), "get_cursor returned %s\n", dbgstr_w(str
));
2315 V_VT(&v
) = VT_EMPTY
;
2316 hres
= IHTMLStyle_get_verticalAlign(style
, &v
);
2317 ok(hres
== S_OK
, "get_vertivalAlign failed: %08x\n", hres
);
2318 ok(V_VT(&v
) == VT_BSTR
, "V_VT(v)=%d\n", V_VT(&v
));
2319 ok(!V_BSTR(&v
), "V_BSTR(v) != NULL\n");
2323 V_BSTR(&v
) = a2bstr("middle");
2324 hres
= IHTMLStyle_put_verticalAlign(style
, v
);
2325 ok(hres
== S_OK
, "put_vertivalAlign failed: %08x\n", hres
);
2328 V_VT(&v
) = VT_EMPTY
;
2329 hres
= IHTMLStyle_get_verticalAlign(style
, &v
);
2330 ok(hres
== S_OK
, "get_verticalAlign failed: %08x\n", hres
);
2331 ok(V_VT(&v
) == VT_BSTR
, "V_VT(v)=%d\n", V_VT(&v
));
2332 ok(!strcmp_wa(V_BSTR(&v
), "middle"), "V_BSTR(v) = %s\n", dbgstr_w(V_BSTR(&v
)));
2335 str
= (void*)0xdeadbeef;
2336 hres
= IHTMLStyle_get_textAlign(style
, &str
);
2337 ok(hres
== S_OK
, "get_textAlign failed: %08x\n", hres
);
2338 ok(!str
, "textAlign != NULL\n");
2340 str
= a2bstr("center");
2341 hres
= IHTMLStyle_put_textAlign(style
, str
);
2342 ok(hres
== S_OK
, "put_textAlign failed: %08x\n", hres
);
2346 hres
= IHTMLStyle_get_textAlign(style
, &str
);
2347 ok(hres
== S_OK
, "get_textAlign failed: %08x\n", hres
);
2348 ok(!strcmp_wa(str
, "center"), "textAlign = %s\n", dbgstr_w(V_BSTR(&v
)));
2351 str
= (void*)0xdeadbeef;
2352 hres
= IHTMLStyle_get_filter(style
, &str
);
2353 ok(hres
== S_OK
, "get_filter failed: %08x\n", hres
);
2354 ok(!str
, "filter != NULL\n");
2356 str
= a2bstr("alpha(opacity=100)");
2357 hres
= IHTMLStyle_put_filter(style
, str
);
2358 ok(hres
== S_OK
, "put_filter failed: %08x\n", hres
);
2361 V_VT(&v
) = VT_EMPTY
;
2362 hres
= IHTMLStyle_get_zIndex(style
, &v
);
2363 ok(hres
== S_OK
, "get_zIndex failed: %08x\n", hres
);
2364 ok(V_VT(&v
) == VT_I4
, "V_VT(v)=%d\n", V_VT(&v
));
2365 ok(!V_I4(&v
), "V_I4(v) != 0\n");
2369 V_BSTR(&v
) = a2bstr("1");
2370 hres
= IHTMLStyle_put_zIndex(style
, v
);
2371 ok(hres
== S_OK
, "put_zIndex failed: %08x\n", hres
);
2374 V_VT(&v
) = VT_EMPTY
;
2375 hres
= IHTMLStyle_get_zIndex(style
, &v
);
2376 ok(hres
== S_OK
, "get_zIndex failed: %08x\n", hres
);
2377 ok(V_VT(&v
) == VT_I4
, "V_VT(v)=%d\n", V_VT(&v
));
2378 ok(V_I4(&v
) == 1, "V_I4(v) = %d\n", V_I4(&v
));
2381 hres
= IHTMLStyle_QueryInterface(style
, &IID_IHTMLStyle2
, (void**)&style2
);
2382 ok(hres
== S_OK
, "Could not get IHTMLStyle2 iface: %08x\n", hres
);
2383 if(SUCCEEDED(hres
)) {
2384 test_style2(style2
);
2385 IHTMLStyle2_Release(style2
);
2389 static void test_default_selection(IHTMLDocument2
*doc
)
2391 IHTMLSelectionObject
*selection
;
2392 IHTMLTxtRange
*range
;
2397 hres
= IHTMLDocument2_get_selection(doc
, &selection
);
2398 ok(hres
== S_OK
, "get_selection failed: %08x\n", hres
);
2400 hres
= IHTMLSelectionObject_get_type(selection
, &str
);
2401 ok(hres
== S_OK
, "get_type failed: %08x\n", hres
);
2402 ok(!lstrcmpW(str
, noneW
), "type = %s\n", dbgstr_w(str
));
2405 hres
= IHTMLSelectionObject_createRange(selection
, &disp
);
2406 IHTMLSelectionObject_Release(selection
);
2407 ok(hres
== S_OK
, "createRange failed: %08x\n", hres
);
2409 hres
= IDispatch_QueryInterface(disp
, &IID_IHTMLTxtRange
, (void**)&range
);
2410 IDispatch_Release(disp
);
2411 ok(hres
== S_OK
, "Could not get IHTMLTxtRange interface: %08x\n", hres
);
2413 test_range_text(range
, NULL
);
2414 IHTMLTxtRange_Release(range
);
2417 static void test_default_body(IHTMLBodyElement
*body
)
2423 WCHAR sBodyText
[] = {'#','F','F','0','0','0','0',0};
2424 WCHAR sTextInvalid
[] = {'I','n','v','a','l','i','d',0};
2425 WCHAR sResInvalid
[] = {'#','0','0','a','0','d','0',0};
2427 bstr
= (void*)0xdeadbeef;
2428 hres
= IHTMLBodyElement_get_background(body
, &bstr
);
2429 ok(hres
== S_OK
, "get_background failed: %08x\n", hres
);
2430 ok(bstr
== NULL
, "bstr != NULL\n");
2432 l
= elem_get_scroll_height((IUnknown
*)body
);
2433 ok(l
!= -1, "scrollHeight == -1\n");
2434 l
= elem_get_scroll_width((IUnknown
*)body
);
2435 ok(l
!= -1, "scrollWidth == -1\n");
2436 l
= elem_get_scroll_top((IUnknown
*)body
);
2437 ok(!l
, "scrollTop = %ld\n", l
);
2438 elem_get_scroll_left((IUnknown
*)body
);
2440 /* get_text tests */
2441 hres
= IHTMLBodyElement_get_text(body
, &v
);
2442 ok(hres
== S_OK
, "expect S_OK got 0x%08d\n", hres
);
2443 ok(V_VT(&v
) == VT_BSTR
, "Expected VT_BSTR got %d\n", V_VT(&v
));
2444 ok(bstr
== NULL
, "bstr != NULL\n");
2447 /* get_text - Invalid Text */
2449 V_BSTR(&v
) = SysAllocString(sTextInvalid
);
2450 hres
= IHTMLBodyElement_put_text(body
, v
);
2451 ok(hres
== S_OK
, "expect S_OK got 0x%08d\n", hres
);
2454 hres
= IHTMLBodyElement_get_text(body
, &v
);
2455 ok(hres
== S_OK
, "expect S_OK got 0x%08d\n", hres
);
2456 ok(V_VT(&v
) == VT_BSTR
, "Expected VT_BSTR got %d\n", V_VT(&v
));
2457 ok(!lstrcmpW(sResInvalid
, V_BSTR(&v
)), "bstr != sResInvalid\n");
2460 /* get_text - Valid Text */
2462 V_BSTR(&v
) = SysAllocString(sBodyText
);
2463 hres
= IHTMLBodyElement_put_text(body
, v
);
2464 ok(hres
== S_OK
, "expect S_OK got 0x%08d\n", hres
);
2467 hres
= IHTMLBodyElement_get_text(body
, &v
);
2468 ok(hres
== S_OK
, "expect S_OK got 0x%08d\n", hres
);
2469 ok(V_VT(&v
) == VT_BSTR
, "Expected VT_BSTR got %d\n", V_VT(&v
));
2470 ok(lstrcmpW(bstr
, V_BSTR(&v
)), "bstr != V_BSTR(&v)\n");
2474 static void test_body_funs(IHTMLBodyElement
*body
)
2476 static WCHAR sRed
[] = {'r','e','d',0};
2477 static WCHAR sRedbg
[] = {'#','f','f','0','0','0','0',0};
2482 hres
= IHTMLBodyElement_get_bgColor(body
, &vDefaultbg
);
2483 ok(hres
== S_OK
, "get_background failed: %08x\n", hres
);
2484 ok(V_VT(&vDefaultbg
) == VT_BSTR
, "bstr != NULL\n");
2486 V_VT(&vbg
) = VT_BSTR
;
2487 V_BSTR(&vbg
) = SysAllocString(sRed
);
2488 hres
= IHTMLBodyElement_put_bgColor(body
, vbg
);
2489 ok(hres
== S_OK
, "get_background failed: %08x\n", hres
);
2492 hres
= IHTMLBodyElement_get_bgColor(body
, &vbg
);
2493 ok(hres
== S_OK
, "get_background failed: %08x\n", hres
);
2494 ok(V_VT(&vDefaultbg
) == VT_BSTR
, "V_VT(&vDefaultbg) != VT_BSTR\n");
2495 ok(!lstrcmpW(V_BSTR(&vbg
), sRedbg
), "Unexpected type %s\n", dbgstr_w(V_BSTR(&vbg
)));
2498 /* Restore Originial */
2499 hres
= IHTMLBodyElement_put_bgColor(body
, vDefaultbg
);
2500 ok(hres
== S_OK
, "get_background failed: %08x\n", hres
);
2501 VariantClear(&vDefaultbg
);
2504 static void test_window(IHTMLDocument2
*doc
)
2506 IHTMLWindow2
*window
, *window2
, *self
;
2507 IHTMLDocument2
*doc2
= NULL
;
2511 hres
= IHTMLDocument2_get_parentWindow(doc
, &window
);
2512 ok(hres
== S_OK
, "get_parentElement failed: %08x\n", hres
);
2513 test_ifaces((IUnknown
*)window
, window_iids
);
2514 test_disp((IUnknown
*)window
, &DIID_DispHTMLWindow2
);
2516 hres
= IHTMLWindow2_get_document(window
, &doc2
);
2517 ok(hres
== S_OK
, "get_document failed: %08x\n", hres
);
2518 ok(doc2
!= NULL
, "doc2 == NULL\n");
2520 IHTMLDocument_Release(doc2
);
2522 hres
= IHTMLWindow2_get_window(window
, &window2
);
2523 ok(hres
== S_OK
, "get_window failed: %08x\n", hres
);
2524 ok(window2
!= NULL
, "window2 == NULL\n");
2526 hres
= IHTMLWindow2_get_self(window
, &self
);
2527 ok(hres
== S_OK
, "get_window failed: %08x\n", hres
);
2528 ok(window2
!= NULL
, "self == NULL\n");
2530 ok(self
== window2
, "self != window2\n");
2532 IHTMLWindow2_Release(window2
);
2533 IHTMLWindow2_Release(self
);
2536 hres
= IHTMLDocument2_get_Script(doc
, &disp
);
2537 ok(hres
== S_OK
, "get_Script failed: %08x\n", hres
);
2538 ok(disp
== (void*)window
, "disp != window\n");
2539 IDispatch_Release(disp
);
2541 IHTMLWindow2_Release(window
);
2544 static void test_defaults(IHTMLDocument2
*doc
)
2546 IHTMLStyleSheetsCollection
*stylesheetcol
;
2547 IHTMLCurrentStyle
*cstyle
;
2548 IHTMLBodyElement
*body
;
2549 IHTMLElement2
*elem2
;
2555 hres
= IHTMLDocument2_get_body(doc
, &elem
);
2556 ok(hres
== S_OK
, "get_body failed: %08x\n", hres
);
2558 hres
= IHTMLElement_QueryInterface(elem
, &IID_IHTMLBodyElement
, (void**)&body
);
2559 ok(hres
== S_OK
, "Could not get IHTMBodyElement: %08x\n", hres
);
2560 test_default_body(body
);
2561 test_body_funs(body
);
2562 IHTMLBodyElement_Release(body
);
2564 hres
= IHTMLElement_get_style(elem
, &style
);
2565 ok(hres
== S_OK
, "get_style failed: %08x\n", hres
);
2567 test_default_style(style
);
2569 test_compatmode(doc
);
2571 test_navigator(doc
);
2573 IHTMLStyle_Release(style
);
2575 elem2
= get_elem2_iface((IUnknown
*)elem
);
2576 hres
= IHTMLElement2_get_currentStyle(elem2
, &cstyle
);
2577 ok(hres
== S_OK
, "get_currentStyle failed: %08x\n", hres
);
2578 if(SUCCEEDED(hres
)) {
2579 test_current_style(cstyle
);
2580 IHTMLCurrentStyle_Release(cstyle
);
2582 IHTMLElement2_Release(elem2
);
2584 IHTMLElement_Release(elem
);
2586 hres
= IHTMLDocument2_get_styleSheets(doc
, &stylesheetcol
);
2587 ok(hres
== S_OK
, "get_styleSheets failed: %08x\n", hres
);
2590 hres
= IHTMLStyleSheetsCollection_get_length(stylesheetcol
, &l
);
2591 ok(hres
== S_OK
, "get_length failed: %08x\n", hres
);
2592 ok(l
== 0, "length = %ld\n", l
);
2594 IHTMLStyleSheetsCollection_Release(stylesheetcol
);
2596 test_default_selection(doc
);
2597 test_doc_title(doc
, "");
2600 static void test_tr_elem(IHTMLElement
*elem
)
2602 IHTMLElementCollection
*col
;
2606 static const elem_type_t cell_types
[] = {ET_TD
,ET_TD
};
2608 hres
= IHTMLElement_QueryInterface(elem
, &IID_IHTMLTableRow
, (void**)&row
);
2609 ok(hres
== S_OK
, "Could not get IHTMLTableRow iface: %08x\n", hres
);
2614 hres
= IHTMLTableRow_get_cells(row
, &col
);
2615 ok(hres
== S_OK
, "get_cells failed: %08x\n", hres
);
2616 ok(col
!= NULL
, "get_cells returned NULL\n");
2618 test_elem_collection((IUnknown
*)col
, cell_types
, sizeof(cell_types
)/sizeof(*cell_types
));
2619 IHTMLElementCollection_Release(col
);
2621 IHTMLTable_Release(row
);
2624 static void test_table_elem(IHTMLElement
*elem
)
2626 IHTMLElementCollection
*col
;
2630 static const elem_type_t row_types
[] = {ET_TR
,ET_TR
};
2632 hres
= IHTMLElement_QueryInterface(elem
, &IID_IHTMLTable
, (void**)&table
);
2633 ok(hres
== S_OK
, "Could not get IHTMLTable iface: %08x\n", hres
);
2638 hres
= IHTMLTable_get_rows(table
, &col
);
2639 ok(hres
== S_OK
, "get_rows failed: %08x\n", hres
);
2640 ok(col
!= NULL
, "get_ros returned NULL\n");
2642 test_elem_collection((IUnknown
*)col
, row_types
, sizeof(row_types
)/sizeof(*row_types
));
2643 IHTMLElementCollection_Release(col
);
2645 IHTMLTable_Release(table
);
2648 static void doc_write(IHTMLDocument2
*doc
, const char *text
)
2658 sa
= SafeArrayCreate(VT_VARIANT
, 1, &dim
);
2659 SafeArrayAccessData(sa
, (void**)&var
);
2660 V_VT(var
) = VT_BSTR
;
2661 V_BSTR(var
) = str
= a2bstr(text
);
2662 SafeArrayUnaccessData(sa
);
2664 hres
= IHTMLDocument2_write(doc
, sa
);
2665 ok(hres
== S_OK
, "write failed: %08x\n", hres
);
2668 SafeArrayDestroy(sa
);
2671 static void test_iframe_elem(IHTMLElement
*elem
)
2673 IHTMLElementCollection
*col
;
2674 IHTMLDocument2
*content_doc
;
2675 IHTMLWindow2
*content_window
;
2676 IHTMLFrameBase2
*base2
;
2682 static const elem_type_t all_types
[] = {
2690 hres
= IHTMLElement_QueryInterface(elem
, &IID_IHTMLFrameBase2
, (void**)&base2
);
2691 ok(hres
== S_OK
, "Could not get IHTMFrameBase2 iface: %08x\n", hres
);
2693 content_window
= NULL
;
2694 hres
= IHTMLFrameBase2_get_contentWindow(base2
, &content_window
);
2695 IHTMLFrameBase2_Release(base2
);
2696 ok(hres
== S_OK
, "get_contentWindow failed: %08x\n", hres
);
2697 ok(content_window
!= NULL
, "contentWindow = NULL\n");
2700 hres
= IHTMLWindow2_get_document(content_window
, &content_doc
);
2701 IHTMLWindow2_Release(content_window
);
2702 ok(hres
== S_OK
, "get_document failed: %08x\n", hres
);
2703 ok(content_doc
!= NULL
, "content_doc = NULL\n");
2705 str
= a2bstr("text/html");
2706 V_VT(&errv
) = VT_ERROR
;
2708 hres
= IHTMLDocument2_open(content_doc
, str
, errv
, errv
, errv
, &disp
);
2710 ok(hres
== S_OK
, "open failed: %08x\n", hres
);
2711 ok(disp
!= NULL
, "disp == NULL\n");
2712 ok(iface_cmp((IUnknown
*)disp
, (IUnknown
*)content_window
), "disp != content_window\n");
2713 IDispatch_Release(disp
);
2715 doc_write(content_doc
, "<html><head><title>test</title></head><body><br /></body></html>");
2717 hres
= IHTMLDocument2_get_all(content_doc
, &col
);
2718 ok(hres
== S_OK
, "get_all failed: %08x\n", hres
);
2719 test_elem_collection((IUnknown
*)col
, all_types
, sizeof(all_types
)/sizeof(all_types
[0]));
2720 IHTMLElementCollection_Release(col
);
2722 hres
= IHTMLDocument2_close(content_doc
);
2723 ok(hres
== S_OK
, "close failed: %08x\n", hres
);
2725 IHTMLDocument2_Release(content_doc
);
2728 static void test_stylesheet(IDispatch
*disp
)
2730 IHTMLStyleSheetRulesCollection
*col
= NULL
;
2731 IHTMLStyleSheet
*stylesheet
;
2734 hres
= IDispatch_QueryInterface(disp
, &IID_IHTMLStyleSheet
, (void**)&stylesheet
);
2735 ok(hres
== S_OK
, "Could not get IHTMLStyleSheet: %08x\n", hres
);
2737 hres
= IHTMLStyleSheet_get_rules(stylesheet
, &col
);
2738 ok(hres
== S_OK
, "get_rules failed: %08x\n", hres
);
2739 ok(col
!= NULL
, "col == NULL\n");
2741 IHTMLStyleSheetRulesCollection_Release(col
);
2742 IHTMLStyleSheet_Release(stylesheet
);
2745 static void test_stylesheets(IHTMLDocument2
*doc
)
2747 IHTMLStyleSheetsCollection
*col
= NULL
;
2752 hres
= IHTMLDocument2_get_styleSheets(doc
, &col
);
2753 ok(hres
== S_OK
, "get_styleSheets failed: %08x\n", hres
);
2754 ok(col
!= NULL
, "col == NULL\n");
2756 hres
= IHTMLStyleSheetsCollection_get_length(col
, &len
);
2757 ok(hres
== S_OK
, "get_length failed: %08x\n", hres
);
2758 ok(len
== 1, "len=%ld\n", len
);
2764 hres
= IHTMLStyleSheetsCollection_item(col
, &idx
, &res
);
2765 ok(hres
== S_OK
, "item failed: %08x\n", hres
);
2766 ok(V_VT(&res
) == VT_DISPATCH
, "V_VT(res) = %d\n", V_VT(&res
));
2767 ok(V_DISPATCH(&res
) != NULL
, "V_DISPATCH(&res) == NULL\n");
2768 test_stylesheet(V_DISPATCH(&res
));
2775 hres
= IHTMLStyleSheetsCollection_item(col
, &idx
, &res
);
2776 ok(hres
== E_INVALIDARG
, "item failed: %08x, expected E_INVALIDARG\n", hres
);
2777 ok(V_VT(&res
) == VT_EMPTY
, "V_VT(res) = %d\n", V_VT(&res
));
2778 ok(V_DISPATCH(&res
) != NULL
, "V_DISPATCH(&res) == NULL\n");
2781 IHTMLStyleSheetsCollection_Release(col
);
2784 static void test_child_col_disp(IHTMLDOMChildrenCollection
*col
)
2786 IDispatchEx
*dispex
;
2788 DISPPARAMS dp
= {NULL
, NULL
, 0, 0};
2796 static const WCHAR w0
[] = {'0',0};
2797 static const WCHAR w100
[] = {'1','0','0',0};
2799 hres
= IHTMLDOMChildrenCollection_QueryInterface(col
, &IID_IDispatchEx
, (void**)&dispex
);
2800 ok(hres
== S_OK
, "Could not get IDispatchEx: %08x\n", hres
);
2802 bstr
= SysAllocString(w0
);
2803 hres
= IDispatchEx_GetDispID(dispex
, bstr
, fdexNameCaseSensitive
, &id
);
2804 ok(hres
== S_OK
, "GetDispID failed: %08x\n", hres
);
2805 SysFreeString(bstr
);
2808 hres
= IDispatchEx_InvokeEx(dispex
, id
, LOCALE_NEUTRAL
, INVOKE_PROPERTYGET
, &dp
, &var
, &ei
, NULL
);
2809 ok(hres
== S_OK
, "InvokeEx failed: %08x\n", hres
);
2810 ok(V_VT(&var
) == VT_DISPATCH
, "V_VT(var)=%d\n", V_VT(&var
));
2811 ok(V_DISPATCH(&var
) != NULL
, "V_DISPATCH(var) == NULL\n");
2812 node
= get_node_iface((IUnknown
*)V_DISPATCH(&var
));
2813 type
= get_node_type((IUnknown
*)node
);
2814 ok(type
== 3, "type=%ld\n", type
);
2815 IHTMLDOMNode_Release(node
);
2818 bstr
= SysAllocString(w100
);
2819 hres
= IDispatchEx_GetDispID(dispex
, bstr
, fdexNameCaseSensitive
, &id
);
2820 ok(hres
== DISP_E_UNKNOWNNAME
, "GetDispID failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres
);
2821 SysFreeString(bstr
);
2823 IDispatchEx_Release(dispex
);
2828 static void test_elems(IHTMLDocument2
*doc
)
2830 IHTMLElementCollection
*col
;
2831 IHTMLDOMChildrenCollection
*child_col
;
2832 IHTMLElement
*elem
, *elem2
, *elem3
;
2833 IHTMLDOMNode
*node
, *node2
;
2838 static const WCHAR imgidW
[] = {'i','m','g','i','d',0};
2839 static const WCHAR inW
[] = {'i','n',0};
2840 static const WCHAR xW
[] = {'x',0};
2841 static const WCHAR sW
[] = {'s',0};
2842 static const WCHAR scW
[] = {'s','c',0};
2843 static const WCHAR xxxW
[] = {'x','x','x',0};
2844 static const WCHAR tblW
[] = {'t','b','l',0};
2845 static const WCHAR row2W
[] = {'r','o','w','2',0};
2846 static const WCHAR ifrW
[] = {'i','f','r',0};
2848 static const elem_type_t all_types
[] = {
2873 static const elem_type_t item_types
[] = {
2879 hres
= IHTMLDocument2_get_all(doc
, &col
);
2880 ok(hres
== S_OK
, "get_all failed: %08x\n", hres
);
2881 test_elem_collection((IUnknown
*)col
, all_types
, sizeof(all_types
)/sizeof(all_types
[0]));
2882 test_elem_col_item(col
, xW
, item_types
, sizeof(item_types
)/sizeof(item_types
[0]));
2883 IHTMLElementCollection_Release(col
);
2885 elem
= get_doc_elem(doc
);
2886 ok(hres
== S_OK
, "get_documentElement failed: %08x\n", hres
);
2887 hres
= IHTMLElement_get_all(elem
, &disp
);
2888 IHTMLElement_Release(elem
);
2889 ok(hres
== S_OK
, "get_all failed: %08x\n", hres
);
2891 hres
= IDispatch_QueryInterface(disp
, &IID_IHTMLElementCollection
, (void**)&col
);
2892 IDispatch_Release(disp
);
2893 ok(hres
== S_OK
, "Could not get IHTMLElementCollection: %08x\n", hres
);
2894 test_elem_collection((IUnknown
*)col
, all_types
+1, sizeof(all_types
)/sizeof(all_types
[0])-1);
2895 IHTMLElementCollection_Release(col
);
2897 get_elem_by_id(doc
, xxxW
, FALSE
);
2898 elem
= get_doc_elem_by_id(doc
, xxxW
);
2899 ok(!elem
, "elem != NULL\n");
2901 elem
= get_doc_elem_by_id(doc
, sW
);
2902 ok(elem
!= NULL
, "elem == NULL\n");
2904 test_elem_type((IUnknown
*)elem
, ET_SELECT
);
2905 test_elem_attr(elem
, xxxW
, NULL
);
2906 test_elem_attr(elem
, idW
, sW
);
2907 test_elem_class((IUnknown
*)elem
, NULL
);
2908 test_elem_set_class((IUnknown
*)elem
, "cl");
2909 test_elem_set_class((IUnknown
*)elem
, NULL
);
2910 test_elem_tabindex((IUnknown
*)elem
, 0);
2911 test_elem_set_tabindex((IUnknown
*)elem
, 1);
2913 node
= test_node_get_parent((IUnknown
*)elem
);
2914 ok(node
!= NULL
, "node == NULL\n");
2915 test_node_name((IUnknown
*)node
, "BODY");
2916 node2
= test_node_get_parent((IUnknown
*)node
);
2917 IHTMLDOMNode_Release(node
);
2918 ok(node2
!= NULL
, "node == NULL\n");
2919 test_node_name((IUnknown
*)node2
, "HTML");
2920 node
= test_node_get_parent((IUnknown
*)node2
);
2921 IHTMLDOMNode_Release(node2
);
2922 ok(node
!= NULL
, "node == NULL\n");
2923 test_node_name((IUnknown
*)node
, "#document");
2924 type
= get_node_type((IUnknown
*)node
);
2925 ok(type
== 9, "type=%ld, expected 9\n", type
);
2926 node2
= test_node_get_parent((IUnknown
*)node
);
2927 IHTMLDOMNode_Release(node
);
2928 ok(node2
== NULL
, "node != NULL\n");
2930 elem2
= test_elem_get_parent((IUnknown
*)elem
);
2931 ok(elem2
!= NULL
, "elem2 == NULL\n");
2932 test_node_name((IUnknown
*)elem2
, "BODY");
2933 elem3
= test_elem_get_parent((IUnknown
*)elem2
);
2934 IHTMLElement_Release(elem2
);
2935 ok(elem3
!= NULL
, "elem3 == NULL\n");
2936 test_node_name((IUnknown
*)elem3
, "HTML");
2937 elem2
= test_elem_get_parent((IUnknown
*)elem3
);
2938 IHTMLElement_Release(elem3
);
2939 ok(elem2
== NULL
, "elem2 != NULL\n");
2941 test_elem_getelembytag((IUnknown
*)elem
, ET_OPTION
, 2);
2942 test_elem_getelembytag((IUnknown
*)elem
, ET_SELECT
, 0);
2943 test_elem_getelembytag((IUnknown
*)elem
, ET_HTML
, 0);
2945 IHTMLElement_Release(elem
);
2948 elem
= get_elem_by_id(doc
, sW
, TRUE
);
2950 IHTMLSelectElement
*select
;
2952 hres
= IHTMLElement_QueryInterface(elem
, &IID_IHTMLSelectElement
, (void**)&select
);
2953 ok(hres
== S_OK
, "Could not get IHTMLSelectElement interface: %08x\n", hres
);
2955 test_select_elem(select
);
2957 test_elem_title((IUnknown
*)select
, NULL
);
2958 test_elem_set_title((IUnknown
*)select
, "Title");
2959 test_elem_title((IUnknown
*)select
, "Title");
2960 test_elem_offset((IUnknown
*)select
);
2962 node
= get_first_child((IUnknown
*)select
);
2963 ok(node
!= NULL
, "node == NULL\n");
2965 test_elem_type((IUnknown
*)node
, ET_OPTION
);
2966 IHTMLDOMNode_Release(node
);
2969 type
= get_node_type((IUnknown
*)select
);
2970 ok(type
== 1, "type=%ld\n", type
);
2972 IHTMLSelectElement_Release(select
);
2973 IHTMLElement_Release(elem
);
2976 elem
= get_elem_by_id(doc
, scW
, TRUE
);
2978 IHTMLScriptElement
*script
;
2981 hres
= IHTMLElement_QueryInterface(elem
, &IID_IHTMLScriptElement
, (void**)&script
);
2982 ok(hres
== S_OK
, "Could not get IHTMLScriptElement interface: %08x\n", hres
);
2984 hres
= IHTMLScriptElement_get_type(script
, &type
);
2985 ok(hres
== S_OK
, "get_type failed: %08x\n", hres
);
2986 ok(!lstrcmpW(type
, text_javascriptW
), "Unexpected type %s\n", dbgstr_w(type
));
2987 SysFreeString(type
);
2989 IHTMLScriptElement_Release(script
);
2992 elem
= get_elem_by_id(doc
, inW
, TRUE
);
2994 IHTMLInputElement
*input
;
2996 hres
= IHTMLElement_QueryInterface(elem
, &IID_IHTMLInputElement
, (void**)&input
);
2997 ok(hres
== S_OK
, "Could not get IHTMLInputElement: %08x\n", hres
);
2999 test_elem_id((IUnknown
*)elem
, "in");
3000 test_elem_put_id((IUnknown
*)elem
, "newin");
3001 test_input_get_disabled(input
, VARIANT_FALSE
);
3002 test_input_set_disabled(input
, VARIANT_TRUE
);
3003 test_input_set_disabled(input
, VARIANT_FALSE
);
3004 test_elem3_set_disabled((IUnknown
*)input
, VARIANT_TRUE
);
3005 test_input_get_disabled(input
, VARIANT_TRUE
);
3006 test_elem3_set_disabled((IUnknown
*)input
, VARIANT_FALSE
);
3007 test_input_get_disabled(input
, VARIANT_FALSE
);
3008 test_elem_client_size((IUnknown
*)elem
);
3010 test_node_get_value_str((IUnknown
*)elem
, NULL
);
3011 test_node_put_value_str((IUnknown
*)elem
, "test");
3012 test_node_get_value_str((IUnknown
*)elem
, NULL
);
3013 test_input_value((IUnknown
*)elem
, NULL
);
3014 test_input_put_value((IUnknown
*)elem
, "test");
3015 test_input_value((IUnknown
*)elem
, NULL
);
3016 test_elem_class((IUnknown
*)elem
, "testclass");
3017 test_elem_tabindex((IUnknown
*)elem
, 2);
3018 test_elem_set_tabindex((IUnknown
*)elem
, 3);
3019 test_elem_title((IUnknown
*)elem
, "test title");
3021 IHTMLInputElement_Release(input
);
3022 IHTMLElement_Release(elem
);
3025 elem
= get_elem_by_id(doc
, imgidW
, TRUE
);
3027 test_img_set_src((IUnknown
*)elem
, "about:blank");
3028 test_img_alt((IUnknown
*)elem
, NULL
);
3029 test_img_set_alt((IUnknown
*)elem
, "alt test");
3030 IHTMLElement_Release(elem
);
3033 elem
= get_doc_elem_by_id(doc
, tblW
);
3034 ok(elem
!= NULL
, "elem == NULL\n");
3036 test_table_elem(elem
);
3037 IHTMLElement_Release(elem
);
3040 elem
= get_doc_elem_by_id(doc
, row2W
);
3041 ok(elem
!= NULL
, "elem == NULL\n");
3044 IHTMLElement_Release(elem
);
3047 elem
= get_doc_elem_by_id(doc
, ifrW
);
3048 ok(elem
!= NULL
, "elem == NULL\n");
3050 test_iframe_elem(elem
);
3051 IHTMLElement_Release(elem
);
3054 hres
= IHTMLDocument2_get_body(doc
, &elem
);
3055 ok(hres
== S_OK
, "get_body failed: %08x\n", hres
);
3057 node
= get_first_child((IUnknown
*)elem
);
3058 ok(node
!= NULL
, "node == NULL\n");
3060 test_ifaces((IUnknown
*)node
, text_iids
);
3061 test_disp((IUnknown
*)node
, &DIID_DispHTMLDOMTextNode
);
3063 node2
= get_first_child((IUnknown
*)node
);
3064 ok(!node2
, "node2 != NULL\n");
3066 type
= get_node_type((IUnknown
*)node
);
3067 ok(type
== 3, "type=%ld\n", type
);
3069 test_node_get_value_str((IUnknown
*)node
, "text test");
3070 test_node_put_value_str((IUnknown
*)elem
, "test text");
3071 test_node_get_value_str((IUnknown
*)node
, "text test");
3073 IHTMLDOMNode_Release(node
);
3076 child_col
= get_child_nodes((IUnknown
*)elem
);
3077 ok(child_col
!= NULL
, "child_coll == NULL\n");
3081 test_disp((IUnknown
*)child_col
, &DIID_DispDOMChildrenCollection
);
3083 hres
= IHTMLDOMChildrenCollection_get_length(child_col
, &length
);
3084 ok(hres
== S_OK
, "get_length failed: %08x\n", hres
);
3085 ok(length
, "length=0\n");
3087 node
= get_child_item(child_col
, 0);
3088 ok(node
!= NULL
, "node == NULL\n");
3090 type
= get_node_type((IUnknown
*)node
);
3091 ok(type
== 3, "type=%ld\n", type
);
3092 IHTMLDOMNode_Release(node
);
3095 node
= get_child_item(child_col
, 1);
3096 ok(node
!= NULL
, "node == NULL\n");
3098 type
= get_node_type((IUnknown
*)node
);
3099 ok(type
== 8, "type=%ld\n", type
);
3101 test_elem_id((IUnknown
*)node
, NULL
);
3102 IHTMLDOMNode_Release(node
);
3105 disp
= (void*)0xdeadbeef;
3106 hres
= IHTMLDOMChildrenCollection_item(child_col
, 6000, &disp
);
3107 ok(hres
== E_INVALIDARG
, "item failed: %08x, expected E_INVALIDARG\n", hres
);
3108 ok(disp
== (void*)0xdeadbeef, "disp=%p\n", disp
);
3110 disp
= (void*)0xdeadbeef;
3111 hres
= IHTMLDOMChildrenCollection_item(child_col
, length
, &disp
);
3112 ok(hres
== E_INVALIDARG
, "item failed: %08x, expected E_INVALIDARG\n", hres
);
3113 ok(disp
== (void*)0xdeadbeef, "disp=%p\n", disp
);
3115 test_child_col_disp(child_col
);
3117 IHTMLDOMChildrenCollection_Release(child_col
);
3120 test_elem3_get_disabled((IUnknown
*)elem
, VARIANT_FALSE
);
3121 test_elem3_set_disabled((IUnknown
*)elem
, VARIANT_TRUE
);
3122 test_elem3_set_disabled((IUnknown
*)elem
, VARIANT_FALSE
);
3124 IHTMLElement_Release(elem
);
3126 test_stylesheets(doc
);
3127 test_create_option_elem(doc
);
3129 test_doc_title(doc
, "test");
3130 test_doc_set_title(doc
, "test title");
3131 test_doc_title(doc
, "test title");
3134 static void test_create_elems(IHTMLDocument2
*doc
)
3136 IHTMLElement
*elem
, *body
, *elem2
;
3142 static const elem_type_t types1
[] = { ET_TESTG
};
3144 elem
= test_create_elem(doc
, "TEST");
3145 test_elem_tag((IUnknown
*)elem
, "TEST");
3146 type
= get_node_type((IUnknown
*)elem
);
3147 ok(type
== 1, "type=%ld\n", type
);
3148 test_ifaces((IUnknown
*)elem
, elem_iids
);
3149 test_disp((IUnknown
*)elem
, &DIID_DispHTMLGenericElement
);
3151 hres
= IHTMLDocument2_get_body(doc
, &body
);
3152 ok(hres
== S_OK
, "get_body failed: %08x\n", hres
);
3153 test_node_has_child((IUnknown
*)body
, VARIANT_FALSE
);
3155 node
= test_node_append_child((IUnknown
*)body
, (IUnknown
*)elem
);
3156 test_node_has_child((IUnknown
*)body
, VARIANT_TRUE
);
3157 elem2
= get_elem_iface((IUnknown
*)node
);
3158 IHTMLElement_Release(elem2
);
3160 hres
= IHTMLElement_get_all(body
, &disp
);
3161 ok(hres
== S_OK
, "get_all failed: %08x\n", hres
);
3162 test_elem_collection((IUnknown
*)disp
, types1
, sizeof(types1
)/sizeof(types1
[0]));
3163 IDispatch_Release(disp
);
3165 test_node_remove_child((IUnknown
*)body
, node
);
3167 hres
= IHTMLElement_get_all(body
, &disp
);
3168 ok(hres
== S_OK
, "get_all failed: %08x\n", hres
);
3169 test_elem_collection((IUnknown
*)disp
, NULL
, 0);
3170 IDispatch_Release(disp
);
3171 test_node_has_child((IUnknown
*)body
, VARIANT_FALSE
);
3173 IHTMLElement_Release(body
);
3174 IHTMLElement_Release(elem
);
3175 IHTMLDOMNode_Release(node
);
3177 node
= test_create_text(doc
, "test");
3178 test_ifaces((IUnknown
*)node
, text_iids
);
3179 test_disp((IUnknown
*)node
, &DIID_DispHTMLDOMTextNode
);
3180 IHTMLDOMNode_Release(node
);
3183 static void test_exec(IUnknown
*unk
, const GUID
*grpid
, DWORD cmdid
, VARIANT
*in
, VARIANT
*out
)
3185 IOleCommandTarget
*cmdtrg
;
3188 hres
= IHTMLTxtRange_QueryInterface(unk
, &IID_IOleCommandTarget
, (void**)&cmdtrg
);
3189 ok(hres
== S_OK
, "Could not get IOleCommandTarget interface: %08x\n", hres
);
3191 hres
= IOleCommandTarget_Exec(cmdtrg
, grpid
, cmdid
, 0, in
, out
);
3192 ok(hres
== S_OK
, "Exec failed: %08x\n", hres
);
3194 IOleCommandTarget_Release(cmdtrg
);
3197 static void test_indent(IHTMLDocument2
*doc
)
3199 IHTMLElementCollection
*col
;
3200 IHTMLTxtRange
*range
;
3203 static const elem_type_t all_types
[] = {
3212 static const elem_type_t indent_types
[] = {
3223 hres
= IHTMLDocument2_get_all(doc
, &col
);
3224 ok(hres
== S_OK
, "get_all failed: %08x\n", hres
);
3225 test_elem_collection((IUnknown
*)col
, all_types
, sizeof(all_types
)/sizeof(all_types
[0]));
3226 IHTMLElementCollection_Release(col
);
3228 range
= test_create_body_range(doc
);
3229 test_exec((IUnknown
*)range
, &CGID_MSHTML
, IDM_INDENT
, NULL
, NULL
);
3230 IHTMLTxtRange_Release(range
);
3232 hres
= IHTMLDocument2_get_all(doc
, &col
);
3233 ok(hres
== S_OK
, "get_all failed: %08x\n", hres
);
3234 test_elem_collection((IUnknown
*)col
, indent_types
, sizeof(indent_types
)/sizeof(indent_types
[0]));
3235 IHTMLElementCollection_Release(col
);
3238 static IHTMLDocument2
*notif_doc
;
3239 static BOOL doc_complete
;
3241 static HRESULT WINAPI
PropertyNotifySink_QueryInterface(IPropertyNotifySink
*iface
,
3242 REFIID riid
, void**ppv
)
3244 if(IsEqualGUID(&IID_IPropertyNotifySink
, riid
)) {
3249 ok(0, "unexpected call\n");
3250 return E_NOINTERFACE
;
3253 static ULONG WINAPI
PropertyNotifySink_AddRef(IPropertyNotifySink
*iface
)
3258 static ULONG WINAPI
PropertyNotifySink_Release(IPropertyNotifySink
*iface
)
3263 static HRESULT WINAPI
PropertyNotifySink_OnChanged(IPropertyNotifySink
*iface
, DISPID dispID
)
3265 if(dispID
== DISPID_READYSTATE
){
3269 static const WCHAR completeW
[] = {'c','o','m','p','l','e','t','e',0};
3271 hres
= IHTMLDocument2_get_readyState(notif_doc
, &state
);
3272 ok(hres
== S_OK
, "get_readyState failed: %08x\n", hres
);
3274 if(!lstrcmpW(state
, completeW
))
3275 doc_complete
= TRUE
;
3277 SysFreeString(state
);
3283 static HRESULT WINAPI
PropertyNotifySink_OnRequestEdit(IPropertyNotifySink
*iface
, DISPID dispID
)
3285 ok(0, "unexpected call\n");
3289 static IPropertyNotifySinkVtbl PropertyNotifySinkVtbl
= {
3290 PropertyNotifySink_QueryInterface
,
3291 PropertyNotifySink_AddRef
,
3292 PropertyNotifySink_Release
,
3293 PropertyNotifySink_OnChanged
,
3294 PropertyNotifySink_OnRequestEdit
3297 static IPropertyNotifySink PropertyNotifySink
= { &PropertyNotifySinkVtbl
};
3299 static IHTMLDocument2
*create_doc_with_string(const char *str
)
3301 IPersistStreamInit
*init
;
3303 IHTMLDocument2
*doc
;
3307 notif_doc
= doc
= create_document();
3311 doc_complete
= FALSE
;
3313 mem
= GlobalAlloc(0, len
);
3314 memcpy(mem
, str
, len
);
3315 CreateStreamOnHGlobal(mem
, TRUE
, &stream
);
3317 IHTMLDocument2_QueryInterface(doc
, &IID_IPersistStreamInit
, (void**)&init
);
3319 IPersistStreamInit_Load(init
, stream
);
3320 IPersistStreamInit_Release(init
);
3321 IStream_Release(stream
);
3326 static void do_advise(IUnknown
*unk
, REFIID riid
, IUnknown
*unk_advise
)
3328 IConnectionPointContainer
*container
;
3329 IConnectionPoint
*cp
;
3333 hres
= IUnknown_QueryInterface(unk
, &IID_IConnectionPointContainer
, (void**)&container
);
3334 ok(hres
== S_OK
, "QueryInterface(IID_IConnectionPointContainer) failed: %08x\n", hres
);
3336 hres
= IConnectionPointContainer_FindConnectionPoint(container
, riid
, &cp
);
3337 IConnectionPointContainer_Release(container
);
3338 ok(hres
== S_OK
, "FindConnectionPoint failed: %08x\n", hres
);
3340 hres
= IConnectionPoint_Advise(cp
, unk_advise
, &cookie
);
3341 IConnectionPoint_Release(cp
);
3342 ok(hres
== S_OK
, "Advise failed: %08x\n", hres
);
3345 typedef void (*domtest_t
)(IHTMLDocument2
*);
3347 static void run_domtest(const char *str
, domtest_t test
)
3349 IHTMLDocument2
*doc
;
3350 IHTMLElement
*body
= NULL
;
3355 doc
= create_doc_with_string(str
);
3356 do_advise((IUnknown
*)doc
, &IID_IPropertyNotifySink
, (IUnknown
*)&PropertyNotifySink
);
3358 while(!doc_complete
&& GetMessage(&msg
, NULL
, 0, 0)) {
3359 TranslateMessage(&msg
);
3360 DispatchMessage(&msg
);
3363 hres
= IHTMLDocument2_get_body(doc
, &body
);
3364 ok(hres
== S_OK
, "get_body failed: %08x\n", hres
);
3367 IHTMLElement_Release(body
);
3370 skip("Could not get document body. Assuming no Gecko installed.\n");
3373 ref
= IHTMLDocument2_Release(doc
);
3375 ref
== 1, /* Vista */
3379 static void gecko_installer_workaround(BOOL disable
)
3384 static BOOL has_url
= FALSE
;
3385 static char url
[2048];
3387 if(!disable
&& !has_url
)
3390 res
= RegOpenKey(HKEY_CURRENT_USER
, "Software\\Wine\\MSHTML", &hkey
);
3391 if(res
!= ERROR_SUCCESS
)
3395 DWORD type
, size
= sizeof(url
);
3397 res
= RegQueryValueEx(hkey
, "GeckoUrl", NULL
, &type
, (PVOID
)url
, &size
);
3398 if(res
== ERROR_SUCCESS
&& type
== REG_SZ
)
3401 RegDeleteValue(hkey
, "GeckoUrl");
3403 RegSetValueEx(hkey
, "GeckoUrl", 0, REG_SZ
, (PVOID
)url
, lstrlenA(url
)+1);
3411 gecko_installer_workaround(TRUE
);
3414 run_domtest(doc_str1
, test_doc_elem
);
3415 run_domtest(range_test_str
, test_txtrange
);
3416 run_domtest(range_test2_str
, test_txtrange2
);
3417 run_domtest(elem_test_str
, test_elems
);
3418 run_domtest(doc_blank
, test_create_elems
);
3419 run_domtest(doc_blank
, test_defaults
);
3420 run_domtest(indent_test_str
, test_indent
);
3423 gecko_installer_workaround(FALSE
);