Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenhtmlelem.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
1.7.6.1
|