ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

htmlelem.c
Go to the documentation of this file.
00001 /*
00002  * Copyright 2006 Jacek Caban for CodeWeavers
00003  *
00004  * This library is free software; you can redistribute it and/or
00005  * modify it under the terms of the GNU Lesser General Public
00006  * License as published by the Free Software Foundation; either
00007  * version 2.1 of the License, or (at your option) any later version.
00008  *
00009  * This library is distributed in the hope that it will be useful,
00010  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00011  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012  * Lesser General Public License for more details.
00013  *
00014  * You should have received a copy of the GNU Lesser General Public
00015  * License along with this library; if not, write to the Free Software
00016  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
00017  */
00018 
00019 
00020 #include <stdarg.h>
00021 
00022 #define COBJMACROS
00023 
00024 #include "windef.h"
00025 #include "winbase.h"
00026 #include "winuser.h"
00027 #include "winreg.h"
00028 #include "ole2.h"
00029 #include "shlwapi.h"
00030 
00031 #include "wine/debug.h"
00032 #include "wine/unicode.h"
00033 
00034 #include "mshtml_private.h"
00035 #include "htmlevent.h"
00036 
00037 typedef struct
00038 {
00039     DispatchEx dispex;
00040     const IHTMLFiltersCollectionVtbl *lpHTMLFiltersCollectionVtbl;
00041 
00042     LONG ref;
00043 } HTMLFiltersCollection;
00044 
00045 #define HTMLFILTERSCOLLECTION(x)     ((IHTMLFiltersCollection*)  &(x)->lpHTMLFiltersCollectionVtbl)
00046 
00047 #define HTMLFILTERSCOLLECTION_THIS(iface) \
00048     DEFINE_THIS(HTMLFiltersCollection, HTMLFiltersCollection, iface)
00049 
00050 IHTMLFiltersCollection *HTMLFiltersCollection_Create(void);
00051 
00052 
00053 WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
00054 
00055 #define HTMLELEM_THIS(iface) DEFINE_THIS(HTMLElement, HTMLElement, iface)
00056 
00057 HRESULT create_nselem(HTMLDocumentNode *doc, const WCHAR *tag, nsIDOMHTMLElement **ret)
00058 {
00059     nsIDOMElement *nselem;
00060     nsAString tag_str;
00061     nsresult nsres;
00062 
00063     if(!doc->nsdoc) {
00064         WARN("NULL nsdoc\n");
00065         return E_UNEXPECTED;
00066     }
00067 
00068     nsAString_InitDepend(&tag_str, tag);
00069     nsres = nsIDOMDocument_CreateElement(doc->nsdoc, &tag_str, &nselem);
00070     nsAString_Finish(&tag_str);
00071     if(NS_FAILED(nsres)) {
00072         ERR("CreateElement failed: %08x\n", nsres);
00073         return E_FAIL;
00074     }
00075 
00076     nsres = nsIDOMElement_QueryInterface(nselem, &IID_nsIDOMHTMLElement, (void**)ret);
00077     nsIDOMElement_Release(nselem);
00078     if(NS_FAILED(nsres)) {
00079         ERR("Could not get nsIDOMHTMLElement iface: %08x\n", nsres);
00080         return E_FAIL;
00081     }
00082 
00083     return S_OK;
00084 }
00085 
00086 #define HTMLELEM_NODE_THIS(iface) DEFINE_THIS2(HTMLElement, node, iface)
00087 
00088 static HRESULT WINAPI HTMLElement_QueryInterface(IHTMLElement *iface,
00089                                                  REFIID riid, void **ppv)
00090 {
00091     HTMLElement *This = HTMLELEM_THIS(iface);
00092 
00093     return IHTMLDOMNode_QueryInterface(HTMLDOMNODE(&This->node), riid, ppv);
00094 }
00095 
00096 static ULONG WINAPI HTMLElement_AddRef(IHTMLElement *iface)
00097 {
00098     HTMLElement *This = HTMLELEM_THIS(iface);
00099 
00100     return IHTMLDOMNode_AddRef(HTMLDOMNODE(&This->node));
00101 }
00102 
00103 static ULONG WINAPI HTMLElement_Release(IHTMLElement *iface)
00104 {
00105     HTMLElement *This = HTMLELEM_THIS(iface);
00106 
00107     return IHTMLDOMNode_Release(HTMLDOMNODE(&This->node));
00108 }
00109 
00110 static HRESULT WINAPI HTMLElement_GetTypeInfoCount(IHTMLElement *iface, UINT *pctinfo)
00111 {
00112     HTMLElement *This = HTMLELEM_THIS(iface);
00113     return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->node.dispex), pctinfo);
00114 }
00115 
00116 static HRESULT WINAPI HTMLElement_GetTypeInfo(IHTMLElement *iface, UINT iTInfo,
00117                                               LCID lcid, ITypeInfo **ppTInfo)
00118 {
00119     HTMLElement *This = HTMLELEM_THIS(iface);
00120     return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->node.dispex), iTInfo, lcid, ppTInfo);
00121 }
00122 
00123 static HRESULT WINAPI HTMLElement_GetIDsOfNames(IHTMLElement *iface, REFIID riid,
00124                                                 LPOLESTR *rgszNames, UINT cNames,
00125                                                 LCID lcid, DISPID *rgDispId)
00126 {
00127     HTMLElement *This = HTMLELEM_THIS(iface);
00128     return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->node.dispex), riid, rgszNames, cNames, lcid, rgDispId);
00129 }
00130 
00131 static HRESULT WINAPI HTMLElement_Invoke(IHTMLElement *iface, DISPID dispIdMember,
00132                             REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
00133                             VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
00134 {
00135     HTMLElement *This = HTMLELEM_THIS(iface);
00136     return IDispatchEx_Invoke(DISPATCHEX(&This->node.dispex), dispIdMember, riid, lcid,
00137             wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
00138 }
00139 
00140 static HRESULT WINAPI HTMLElement_setAttribute(IHTMLElement *iface, BSTR strAttributeName,
00141                                                VARIANT AttributeValue, LONG lFlags)
00142 {
00143     HTMLElement *This = HTMLELEM_THIS(iface);
00144     HRESULT hres;
00145     DISPID dispid, dispidNamed = DISPID_PROPERTYPUT;
00146     DISPPARAMS dispParams;
00147     EXCEPINFO excep;
00148 
00149     TRACE("(%p)->(%s . %08x)\n", This, debugstr_w(strAttributeName), lFlags);
00150 
00151     hres = IDispatchEx_GetDispID(DISPATCHEX(&This->node.dispex), strAttributeName,
00152             fdexNameCaseInsensitive | fdexNameEnsure, &dispid);
00153     if(FAILED(hres))
00154         return hres;
00155 
00156     dispParams.cArgs = 1;
00157     dispParams.cNamedArgs = 1;
00158     dispParams.rgdispidNamedArgs = &dispidNamed;
00159     dispParams.rgvarg = &AttributeValue;
00160 
00161     hres = IDispatchEx_InvokeEx(DISPATCHEX(&This->node.dispex), dispid,
00162             LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYPUT, &dispParams,
00163             NULL, &excep, NULL);
00164     return hres;
00165 }
00166 
00167 static HRESULT WINAPI HTMLElement_getAttribute(IHTMLElement *iface, BSTR strAttributeName,
00168                                                LONG lFlags, VARIANT *AttributeValue)
00169 {
00170     HTMLElement *This = HTMLELEM_THIS(iface);
00171     DISPID dispid;
00172     HRESULT hres;
00173     DISPPARAMS dispParams = {NULL, NULL, 0, 0};
00174     EXCEPINFO excep;
00175 
00176     TRACE("(%p)->(%s %08x %p)\n", This, debugstr_w(strAttributeName), lFlags, AttributeValue);
00177 
00178     hres = IDispatchEx_GetDispID(DISPATCHEX(&This->node.dispex), strAttributeName,
00179             fdexNameCaseInsensitive, &dispid);
00180     if(hres == DISP_E_UNKNOWNNAME) {
00181         V_VT(AttributeValue) = VT_NULL;
00182         return S_OK;
00183     }
00184 
00185     if(FAILED(hres)) {
00186         V_VT(AttributeValue) = VT_NULL;
00187         return hres;
00188     }
00189 
00190     hres = IDispatchEx_InvokeEx(DISPATCHEX(&This->node.dispex), dispid,
00191             LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &dispParams,
00192             AttributeValue, &excep, NULL);
00193 
00194     return hres;
00195 }
00196 
00197 static HRESULT WINAPI HTMLElement_removeAttribute(IHTMLElement *iface, BSTR strAttributeName,
00198                                                   LONG lFlags, VARIANT_BOOL *pfSuccess)
00199 {
00200     HTMLElement *This = HTMLELEM_THIS(iface);
00201 
00202     TRACE("(%p)->(%s %x %p)\n", This, debugstr_w(strAttributeName), lFlags, pfSuccess);
00203 
00204     return remove_prop(&This->node.dispex, strAttributeName, pfSuccess);
00205 }
00206 
00207 static HRESULT WINAPI HTMLElement_put_className(IHTMLElement *iface, BSTR v)
00208 {
00209     HTMLElement *This = HTMLELEM_THIS(iface);
00210     nsAString classname_str;
00211     nsresult nsres;
00212 
00213     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
00214 
00215     if(!This->nselem) {
00216         FIXME("NULL nselem\n");
00217         return E_NOTIMPL;
00218     }
00219 
00220     nsAString_InitDepend(&classname_str, v);
00221     nsres = nsIDOMHTMLElement_SetClassName(This->nselem, &classname_str);
00222     nsAString_Finish(&classname_str);
00223     if(NS_FAILED(nsres))
00224         ERR("SetClassName failed: %08x\n", nsres);
00225 
00226     return S_OK;
00227 }
00228 
00229 static HRESULT WINAPI HTMLElement_get_className(IHTMLElement *iface, BSTR *p)
00230 {
00231     HTMLElement *This = HTMLELEM_THIS(iface);
00232     nsAString class_str;
00233     nsresult nsres;
00234     HRESULT hres = S_OK;
00235 
00236     TRACE("(%p)->(%p)\n", This, p);
00237 
00238     if(!This->nselem) {
00239         FIXME("NULL nselem\n");
00240         return E_NOTIMPL;
00241     }
00242 
00243     nsAString_Init(&class_str, NULL);
00244     nsres = nsIDOMHTMLElement_GetClassName(This->nselem, &class_str);
00245 
00246     if(NS_SUCCEEDED(nsres)) {
00247         const PRUnichar *class;
00248         nsAString_GetData(&class_str, &class);
00249         *p = *class ? SysAllocString(class) : NULL;
00250     }else {
00251         ERR("GetClassName failed: %08x\n", nsres);
00252         hres = E_FAIL;
00253     }
00254 
00255     nsAString_Finish(&class_str);
00256 
00257     TRACE("className=%s\n", debugstr_w(*p));
00258     return hres;
00259 }
00260 
00261 static HRESULT WINAPI HTMLElement_put_id(IHTMLElement *iface, BSTR v)
00262 {
00263     HTMLElement *This = HTMLELEM_THIS(iface);
00264     nsAString id_str;
00265     nsresult nsres;
00266 
00267     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
00268 
00269     if(!This->nselem) {
00270         FIXME("nselem == NULL\n");
00271         return S_OK;
00272     }
00273 
00274     nsAString_InitDepend(&id_str, v);
00275     nsres = nsIDOMHTMLElement_SetId(This->nselem, &id_str);
00276     nsAString_Finish(&id_str);
00277     if(NS_FAILED(nsres))
00278         ERR("SetId failed: %08x\n", nsres);
00279 
00280     return S_OK;
00281 }
00282 
00283 static HRESULT WINAPI HTMLElement_get_id(IHTMLElement *iface, BSTR *p)
00284 {
00285     HTMLElement *This = HTMLELEM_THIS(iface);
00286     const PRUnichar *id;
00287     nsAString id_str;
00288     nsresult nsres;
00289 
00290     TRACE("(%p)->(%p)\n", This, p);
00291 
00292     *p = NULL;
00293 
00294     if(!This->nselem)
00295         return S_OK;
00296 
00297     nsAString_Init(&id_str, NULL);
00298     nsres = nsIDOMHTMLElement_GetId(This->nselem, &id_str);
00299     nsAString_GetData(&id_str, &id);
00300 
00301     if(NS_FAILED(nsres))
00302         ERR("GetId failed: %08x\n", nsres);
00303     else if(*id)
00304         *p = SysAllocString(id);
00305 
00306     nsAString_Finish(&id_str);
00307     return S_OK;
00308 }
00309 
00310 static HRESULT WINAPI HTMLElement_get_tagName(IHTMLElement *iface, BSTR *p)
00311 {
00312     HTMLElement *This = HTMLELEM_THIS(iface);
00313     const PRUnichar *tag;
00314     nsAString tag_str;
00315     nsresult nsres;
00316 
00317     TRACE("(%p)->(%p)\n", This, p);
00318 
00319     if(!This->nselem) {
00320         static const WCHAR comment_tagW[] = {'!',0};
00321 
00322         WARN("NULL nselem, assuming comment\n");
00323 
00324         *p = SysAllocString(comment_tagW);
00325         return S_OK;
00326     }
00327 
00328     nsAString_Init(&tag_str, NULL);
00329     nsres = nsIDOMHTMLElement_GetTagName(This->nselem, &tag_str);
00330     if(NS_SUCCEEDED(nsres)) {
00331         nsAString_GetData(&tag_str, &tag);
00332         *p = SysAllocString(tag);
00333     }else {
00334         ERR("GetTagName failed: %08x\n", nsres);
00335         *p = NULL;
00336     }
00337     nsAString_Finish(&tag_str);
00338 
00339     return S_OK;
00340 }
00341 
00342 static HRESULT WINAPI HTMLElement_get_parentElement(IHTMLElement *iface, IHTMLElement **p)
00343 {
00344     HTMLElement *This = HTMLELEM_THIS(iface);
00345     IHTMLDOMNode *node;
00346     HRESULT hres;
00347 
00348     TRACE("(%p)->(%p)\n", This, p);
00349 
00350     hres = IHTMLDOMNode_get_parentNode(HTMLDOMNODE(&This->node), &node);
00351     if(FAILED(hres))
00352         return hres;
00353 
00354     hres = IHTMLDOMNode_QueryInterface(node, &IID_IHTMLElement, (void**)p);
00355     IHTMLDOMNode_Release(node);
00356     if(FAILED(hres))
00357         *p = NULL;
00358 
00359     return S_OK;
00360 }
00361 
00362 static HRESULT WINAPI HTMLElement_get_style(IHTMLElement *iface, IHTMLStyle **p)
00363 {
00364     HTMLElement *This = HTMLELEM_THIS(iface);
00365     nsIDOMElementCSSInlineStyle *nselemstyle;
00366     nsIDOMCSSStyleDeclaration *nsstyle;
00367     nsresult nsres;
00368 
00369     TRACE("(%p)->(%p)\n", This, p);
00370 
00371     if(!This->nselem) {
00372         FIXME("NULL nselem\n");
00373         return E_NOTIMPL;
00374     }
00375 
00376     nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMElementCSSInlineStyle,
00377                                              (void**)&nselemstyle);
00378     if(NS_FAILED(nsres)) {
00379         ERR("Coud not get nsIDOMCSSStyleDeclaration interface: %08x\n", nsres);
00380         return E_FAIL;
00381     }
00382 
00383     nsres = nsIDOMElementCSSInlineStyle_GetStyle(nselemstyle, &nsstyle);
00384     nsIDOMElementCSSInlineStyle_Release(nselemstyle);
00385     if(NS_FAILED(nsres)) {
00386         ERR("GetStyle failed: %08x\n", nsres);
00387         return E_FAIL;
00388     }
00389 
00390     /* FIXME: Store style instead of creating a new instance in each call */
00391     *p = HTMLStyle_Create(nsstyle);
00392 
00393     nsIDOMCSSStyleDeclaration_Release(nsstyle);
00394     return S_OK;
00395 }
00396 
00397 static HRESULT WINAPI HTMLElement_put_onhelp(IHTMLElement *iface, VARIANT v)
00398 {
00399     HTMLElement *This = HTMLELEM_THIS(iface);
00400     FIXME("(%p)->()\n", This);
00401     return E_NOTIMPL;
00402 }
00403 
00404 static HRESULT WINAPI HTMLElement_get_onhelp(IHTMLElement *iface, VARIANT *p)
00405 {
00406     HTMLElement *This = HTMLELEM_THIS(iface);
00407     FIXME("(%p)->(%p)\n", This, p);
00408     return E_NOTIMPL;
00409 }
00410 
00411 static HRESULT WINAPI HTMLElement_put_onclick(IHTMLElement *iface, VARIANT v)
00412 {
00413     HTMLElement *This = HTMLELEM_THIS(iface);
00414 
00415     TRACE("(%p)->()\n", This);
00416 
00417     return set_node_event(&This->node, EVENTID_CLICK, &v);
00418 }
00419 
00420 static HRESULT WINAPI HTMLElement_get_onclick(IHTMLElement *iface, VARIANT *p)
00421 {
00422     HTMLElement *This = HTMLELEM_THIS(iface);
00423 
00424     TRACE("(%p)->(%p)\n", This, p);
00425 
00426     return get_node_event(&This->node, EVENTID_CLICK, p);
00427 }
00428 
00429 static HRESULT WINAPI HTMLElement_put_ondblclick(IHTMLElement *iface, VARIANT v)
00430 {
00431     HTMLElement *This = HTMLELEM_THIS(iface);
00432 
00433     FIXME("(%p)->(%s)\n", This, debugstr_variant(&v));
00434 
00435     return set_node_event(&This->node, EVENTID_DBLCLICK, &v);
00436 }
00437 
00438 static HRESULT WINAPI HTMLElement_get_ondblclick(IHTMLElement *iface, VARIANT *p)
00439 {
00440     HTMLElement *This = HTMLELEM_THIS(iface);
00441 
00442     TRACE("(%p)->(%p)\n", This, p);
00443 
00444     return get_node_event(&This->node, EVENTID_DBLCLICK, p);
00445 }
00446 
00447 static HRESULT WINAPI HTMLElement_put_onkeydown(IHTMLElement *iface, VARIANT v)
00448 {
00449     HTMLElement *This = HTMLELEM_THIS(iface);
00450 
00451     TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
00452 
00453     return set_node_event(&This->node, EVENTID_KEYDOWN, &v);
00454 }
00455 
00456 static HRESULT WINAPI HTMLElement_get_onkeydown(IHTMLElement *iface, VARIANT *p)
00457 {
00458     HTMLElement *This = HTMLELEM_THIS(iface);
00459 
00460     TRACE("(%p)->(%p)\n", This, p);
00461 
00462     return get_node_event(&This->node, EVENTID_KEYDOWN, p);
00463 }
00464 
00465 static HRESULT WINAPI HTMLElement_put_onkeyup(IHTMLElement *iface, VARIANT v)
00466 {
00467     HTMLElement *This = HTMLELEM_THIS(iface);
00468 
00469     TRACE("(%p)->()\n", This);
00470 
00471     return set_node_event(&This->node, EVENTID_KEYUP, &v);
00472 }
00473 
00474 static HRESULT WINAPI HTMLElement_get_onkeyup(IHTMLElement *iface, VARIANT *p)
00475 {
00476     HTMLElement *This = HTMLELEM_THIS(iface);
00477     FIXME("(%p)->(%p)\n", This, p);
00478     return E_NOTIMPL;
00479 }
00480 
00481 static HRESULT WINAPI HTMLElement_put_onkeypress(IHTMLElement *iface, VARIANT v)
00482 {
00483     HTMLElement *This = HTMLELEM_THIS(iface);
00484     FIXME("(%p)->()\n", This);
00485     return E_NOTIMPL;
00486 }
00487 
00488 static HRESULT WINAPI HTMLElement_get_onkeypress(IHTMLElement *iface, VARIANT *p)
00489 {
00490     HTMLElement *This = HTMLELEM_THIS(iface);
00491     FIXME("(%p)->(%p)\n", This, p);
00492     return E_NOTIMPL;
00493 }
00494 
00495 static HRESULT WINAPI HTMLElement_put_onmouseout(IHTMLElement *iface, VARIANT v)
00496 {
00497     HTMLElement *This = HTMLELEM_THIS(iface);
00498 
00499     TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
00500 
00501     return set_node_event(&This->node, EVENTID_MOUSEOUT, &v);
00502 }
00503 
00504 static HRESULT WINAPI HTMLElement_get_onmouseout(IHTMLElement *iface, VARIANT *p)
00505 {
00506     HTMLElement *This = HTMLELEM_THIS(iface);
00507 
00508     TRACE("(%p)->(%p)\n", This, p);
00509 
00510     return get_node_event(&This->node, EVENTID_MOUSEOUT, p);
00511 }
00512 
00513 static HRESULT WINAPI HTMLElement_put_onmouseover(IHTMLElement *iface, VARIANT v)
00514 {
00515     HTMLElement *This = HTMLELEM_THIS(iface);
00516 
00517     TRACE("(%p)->()\n", This);
00518 
00519     return set_node_event(&This->node, EVENTID_MOUSEOVER, &v);
00520 }
00521 
00522 static HRESULT WINAPI HTMLElement_get_onmouseover(IHTMLElement *iface, VARIANT *p)
00523 {
00524     HTMLElement *This = HTMLELEM_THIS(iface);
00525 
00526     TRACE("(%p)->(%p)\n", This, p);
00527 
00528     return get_node_event(&This->node, EVENTID_MOUSEOVER, p);
00529 }
00530 
00531 static HRESULT WINAPI HTMLElement_put_onmousemove(IHTMLElement *iface, VARIANT v)
00532 {
00533     HTMLElement *This = HTMLELEM_THIS(iface);
00534     FIXME("(%p)->()\n", This);
00535     return E_NOTIMPL;
00536 }
00537 
00538 static HRESULT WINAPI HTMLElement_get_onmousemove(IHTMLElement *iface, VARIANT *p)
00539 {
00540     HTMLElement *This = HTMLELEM_THIS(iface);
00541     FIXME("(%p)->(%p)\n", This, p);
00542     return E_NOTIMPL;
00543 }
00544 
00545 static HRESULT WINAPI HTMLElement_put_onmousedown(IHTMLElement *iface, VARIANT v)
00546 {
00547     HTMLElement *This = HTMLELEM_THIS(iface);
00548 
00549     TRACE("(%p)->()\n", This);
00550 
00551     return set_node_event(&This->node, EVENTID_MOUSEDOWN, &v);
00552 }
00553 
00554 static HRESULT WINAPI HTMLElement_get_onmousedown(IHTMLElement *iface, VARIANT *p)
00555 {
00556     HTMLElement *This = HTMLELEM_THIS(iface);
00557 
00558     TRACE("(%p)->(%p)\n", This, p);
00559 
00560     return get_node_event(&This->node, EVENTID_MOUSEDOWN, p);
00561 }
00562 
00563 static HRESULT WINAPI HTMLElement_put_onmouseup(IHTMLElement *iface, VARIANT v)
00564 {
00565     HTMLElement *This = HTMLELEM_THIS(iface);
00566 
00567     TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
00568 
00569     return set_node_event(&This->node, EVENTID_MOUSEUP, &v);
00570 }
00571 
00572 static HRESULT WINAPI HTMLElement_get_onmouseup(IHTMLElement *iface, VARIANT *p)
00573 {
00574     HTMLElement *This = HTMLELEM_THIS(iface);
00575 
00576     TRACE("(%p)->(%p)\n", This, p);
00577 
00578     return get_node_event(&This->node, EVENTID_MOUSEUP, p);
00579 }
00580 
00581 static HRESULT WINAPI HTMLElement_get_document(IHTMLElement *iface, IDispatch **p)
00582 {
00583     HTMLElement *This = HTMLELEM_THIS(iface);
00584 
00585     TRACE("(%p)->(%p)\n", This, p);
00586 
00587     if(!p)
00588         return E_POINTER;
00589 
00590     if(This->node.vtbl->get_document)
00591         return This->node.vtbl->get_document(&This->node, p);
00592 
00593     *p = (IDispatch*)HTMLDOC(&This->node.doc->basedoc);
00594     IDispatch_AddRef(*p);
00595     return S_OK;
00596 }
00597 
00598 static const WCHAR titleW[] = {'t','i','t','l','e',0};
00599 
00600 static HRESULT WINAPI HTMLElement_put_title(IHTMLElement *iface, BSTR v)
00601 {
00602     HTMLElement *This = HTMLELEM_THIS(iface);
00603     nsAString title_str;
00604     nsresult nsres;
00605 
00606     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
00607 
00608     if(!This->nselem) {
00609         VARIANT *var;
00610         HRESULT hres;
00611 
00612         hres = dispex_get_dprop_ref(&This->node.dispex, titleW, TRUE, &var);
00613         if(FAILED(hres))
00614             return hres;
00615 
00616         VariantClear(var);
00617         V_VT(var) = VT_BSTR;
00618         V_BSTR(var) = v ? SysAllocString(v) : NULL;
00619         return S_OK;
00620     }
00621 
00622     nsAString_InitDepend(&title_str, v);
00623     nsres = nsIDOMHTMLElement_SetTitle(This->nselem, &title_str);
00624     nsAString_Finish(&title_str);
00625     if(NS_FAILED(nsres))
00626         ERR("SetTitle failed: %08x\n", nsres);
00627 
00628     return S_OK;
00629 }
00630 
00631 static HRESULT WINAPI HTMLElement_get_title(IHTMLElement *iface, BSTR *p)
00632 {
00633     HTMLElement *This = HTMLELEM_THIS(iface);
00634     nsAString title_str;
00635     nsresult nsres;
00636 
00637     TRACE("(%p)->(%p)\n", This, p);
00638 
00639     if(!This->nselem) {
00640         VARIANT *var;
00641         HRESULT hres;
00642 
00643         hres = dispex_get_dprop_ref(&This->node.dispex, titleW, FALSE, &var);
00644         if(hres == DISP_E_UNKNOWNNAME) {
00645             *p = NULL;
00646         }else if(V_VT(var) != VT_BSTR) {
00647             FIXME("title = %s\n", debugstr_variant(var));
00648             return E_FAIL;
00649         }else {
00650             *p = V_BSTR(var) ? SysAllocString(V_BSTR(var)) : NULL;
00651         }
00652 
00653         return S_OK;
00654     }
00655 
00656     nsAString_Init(&title_str, NULL);
00657     nsres = nsIDOMHTMLElement_GetTitle(This->nselem, &title_str);
00658     if(NS_SUCCEEDED(nsres)) {
00659         const PRUnichar *title;
00660 
00661         nsAString_GetData(&title_str, &title);
00662         *p = *title ? SysAllocString(title) : NULL;
00663     }else {
00664         ERR("GetTitle failed: %08x\n", nsres);
00665         return E_FAIL;
00666     }
00667 
00668     return S_OK;
00669 }
00670 
00671 static HRESULT WINAPI HTMLElement_put_language(IHTMLElement *iface, BSTR v)
00672 {
00673     HTMLElement *This = HTMLELEM_THIS(iface);
00674     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
00675     return E_NOTIMPL;
00676 }
00677 
00678 static HRESULT WINAPI HTMLElement_get_language(IHTMLElement *iface, BSTR *p)
00679 {
00680     HTMLElement *This = HTMLELEM_THIS(iface);
00681     FIXME("(%p)->(%p)\n", This, p);
00682     return E_NOTIMPL;
00683 }
00684 
00685 static HRESULT WINAPI HTMLElement_put_onselectstart(IHTMLElement *iface, VARIANT v)
00686 {
00687     HTMLElement *This = HTMLELEM_THIS(iface);
00688 
00689     TRACE("(%p)->(%s)\n", This, debugstr_variant(&v));
00690 
00691     return set_node_event(&This->node, EVENTID_SELECTSTART, &v);
00692 }
00693 
00694 static HRESULT WINAPI HTMLElement_get_onselectstart(IHTMLElement *iface, VARIANT *p)
00695 {
00696     HTMLElement *This = HTMLELEM_THIS(iface);
00697 
00698     TRACE("(%p)->(%p)\n", This, p);
00699 
00700     return get_node_event(&This->node, EVENTID_SELECTSTART, p);
00701 }
00702 
00703 static HRESULT WINAPI HTMLElement_scrollIntoView(IHTMLElement *iface, VARIANT varargStart)
00704 {
00705     HTMLElement *This = HTMLELEM_THIS(iface);
00706     FIXME("(%p)->()\n", This);
00707     return E_NOTIMPL;
00708 }
00709 
00710 static HRESULT WINAPI HTMLElement_contains(IHTMLElement *iface, IHTMLElement *pChild,
00711                                            VARIANT_BOOL *pfResult)
00712 {
00713     HTMLElement *This = HTMLELEM_THIS(iface);
00714     FIXME("(%p)->(%p %p)\n", This, pChild, pfResult);
00715     return E_NOTIMPL;
00716 }
00717 
00718 static HRESULT WINAPI HTMLElement_get_sourceIndex(IHTMLElement *iface, LONG *p)
00719 {
00720     HTMLElement *This = HTMLELEM_THIS(iface);
00721     FIXME("(%p)->(%p)\n", This, p);
00722     return E_NOTIMPL;
00723 }
00724 
00725 static HRESULT WINAPI HTMLElement_get_recordNumber(IHTMLElement *iface, VARIANT *p)
00726 {
00727     HTMLElement *This = HTMLELEM_THIS(iface);
00728     FIXME("(%p)->(%p)\n", This, p);
00729     return E_NOTIMPL;
00730 }
00731 
00732 static HRESULT WINAPI HTMLElement_put_lang(IHTMLElement *iface, BSTR v)
00733 {
00734     HTMLElement *This = HTMLELEM_THIS(iface);
00735     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
00736     return E_NOTIMPL;
00737 }
00738 
00739 static HRESULT WINAPI HTMLElement_get_lang(IHTMLElement *iface, BSTR *p)
00740 {
00741     HTMLElement *This = HTMLELEM_THIS(iface);
00742     FIXME("(%p)->(%p)\n", This, p);
00743     return E_NOTIMPL;
00744 }
00745 
00746 static HRESULT WINAPI HTMLElement_get_offsetLeft(IHTMLElement *iface, LONG *p)
00747 {
00748     HTMLElement *This = HTMLELEM_THIS(iface);
00749     FIXME("(%p)->(%p)\n", This, p);
00750     return E_NOTIMPL;
00751 }
00752 
00753 static HRESULT WINAPI HTMLElement_get_offsetTop(IHTMLElement *iface, LONG *p)
00754 {
00755     HTMLElement *This = HTMLELEM_THIS(iface);
00756     nsIDOMNSHTMLElement *nselem;
00757     PRInt32 top = 0;
00758     nsresult nsres;
00759 
00760     TRACE("(%p)->(%p)\n", This, p);
00761 
00762     nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
00763     if(NS_FAILED(nsres)) {
00764         ERR("Could not get nsIDOMNSHTMLElement: %08x\n", nsres);
00765         return E_FAIL;
00766     }
00767 
00768     nsres = nsIDOMNSHTMLElement_GetOffsetTop(nselem, &top);
00769     nsIDOMNSHTMLElement_Release(nselem);
00770     if(NS_FAILED(nsres)) {
00771         ERR("GetOffsetTop failed: %08x\n", nsres);
00772         return E_FAIL;
00773     }
00774 
00775     *p = top;
00776     return S_OK;
00777 }
00778 
00779 static HRESULT WINAPI HTMLElement_get_offsetWidth(IHTMLElement *iface, LONG *p)
00780 {
00781     HTMLElement *This = HTMLELEM_THIS(iface);
00782     nsIDOMNSHTMLElement *nselem;
00783     PRInt32 offset = 0;
00784     nsresult nsres;
00785 
00786     TRACE("(%p)->(%p)\n", This, p);
00787 
00788     nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
00789     if(NS_FAILED(nsres)) {
00790         ERR("Could not get nsIDOMNSHTMLElement: %08x\n", nsres);
00791         return E_FAIL;
00792     }
00793 
00794     nsres = nsIDOMNSHTMLElement_GetOffsetWidth(nselem, &offset);
00795     nsIDOMNSHTMLElement_Release(nselem);
00796     if(NS_FAILED(nsres)) {
00797         ERR("GetOffsetWidth failed: %08x\n", nsres);
00798         return E_FAIL;
00799     }
00800 
00801     *p = offset;
00802     return S_OK;
00803 }
00804 
00805 static HRESULT WINAPI HTMLElement_get_offsetHeight(IHTMLElement *iface, LONG *p)
00806 {
00807     HTMLElement *This = HTMLELEM_THIS(iface);
00808     nsIDOMNSHTMLElement *nselem;
00809     PRInt32 offset = 0;
00810     nsresult nsres;
00811 
00812     TRACE("(%p)->(%p)\n", This, p);
00813 
00814     nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
00815     if(NS_FAILED(nsres)) {
00816         ERR("Could not get nsIDOMNSHTMLElement: %08x\n", nsres);
00817         return E_FAIL;
00818     }
00819 
00820     nsres = nsIDOMNSHTMLElement_GetOffsetHeight(nselem, &offset);
00821     nsIDOMNSHTMLElement_Release(nselem);
00822     if(NS_FAILED(nsres)) {
00823         ERR("GetOffsetHeight failed: %08x\n", nsres);
00824         return E_FAIL;
00825     }
00826 
00827     *p = offset;
00828     return S_OK;
00829 }
00830 
00831 static HRESULT WINAPI HTMLElement_get_offsetParent(IHTMLElement *iface, IHTMLElement **p)
00832 {
00833     HTMLElement *This = HTMLELEM_THIS(iface);
00834     FIXME("(%p)->(%p)\n", This, p);
00835     return E_NOTIMPL;
00836 }
00837 
00838 static HRESULT WINAPI HTMLElement_put_innerHTML(IHTMLElement *iface, BSTR v)
00839 {
00840     HTMLElement *This = HTMLELEM_THIS(iface);
00841     nsIDOMNSHTMLElement *nselem;
00842     nsAString html_str;
00843     nsresult nsres;
00844 
00845     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
00846 
00847     if(!This->nselem) {
00848         FIXME("NULL nselem\n");
00849         return E_NOTIMPL;
00850     }
00851 
00852     nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
00853     if(NS_FAILED(nsres)) {
00854         ERR("Could not get nsIDOMNSHTMLElement: %08x\n", nsres);
00855         return E_FAIL;
00856     }
00857 
00858     nsAString_InitDepend(&html_str, v);
00859     nsres = nsIDOMNSHTMLElement_SetInnerHTML(nselem, &html_str);
00860     nsAString_Finish(&html_str);
00861 
00862     if(NS_FAILED(nsres)) {
00863         FIXME("SetInnerHtml failed %08x\n", nsres);
00864         return E_FAIL;
00865     }
00866 
00867     return S_OK;
00868 }
00869 
00870 static HRESULT WINAPI HTMLElement_get_innerHTML(IHTMLElement *iface, BSTR *p)
00871 {
00872     HTMLElement *This = HTMLELEM_THIS(iface);
00873     nsIDOMNSHTMLElement *nselem;
00874     nsAString html_str;
00875     nsresult nsres;
00876 
00877     TRACE("(%p)->(%p)\n", This, p);
00878 
00879     if(!This->nselem) {
00880         FIXME("NULL nselem\n");
00881         return E_NOTIMPL;
00882     }
00883 
00884     nsres = nsIDOMHTMLElement_QueryInterface(This->nselem, &IID_nsIDOMNSHTMLElement, (void**)&nselem);
00885     if(NS_FAILED(nsres)) {
00886         ERR("Could not get nsIDOMNSHTMLElement: %08x\n", nsres);
00887         return E_FAIL;
00888     }
00889 
00890     nsAString_Init(&html_str, NULL);
00891     nsres = nsIDOMNSHTMLElement_GetInnerHTML(nselem, &html_str);
00892     if(NS_SUCCEEDED(nsres)) {
00893         const PRUnichar *html;
00894 
00895         nsAString_GetData(&html_str, &html);
00896         *p = *html ? SysAllocString(html) : NULL;
00897     }else {
00898         FIXME("SetInnerHtml failed %08x\n", nsres);
00899         *p = NULL;
00900     }
00901 
00902     nsAString_Finish(&html_str);
00903     return S_OK;
00904 }
00905 
00906 static HRESULT WINAPI HTMLElement_put_innerText(IHTMLElement *iface, BSTR v)
00907 {
00908     HTMLElement *This = HTMLELEM_THIS(iface);
00909     nsIDOMNode *nschild, *tmp;
00910     nsIDOMText *text_node;
00911     nsAString text_str;
00912     nsresult nsres;
00913 
00914     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
00915 
00916     while(1) {
00917         nsres = nsIDOMHTMLElement_GetLastChild(This->nselem, &nschild);
00918         if(NS_FAILED(nsres)) {
00919             ERR("GetLastChild failed: %08x\n", nsres);
00920             return E_FAIL;
00921         }
00922         if(!nschild)
00923             break;
00924 
00925         nsres = nsIDOMHTMLElement_RemoveChild(This->nselem, nschild, &tmp);
00926         nsIDOMNode_Release(nschild);
00927         if(NS_FAILED(nsres)) {
00928             ERR("RemoveChild failed: %08x\n", nsres);
00929             return E_FAIL;
00930         }
00931         nsIDOMNode_Release(tmp);
00932     }
00933 
00934     nsAString_InitDepend(&text_str, v);
00935     nsres = nsIDOMHTMLDocument_CreateTextNode(This->node.doc->nsdoc, &text_str, &text_node);
00936     nsAString_Finish(&text_str);
00937     if(NS_FAILED(nsres)) {
00938         ERR("CreateTextNode failed: %08x\n", nsres);
00939         return E_FAIL;
00940     }
00941 
00942     nsres = nsIDOMHTMLElement_AppendChild(This->nselem, (nsIDOMNode*)text_node, &tmp);
00943     if(NS_FAILED(nsres)) {
00944         ERR("AppendChild failed: %08x\n", nsres);
00945         return E_FAIL;
00946     }
00947 
00948     nsIDOMNode_Release(tmp);
00949     return S_OK;
00950 }
00951 
00952 static HRESULT WINAPI HTMLElement_get_innerText(IHTMLElement *iface, BSTR *p)
00953 {
00954     HTMLElement *This = HTMLELEM_THIS(iface);
00955 
00956     TRACE("(%p)->(%p)\n", This, p);
00957 
00958     return get_node_text(&This->node, p);
00959 }
00960 
00961 static HRESULT WINAPI HTMLElement_put_outerHTML(IHTMLElement *iface, BSTR v)
00962 {
00963     HTMLElement *This = HTMLELEM_THIS(iface);
00964     nsIDOMDocumentFragment *nsfragment;
00965     nsIDOMDocumentRange *nsdocrange;
00966     nsIDOMNSRange *nsrange;
00967     nsIDOMNode *nsparent;
00968     nsIDOMRange *range;
00969     nsAString html_str;
00970     nsresult nsres;
00971     HRESULT hres = S_OK;
00972 
00973     TRACE("(%p)->(%s)\n", This, debugstr_w(v));
00974 
00975     nsres = nsIDOMHTMLDocument_QueryInterface(This->node.doc->nsdoc, &IID_nsIDOMDocumentRange, (void**)&nsdocrange);
00976     if(NS_FAILED(nsres))
00977         return E_FAIL;
00978 
00979     nsres = nsIDOMDocumentRange_CreateRange(nsdocrange, &range);
00980     nsIDOMDocumentRange_Release(nsdocrange);
00981     if(NS_FAILED(nsres)) {
00982         ERR("CreateRange failed: %08x\n", nsres);
00983         return E_FAIL;
00984     }
00985 
00986     nsres = nsIDOMRange_QueryInterface(range, &IID_nsIDOMNSRange, (void**)&nsrange);
00987     nsIDOMRange_Release(range);
00988     if(NS_FAILED(nsres)) {
00989         ERR("Could not get nsIDOMNSRange: %08x\n", nsres);
00990         return E_FAIL;
00991     }
00992 
00993     nsAString_InitDepend(&html_str, v);
00994     nsIDOMNSRange_CreateContextualFragment(nsrange, &html_str, &nsfragment);
00995     nsIDOMNSRange_Release(nsrange);
00996     nsAString_Finish(&html_str);
00997     if(NS_FAILED(nsres)) {
00998         ERR("CreateContextualFragment failed: %08x\n", nsres);
00999         return E_FAIL;
01000     }
01001 
01002     nsres = nsIDOMNode_GetParentNode(This->node.nsnode, &nsparent);
01003     if(NS_SUCCEEDED(nsres) && nsparent) {
01004         nsIDOMNode *nstmp;
01005 
01006         nsres = nsIDOMNode_ReplaceChild(nsparent, (nsIDOMNode*)nsfragment, This->node.nsnode, &nstmp);
01007         nsIDOMNode_Release(nsparent);
01008         if(NS_FAILED(nsres)) {
01009             ERR("ReplaceChild failed: %08x\n", nsres);
01010             hres = E_FAIL;
01011         }else if(nstmp) {
01012             nsIDOMNode_Release(nstmp);
01013         }
01014     }else {
01015         ERR("GetParentNode failed: %08x\n", nsres);
01016         hres = E_FAIL;
01017     }
01018 
01019     nsIDOMDocumentFragment_Release(nsfragment);
01020     return hres;
01021 }
01022 
01023 static HRESULT WINAPI HTMLElement_get_outerHTML(IHTMLElement *iface, BSTR *p)
01024 {
01025     HTMLElement *This = HTMLELEM_THIS(iface);
01026     nsAString html_str;
01027     HRESULT hres;
01028 
01029     WARN("(%p)->(%p) semi-stub\n", This, p);
01030 
01031     nsAString_Init(&html_str, NULL);
01032     hres = nsnode_to_nsstring(This->node.nsnode, &html_str);
01033     if(SUCCEEDED(hres)) {
01034         const PRUnichar *html;
01035 
01036         nsAString_GetData(&html_str, &html);
01037         *p = SysAllocString(html);
01038         if(!*p)
01039             hres = E_OUTOFMEMORY;
01040     }
01041 
01042     nsAString_Finish(&html_str);
01043 
01044     TRACE("ret %s\n", debugstr_w(*p));
01045     return S_OK;
01046 }
01047 
01048 static HRESULT WINAPI HTMLElement_put_outerText(IHTMLElement *iface, BSTR v)
01049 {
01050     HTMLElement *This = HTMLELEM_THIS(iface);
01051     FIXME("(%p)->(%s)\n", This, debugstr_w(v));
01052     return E_NOTIMPL;
01053 }
01054 
01055 static HRESULT WINAPI HTMLElement_get_outerText(IHTMLElement *iface, BSTR *p)
01056 {
01057     HTMLElement *This = HTMLELEM_THIS(iface);
01058     FIXME("(%p)->(%p)\n", This, p);
01059     return E_NOTIMPL;
01060 }
01061 
01062 static HRESULT HTMLElement_InsertAdjacentNode(HTMLElement *This, BSTR where, nsIDOMNode *nsnode)
01063 {
01064     static const WCHAR wszBeforeBegin[] = {'b','e','f','o','r','e','B','e','g','i','n',0};
01065     static const WCHAR wszAfterBegin[] = {'a','f','t','e','r','B','e','g','i','n',0};
01066     static const WCHAR wszBeforeEnd[] = {'b','e','f','o','r','e','E','n','d',0};
01067     static const WCHAR wszAfterEnd[] = {'a','f','t','e','r','E','n','d',0};
01068     nsresult nsres;
01069 
01070     if (!strcmpiW(where, wszBeforeBegin))
01071     {
01072         nsIDOMNode *unused;
01073         nsIDOMNode *parent;
01074         nsres = nsIDOMNode_GetParentNode(This->node.nsnode, &parent);
01075         if (!parent) return E_INVALIDARG;
01076         nsres = nsIDOMNode_InsertBefore(parent, nsnode, This->node.nsnode, &unused);
01077         if (unused) nsIDOMNode_Release(unused);
01078         nsIDOMNode_Release(parent);
01079     }
01080     else if (!strcmpiW(where, wszAfterBegin))
01081     {
01082         nsIDOMNode *unused;
01083         nsIDOMNode *first_child;
01084         nsIDOMNode_GetFirstChild(This->node.nsnode, &first_child);
01085         nsres = nsIDOMNode_InsertBefore(This->node.nsnode, nsnode, first_child, &unused);
01086         if (unused) nsIDOMNode_Release(unused);
01087         if (first_child) nsIDOMNode_Release(first_child);
01088     }
01089     else if (!strcmpiW(where, wszBeforeEnd))
01090     {
01091         nsIDOMNode *unused;
01092         nsres = nsIDOMNode_AppendChild(This->node.nsnode, nsnode, &unused);
01093         if (unused) nsIDOMNode_Release(unused);
01094     }
01095     else if (!strcmpiW(where, wszAfterEnd))
01096     {
01097         nsIDOMNode *unused;
01098         nsIDOMNode *next_sibling;
01099         nsIDOMNode *parent;
01100         nsIDOMNode_GetParentNode(This->node.nsnode, &parent);
01101         if (!parent) return E_INVALIDARG;
01102 
01103         nsIDOMNode_GetNextSibling(This->node.nsnode, &next_sibling);
01104         if (next_sibling)
01105         {
01106             nsres = nsIDOMNode_InsertBefore(parent, nsnode, next_sibling, &unused);
01107             nsIDOMNode_Release(next_sibling);
01108         }
01109         else
01110             nsres = nsIDOMNode_AppendChild(parent, nsnode, &unused);
01111         nsIDOMNode_Release(parent);
01112         if (unused) nsIDOMNode_Release(unused);
01113     }
01114     else
01115     {
01116         ERR("invalid where: %s\n", debugstr_w(where));
01117         return E_INVALIDARG;
01118     }
01119 
01120     if (NS_FAILED(nsres))
01121         return E_FAIL;
01122     else
01123         return S_OK;
01124 }
01125 
01126 static HRESULT WINAPI HTMLElement_insertAdjacentHTML(IHTMLElement *iface, BSTR where,
01127                                                      BSTR html)
01128 {
01129     HTMLElement *This = HTMLELEM_THIS(iface);
01130     nsIDOMDocumentRange *nsdocrange;
01131     nsIDOMRange *range;
01132     nsIDOMNSRange *nsrange;
01133     nsIDOMNode *nsnode;
01134     nsAString ns_html;
01135     nsresult nsres;
01136     HRESULT hr;
01137 
01138     TRACE("(%p)->(%s %s)\n", This, debugstr_w(where), debugstr_w(html));
01139 
01140     if(!This->node.doc->nsdoc) {
01141         WARN("NULL nsdoc\n");
01142         return E_UNEXPECTED;
01143     }
01144 
01145     nsres = nsIDOMDocument_QueryInterface(This->node.doc->nsdoc, &IID_nsIDOMDocumentRange, (void **)&nsdocrange);
01146     if(NS_FAILED(nsres))
01147     {
01148         ERR("getting nsIDOMDocumentRange failed: %08x\n", nsres);
01149         return E_FAIL;
01150     }
01151     nsres = nsIDOMDocumentRange_CreateRange(nsdocrange, &range);
01152     nsIDOMDocumentRange_Release(nsdocrange);
01153     if(NS_FAILED(nsres))
01154     {
01155         ERR("CreateRange failed: %08x\n", nsres);
01156         return E_FAIL;
01157     }
01158 
01159     nsIDOMRange_SetStartBefore(range, This->node.nsnode);
01160 
01161     nsIDOMRange_QueryInterface(range, &IID_nsIDOMNSRange, (void **)&nsrange);
01162     nsIDOMRange_Release(range);
01163     if(NS_FAILED(nsres))
01164     {
01165         ERR("getting nsIDOMNSRange failed: %08x\n", nsres);
01166         return E_FAIL;
01167     }
01168 
01169     nsAString_InitDepend(&ns_html, html);
01170 
01171     nsres = nsIDOMNSRange_CreateContextualFragment(nsrange, &ns_html, (nsIDOMDocumentFragment **)&nsnode);
01172     nsIDOMNSRange_Release(nsrange);
01173     nsAString_Finish(&ns_html);
01174 
01175     if(NS_FAILED(nsres) || !nsnode)
01176     {
01177         ERR("CreateTextNode failed: %08x\n", nsres);
01178         return E_FAIL;
01179     }
01180 
01181     hr = HTMLElement_InsertAdjacentNode(This, where, nsnode);
01182     nsIDOMNode_Release(nsnode);
01183 
01184     return hr;
01185 }
01186 
01187 static HRESULT WINAPI HTMLElement_insertAdjacentText(IHTMLElement *iface, BSTR where,
01188                                                      BSTR text)
01189 {
01190     HTMLElement *This = HTMLELEM_THIS(iface);
01191     nsIDOMNode *nsnode;
01192     nsAString ns_text;
01193     nsresult nsres;
01194     HRESULT hr;
01195 
01196     TRACE("(%p)->(%s %s)\n", This, debugstr_w(where), debugstr_w(text));
01197 
01198     if(!This->node.doc->nsdoc) {
01199         WARN("NULL nsdoc\n");
01200         return E_UNEXPECTED;
01201     }
01202 
01203 
01204     nsAString_InitDepend(&ns_text, text);
01205     nsres = nsIDOMDocument_CreateTextNode(This->node.doc->nsdoc, &ns_text, (nsIDOMText **)&nsnode);
01206     nsAString_Finish(&ns_text);
01207 
01208     if(NS_FAILED(nsres) || !nsnode)
01209     {
01210         ERR("CreateTextNode failed: %08x\n", nsres);
01211         return E_FAIL;
01212     }
01213 
01214     hr = HTMLElement_InsertAdjacentNode(This, where, nsnode);
01215     nsIDOMNode_Release(nsnode);
01216 
01217     return hr;
01218 }
01219 
01220 static HRESULT WINAPI HTMLElement_get_parentTextEdit(IHTMLElement *iface, IHTMLElement **p)
01221 {
01222     HTMLElement *This = HTMLELEM_THIS(iface);
01223     FIXME("(%p)->(%p)\n", This, p);
01224     return E_NOTIMPL;
01225 }
01226 
01227 static HRESULT WINAPI HTMLElement_get_isTextEdit(IHTMLElement *iface, VARIANT_BOOL *p)
01228 {
01229     HTMLElement *This = HTMLELEM_THIS(iface);
01230     FIXME("(%p)->(%p)\n", This, p);
01231     return E_NOTIMPL;
01232 }
01233 
01234 static HRESULT WINAPI HTMLElement_click(IHTMLElement *iface)
01235 {
01236     HTMLElement *This = HTMLELEM_THIS(iface);
01237 
01238     TRACE("(%p)\n", This);
01239 
01240     return call_event(&This->node, EVENTID_CLICK);
01241 }
01242 
01243 static HRESULT WINAPI HTMLElement_get_filters(IHTMLElement *iface,
01244                                               IHTMLFiltersCollection **p)
01245 {
01246     HTMLElement *This = HTMLELEM_THIS(iface);
01247     TRACE("(%p)->(%p)\n", This, p);
01248 
01249     if(!p)
01250         return E_POINTER;
01251 
01252     *p = HTMLFiltersCollection_Create();
01253 
01254     return S_OK;
01255 }
01256 
01257 static HRESULT WINAPI HTMLElement_put_ondragstart(IHTMLElement *iface, VARIANT v)
01258 {
01259     HTMLElement *This = HTMLELEM_THIS(iface);
01260     FIXME("(%p)->()\n", This);
01261     return E_NOTIMPL;
01262 }
01263 
01264 static HRESULT WINAPI HTMLElement_get_ondragstart(IHTMLElement *iface, VARIANT *p)
01265 {
01266     HTMLElement *This = HTMLELEM_THIS(iface);
01267     FIXME("(%p)->(%p)\n", This, p);
01268     return E_NOTIMPL;
01269 }
01270 
01271 static HRESULT WINAPI HTMLElement_toString(IHTMLElement *iface, BSTR *String)
01272 {
01273     HTMLElement *This = HTMLELEM_THIS(iface);
01274     FIXME("(%p)->(%p)\n", This, String);
01275     return E_NOTIMPL;
01276 }
01277 
01278 static HRESULT WINAPI HTMLElement_put_onbeforeupdate(IHTMLElement *iface, VARIANT v)
01279 {
01280     HTMLElement *This = HTMLELEM_THIS(iface);
01281     FIXME("(%p)->()\n", This);
01282     return E_NOTIMPL;
01283 }
01284 
01285 static HRESULT WINAPI HTMLElement_get_onbeforeupdate(IHTMLElement *iface, VARIANT *p)
01286 {
01287     HTMLElement *This = HTMLELEM_THIS(iface);
01288     FIXME("(%p)->(%p)\n", This, p);
01289     return E_NOTIMPL;
01290 }
01291 
01292 static HRESULT WINAPI HTMLElement_put_onafterupdate(IHTMLElement *iface, VARIANT v)
01293 {
01294     HTMLElement *This = HTMLELEM_THIS(iface);
01295     FIXME("(%p)->()\n", This);
01296     return E_NOTIMPL;
01297 }
01298 
01299 static HRESULT WINAPI HTMLElement_get_onafterupdate(IHTMLElement *iface, VARIANT *p)
01300 {
01301     HTMLElement *This = HTMLELEM_THIS(iface);
01302     FIXME("(%p)->(%p)\n", This, p);
01303     return E_NOTIMPL;
01304 }
01305 
01306 static HRESULT WINAPI HTMLElement_put_onerrorupdate(IHTMLElement *iface, VARIANT v)
01307 {
01308     HTMLElement *This = HTMLELEM_THIS(iface);
01309     FIXME("(%p)->()\n", This);
01310     return E_NOTIMPL;
01311 }
01312 
01313 static HRESULT WINAPI HTMLElement_get_onerrorupdate(IHTMLElement *iface, VARIANT *p)
01314 {
01315     HTMLElement *This = HTMLELEM_THIS(iface);
01316     FIXME("(%p)->(%p)\n", This, p);
01317     return E_NOTIMPL;
01318 }
01319 
01320 static HRESULT WINAPI HTMLElement_put_onrowexit(IHTMLElement *iface, VARIANT v)
01321 {
01322     HTMLElement *This = HTMLELEM_THIS(iface);
01323     FIXME("(%p)->()\n", This);
01324     return E_NOTIMPL;
01325 }
01326 
01327 static HRESULT WINAPI HTMLElement_get_onrowexit(IHTMLElement *iface, VARIANT *p)
01328 {
01329     HTMLElement *This = HTMLELEM_THIS(iface);
01330     FIXME("(%p)->(%p)\n", This, p);
01331     return E_NOTIMPL;
01332 }
01333 
01334 static HRESULT WINAPI HTMLElement_put_onrowenter(IHTMLElement *iface, VARIANT v)
01335 {
01336     HTMLElement *This = HTMLELEM_THIS(iface);
01337     FIXME("(%p)->()\n", This);
01338     return E_NOTIMPL;
01339 }
01340 
01341 static HRESULT WINAPI HTMLElement_get_onrowenter(IHTMLElement *iface, VARIANT *p)
01342 {
01343     HTMLElement *This = HTMLELEM_THIS(iface);
01344     FIXME("(%p)->(%p)\n", This, p);
01345     return E_NOTIMPL;
01346 }
01347 
01348 static HRESULT WINAPI HTMLElement_put_ondatasetchanged(IHTMLElement *iface, VARIANT v)
01349 {
01350     HTMLElement *This = HTMLELEM_THIS(iface);
01351     FIXME("(%p)->()\n", This);
01352     return E_NOTIMPL;
01353 }
01354 
01355 static HRESULT WINAPI HTMLElement_get_ondatasetchanged(IHTMLElement *iface, VARIANT *p)
01356 {
01357     HTMLElement *This = HTMLELEM_THIS(iface);
01358     FIXME("(%p)->(%p)\n", This, p);
01359     return E_NOTIMPL;
01360 }
01361 
01362 static HRESULT WINAPI HTMLElement_put_ondataavailable(IHTMLElement *iface, VARIANT v)
01363 {
01364     HTMLElement *This = HTMLELEM_THIS(iface);
01365     FIXME("(%p)->()\n", This);
01366     return E_NOTIMPL;
01367 }
01368 
01369 static HRESULT WINAPI HTMLElement_get_ondataavailable(IHTMLElement *iface, VARIANT *p)
01370 {
01371     HTMLElement *This = HTMLELEM_THIS(iface);
01372     FIXME("(%p)->(%p)\n", This, p);
01373     return E_NOTIMPL;
01374 }
01375 
01376 static HRESULT WINAPI HTMLElement_put_ondatasetcomplete(IHTMLElement *iface, VARIANT v)
01377 {
01378     HTMLElement *This = HTMLELEM_THIS(iface);
01379     FIXME("(%p)->()\n", This);
01380     return E_NOTIMPL;
01381 }
01382 
01383 static HRESULT WINAPI HTMLElement_get_ondatasetcomplete(IHTMLElement *iface, VARIANT *p)
01384 {
01385     HTMLElement *This = HTMLELEM_THIS(iface);
01386     FIXME("(%p)->(%p)\n", This, p);
01387     return E_NOTIMPL;
01388 }
01389 
01390 static HRESULT WINAPI HTMLElement_put_onfilterchange(IHTMLElement *iface, VARIANT v)
01391 {
01392     HTMLElement *This = HTMLELEM_THIS(iface);
01393     FIXME("(%p)->()\n", This);
01394     return E_NOTIMPL;
01395 }
01396 
01397 static HRESULT WINAPI HTMLElement_get_onfilterchange(IHTMLElement *iface, VARIANT *p)
01398 {
01399     HTMLElement *This = HTMLELEM_THIS(iface);
01400     FIXME("(%p)->(%p)\n", This, p);
01401     return E_NOTIMPL;
01402 }
01403 
01404 static HRESULT WINAPI HTMLElement_get_children(IHTMLElement *iface, IDispatch **p)
01405 {
01406     HTMLElement *This = HTMLELEM_THIS(iface);
01407     nsIDOMNodeList *nsnode_list;
01408     nsresult nsres;
01409 
01410     TRACE("(%p)->(%p)\n", This, p);
01411 
01412     nsres = nsIDOMNode_GetChildNodes(This->node.nsnode, &nsnode_list);
01413     if(NS_FAILED(nsres)) {
01414         ERR("GetChildNodes failed: %08x\n", nsres);
01415         return E_FAIL;
01416     }
01417 
01418     *p = (IDispatch*)create_collection_from_nodelist(This->node.doc, (IUnknown*)HTMLELEM(This), nsnode_list);
01419 
01420     nsIDOMNodeList_Release(nsnode_list);
01421     return S_OK;
01422 }
01423 
01424 static HRESULT WINAPI HTMLElement_get_all(IHTMLElement *iface, IDispatch **p)
01425 {
01426     HTMLElement *This = HTMLELEM_THIS(iface);
01427 
01428     TRACE("(%p)->(%p)\n", This, p);
01429 
01430     *p = (IDispatch*)create_all_collection(&This->node, FALSE);
01431     return S_OK;
01432 }
01433 
01434 static HRESULT HTMLElement_get_dispid(IUnknown *iface, BSTR name,
01435         DWORD grfdex, DISPID *pid)
01436 {
01437     HTMLElement *This = HTMLELEM_THIS(iface);
01438 
01439     if(This->node.vtbl->get_dispid)
01440         return This->node.vtbl->get_dispid(&This->node, name, grfdex, pid);
01441 
01442     return DISP_E_UNKNOWNNAME;
01443 }
01444 
01445 static HRESULT HTMLElement_invoke(IUnknown *iface, DISPID id, LCID lcid,
01446         WORD flags, DISPPARAMS *params, VARIANT *res, EXCEPINFO *ei,
01447         IServiceProvider *caller)
01448 {
01449     HTMLElement *This = HTMLELEM_THIS(iface);
01450 
01451     if(This->node.vtbl->invoke)
01452         return This->node.vtbl->invoke(&This->node, id, lcid, flags,
01453                 params, res, ei, caller);
01454 
01455     ERR("(%p): element has no invoke method\n", This);
01456     return E_NOTIMPL;
01457 }
01458 
01459 #undef HTMLELEM_THIS
01460 
01461 static const IHTMLElementVtbl HTMLElementVtbl = {
01462     HTMLElement_QueryInterface,
01463     HTMLElement_AddRef,
01464     HTMLElement_Release,
01465     HTMLElement_GetTypeInfoCount,
01466     HTMLElement_GetTypeInfo,
01467     HTMLElement_GetIDsOfNames,
01468     HTMLElement_Invoke,
01469     HTMLElement_setAttribute,
01470     HTMLElement_getAttribute,
01471     HTMLElement_removeAttribute,
01472     HTMLElement_put_className,
01473     HTMLElement_get_className,
01474     HTMLElement_put_id,
01475     HTMLElement_get_id,
01476     HTMLElement_get_tagName,
01477     HTMLElement_get_parentElement,
01478     HTMLElement_get_style,
01479     HTMLElement_put_onhelp,
01480     HTMLElement_get_onhelp,
01481     HTMLElement_put_onclick,
01482     HTMLElement_get_onclick,
01483     HTMLElement_put_ondblclick,
01484     HTMLElement_get_ondblclick,
01485     HTMLElement_put_onkeydown,
01486     HTMLElement_get_onkeydown,
01487     HTMLElement_put_onkeyup,
01488     HTMLElement_get_onkeyup,
01489     HTMLElement_put_onkeypress,
01490     HTMLElement_get_onkeypress,
01491     HTMLElement_put_onmouseout,
01492     HTMLElement_get_onmouseout,
01493     HTMLElement_put_onmouseover,
01494     HTMLElement_get_onmouseover,
01495     HTMLElement_put_onmousemove,
01496     HTMLElement_get_onmousemove,
01497     HTMLElement_put_onmousedown,
01498     HTMLElement_get_onmousedown,
01499     HTMLElement_put_onmouseup,
01500     HTMLElement_get_onmouseup,
01501     HTMLElement_get_document,
01502     HTMLElement_put_title,
01503     HTMLElement_get_title,
01504     HTMLElement_put_language,
01505     HTMLElement_get_language,
01506     HTMLElement_put_onselectstart,
01507     HTMLElement_get_onselectstart,
01508     HTMLElement_scrollIntoView,
01509     HTMLElement_contains,
01510     HTMLElement_get_sourceIndex,
01511     HTMLElement_get_recordNumber,
01512     HTMLElement_put_lang,
01513     HTMLElement_get_lang,
01514     HTMLElement_get_offsetLeft,
01515     HTMLElement_get_offsetTop,
01516     HTMLElement_get_offsetWidth,
01517     HTMLElement_get_offsetHeight,
01518     HTMLElement_get_offsetParent,
01519     HTMLElement_put_innerHTML,
01520     HTMLElement_get_innerHTML,
01521     HTMLElement_put_innerText,
01522     HTMLElement_get_innerText,
01523     HTMLElement_put_outerHTML,
01524     HTMLElement_get_outerHTML,
01525     HTMLElement_put_outerText,
01526     HTMLElement_get_outerText,
01527     HTMLElement_insertAdjacentHTML,
01528     HTMLElement_insertAdjacentText,
01529     HTMLElement_get_parentTextEdit,
01530     HTMLElement_get_isTextEdit,
01531     HTMLElement_click,
01532     HTMLElement_get_filters,
01533     HTMLElement_put_ondragstart,
01534     HTMLElement_get_ondragstart,
01535     HTMLElement_toString,
01536     HTMLElement_put_onbeforeupdate,
01537     HTMLElement_get_onbeforeupdate,
01538     HTMLElement_put_onafterupdate,
01539     HTMLElement_get_onafterupdate,
01540     HTMLElement_put_onerrorupdate,
01541     HTMLElement_get_onerrorupdate,
01542     HTMLElement_put_onrowexit,
01543     HTMLElement_get_onrowexit,
01544     HTMLElement_put_onrowenter,
01545     HTMLElement_get_onrowenter,
01546     HTMLElement_put_ondatasetchanged,
01547     HTMLElement_get_ondatasetchanged,
01548     HTMLElement_put_ondataavailable,
01549     HTMLElement_get_ondataavailable,
01550     HTMLElement_put_ondatasetcomplete,
01551     HTMLElement_get_ondatasetcomplete,
01552     HTMLElement_put_onfilterchange,
01553     HTMLElement_get_onfilterchange,
01554     HTMLElement_get_children,
01555     HTMLElement_get_all
01556 };
01557 
01558 HRESULT HTMLElement_QI(HTMLDOMNode *iface, REFIID riid, void **ppv)
01559 {
01560     HTMLElement *This = HTMLELEM_NODE_THIS(iface);
01561 
01562     *ppv =  NULL;
01563 
01564     if(IsEqualGUID(&IID_IUnknown, riid)) {
01565         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
01566         *ppv = HTMLELEM(This);
01567     }else if(IsEqualGUID(&IID_IDispatch, riid)) {
01568         TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv);
01569         *ppv = HTMLELEM(This);
01570     }else if(IsEqualGUID(&IID_IHTMLElement, riid)) {
01571         TRACE("(%p)->(IID_IHTMLElement %p)\n", This, ppv);
01572         *ppv = HTMLELEM(This);
01573     }else if(IsEqualGUID(&IID_IHTMLElement2, riid)) {
01574         TRACE("(%p)->(IID_IHTMLElement2 %p)\n", This, ppv);
01575         *ppv = HTMLELEM2(This);
01576     }else if(IsEqualGUID(&IID_IHTMLElement3, riid)) {
01577         TRACE("(%p)->(IID_IHTMLElement3 %p)\n", This, ppv);
01578         *ppv = HTMLELEM3(This);
01579     }else if(IsEqualGUID(&IID_IConnectionPointContainer, riid)) {
01580         TRACE("(%p)->(IID_IConnectionPointContainer %p)\n", This, ppv);
01581         *ppv = CONPTCONT(&This->cp_container);
01582     }
01583 
01584     if(*ppv) {
01585         IHTMLElement_AddRef(HTMLELEM(This));
01586         return S_OK;
01587     }
01588 
01589     return HTMLDOMNode_QI(&This->node, riid, ppv);
01590 }
01591 
01592 void HTMLElement_destructor(HTMLDOMNode *iface)
01593 {
01594     HTMLElement *This = HTMLELEM_NODE_THIS(iface);
01595 
01596     ConnectionPointContainer_Destroy(&This->cp_container);
01597 
01598     if(This->nselem)
01599         nsIDOMHTMLElement_Release(This->nselem);
01600 
01601     HTMLDOMNode_destructor(&This->node);
01602 }
01603 
01604 static const NodeImplVtbl HTMLElementImplVtbl = {
01605     HTMLElement_QI,
01606     HTMLElement_destructor
01607 };
01608 
01609 static const tid_t HTMLElement_iface_tids[] = {
01610     HTMLELEMENT_TIDS,
01611     0
01612 };
01613 
01614 static dispex_static_data_vtbl_t HTMLElement_dispex_vtbl = {
01615     NULL,
01616     HTMLElement_get_dispid,
01617     HTMLElement_invoke
01618 };
01619 
01620 static dispex_static_data_t HTMLElement_dispex = {
01621     &HTMLElement_dispex_vtbl,
01622     DispHTMLUnknownElement_tid,
01623     NULL,
01624     HTMLElement_iface_tids
01625 };
01626 
01627 void HTMLElement_Init(HTMLElement *This, HTMLDocumentNode *doc, nsIDOMHTMLElement *nselem, dispex_static_data_t *dispex_data)
01628 {
01629     This->lpHTMLElementVtbl = &HTMLElementVtbl;
01630 
01631     HTMLElement2_Init(This);
01632     HTMLElement3_Init(This);
01633 
01634     if(dispex_data && !dispex_data->vtbl)
01635         dispex_data->vtbl = &HTMLElement_dispex_vtbl;
01636     init_dispex(&This->node.dispex, (IUnknown*)HTMLELEM(This), dispex_data ? dispex_data : &HTMLElement_dispex);
01637 
01638     if(nselem)
01639         nsIDOMHTMLElement_AddRef(nselem);
01640     This->nselem = nselem;
01641 
01642     HTMLDOMNode_Init(doc, &This->node, (nsIDOMNode*)nselem);
01643 
01644     ConnectionPointContainer_Init(&This->cp_container, (IUnknown*)HTMLELEM(This));
01645 }
01646 
01647 HTMLElement *HTMLElement_Create(HTMLDocumentNode *doc, nsIDOMNode *nsnode, BOOL use_generic)
01648 {
01649     nsIDOMHTMLElement *nselem;
01650     HTMLElement *ret = NULL;
01651     nsAString class_name_str;
01652     const PRUnichar *class_name;
01653     nsresult nsres;
01654 
01655     static const WCHAR wszA[]        = {'A',0};
01656     static const WCHAR wszBODY[]     = {'B','O','D','Y',0};
01657     static const WCHAR wszFORM[]     = {'F','O','R','M',0};
01658     static const WCHAR wszFRAME[]    = {'F','R','A','M','E',0};
01659     static const WCHAR wszIFRAME[]   = {'I','F','R','A','M','E',0};
01660     static const WCHAR wszIMG[]      = {'I','M','G',0};
01661     static const WCHAR wszINPUT[]    = {'I','N','P','U','T',0};
01662     static const WCHAR wszOPTION[]   = {'O','P','T','I','O','N',0};
01663     static const WCHAR wszSCRIPT[]   = {'S','C','R','I','P','T',0};
01664     static const WCHAR wszSELECT[]   = {'S','E','L','E','C','T',0};
01665     static const WCHAR wszTABLE[]    = {'T','A','B','L','E',0};
01666     static const WCHAR wszTR[]       = {'T','R',0};
01667     static const WCHAR wszTEXTAREA[] = {'T','E','X','T','A','R','E','A',0};
01668 
01669     nsres = nsIDOMNode_QueryInterface(nsnode, &IID_nsIDOMHTMLElement, (void**)&nselem);
01670     if(NS_FAILED(nsres))
01671         return NULL;
01672 
01673     nsAString_Init(&class_name_str, NULL);
01674     nsIDOMHTMLElement_GetTagName(nselem, &class_name_str);
01675 
01676     nsAString_GetData(&class_name_str, &class_name);
01677 
01678     if(!strcmpW(class_name, wszA))
01679         ret = HTMLAnchorElement_Create(doc, nselem);
01680     else if(!strcmpW(class_name, wszBODY))
01681         ret = HTMLBodyElement_Create(doc, nselem);
01682     else if(!strcmpW(class_name, wszFORM))
01683         ret = HTMLFormElement_Create(doc, nselem);
01684     else if(!strcmpW(class_name, wszFRAME))
01685         ret = HTMLFrameElement_Create(doc, nselem);
01686     else if(!strcmpW(class_name, wszIFRAME))
01687         ret = HTMLIFrame_Create(doc, nselem);
01688     else if(!strcmpW(class_name, wszIMG))
01689         ret = HTMLImgElement_Create(doc, nselem);
01690     else if(!strcmpW(class_name, wszINPUT))
01691         ret = HTMLInputElement_Create(doc, nselem);
01692     else if(!strcmpW(class_name, wszOPTION))
01693         ret = HTMLOptionElement_Create(doc, nselem);
01694     else if(!strcmpW(class_name, wszSCRIPT))
01695         ret = HTMLScriptElement_Create(doc, nselem);
01696     else if(!strcmpW(class_name, wszSELECT))
01697         ret = HTMLSelectElement_Create(doc, nselem);
01698     else if(!strcmpW(class_name, wszTABLE))
01699         ret = HTMLTable_Create(doc, nselem);
01700     else if(!strcmpW(class_name, wszTR))
01701         ret = HTMLTableRow_Create(doc, nselem);
01702     else if(!strcmpW(class_name, wszTEXTAREA))
01703         ret = HTMLTextAreaElement_Create(doc, nselem);
01704     else if(use_generic)
01705         ret = HTMLGenericElement_Create(doc, nselem);
01706 
01707     if(!ret) {
01708         ret = heap_alloc_zero(sizeof(HTMLElement));
01709         HTMLElement_Init(ret, doc, nselem, &HTMLElement_dispex);
01710         ret->node.vtbl = &HTMLElementImplVtbl;
01711     }
01712 
01713     TRACE("%s ret %p\n", debugstr_w(class_name), ret);
01714 
01715     nsIDOMElement_Release(nselem);
01716     nsAString_Finish(&class_name_str);
01717 
01718     return ret;
01719 }
01720 
01721 /* interaface IHTMLFiltersCollection */
01722 static HRESULT WINAPI HTMLFiltersCollection_QueryInterface(IHTMLFiltersCollection *iface, REFIID riid, void **ppv)
01723 {
01724     HTMLFiltersCollection *This = HTMLFILTERSCOLLECTION_THIS(iface);
01725 
01726     TRACE("%p %s %p\n", This, debugstr_guid( riid ), ppv );
01727 
01728     if(IsEqualGUID(&IID_IUnknown, riid)) {
01729         TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
01730         *ppv = HTMLFILTERSCOLLECTION(This);
01731     }else if(IsEqualGUID(&IID_IHTMLFiltersCollection, riid)) {
01732         TRACE("(%p)->(IID_IHTMLFiltersCollection %p)\n", This, ppv);
01733         *ppv = HTMLFILTERSCOLLECTION(This);
01734     }else if(dispex_query_interface(&This->dispex, riid, ppv)) {
01735         return *ppv ? S_OK : E_NOINTERFACE;
01736     }
01737 
01738     if(*ppv) {
01739         IUnknown_AddRef((IUnknown*)*ppv);
01740         return S_OK;
01741     }
01742 
01743     FIXME("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppv);
01744     return E_NOINTERFACE;
01745 }
01746 
01747 static ULONG WINAPI HTMLFiltersCollection_AddRef(IHTMLFiltersCollection *iface)
01748 {
01749     HTMLFiltersCollection *This = HTMLFILTERSCOLLECTION_THIS(iface);
01750     LONG ref = InterlockedIncrement(&This->ref);
01751 
01752     TRACE("(%p) ref=%d\n", This, ref);
01753 
01754     return ref;
01755 }
01756 
01757 static ULONG WINAPI HTMLFiltersCollection_Release(IHTMLFiltersCollection *iface)
01758 {
01759     HTMLFiltersCollection *This = HTMLFILTERSCOLLECTION_THIS(iface);
01760     LONG ref = InterlockedDecrement(&This->ref);
01761 
01762     TRACE("(%p) ref=%d\n", This, ref);
01763 
01764     if(!ref)
01765     {
01766         heap_free(This);
01767     }
01768 
01769     return ref;
01770 }
01771 
01772 static HRESULT WINAPI HTMLFiltersCollection_GetTypeInfoCount(IHTMLFiltersCollection *iface, UINT *pctinfo)
01773 {
01774     HTMLFiltersCollection *This = HTMLFILTERSCOLLECTION_THIS(iface);
01775     return IDispatchEx_GetTypeInfoCount(DISPATCHEX(&This->dispex), pctinfo);
01776 }
01777 
01778 static HRESULT WINAPI HTMLFiltersCollection_GetTypeInfo(IHTMLFiltersCollection *iface,
01779                                     UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
01780 {
01781     HTMLFiltersCollection *This = HTMLFILTERSCOLLECTION_THIS(iface);
01782     return IDispatchEx_GetTypeInfo(DISPATCHEX(&This->dispex), iTInfo, lcid, ppTInfo);
01783 }
01784 
01785 static HRESULT WINAPI HTMLFiltersCollection_GetIDsOfNames(IHTMLFiltersCollection *iface,
01786                                     REFIID riid, LPOLESTR *rgszNames, UINT cNames,
01787                                     LCID lcid, DISPID *rgDispId)
01788 {
01789     HTMLFiltersCollection *This = HTMLFILTERSCOLLECTION_THIS(iface);
01790     return IDispatchEx_GetIDsOfNames(DISPATCHEX(&This->dispex), riid, rgszNames, cNames, lcid, rgDispId);
01791 }
01792 
01793 static HRESULT WINAPI HTMLFiltersCollection_Invoke(IHTMLFiltersCollection *iface, DISPID dispIdMember, REFIID riid,
01794                                     LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult,
01795                                     EXCEPINFO *pExcepInfo, UINT *puArgErr)
01796 {
01797     HTMLFiltersCollection *This = HTMLFILTERSCOLLECTION_THIS(iface);
01798     return IDispatchEx_Invoke(DISPATCHEX(&This->dispex), dispIdMember, riid, lcid,
01799             wFlags, pDispParams, pVarResult, pExcepInfo, puArgErr);
01800 }
01801 
01802 static HRESULT WINAPI HTMLFiltersCollection_get_length(IHTMLFiltersCollection *iface, LONG *p)
01803 {
01804     HTMLFiltersCollection *This = HTMLFILTERSCOLLECTION_THIS(iface);
01805 
01806     if(!p)
01807         return E_POINTER;
01808 
01809     FIXME("(%p)->(%p) Always returning 0\n", This, p);
01810     *p = 0;
01811 
01812     return S_OK;
01813 }
01814 
01815 static HRESULT WINAPI HTMLFiltersCollection_get__newEnum(IHTMLFiltersCollection *iface, IUnknown **p)
01816 {
01817     HTMLFiltersCollection *This = HTMLFILTERSCOLLECTION_THIS(iface);
01818     FIXME("(%p)->(%p)\n", This, p);
01819     return E_NOTIMPL;
01820 }
01821 
01822 static HRESULT WINAPI HTMLFiltersCollection_item(IHTMLFiltersCollection *iface, VARIANT *pvarIndex, VARIANT *pvarResult)
01823 {
01824     HTMLFiltersCollection *This = HTMLFILTERSCOLLECTION_THIS(iface);
01825     FIXME("(%p)->(%p, %p)\n", This, pvarIndex, pvarResult);
01826     return E_NOTIMPL;
01827 }
01828 
01829 static const IHTMLFiltersCollectionVtbl HTMLFiltersCollectionVtbl = {
01830     HTMLFiltersCollection_QueryInterface,
01831     HTMLFiltersCollection_AddRef,
01832     HTMLFiltersCollection_Release,
01833     HTMLFiltersCollection_GetTypeInfoCount,
01834     HTMLFiltersCollection_GetTypeInfo,
01835     HTMLFiltersCollection_GetIDsOfNames,
01836     HTMLFiltersCollection_Invoke,
01837     HTMLFiltersCollection_get_length,
01838     HTMLFiltersCollection_get__newEnum,
01839     HTMLFiltersCollection_item
01840 };
01841 
01842 static HRESULT HTMLFiltersCollection_get_dispid(IUnknown *iface, BSTR name, DWORD flags, DISPID *dispid)
01843 {
01844     WCHAR *ptr;
01845     int idx = 0;
01846 
01847     for(ptr = name; *ptr && isdigitW(*ptr); ptr++)
01848         idx = idx*10 + (*ptr-'0');
01849     if(*ptr)
01850         return DISP_E_UNKNOWNNAME;
01851 
01852     *dispid = MSHTML_DISPID_CUSTOM_MIN + idx;
01853     TRACE("ret %x\n", *dispid);
01854     return S_OK;
01855 }
01856 
01857 static HRESULT HTMLFiltersCollection_invoke(IUnknown *iface, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params,
01858         VARIANT *res, EXCEPINFO *ei, IServiceProvider *caller)
01859 {
01860     HTMLFiltersCollection *This = HTMLFILTERSCOLLECTION_THIS(iface);
01861 
01862     TRACE("(%p)->(%x %x %x %p %p %p)\n", This, id, lcid, flags, params, res, ei);
01863 
01864     V_VT(res) = VT_DISPATCH;
01865     V_DISPATCH(res) = NULL;
01866 
01867     FIXME("always returning NULL\n");
01868 
01869     return S_OK;
01870 }
01871 
01872 static const dispex_static_data_vtbl_t HTMLFiltersCollection_dispex_vtbl = {
01873     NULL,
01874     HTMLFiltersCollection_get_dispid,
01875     HTMLFiltersCollection_invoke
01876 };
01877 
01878 static const tid_t HTMLFiltersCollection_iface_tids[] = {
01879     IHTMLFiltersCollection_tid,
01880     0
01881 };
01882 static dispex_static_data_t HTMLFiltersCollection_dispex = {
01883     &HTMLFiltersCollection_dispex_vtbl,
01884     IHTMLFiltersCollection_tid,
01885     NULL,
01886     HTMLFiltersCollection_iface_tids
01887 };
01888 
01889 IHTMLFiltersCollection *HTMLFiltersCollection_Create()
01890 {
01891     HTMLFiltersCollection *ret = heap_alloc(sizeof(HTMLFiltersCollection));
01892 
01893     ret->lpHTMLFiltersCollectionVtbl = &HTMLFiltersCollectionVtbl;
01894     ret->ref = 1;
01895 
01896     init_dispex(&ret->dispex, (IUnknown*)HTMLFILTERSCOLLECTION(ret),  &HTMLFiltersCollection_dispex);
01897 
01898     return HTMLFILTERSCOLLECTION(ret);
01899 }

Generated on Sun May 27 2012 04:24:55 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.