push b79aff4f9e064e6702329573e5ebb8548e254b61
[wine/hacks.git] / dlls / mshtml / htmlelem.c
blob1ee755d4c413a3e6f239cd5d64b8f0fd681fbcc9
1 /*
2 * Copyright 2006 Jacek Caban for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
19 #include "config.h"
21 #include <stdarg.h>
22 #include <stdio.h>
24 #define COBJMACROS
26 #include "windef.h"
27 #include "winbase.h"
28 #include "winuser.h"
29 #include "winreg.h"
30 #include "winnls.h"
31 #include "ole2.h"
32 #include "shlwapi.h"
34 #include "wine/debug.h"
35 #include "wine/unicode.h"
37 #include "mshtml_private.h"
39 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
41 static IHTMLElementCollection *HTMLElementCollection_Create(IUnknown*,HTMLElement**,DWORD);
43 typedef struct {
44 HTMLElement **buf;
45 DWORD len;
46 DWORD size;
47 } elem_vector;
49 static void elem_vector_add(elem_vector *buf, HTMLElement *elem)
51 if(buf->len == buf->size) {
52 buf->size <<= 1;
53 buf->buf = mshtml_realloc(buf->buf, buf->size*sizeof(HTMLElement**));
56 buf->buf[buf->len++] = elem;
59 static void elem_vector_normalize(elem_vector *buf)
61 if(!buf->len) {
62 mshtml_free(buf->buf);
63 buf->buf = NULL;
64 }else if(buf->size > buf->len) {
65 buf->buf = mshtml_realloc(buf->buf, buf->len*sizeof(HTMLElement**));
68 buf->size = buf->len;
71 #define HTMLELEM_THIS(iface) DEFINE_THIS(HTMLElement, HTMLElement, iface)
73 #define HTMLELEM_NODE_THIS(iface) DEFINE_THIS2(HTMLElement, node, iface)
75 static HRESULT WINAPI HTMLElement_QueryInterface(IHTMLElement *iface,
76 REFIID riid, void **ppv)
78 HTMLElement *This = HTMLELEM_THIS(iface);
80 return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(&This->node), riid, ppv);
83 static ULONG WINAPI HTMLElement_AddRef(IHTMLElement *iface)
85 HTMLElement *This = HTMLELEM_THIS(iface);
87 return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This->node));
90 static ULONG WINAPI HTMLElement_Release(IHTMLElement *iface)
92 HTMLElement *This = HTMLELEM_THIS(iface);
94 return IHTMLDOMNode_Release(HTMLDOMNODE(&This->node));
97 static HRESULT WINAPI HTMLElement_GetTypeInfoCount(IHTMLElement *iface, UINT *pctinfo)
99 HTMLElement *This = HTMLELEM_THIS(iface);
100 FIXME("(%p)->(%p)\n", This, pctinfo);
101 return E_NOTIMPL;
104 static HRESULT WINAPI HTMLElement_GetTypeInfo(IHTMLElement *iface, UINT iTInfo,
105 LCID lcid, ITypeInfo **ppTInfo)
107 HTMLElement *This = HTMLELEM_THIS(iface);
108 FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
109 return E_NOTIMPL;
112 static HRESULT WINAPI HTMLElement_GetIDsOfNames(IHTMLElement *iface, REFIID riid,
113 LPOLESTR *rgszNames, UINT cNames,
114 LCID lcid, DISPID *rgDispId)
116 HTMLElement *This = HTMLELEM_THIS(iface);
117 FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
118 lcid, rgDispId);
119 return E_NOTIMPL;
122 static HRESULT WINAPI HTMLElement_Invoke(IHTMLElement *iface, DISPID dispIdMember,
123 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
124 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
126 HTMLElement *This = HTMLELEM_THIS(iface);
127 FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
128 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
129 return E_NOTIMPL;
132 static HRESULT WINAPI HTMLElement_setAttribute(IHTMLElement *iface, BSTR strAttributeName,
133 VARIANT AttributeValue, LONG lFlags)
135 HTMLElement *This = HTMLELEM_THIS(iface);
136 nsAString attr_str;
137 nsAString value_str;
138 nsresult nsres;
139 HRESULT hres;
140 VARIANT AttributeValueChanged;
142 WARN("(%p)->(%s . %08x)\n", This, debugstr_w(strAttributeName), lFlags);
144 VariantInit(&AttributeValueChanged);
146 hres = VariantChangeType(&AttributeValueChanged, &AttributeValue, 0, VT_BSTR);
147 if (FAILED(hres)) {
148 WARN("couldn't convert input attribute value %d to VT_BSTR\n", V_VT(&AttributeValue));
149 return hres;
152 nsAString_Init(&attr_str, strAttributeName);
153 nsAString_Init(&value_str, V_BSTR(&AttributeValueChanged));
155 TRACE("setting %s to %s\n", debugstr_w(strAttributeName),
156 debugstr_w(V_BSTR(&AttributeValueChanged)));
158 nsres = nsIDOMHTMLElement_SetAttribute(This->nselem, &attr_str, &value_str);
159 nsAString_Finish(&attr_str);
160 nsAString_Finish(&value_str);
162 if(NS_SUCCEEDED(nsres)) {
163 hres = S_OK;
164 }else {
165 ERR("SetAttribute failed: %08x\n", nsres);
166 hres = E_FAIL;
169 return hres;
172 static HRESULT WINAPI HTMLElement_getAttribute(IHTMLElement *iface, BSTR strAttributeName,
173 LONG lFlags, VARIANT *AttributeValue)
175 HTMLElement *This = HTMLELEM_THIS(iface);
176 nsAString attr_str;
177 nsAString value_str;
178 const PRUnichar *value;
179 nsresult nsres;
180 HRESULT hres = S_OK;
182 WARN("(%p)->(%s %08x %p)\n", This, debugstr_w(strAttributeName), lFlags, AttributeValue);
184 VariantInit(AttributeValue);
186 nsAString_Init(&attr_str, strAttributeName);
187 nsAString_Init(&value_str, NULL);
189 nsres = nsIDOMHTMLElement_GetAttribute(This->nselem, &attr_str, &value_str);
190 nsAString_Finish(&attr_str);
192 if(NS_SUCCEEDED(nsres)) {
193 static const WCHAR wszSRC[] = {'s','r','c',0};
194 nsAString_GetData(&value_str, &value, NULL);
195 if(!strcmpiW(strAttributeName, wszSRC))
197 WCHAR buffer[256];
198 DWORD len;
199 BSTR bstrBaseUrl;
200 hres = IHTMLDocument2_get_URL(HTMLDOC(This->node.doc), &bstrBaseUrl);
201 if(SUCCEEDED(hres)) {
202 hres = CoInternetCombineUrl(bstrBaseUrl, value,
203 URL_ESCAPE_SPACES_ONLY|URL_DONT_ESCAPE_EXTRA_INFO,
204 buffer, sizeof(buffer)/sizeof(WCHAR), &len, 0);
205 SysFreeString(bstrBaseUrl);
206 if(SUCCEEDED(hres)) {
207 V_VT(AttributeValue) = VT_BSTR;
208 V_BSTR(AttributeValue) = SysAllocString(buffer);
209 TRACE("attr_value=%s\n", debugstr_w(V_BSTR(AttributeValue)));
212 }else {
213 V_VT(AttributeValue) = VT_BSTR;
214 V_BSTR(AttributeValue) = SysAllocString(value);
215 TRACE("attr_value=%s\n", debugstr_w(V_BSTR(AttributeValue)));
217 }else {
218 ERR("GetAttribute failed: %08x\n", nsres);
219 hres = E_FAIL;
222 nsAString_Finish(&value_str);
224 return hres;
227 static HRESULT WINAPI HTMLElement_removeAttribute(IHTMLElement *iface, BSTR strAttributeName,
228 LONG lFlags, VARIANT_BOOL *pfSuccess)
230 HTMLElement *This = HTMLELEM_THIS(iface);
231 FIXME("(%p)->()\n", This);
232 return E_NOTIMPL;
235 static HRESULT WINAPI HTMLElement_put_className(IHTMLElement *iface, BSTR v)
237 HTMLElement *This = HTMLELEM_THIS(iface);
238 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
239 return E_NOTIMPL;
242 static HRESULT WINAPI HTMLElement_get_className(IHTMLElement *iface, BSTR *p)
244 HTMLElement *This = HTMLELEM_THIS(iface);
245 nsAString class_str;
246 nsresult nsres;
247 HRESULT hres = S_OK;
249 TRACE("(%p)->(%p)\n", This, p);
251 nsAString_Init(&class_str, NULL);
252 nsres = nsIDOMHTMLElement_GetClassName(This->nselem, &class_str);
254 if(NS_SUCCEEDED(nsres)) {
255 const PRUnichar *class;
256 nsAString_GetData(&class_str, &class, NULL);
257 *p = SysAllocString(class);
258 }else {
259 ERR("GetClassName failed: %08x\n", nsres);
260 hres = E_FAIL;
263 nsAString_Finish(&class_str);
265 TRACE("className=%s\n", debugstr_w(*p));
266 return hres;
269 static HRESULT WINAPI HTMLElement_put_id(IHTMLElement *iface, BSTR v)
271 HTMLElement *This = HTMLELEM_THIS(iface);
272 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
273 return E_NOTIMPL;
276 static HRESULT WINAPI HTMLElement_get_id(IHTMLElement *iface, BSTR *p)
278 HTMLElement *This = HTMLELEM_THIS(iface);
279 FIXME("(%p)->(%p)\n", This, p);
280 return E_NOTIMPL;
283 static HRESULT WINAPI HTMLElement_get_tagName(IHTMLElement *iface, BSTR *p)
285 HTMLElement *This = HTMLELEM_THIS(iface);
286 const PRUnichar *tag;
287 nsAString tag_str;
288 nsresult nsres;
290 TRACE("(%p)->(%p)\n", This, p);
292 nsAString_Init(&tag_str, NULL);
293 nsres = nsIDOMHTMLElement_GetTagName(This->nselem, &tag_str);
294 if(NS_SUCCEEDED(nsres)) {
295 nsAString_GetData(&tag_str, &tag, NULL);
296 *p = SysAllocString(tag);
297 }else {
298 ERR("GetTagName failed: %08x\n", nsres);
299 *p = NULL;
301 nsAString_Finish(&tag_str);
303 return S_OK;
306 static HRESULT WINAPI HTMLElement_get_parentElement(IHTMLElement *iface, IHTMLElement **p)
308 HTMLElement *This = HTMLELEM_THIS(iface);
309 FIXME("(%p)->(%p)\n", This, p);
310 return E_NOTIMPL;
313 static HRESULT WINAPI HTMLElement_get_style(IHTMLElement *iface, IHTMLStyle **p)
315 HTMLElement *This = HTMLELEM_THIS(iface);
316 nsIDOMElementCSSInlineStyle *nselemstyle;
317 nsIDOMCSSStyleDeclaration *nsstyle;
318 nsresult nsres;
320 TRACE("(%p)->(%p)\n", This, p);
322 nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMElementCSSInlineStyle,
323 (void**)&nselemstyle);
324 if(NS_FAILED(nsres)) {
325 ERR("Coud not get nsIDOMCSSStyleDeclaration interface: %08x\n", nsres);
326 return E_FAIL;
329 nsres = nsIDOMElementCSSInlineStyle_GetStyle(nselemstyle, &nsstyle);
330 nsIDOMElementCSSInlineStyle_Release(nselemstyle);
331 if(NS_FAILED(nsres)) {
332 ERR("GetStyle failed: %08x\n", nsres);
333 return E_FAIL;
336 /* FIXME: Store style instead of creating a new instance in each call */
337 *p = HTMLStyle_Create(nsstyle);
339 nsIDOMCSSStyleDeclaration_Release(nsstyle);
340 return S_OK;
343 static HRESULT WINAPI HTMLElement_put_onhelp(IHTMLElement *iface, VARIANT v)
345 HTMLElement *This = HTMLELEM_THIS(iface);
346 FIXME("(%p)->()\n", This);
347 return E_NOTIMPL;
350 static HRESULT WINAPI HTMLElement_get_onhelp(IHTMLElement *iface, VARIANT *p)
352 HTMLElement *This = HTMLELEM_THIS(iface);
353 FIXME("(%p)->(%p)\n", This, p);
354 return E_NOTIMPL;
357 static HRESULT WINAPI HTMLElement_put_onclick(IHTMLElement *iface, VARIANT v)
359 HTMLElement *This = HTMLELEM_THIS(iface);
360 FIXME("(%p)->()\n", This);
361 return E_NOTIMPL;
364 static HRESULT WINAPI HTMLElement_get_onclick(IHTMLElement *iface, VARIANT *p)
366 HTMLElement *This = HTMLELEM_THIS(iface);
367 FIXME("(%p)->(%p)\n", This, p);
368 return E_NOTIMPL;
371 static HRESULT WINAPI HTMLElement_put_ondblclick(IHTMLElement *iface, VARIANT v)
373 HTMLElement *This = HTMLELEM_THIS(iface);
374 FIXME("(%p)->()\n", This);
375 return E_NOTIMPL;
378 static HRESULT WINAPI HTMLElement_get_ondblclick(IHTMLElement *iface, VARIANT *p)
380 HTMLElement *This = HTMLELEM_THIS(iface);
381 FIXME("(%p)->(%p)\n", This, p);
382 return E_NOTIMPL;
385 static HRESULT WINAPI HTMLElement_put_onkeydown(IHTMLElement *iface, VARIANT v)
387 HTMLElement *This = HTMLELEM_THIS(iface);
388 FIXME("(%p)->()\n", This);
389 return E_NOTIMPL;
392 static HRESULT WINAPI HTMLElement_get_onkeydown(IHTMLElement *iface, VARIANT *p)
394 HTMLElement *This = HTMLELEM_THIS(iface);
395 FIXME("(%p)->(%p)\n", This, p);
396 return E_NOTIMPL;
399 static HRESULT WINAPI HTMLElement_put_onkeyup(IHTMLElement *iface, VARIANT v)
401 HTMLElement *This = HTMLELEM_THIS(iface);
402 FIXME("(%p)->()\n", This);
403 return E_NOTIMPL;
406 static HRESULT WINAPI HTMLElement_get_onkeyup(IHTMLElement *iface, VARIANT *p)
408 HTMLElement *This = HTMLELEM_THIS(iface);
409 FIXME("(%p)->(%p)\n", This, p);
410 return E_NOTIMPL;
413 static HRESULT WINAPI HTMLElement_put_onkeypress(IHTMLElement *iface, VARIANT v)
415 HTMLElement *This = HTMLELEM_THIS(iface);
416 FIXME("(%p)->()\n", This);
417 return E_NOTIMPL;
420 static HRESULT WINAPI HTMLElement_get_onkeypress(IHTMLElement *iface, VARIANT *p)
422 HTMLElement *This = HTMLELEM_THIS(iface);
423 FIXME("(%p)->(%p)\n", This, p);
424 return E_NOTIMPL;
427 static HRESULT WINAPI HTMLElement_put_onmouseout(IHTMLElement *iface, VARIANT v)
429 HTMLElement *This = HTMLELEM_THIS(iface);
430 FIXME("(%p)->()\n", This);
431 return E_NOTIMPL;
434 static HRESULT WINAPI HTMLElement_get_onmouseout(IHTMLElement *iface, VARIANT *p)
436 HTMLElement *This = HTMLELEM_THIS(iface);
437 FIXME("(%p)->(%p)\n", This, p);
438 return E_NOTIMPL;
441 static HRESULT WINAPI HTMLElement_put_onmouseover(IHTMLElement *iface, VARIANT v)
443 HTMLElement *This = HTMLELEM_THIS(iface);
444 FIXME("(%p)->()\n", This);
445 return E_NOTIMPL;
448 static HRESULT WINAPI HTMLElement_get_onmouseover(IHTMLElement *iface, VARIANT *p)
450 HTMLElement *This = HTMLELEM_THIS(iface);
451 FIXME("(%p)->(%p)\n", This, p);
452 return E_NOTIMPL;
455 static HRESULT WINAPI HTMLElement_put_onmousemove(IHTMLElement *iface, VARIANT v)
457 HTMLElement *This = HTMLELEM_THIS(iface);
458 FIXME("(%p)->()\n", This);
459 return E_NOTIMPL;
462 static HRESULT WINAPI HTMLElement_get_onmousemove(IHTMLElement *iface, VARIANT *p)
464 HTMLElement *This = HTMLELEM_THIS(iface);
465 FIXME("(%p)->(%p)\n", This, p);
466 return E_NOTIMPL;
469 static HRESULT WINAPI HTMLElement_put_onmousedown(IHTMLElement *iface, VARIANT v)
471 HTMLElement *This = HTMLELEM_THIS(iface);
472 FIXME("(%p)->()\n", This);
473 return E_NOTIMPL;
476 static HRESULT WINAPI HTMLElement_get_onmousedown(IHTMLElement *iface, VARIANT *p)
478 HTMLElement *This = HTMLELEM_THIS(iface);
479 FIXME("(%p)->(%p)\n", This, p);
480 return E_NOTIMPL;
483 static HRESULT WINAPI HTMLElement_put_onmouseup(IHTMLElement *iface, VARIANT v)
485 HTMLElement *This = HTMLELEM_THIS(iface);
486 FIXME("(%p)->()\n", This);
487 return E_NOTIMPL;
490 static HRESULT WINAPI HTMLElement_get_onmouseup(IHTMLElement *iface, VARIANT *p)
492 HTMLElement *This = HTMLELEM_THIS(iface);
493 FIXME("(%p)->(%p)\n", This, p);
494 return E_NOTIMPL;
497 static HRESULT WINAPI HTMLElement_get_document(IHTMLElement *iface, IDispatch **p)
499 HTMLElement *This = HTMLELEM_THIS(iface);
500 FIXME("(%p)->(%p)\n", This, p);
501 return E_NOTIMPL;
504 static HRESULT WINAPI HTMLElement_put_title(IHTMLElement *iface, BSTR v)
506 HTMLElement *This = HTMLELEM_THIS(iface);
507 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
508 return E_NOTIMPL;
511 static HRESULT WINAPI HTMLElement_get_title(IHTMLElement *iface, BSTR *p)
513 HTMLElement *This = HTMLELEM_THIS(iface);
514 FIXME("(%p)->(%p)\n", This, p);
515 return E_NOTIMPL;
518 static HRESULT WINAPI HTMLElement_put_language(IHTMLElement *iface, BSTR v)
520 HTMLElement *This = HTMLELEM_THIS(iface);
521 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
522 return E_NOTIMPL;
525 static HRESULT WINAPI HTMLElement_get_language(IHTMLElement *iface, BSTR *p)
527 HTMLElement *This = HTMLELEM_THIS(iface);
528 FIXME("(%p)->(%p)\n", This, p);
529 return E_NOTIMPL;
532 static HRESULT WINAPI HTMLElement_put_onselectstart(IHTMLElement *iface, VARIANT v)
534 HTMLElement *This = HTMLELEM_THIS(iface);
535 FIXME("(%p)->()\n", This);
536 return E_NOTIMPL;
539 static HRESULT WINAPI HTMLElement_get_onselectstart(IHTMLElement *iface, VARIANT *p)
541 HTMLElement *This = HTMLELEM_THIS(iface);
542 FIXME("(%p)->(%p)\n", This, p);
543 return E_NOTIMPL;
546 static HRESULT WINAPI HTMLElement_scrollIntoView(IHTMLElement *iface, VARIANT varargStart)
548 HTMLElement *This = HTMLELEM_THIS(iface);
549 FIXME("(%p)->()\n", This);
550 return E_NOTIMPL;
553 static HRESULT WINAPI HTMLElement_contains(IHTMLElement *iface, IHTMLElement *pChild,
554 VARIANT_BOOL *pfResult)
556 HTMLElement *This = HTMLELEM_THIS(iface);
557 FIXME("(%p)->(%p %p)\n", This, pChild, pfResult);
558 return E_NOTIMPL;
561 static HRESULT WINAPI HTMLElement_get_sourceIndex(IHTMLElement *iface, long *p)
563 HTMLElement *This = HTMLELEM_THIS(iface);
564 FIXME("(%p)->(%p)\n", This, p);
565 return E_NOTIMPL;
568 static HRESULT WINAPI HTMLElement_get_recordNumber(IHTMLElement *iface, VARIANT *p)
570 HTMLElement *This = HTMLELEM_THIS(iface);
571 FIXME("(%p)->(%p)\n", This, p);
572 return E_NOTIMPL;
575 static HRESULT WINAPI HTMLElement_put_lang(IHTMLElement *iface, BSTR v)
577 HTMLElement *This = HTMLELEM_THIS(iface);
578 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
579 return E_NOTIMPL;
582 static HRESULT WINAPI HTMLElement_get_lang(IHTMLElement *iface, BSTR *p)
584 HTMLElement *This = HTMLELEM_THIS(iface);
585 FIXME("(%p)->(%p)\n", This, p);
586 return E_NOTIMPL;
589 static HRESULT WINAPI HTMLElement_get_offsetLeft(IHTMLElement *iface, long *p)
591 HTMLElement *This = HTMLELEM_THIS(iface);
592 FIXME("(%p)->(%p)\n", This, p);
593 return E_NOTIMPL;
596 static HRESULT WINAPI HTMLElement_get_offsetTop(IHTMLElement *iface, long *p)
598 HTMLElement *This = HTMLELEM_THIS(iface);
599 FIXME("(%p)->(%p)\n", This, p);
600 return E_NOTIMPL;
603 static HRESULT WINAPI HTMLElement_get_offsetWidth(IHTMLElement *iface, long *p)
605 HTMLElement *This = HTMLELEM_THIS(iface);
606 FIXME("(%p)->(%p)\n", This, p);
607 return E_NOTIMPL;
610 static HRESULT WINAPI HTMLElement_get_offsetHeight(IHTMLElement *iface, long *p)
612 HTMLElement *This = HTMLELEM_THIS(iface);
613 FIXME("(%p)->(%p)\n", This, p);
614 return E_NOTIMPL;
617 static HRESULT WINAPI HTMLElement_get_offsetParent(IHTMLElement *iface, IHTMLElement **p)
619 HTMLElement *This = HTMLELEM_THIS(iface);
620 FIXME("(%p)->(%p)\n", This, p);
621 return E_NOTIMPL;
624 static HRESULT WINAPI HTMLElement_put_innerHTML(IHTMLElement *iface, BSTR v)
626 HTMLElement *This = HTMLELEM_THIS(iface);
627 nsIDOMNSHTMLElement *nselem;
628 nsAString html_str;
629 nsresult nsres;
631 TRACE("(%p)->(%s)\n", This, debugstr_w(v));
633 nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
634 if(NS_FAILED(nsres)) {
635 ERR("Could not get nsIDOMNSHTMLElement: %08x\n", nsres);
636 return E_FAIL;
639 nsAString_Init(&html_str, v);
640 nsres = nsIDOMNSHTMLElement_SetInnerHTML(nselem, &html_str);
641 nsAString_Finish(&html_str);
643 if(NS_FAILED(nsres)) {
644 FIXME("SetInnerHtml failed %08x\n", nsres);
645 return E_FAIL;
648 return S_OK;
651 static HRESULT WINAPI HTMLElement_get_innerHTML(IHTMLElement *iface, BSTR *p)
653 HTMLElement *This = HTMLELEM_THIS(iface);
654 FIXME("(%p)->(%p)\n", This, p);
655 return E_NOTIMPL;
658 static HRESULT WINAPI HTMLElement_put_innerText(IHTMLElement *iface, BSTR v)
660 HTMLElement *This = HTMLELEM_THIS(iface);
661 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
662 return E_NOTIMPL;
665 static HRESULT WINAPI HTMLElement_get_innerText(IHTMLElement *iface, BSTR *p)
667 HTMLElement *This = HTMLELEM_THIS(iface);
668 FIXME("(%p)->(%p)\n", This, p);
669 return E_NOTIMPL;
672 static HRESULT WINAPI HTMLElement_put_outerHTML(IHTMLElement *iface, BSTR v)
674 HTMLElement *This = HTMLELEM_THIS(iface);
675 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
676 return E_NOTIMPL;
679 static HRESULT WINAPI HTMLElement_get_outerHTML(IHTMLElement *iface, BSTR *p)
681 HTMLElement *This = HTMLELEM_THIS(iface);
682 FIXME("(%p)->(%p)\n", This, p);
683 return E_NOTIMPL;
686 static HRESULT WINAPI HTMLElement_put_outerText(IHTMLElement *iface, BSTR v)
688 HTMLElement *This = HTMLELEM_THIS(iface);
689 FIXME("(%p)->(%s)\n", This, debugstr_w(v));
690 return E_NOTIMPL;
693 static HRESULT WINAPI HTMLElement_get_outerText(IHTMLElement *iface, BSTR *p)
695 HTMLElement *This = HTMLELEM_THIS(iface);
696 FIXME("(%p)->(%p)\n", This, p);
697 return E_NOTIMPL;
700 static HRESULT HTMLElement_InsertAdjacentNode(HTMLElement *This, BSTR where, nsIDOMNode *nsnode)
702 static const WCHAR wszBeforeBegin[] = {'b','e','f','o','r','e','B','e','g','i','n',0};
703 static const WCHAR wszAfterBegin[] = {'a','f','t','e','r','B','e','g','i','n',0};
704 static const WCHAR wszBeforeEnd[] = {'b','e','f','o','r','e','E','n','d',0};
705 static const WCHAR wszAfterEnd[] = {'a','f','t','e','r','E','n','d',0};
706 nsresult nsres;
708 if (!strcmpiW(where, wszBeforeBegin))
710 nsIDOMNode *unused;
711 nsIDOMNode *parent;
712 nsres = nsIDOMNode_GetParentNode(This->nselem, &parent);
713 if (!parent) return E_INVALIDARG;
714 nsres = nsIDOMNode_InsertBefore(parent, nsnode,
715 (nsIDOMNode *)This->nselem, &unused);
716 if (unused) nsIDOMNode_Release(unused);
717 nsIDOMNode_Release(parent);
719 else if (!strcmpiW(where, wszAfterBegin))
721 nsIDOMNode *unused;
722 nsIDOMNode *first_child;
723 nsIDOMNode_GetFirstChild(This->nselem, &first_child);
724 nsres = nsIDOMNode_InsertBefore(This->nselem, nsnode, first_child, &unused);
725 if (unused) nsIDOMNode_Release(unused);
726 if (first_child) nsIDOMNode_Release(first_child);
728 else if (!strcmpiW(where, wszBeforeEnd))
730 nsIDOMNode *unused;
731 nsres = nsIDOMNode_AppendChild(This->nselem, nsnode, &unused);
732 if (unused) nsIDOMNode_Release(unused);
734 else if (!strcmpiW(where, wszAfterEnd))
736 nsIDOMNode *unused;
737 nsIDOMNode *next_sibling;
738 nsIDOMNode *parent;
739 nsIDOMNode_GetParentNode(This->nselem, &parent);
740 if (!parent) return E_INVALIDARG;
742 nsIDOMNode_GetNextSibling(This->nselem, &next_sibling);
743 if (next_sibling)
745 nsres = nsIDOMNode_InsertBefore(parent, nsnode, next_sibling, &unused);
746 nsIDOMNode_Release(next_sibling);
748 else
749 nsres = nsIDOMNode_AppendChild(parent, nsnode, &unused);
750 nsIDOMNode_Release(parent);
751 if (unused) nsIDOMNode_Release(unused);
753 else
755 ERR("invalid where: %s\n", debugstr_w(where));
756 return E_INVALIDARG;
759 if (NS_FAILED(nsres))
760 return E_FAIL;
761 else
762 return S_OK;
765 static HRESULT WINAPI HTMLElement_insertAdjacentHTML(IHTMLElement *iface, BSTR where,
766 BSTR html)
768 HTMLElement *This = HTMLELEM_THIS(iface);
769 nsresult nsres;
770 nsIDOMDocument *nsdoc;
771 nsIDOMDocumentRange *nsdocrange;
772 nsIDOMRange *range;
773 nsIDOMNSRange *nsrange;
774 nsIDOMNode *nsnode;
775 nsAString ns_html;
776 HRESULT hr;
778 TRACE("(%p)->(%s %s)\n", This, debugstr_w(where), debugstr_w(html));
780 nsres = nsIWebNavigation_GetDocument(This->node.doc->nscontainer->navigation, &nsdoc);
781 if(NS_FAILED(nsres))
783 ERR("GetDocument failed: %08x\n", nsres);
784 return E_FAIL;
787 nsres = nsIDOMDocument_QueryInterface(nsdoc, &IID_nsIDOMDocumentRange, (void **)&nsdocrange);
788 nsIDOMDocument_Release(nsdoc);
789 if(NS_FAILED(nsres))
791 ERR("getting nsIDOMDocumentRange failed: %08x\n", nsres);
792 return E_FAIL;
794 nsres = nsIDOMDocumentRange_CreateRange(nsdocrange, &range);
795 nsIDOMDocumentRange_Release(nsdocrange);
796 if(NS_FAILED(nsres))
798 ERR("CreateRange failed: %08x\n", nsres);
799 return E_FAIL;
802 nsIDOMRange_SetStartBefore(range, (nsIDOMNode *)This->nselem);
804 nsIDOMRange_QueryInterface(range, &IID_nsIDOMNSRange, (void **)&nsrange);
805 nsIDOMRange_Release(range);
806 if(NS_FAILED(nsres))
808 ERR("getting nsIDOMNSRange failed: %08x\n", nsres);
809 return E_FAIL;
812 nsAString_Init(&ns_html, html);
814 nsres = nsIDOMNSRange_CreateContextualFragment(nsrange, &ns_html, (nsIDOMDocumentFragment **)&nsnode);
815 nsIDOMNSRange_Release(nsrange);
816 nsAString_Finish(&ns_html);
818 if(NS_FAILED(nsres) || !nsnode)
820 ERR("CreateTextNode failed: %08x\n", nsres);
821 return E_FAIL;
824 hr = HTMLElement_InsertAdjacentNode(This, where, nsnode);
825 nsIDOMNode_Release(nsnode);
827 return hr;
830 static HRESULT WINAPI HTMLElement_insertAdjacentText(IHTMLElement *iface, BSTR where,
831 BSTR text)
833 HTMLElement *This = HTMLELEM_THIS(iface);
834 nsresult nsres;
835 nsIDOMDocument *nsdoc;
836 nsIDOMNode *nsnode;
837 nsAString ns_text;
838 HRESULT hr;
840 TRACE("(%p)->(%s %s)\n", This, debugstr_w(where), debugstr_w(text));
842 nsres = nsIWebNavigation_GetDocument(This->node.doc->nscontainer->navigation, &nsdoc);
843 if(NS_FAILED(nsres) || !nsdoc)
845 ERR("GetDocument failed: %08x\n", nsres);
846 return E_FAIL;
849 nsAString_Init(&ns_text, text);
851 nsres = nsIDOMDocument_CreateTextNode(nsdoc, &ns_text, (nsIDOMText **)&nsnode);
852 nsIDOMDocument_Release(nsdoc);
853 nsAString_Finish(&ns_text);
855 if(NS_FAILED(nsres) || !nsnode)
857 ERR("CreateTextNode failed: %08x\n", nsres);
858 return E_FAIL;
861 hr = HTMLElement_InsertAdjacentNode(This, where, nsnode);
862 nsIDOMNode_Release(nsnode);
864 return hr;
867 static HRESULT WINAPI HTMLElement_get_parentTextEdit(IHTMLElement *iface, IHTMLElement **p)
869 HTMLElement *This = HTMLELEM_THIS(iface);
870 FIXME("(%p)->(%p)\n", This, p);
871 return E_NOTIMPL;
874 static HRESULT WINAPI HTMLElement_get_isTextEdit(IHTMLElement *iface, VARIANT_BOOL *p)
876 HTMLElement *This = HTMLELEM_THIS(iface);
877 FIXME("(%p)->(%p)\n", This, p);
878 return E_NOTIMPL;
881 static HRESULT WINAPI HTMLElement_click(IHTMLElement *iface)
883 HTMLElement *This = HTMLELEM_THIS(iface);
884 FIXME("(%p)\n", This);
885 return E_NOTIMPL;
888 static HRESULT WINAPI HTMLElement_get_filters(IHTMLElement *iface,
889 IHTMLFiltersCollection **p)
891 HTMLElement *This = HTMLELEM_THIS(iface);
892 FIXME("(%p)->(%p)\n", This, p);
893 return E_NOTIMPL;
896 static HRESULT WINAPI HTMLElement_put_ondragstart(IHTMLElement *iface, VARIANT v)
898 HTMLElement *This = HTMLELEM_THIS(iface);
899 FIXME("(%p)->()\n", This);
900 return E_NOTIMPL;
903 static HRESULT WINAPI HTMLElement_get_ondragstart(IHTMLElement *iface, VARIANT *p)
905 HTMLElement *This = HTMLELEM_THIS(iface);
906 FIXME("(%p)->(%p)\n", This, p);
907 return E_NOTIMPL;
910 static HRESULT WINAPI HTMLElement_toString(IHTMLElement *iface, BSTR *String)
912 HTMLElement *This = HTMLELEM_THIS(iface);
913 FIXME("(%p)->(%p)\n", This, String);
914 return E_NOTIMPL;
917 static HRESULT WINAPI HTMLElement_put_onbeforeupdate(IHTMLElement *iface, VARIANT v)
919 HTMLElement *This = HTMLELEM_THIS(iface);
920 FIXME("(%p)->()\n", This);
921 return E_NOTIMPL;
924 static HRESULT WINAPI HTMLElement_get_onbeforeupdate(IHTMLElement *iface, VARIANT *p)
926 HTMLElement *This = HTMLELEM_THIS(iface);
927 FIXME("(%p)->(%p)\n", This, p);
928 return E_NOTIMPL;
931 static HRESULT WINAPI HTMLElement_put_onafterupdate(IHTMLElement *iface, VARIANT v)
933 HTMLElement *This = HTMLELEM_THIS(iface);
934 FIXME("(%p)->()\n", This);
935 return E_NOTIMPL;
938 static HRESULT WINAPI HTMLElement_get_onafterupdate(IHTMLElement *iface, VARIANT *p)
940 HTMLElement *This = HTMLELEM_THIS(iface);
941 FIXME("(%p)->(%p)\n", This, p);
942 return E_NOTIMPL;
945 static HRESULT WINAPI HTMLElement_put_onerrorupdate(IHTMLElement *iface, VARIANT v)
947 HTMLElement *This = HTMLELEM_THIS(iface);
948 FIXME("(%p)->()\n", This);
949 return E_NOTIMPL;
952 static HRESULT WINAPI HTMLElement_get_onerrorupdate(IHTMLElement *iface, VARIANT *p)
954 HTMLElement *This = HTMLELEM_THIS(iface);
955 FIXME("(%p)->(%p)\n", This, p);
956 return E_NOTIMPL;
959 static HRESULT WINAPI HTMLElement_put_onrowexit(IHTMLElement *iface, VARIANT v)
961 HTMLElement *This = HTMLELEM_THIS(iface);
962 FIXME("(%p)->()\n", This);
963 return E_NOTIMPL;
966 static HRESULT WINAPI HTMLElement_get_onrowexit(IHTMLElement *iface, VARIANT *p)
968 HTMLElement *This = HTMLELEM_THIS(iface);
969 FIXME("(%p)->(%p)\n", This, p);
970 return E_NOTIMPL;
973 static HRESULT WINAPI HTMLElement_put_onrowenter(IHTMLElement *iface, VARIANT v)
975 HTMLElement *This = HTMLELEM_THIS(iface);
976 FIXME("(%p)->()\n", This);
977 return E_NOTIMPL;
980 static HRESULT WINAPI HTMLElement_get_onrowenter(IHTMLElement *iface, VARIANT *p)
982 HTMLElement *This = HTMLELEM_THIS(iface);
983 FIXME("(%p)->(%p)\n", This, p);
984 return E_NOTIMPL;
987 static HRESULT WINAPI HTMLElement_put_ondatasetchanged(IHTMLElement *iface, VARIANT v)
989 HTMLElement *This = HTMLELEM_THIS(iface);
990 FIXME("(%p)->()\n", This);
991 return E_NOTIMPL;
994 static HRESULT WINAPI HTMLElement_get_ondatasetchanged(IHTMLElement *iface, VARIANT *p)
996 HTMLElement *This = HTMLELEM_THIS(iface);
997 FIXME("(%p)->(%p)\n", This, p);
998 return E_NOTIMPL;
1001 static HRESULT WINAPI HTMLElement_put_ondataavailable(IHTMLElement *iface, VARIANT v)
1003 HTMLElement *This = HTMLELEM_THIS(iface);
1004 FIXME("(%p)->()\n", This);
1005 return E_NOTIMPL;
1008 static HRESULT WINAPI HTMLElement_get_ondataavailable(IHTMLElement *iface, VARIANT *p)
1010 HTMLElement *This = HTMLELEM_THIS(iface);
1011 FIXME("(%p)->(%p)\n", This, p);
1012 return E_NOTIMPL;
1015 static HRESULT WINAPI HTMLElement_put_ondatasetcomplete(IHTMLElement *iface, VARIANT v)
1017 HTMLElement *This = HTMLELEM_THIS(iface);
1018 FIXME("(%p)->()\n", This);
1019 return E_NOTIMPL;
1022 static HRESULT WINAPI HTMLElement_get_ondatasetcomplete(IHTMLElement *iface, VARIANT *p)
1024 HTMLElement *This = HTMLELEM_THIS(iface);
1025 FIXME("(%p)->(%p)\n", This, p);
1026 return E_NOTIMPL;
1029 static HRESULT WINAPI HTMLElement_put_onfilterchange(IHTMLElement *iface, VARIANT v)
1031 HTMLElement *This = HTMLELEM_THIS(iface);
1032 FIXME("(%p)->()\n", This);
1033 return E_NOTIMPL;
1036 static HRESULT WINAPI HTMLElement_get_onfilterchange(IHTMLElement *iface, VARIANT *p)
1038 HTMLElement *This = HTMLELEM_THIS(iface);
1039 FIXME("(%p)->(%p)\n", This, p);
1040 return E_NOTIMPL;
1043 static void create_child_list(HTMLDocument *doc, HTMLElement *elem, elem_vector *buf)
1045 nsIDOMNodeList *nsnode_list;
1046 nsIDOMNode *iter;
1047 PRUint32 list_len = 0, i;
1048 PRUint16 node_type;
1049 nsresult nsres;
1051 nsres = nsIDOMNode_GetChildNodes(elem->node.nsnode, &nsnode_list);
1052 if(NS_FAILED(nsres)) {
1053 ERR("GetChildNodes failed: %08x\n", nsres);
1054 return;
1057 nsIDOMNodeList_GetLength(nsnode_list, &list_len);
1058 if(!list_len)
1059 return;
1061 buf->size = list_len;
1062 buf->buf = mshtml_alloc(buf->size*sizeof(HTMLElement**));
1064 for(i=0; i<list_len; i++) {
1065 nsres = nsIDOMNodeList_Item(nsnode_list, i, &iter);
1066 if(NS_FAILED(nsres)) {
1067 ERR("Item failed: %08x\n", nsres);
1068 continue;
1071 nsres = nsIDOMNode_GetNodeType(iter, &node_type);
1072 if(NS_SUCCEEDED(nsres) && node_type == ELEMENT_NODE)
1073 elem_vector_add(buf, HTMLELEM_NODE_THIS(get_node(doc, iter)));
1077 static HRESULT WINAPI HTMLElement_get_children(IHTMLElement *iface, IDispatch **p)
1079 HTMLElement *This = HTMLELEM_THIS(iface);
1080 elem_vector buf = {NULL, 0, 0};
1082 TRACE("(%p)->(%p)\n", This, p);
1084 create_child_list(This->node.doc, This, &buf);
1086 *p = (IDispatch*)HTMLElementCollection_Create((IUnknown*)HTMLELEM(This), buf.buf, buf.len);
1087 return S_OK;
1090 static void create_all_list(HTMLDocument *doc, HTMLDOMNode *elem, elem_vector *buf)
1092 nsIDOMNodeList *nsnode_list;
1093 nsIDOMNode *iter;
1094 PRUint32 list_len = 0, i;
1095 PRUint16 node_type;
1096 nsresult nsres;
1098 nsres = nsIDOMNode_GetChildNodes(elem->nsnode, &nsnode_list);
1099 if(NS_FAILED(nsres)) {
1100 ERR("GetChildNodes failed: %08x\n", nsres);
1101 return;
1104 nsIDOMNodeList_GetLength(nsnode_list, &list_len);
1105 if(!list_len)
1106 return;
1108 for(i=0; i<list_len; i++) {
1109 nsres = nsIDOMNodeList_Item(nsnode_list, i, &iter);
1110 if(NS_FAILED(nsres)) {
1111 ERR("Item failed: %08x\n", nsres);
1112 continue;
1115 nsres = nsIDOMNode_GetNodeType(iter, &node_type);
1116 if(NS_SUCCEEDED(nsres) && node_type == ELEMENT_NODE) {
1117 HTMLDOMNode *node = get_node(doc, iter);
1119 elem_vector_add(buf, HTMLELEM_NODE_THIS(node));
1120 create_all_list(doc, node, buf);
1125 static HRESULT WINAPI HTMLElement_get_all(IHTMLElement *iface, IDispatch **p)
1127 HTMLElement *This = HTMLELEM_THIS(iface);
1128 elem_vector buf = {NULL, 0, 8};
1130 TRACE("(%p)->(%p)\n", This, p);
1132 buf.buf = mshtml_alloc(buf.size*sizeof(HTMLElement**));
1134 create_all_list(This->node.doc, &This->node, &buf);
1135 elem_vector_normalize(&buf);
1137 *p = (IDispatch*)HTMLElementCollection_Create((IUnknown*)HTMLELEM(This), buf.buf, buf.len);
1138 return S_OK;
1141 #undef HTMLELEM_THIS
1143 static const IHTMLElementVtbl HTMLElementVtbl = {
1144 HTMLElement_QueryInterface,
1145 HTMLElement_AddRef,
1146 HTMLElement_Release,
1147 HTMLElement_GetTypeInfoCount,
1148 HTMLElement_GetTypeInfo,
1149 HTMLElement_GetIDsOfNames,
1150 HTMLElement_Invoke,
1151 HTMLElement_setAttribute,
1152 HTMLElement_getAttribute,
1153 HTMLElement_removeAttribute,
1154 HTMLElement_put_className,
1155 HTMLElement_get_className,
1156 HTMLElement_put_id,
1157 HTMLElement_get_id,
1158 HTMLElement_get_tagName,
1159 HTMLElement_get_parentElement,
1160 HTMLElement_get_style,
1161 HTMLElement_put_onhelp,
1162 HTMLElement_get_onhelp,
1163 HTMLElement_put_onclick,
1164 HTMLElement_get_onclick,
1165 HTMLElement_put_ondblclick,
1166 HTMLElement_get_ondblclick,
1167 HTMLElement_put_onkeydown,
1168 HTMLElement_get_onkeydown,
1169 HTMLElement_put_onkeyup,
1170 HTMLElement_get_onkeyup,
1171 HTMLElement_put_onkeypress,
1172 HTMLElement_get_onkeypress,
1173 HTMLElement_put_onmouseout,
1174 HTMLElement_get_onmouseout,
1175 HTMLElement_put_onmouseover,
1176 HTMLElement_get_onmouseover,
1177 HTMLElement_put_onmousemove,
1178 HTMLElement_get_onmousemove,
1179 HTMLElement_put_onmousedown,
1180 HTMLElement_get_onmousedown,
1181 HTMLElement_put_onmouseup,
1182 HTMLElement_get_onmouseup,
1183 HTMLElement_get_document,
1184 HTMLElement_put_title,
1185 HTMLElement_get_title,
1186 HTMLElement_put_language,
1187 HTMLElement_get_language,
1188 HTMLElement_put_onselectstart,
1189 HTMLElement_get_onselectstart,
1190 HTMLElement_scrollIntoView,
1191 HTMLElement_contains,
1192 HTMLElement_get_sourceIndex,
1193 HTMLElement_get_recordNumber,
1194 HTMLElement_put_lang,
1195 HTMLElement_get_lang,
1196 HTMLElement_get_offsetLeft,
1197 HTMLElement_get_offsetTop,
1198 HTMLElement_get_offsetWidth,
1199 HTMLElement_get_offsetHeight,
1200 HTMLElement_get_offsetParent,
1201 HTMLElement_put_innerHTML,
1202 HTMLElement_get_innerHTML,
1203 HTMLElement_put_innerText,
1204 HTMLElement_get_innerText,
1205 HTMLElement_put_outerHTML,
1206 HTMLElement_get_outerHTML,
1207 HTMLElement_put_outerText,
1208 HTMLElement_get_outerText,
1209 HTMLElement_insertAdjacentHTML,
1210 HTMLElement_insertAdjacentText,
1211 HTMLElement_get_parentTextEdit,
1212 HTMLElement_get_isTextEdit,
1213 HTMLElement_click,
1214 HTMLElement_get_filters,
1215 HTMLElement_put_ondragstart,
1216 HTMLElement_get_ondragstart,
1217 HTMLElement_toString,
1218 HTMLElement_put_onbeforeupdate,
1219 HTMLElement_get_onbeforeupdate,
1220 HTMLElement_put_onafterupdate,
1221 HTMLElement_get_onafterupdate,
1222 HTMLElement_put_onerrorupdate,
1223 HTMLElement_get_onerrorupdate,
1224 HTMLElement_put_onrowexit,
1225 HTMLElement_get_onrowexit,
1226 HTMLElement_put_onrowenter,
1227 HTMLElement_get_onrowenter,
1228 HTMLElement_put_ondatasetchanged,
1229 HTMLElement_get_ondatasetchanged,
1230 HTMLElement_put_ondataavailable,
1231 HTMLElement_get_ondataavailable,
1232 HTMLElement_put_ondatasetcomplete,
1233 HTMLElement_get_ondatasetcomplete,
1234 HTMLElement_put_onfilterchange,
1235 HTMLElement_get_onfilterchange,
1236 HTMLElement_get_children,
1237 HTMLElement_get_all
1240 HRESULT HTMLElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
1242 HTMLElement *This = HTMLELEM_NODE_THIS(iface);
1244 *ppv = NULL;
1246 if(IsEqualGUID(&IID_IUnknown, riid)) {
1247 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
1248 *ppv = HTMLELEM(This);
1249 }else if(IsEqualGUID(&IID_IDispatch, riid)) {
1250 TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
1251 *ppv = HTMLELEM(This);
1252 }else if(IsEqualGUID(&IID_IHTMLElement, riid)) {
1253 TRACE("(%p)->(IID_IHTMLElement %p)\n", This, ppv);
1254 *ppv = HTMLELEM(This);
1255 }else if(IsEqualGUID(&IID_IHTMLElement2, riid)) {
1256 TRACE("(%p)->(IID_IHTMLElement2 %p)\n", This, ppv);
1257 *ppv = HTMLELEM2(This);
1260 if(*ppv) {
1261 IHTMLElement_AddRef(HTMLELEM(This));
1262 return S_OK;
1265 return HTMLDOMNode_QI(&This->node, riid, ppv);
1268 void HTMLElement_destructor(HTMLDOMNode *iface)
1270 HTMLElement *This = HTMLELEM_NODE_THIS(iface);
1272 if(This->nselem)
1273 nsIDOMHTMLElement_Release(This->nselem);
1275 HTMLDOMNode_destructor(&This->node);
1278 static const NodeImplVtbl HTMLElementImplVtbl = {
1279 HTMLElement_QI,
1280 HTMLElement_destructor
1283 HTMLElement *HTMLElement_Create(nsIDOMNode *nsnode)
1285 nsIDOMHTMLElement *nselem;
1286 HTMLElement *ret = NULL;
1287 nsAString class_name_str;
1288 const PRUnichar *class_name;
1289 nsresult nsres;
1291 static const WCHAR wszA[] = {'A',0};
1292 static const WCHAR wszBODY[] = {'B','O','D','Y',0};
1293 static const WCHAR wszINPUT[] = {'I','N','P','U','T',0};
1294 static const WCHAR wszOPTION[] = {'O','P','T','I','O','N',0};
1295 static const WCHAR wszSELECT[] = {'S','E','L','E','C','T',0};
1296 static const WCHAR wszTEXTAREA[] = {'T','E','X','T','A','R','E','A',0};
1298 nsres = nsIDOMNode_QueryInterface(nsnode, &IID_nsIDOMHTMLElement, (void**)&nselem);
1299 if(NS_FAILED(nsres))
1300 return NULL;
1302 nsAString_Init(&class_name_str, NULL);
1303 nsIDOMHTMLElement_GetTagName(nselem, &class_name_str);
1305 nsAString_GetData(&class_name_str, &class_name, NULL);
1307 if(!strcmpW(class_name, wszA))
1308 ret = HTMLAnchorElement_Create(nselem);
1309 else if(!strcmpW(class_name, wszBODY))
1310 ret = HTMLBodyElement_Create(nselem);
1311 else if(!strcmpW(class_name, wszINPUT))
1312 ret = HTMLInputElement_Create(nselem);
1313 else if(!strcmpW(class_name, wszOPTION))
1314 ret = HTMLOptionElement_Create(nselem);
1315 else if(!strcmpW(class_name, wszSELECT))
1316 ret = HTMLSelectElement_Create(nselem);
1317 else if(!strcmpW(class_name, wszTEXTAREA))
1318 ret = HTMLTextAreaElement_Create(nselem);
1320 if(!ret) {
1321 ret = mshtml_alloc(sizeof(HTMLElement));
1322 ret->node.vtbl = &HTMLElementImplVtbl;
1325 nsAString_Finish(&class_name_str);
1327 ret->lpHTMLElementVtbl = &HTMLElementVtbl;
1328 ret->nselem = nselem;
1330 HTMLElement2_Init(ret);
1332 return ret;
1335 typedef struct {
1336 const IHTMLElementCollectionVtbl *lpHTMLElementCollectionVtbl;
1338 IUnknown *ref_unk;
1339 HTMLElement **elems;
1340 DWORD len;
1342 LONG ref;
1343 } HTMLElementCollection;
1345 #define HTMLELEMCOL(x) ((IHTMLElementCollection*) &(x)->lpHTMLElementCollectionVtbl)
1347 #define ELEMCOL_THIS(iface) DEFINE_THIS(HTMLElementCollection, HTMLElementCollection, iface)
1349 static HRESULT WINAPI HTMLElementCollection_QueryInterface(IHTMLElementCollection *iface,
1350 REFIID riid, void **ppv)
1352 HTMLElementCollection *This = ELEMCOL_THIS(iface);
1354 *ppv = NULL;
1356 if(IsEqualGUID(&IID_IUnknown, riid)) {
1357 TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
1358 *ppv = HTMLELEMCOL(This);
1359 }else if(IsEqualGUID(&IID_IDispatch, riid)) {
1360 TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
1361 *ppv = HTMLELEMCOL(This);
1362 }else if(IsEqualGUID(&IID_IHTMLElementCollection, riid)) {
1363 TRACE("(%p)->(IID_IHTMLElementCollection %p)\n", This, ppv);
1364 *ppv = HTMLELEMCOL(This);
1367 if(*ppv) {
1368 IHTMLElementCollection_AddRef(HTMLELEMCOL(This));
1369 return S_OK;
1372 FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
1373 return E_NOINTERFACE;
1376 static ULONG WINAPI HTMLElementCollection_AddRef(IHTMLElementCollection *iface)
1378 HTMLElementCollection *This = ELEMCOL_THIS(iface);
1379 LONG ref = InterlockedIncrement(&This->ref);
1381 TRACE("(%p) ref=%d\n", This, ref);
1383 return ref;
1386 static ULONG WINAPI HTMLElementCollection_Release(IHTMLElementCollection *iface)
1388 HTMLElementCollection *This = ELEMCOL_THIS(iface);
1389 LONG ref = InterlockedDecrement(&This->ref);
1391 TRACE("(%p) ref=%d\n", This, ref);
1393 if(!ref) {
1394 IUnknown_Release(This->ref_unk);
1395 mshtml_free(This->elems);
1396 mshtml_free(This);
1399 return ref;
1402 static HRESULT WINAPI HTMLElementCollection_GetTypeInfoCount(IHTMLElementCollection *iface,
1403 UINT *pctinfo)
1405 HTMLElementCollection *This = ELEMCOL_THIS(iface);
1406 FIXME("(%p)->(%p)\n", This, pctinfo);
1407 return E_NOTIMPL;
1410 static HRESULT WINAPI HTMLElementCollection_GetTypeInfo(IHTMLElementCollection *iface,
1411 UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
1413 HTMLElementCollection *This = ELEMCOL_THIS(iface);
1414 FIXME("(%p)->(%u %u %p)\n", This, iTInfo, lcid, ppTInfo);
1415 return E_NOTIMPL;
1418 static HRESULT WINAPI HTMLElementCollection_GetIDsOfNames(IHTMLElementCollection *iface,
1419 REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
1421 HTMLElementCollection *This = ELEMCOL_THIS(iface);
1422 FIXME("(%p)->(%s %p %u %u %p)\n", This, debugstr_guid(riid), rgszNames, cNames,
1423 lcid, rgDispId);
1424 return E_NOTIMPL;
1427 static HRESULT WINAPI HTMLElementCollection_Invoke(IHTMLElementCollection *iface,
1428 DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
1429 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
1431 HTMLElementCollection *This = ELEMCOL_THIS(iface);
1432 FIXME("(%p)->(%d %s %d %d %p %p %p %p)\n", This, dispIdMember, debugstr_guid(riid),
1433 lcid, wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
1434 return E_NOTIMPL;
1437 static HRESULT WINAPI HTMLElementCollection_toString(IHTMLElementCollection *iface,
1438 BSTR *String)
1440 HTMLElementCollection *This = ELEMCOL_THIS(iface);
1441 FIXME("(%p)->(%p)\n", This, String);
1442 return E_NOTIMPL;
1445 static HRESULT WINAPI HTMLElementCollection_put_length(IHTMLElementCollection *iface,
1446 long v)
1448 HTMLElementCollection *This = ELEMCOL_THIS(iface);
1449 FIXME("(%p)->(%ld)\n", This, v);
1450 return E_NOTIMPL;
1453 static HRESULT WINAPI HTMLElementCollection_get_length(IHTMLElementCollection *iface,
1454 long *p)
1456 HTMLElementCollection *This = ELEMCOL_THIS(iface);
1458 TRACE("(%p)->(%p)\n", This, p);
1460 *p = This->len;
1461 return S_OK;
1464 static HRESULT WINAPI HTMLElementCollection_get__newEnum(IHTMLElementCollection *iface,
1465 IUnknown **p)
1467 HTMLElementCollection *This = ELEMCOL_THIS(iface);
1468 FIXME("(%p)->(%p)\n", This, p);
1469 return E_NOTIMPL;
1472 static BOOL is_elem_name(HTMLElement *elem, LPCWSTR name)
1474 const PRUnichar *str;
1475 nsAString nsstr, nsname;
1476 BOOL ret = FALSE;
1477 nsresult nsres;
1479 static const PRUnichar nameW[] = {'n','a','m','e',0};
1481 nsAString_Init(&nsstr, NULL);
1482 nsIDOMHTMLElement_GetId(elem->nselem, &nsstr);
1483 nsAString_GetData(&nsstr, &str, NULL);
1484 if(!strcmpiW(str, name)) {
1485 nsAString_Finish(&nsstr);
1486 return TRUE;
1489 nsAString_Init(&nsname, nameW);
1490 nsres = nsIDOMHTMLElement_GetAttribute(elem->nselem, &nsname, &nsstr);
1491 nsAString_Finish(&nsname);
1492 if(NS_SUCCEEDED(nsres)) {
1493 nsAString_GetData(&nsstr, &str, NULL);
1494 ret = !strcmpiW(str, name);
1497 nsAString_Finish(&nsstr);
1498 return ret;
1501 static HRESULT WINAPI HTMLElementCollection_item(IHTMLElementCollection *iface,
1502 VARIANT name, VARIANT index, IDispatch **pdisp)
1504 HTMLElementCollection *This = ELEMCOL_THIS(iface);
1506 TRACE("(%p)->(v(%d) v(%d) %p)\n", This, V_VT(&name), V_VT(&index), pdisp);
1508 *pdisp = NULL;
1510 if(V_VT(&name) == VT_I4) {
1511 TRACE("name is VT_I4: %d\n", V_I4(&name));
1513 if(V_I4(&name) < 0)
1514 return E_INVALIDARG;
1515 if(V_I4(&name) >= This->len)
1516 return S_OK;
1518 *pdisp = (IDispatch*)This->elems[V_I4(&name)];
1519 IDispatch_AddRef(*pdisp);
1520 TRACE("Returning pdisp=%p\n", pdisp);
1521 return S_OK;
1524 if(V_VT(&name) == VT_BSTR) {
1525 DWORD i;
1527 TRACE("name is VT_BSTR: %s\n", debugstr_w(V_BSTR(&name)));
1529 if(V_VT(&index) == VT_I4) {
1530 LONG idx = V_I4(&index);
1532 TRACE("index = %d\n", idx);
1534 if(idx < 0)
1535 return E_INVALIDARG;
1537 for(i=0; i<This->len; i++) {
1538 if(is_elem_name(This->elems[i], V_BSTR(&name)) && !idx--)
1539 break;
1542 if(i != This->len) {
1543 *pdisp = (IDispatch*)HTMLELEM(This->elems[i]);
1544 IDispatch_AddRef(*pdisp);
1547 return S_OK;
1548 }else {
1549 elem_vector buf = {NULL, 0, 8};
1551 buf.buf = mshtml_alloc(buf.size*sizeof(HTMLElement*));
1553 for(i=0; i<This->len; i++) {
1554 if(is_elem_name(This->elems[i], V_BSTR(&name)))
1555 elem_vector_add(&buf, This->elems[i]);
1558 if(buf.len > 1) {
1559 elem_vector_normalize(&buf);
1560 *pdisp = (IDispatch*)HTMLElementCollection_Create(This->ref_unk, buf.buf, buf.len);
1561 }else {
1562 if(buf.len == 1) {
1563 *pdisp = (IDispatch*)HTMLELEM(buf.buf[0]);
1564 IDispatch_AddRef(*pdisp);
1567 mshtml_free(buf.buf);
1570 return S_OK;
1574 FIXME("unsupported arguments\n");
1575 return E_INVALIDARG;
1578 static HRESULT WINAPI HTMLElementCollection_tags(IHTMLElementCollection *iface,
1579 VARIANT tagName, IDispatch **pdisp)
1581 HTMLElementCollection *This = ELEMCOL_THIS(iface);
1582 DWORD i;
1583 nsAString tag_str;
1584 const PRUnichar *tag;
1585 elem_vector buf = {NULL, 0, 8};
1587 if(V_VT(&tagName) != VT_BSTR) {
1588 WARN("Invalid arg\n");
1589 return DISP_E_MEMBERNOTFOUND;
1592 TRACE("(%p)->(%s %p)\n", This, debugstr_w(V_BSTR(&tagName)), pdisp);
1594 buf.buf = mshtml_alloc(buf.size*sizeof(HTMLElement*));
1596 nsAString_Init(&tag_str, NULL);
1598 for(i=0; i<This->len; i++) {
1599 if(!This->elems[i]->nselem)
1600 continue;
1602 nsIDOMElement_GetTagName(This->elems[i]->nselem, &tag_str);
1603 nsAString_GetData(&tag_str, &tag, NULL);
1605 if(CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, tag, -1,
1606 V_BSTR(&tagName), -1) == CSTR_EQUAL)
1607 elem_vector_add(&buf, This->elems[i]);
1610 nsAString_Finish(&tag_str);
1611 elem_vector_normalize(&buf);
1613 TRACE("fount %d tags\n", buf.len);
1615 *pdisp = (IDispatch*)HTMLElementCollection_Create(This->ref_unk, buf.buf, buf.len);
1616 return S_OK;
1619 #undef ELEMCOL_THIS
1621 static const IHTMLElementCollectionVtbl HTMLElementCollectionVtbl = {
1622 HTMLElementCollection_QueryInterface,
1623 HTMLElementCollection_AddRef,
1624 HTMLElementCollection_Release,
1625 HTMLElementCollection_GetTypeInfoCount,
1626 HTMLElementCollection_GetTypeInfo,
1627 HTMLElementCollection_GetIDsOfNames,
1628 HTMLElementCollection_Invoke,
1629 HTMLElementCollection_toString,
1630 HTMLElementCollection_put_length,
1631 HTMLElementCollection_get_length,
1632 HTMLElementCollection_get__newEnum,
1633 HTMLElementCollection_item,
1634 HTMLElementCollection_tags
1637 IHTMLElementCollection *create_all_collection(HTMLDOMNode *node)
1639 elem_vector buf = {NULL, 0, 8};
1641 buf.buf = mshtml_alloc(buf.size*sizeof(HTMLElement**));
1643 elem_vector_add(&buf, HTMLELEM_NODE_THIS(node));
1644 create_all_list(node->doc, node, &buf);
1645 elem_vector_normalize(&buf);
1647 return HTMLElementCollection_Create((IUnknown*)HTMLDOMNODE(node), buf.buf, buf.len);
1650 static IHTMLElementCollection *HTMLElementCollection_Create(IUnknown *ref_unk,
1651 HTMLElement **elems, DWORD len)
1653 HTMLElementCollection *ret = mshtml_alloc(sizeof(HTMLElementCollection));
1655 ret->lpHTMLElementCollectionVtbl = &HTMLElementCollectionVtbl;
1656 ret->ref = 1;
1657 ret->elems = elems;
1658 ret->len = len;
1660 IUnknown_AddRef(ref_unk);
1661 ret->ref_unk = ref_unk;
1663 TRACE("ret=%p len=%d\n", ret, len);
1665 return HTMLELEMCOL(ret);