static HRESULT WINAPI HTMLFormElement_put_action(IHTMLFormElement *iface, BSTR v) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); nsAString action_str; nsresult nsres; TRACE("(%p)->(%s)\n", This, wine_dbgstr_w(v)); nsAString_InitDepend(&action_str, v); nsres = nsIDOMHTMLFormElement_SetAction(This->nsform, &action_str); nsAString_Finish(&action_str); if(NS_FAILED(nsres)) { ERR("SetAction failed: %08x\n", nsres); return E_FAIL; } return S_OK; }
static HRESULT WINAPI HTMLBodyElement_put_bgColor(IHTMLBodyElement *iface, VARIANT v) { HTMLBodyElement *This = impl_from_IHTMLBodyElement(iface); nsAString strColor; nsresult nsres; TRACE("(%p)->(%s)\n", This, debugstr_variant(&v)); if(!variant_to_nscolor(&v, &strColor)) return S_OK; nsres = nsIDOMHTMLBodyElement_SetBgColor(This->nsbody, &strColor); nsAString_Finish(&strColor); if(NS_FAILED(nsres)) ERR("SetBgColor failed: %08x\n", nsres); return S_OK; }
static HRESULT WINAPI HTMLFrameBase_get_marginHeight(IHTMLFrameBase *iface, VARIANT *p) { HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); nsAString nsstr; nsresult nsres; HRESULT hres = S_OK; TRACE("(%p)->(%p)\n", This, p); nsAString_Init(&nsstr, NULL); if(This->nsframe) nsres = nsIDOMHTMLFrameElement_GetMarginHeight(This->nsframe, &nsstr); else nsres = nsIDOMHTMLIFrameElement_GetMarginHeight(This->nsiframe, &nsstr); if(NS_SUCCEEDED(nsres)) { const PRUnichar *str, *end; nsAString_GetData(&nsstr, &str); if(*str) { BSTR ret; end = strstrW(str, pxW); if(!end) end = str+strlenW(str); ret = SysAllocStringLen(str, end-str); if(ret) { V_VT(p) = VT_BSTR; V_BSTR(p) = ret; }else { hres = E_OUTOFMEMORY; } }else { V_VT(p) = VT_BSTR; V_BSTR(p) = NULL; } }else { ERR("SetMarginHeight failed: %08x\n", nsres); hres = E_FAIL; } nsAString_Finish(&nsstr); return hres; }
static IHTMLEventObj *create_event(HTMLDOMNode *target, eventid_t eid, nsIDOMEvent *nsevent) { HTMLEventObj *ret; ret = heap_alloc(sizeof(*ret)); if(!ret) return NULL; ret->IHTMLEventObj_iface.lpVtbl = &HTMLEventObjVtbl; ret->ref = 1; ret->type = event_info+eid; ret->nsevent = nsevent; if(nsevent) { nsIDOMEvent_AddRef(nsevent); }else if(event_types[event_info[eid].type]) { nsIDOMDocumentEvent *doc_event; nsresult nsres; nsres = nsIDOMHTMLDocument_QueryInterface(target->doc->nsdoc, &IID_nsIDOMDocumentEvent, (void**)&doc_event); if(NS_SUCCEEDED(nsres)) { nsAString type_str; nsAString_InitDepend(&type_str, event_types[event_info[eid].type]); nsres = nsIDOMDocumentEvent_CreateEvent(doc_event, &type_str, &ret->nsevent); nsAString_Finish(&type_str); nsIDOMDocumentEvent_Release(doc_event); } if(NS_FAILED(nsres)) { ERR("Could not create event: %08x\n", nsres); IHTMLEventObj_Release(&ret->IHTMLEventObj_iface); return NULL; } } ret->target = target; IHTMLDOMNode_AddRef(&target->IHTMLDOMNode_iface); init_dispex(&ret->dispex, (IUnknown*)&ret->IHTMLEventObj_iface, &HTMLEventObj_dispex); return &ret->IHTMLEventObj_iface; }
static HRESULT WINAPI HTMLLinkElement_put_media(IHTMLLinkElement *iface, BSTR v) { HTMLLinkElement *This = impl_from_IHTMLLinkElement(iface); nsresult nsres; nsAString str; TRACE("(%p)->(%s)\n", This, debugstr_w(v)); nsAString_InitDepend(&str, v); nsres = nsIDOMHTMLLinkElement_SetMedia(This->nslink, &str); nsAString_Finish(&str); if(NS_FAILED(nsres)) { ERR("Set Media(%s) failed: %08x\n", debugstr_w(v), nsres); return E_FAIL; } return S_OK; }
static HRESULT WINAPI HTMLElement3_put_contentEditable(IHTMLElement3 *iface, BSTR v) { HTMLElement *This = impl_from_IHTMLElement3(iface); nsresult nsres; nsAString str; TRACE("(%p)->(%s)\n", This, debugstr_w(v)); nsAString_InitDepend(&str, v); nsres = nsIDOMHTMLElement_SetContentEditable(This->nselem, &str); nsAString_Finish(&str); if (NS_FAILED(nsres)){ ERR("SetContentEditable(%s) failed!\n", debugstr_w(v)); return E_FAIL; } return S_OK; }
static HRESULT WINAPI HTMLTable3_put_summary(IHTMLTable3 *iface, BSTR v) { HTMLTable *This = impl_from_IHTMLTable3(iface); nsAString str; nsresult nsres; TRACE("(%p)->(%s)\n", This, debugstr_w(v)); nsAString_InitDepend(&str, v); nsres = nsIDOMHTMLTableElement_SetSummary(This->nstable, &str); nsAString_Finish(&str); if (NS_FAILED(nsres)) { ERR("Set summary(%s) failed: %08x\n", debugstr_w(v), nsres); return E_FAIL; } return S_OK; }
static HRESULT WINAPI HTMLDOMAttribute_get_specified(IHTMLDOMAttribute *iface, VARIANT_BOOL *p) { HTMLDOMAttribute *This = impl_from_IHTMLDOMAttribute(iface); nsIDOMAttr *nsattr; nsAString nsname; BSTR name; nsresult nsres; HRESULT hres; TRACE("(%p)->(%p)\n", This, p); if(!This->elem || !This->elem->nselem) { FIXME("NULL This->elem\n"); return E_UNEXPECTED; } if(get_dispid_type(This->dispid) != DISPEXPROP_BUILTIN) { *p = VARIANT_TRUE; return S_OK; } hres = IDispatchEx_GetMemberName(&This->elem->node.event_target.dispex.IDispatchEx_iface, This->dispid, &name); if(FAILED(hres)) return hres; /* FIXME: This is not exactly right, we have some attributes that don't map directly to Gecko attributes. */ nsAString_InitDepend(&nsname, name); nsres = nsIDOMHTMLElement_GetAttributeNode(This->elem->nselem, &nsname, &nsattr); nsAString_Finish(&nsname); SysFreeString(name); if(NS_FAILED(nsres)) return E_FAIL; /* If the Gecko attribute node can be found, we know that the attribute is specified. There is no point in calling GetSpecified */ if(nsattr) { nsIDOMAttr_Release(nsattr); *p = VARIANT_TRUE; }else { *p = VARIANT_FALSE; } return S_OK; }
static nsresult NSAPI handle_htmlevent(nsIDOMEventListener *iface, nsIDOMEvent *event) { nsEventListener *This = impl_from_nsIDOMEventListener(iface); HTMLDocumentNode *doc = This->This->doc; const PRUnichar *type; nsIDOMEventTarget *event_target; nsIDOMNode *nsnode; nsAString type_str; eventid_t eid; nsresult nsres; TRACE("%p\n", This->This); if(!doc) { WARN("NULL doc\n"); return NS_OK; } nsAString_Init(&type_str, NULL); nsIDOMEvent_GetType(event, &type_str); nsAString_GetData(&type_str, &type); eid = str_to_eid(type); nsAString_Finish(&type_str); nsres = nsIDOMEvent_GetTarget(event, &event_target); if(NS_FAILED(nsres) || !event_target) { ERR("GetEventTarget failed: %08x\n", nsres); return NS_OK; } nsres = nsIDOMEventTarget_QueryInterface(event_target, &IID_nsIDOMNode, (void**)&nsnode); nsIDOMEventTarget_Release(event_target); if(NS_FAILED(nsres)) { ERR("Could not get nsIDOMNode: %08x\n", nsres); return NS_OK; } fire_event(doc, eid, TRUE, nsnode, event, NULL); nsIDOMNode_Release(nsnode); return NS_OK; }
static HRESULT WINAPI HTMLElementCollection_tags(IHTMLElementCollection *iface, VARIANT tagName, IDispatch **pdisp) { HTMLElementCollection *This = impl_from_IHTMLElementCollection(iface); DWORD i; nsAString tag_str; const PRUnichar *tag; elem_vector_t buf = {NULL, 0, 8}; if(V_VT(&tagName) != VT_BSTR) { WARN("Invalid arg\n"); return DISP_E_MEMBERNOTFOUND; } TRACE("(%p)->(%s %p)\n", This, debugstr_w(V_BSTR(&tagName)), pdisp); buf.buf = heap_alloc(buf.size*sizeof(HTMLElement*)); nsAString_Init(&tag_str, NULL); for(i=0; i<This->len; i++) { if(!This->elems[i]->nselem) continue; nsIDOMHTMLElement_GetTagName(This->elems[i]->nselem, &tag_str); nsAString_GetData(&tag_str, &tag); if(CompareStringW(LOCALE_SYSTEM_DEFAULT, NORM_IGNORECASE, tag, -1, V_BSTR(&tagName), -1) == CSTR_EQUAL) { node_addref(&This->elems[i]->node); elem_vector_add(&buf, This->elems[i]); } } nsAString_Finish(&tag_str); elem_vector_normalize(&buf); TRACE("fount %d tags\n", buf.len); *pdisp = (IDispatch*)HTMLElementCollection_Create(buf.buf, buf.len); return S_OK; }
static HRESULT WINAPI HTMLDocument3_getElementsByName(IHTMLDocument3 *iface, BSTR v, IHTMLElementCollection **ppelColl) { HTMLDocument *This = impl_from_IHTMLDocument3(iface); nsIDOMNodeList *node_list; nsAString selector_str; WCHAR *selector; nsresult nsres; static const WCHAR formatW[] = {'*','[','i','d','=','%','s',']',',','*','[','n','a','m','e','=','%','s',']',0}; TRACE("(%p)->(%s %p)\n", This, debugstr_w(v), ppelColl); if(!This->doc_node || !This->doc_node->nsdoc) { /* We should probably return an empty collection. */ FIXME("No nsdoc\n"); return E_NOTIMPL; } selector = heap_alloc(2*SysStringLen(v)*sizeof(WCHAR) + sizeof(formatW)); if(!selector) return E_OUTOFMEMORY; sprintfW(selector, formatW, v, v); /* * NOTE: IE getElementsByName implementation differs from Gecko. It searches both name and id attributes. * That's why we use CSS selector instead. We should also use name only when it applies to given element * types and search should be case insensitive. Those are currently not supported properly. */ nsAString_InitDepend(&selector_str, selector); nsres = nsIDOMNodeSelector_QuerySelectorAll(This->doc_node->nsnode_selector, &selector_str, &node_list); nsAString_Finish(&selector_str); heap_free(selector); if(NS_FAILED(nsres)) { ERR("QuerySelectorAll failed: %08x\n", nsres); return E_FAIL; } *ppelColl = create_collection_from_nodelist(This->doc_node, node_list); nsIDOMNodeList_Release(node_list); return S_OK; }
static HRESULT WINAPI HTMLBodyElement_put_text(IHTMLBodyElement *iface, VARIANT v) { HTMLBodyElement *This = impl_from_IHTMLBodyElement(iface); nsAString text; nsresult nsres; TRACE("(%p)->(v%d)\n", This, V_VT(&v)); if(!variant_to_nscolor(&v, &text)) return S_OK; nsres = nsIDOMHTMLBodyElement_SetText(This->nsbody, &text); nsAString_Finish(&text); if(NS_FAILED(nsres)) { ERR("SetText failed: %08x\n", nsres); return E_FAIL; } return S_OK; }
static HRESULT WINAPI HTMLTable_put_bgColor(IHTMLTable *iface, VARIANT v) { HTMLTable *This = impl_from_IHTMLTable(iface); nsAString val; nsresult nsres; TRACE("(%p)->(%s)\n", This, debugstr_variant(&v)); if(!variant_to_nscolor(&v, &val)) return S_OK; nsres = nsIDOMHTMLTableElement_SetBgColor(This->nstable, &val); nsAString_Finish(&val); if (NS_FAILED(nsres)){ ERR("Set BgColor(%s) failed!\n", debugstr_variant(&v)); return E_FAIL; } return S_OK; }
static HRESULT WINAPI HTMLTableRow_put_vAlign(IHTMLTableRow *iface, BSTR v) { HTMLTableRow *This = impl_from_IHTMLTableRow(iface); nsAString val; nsresult nsres; TRACE("(%p)->(%s)\n", This, debugstr_w(v)); nsAString_InitDepend(&val, v); nsres = nsIDOMHTMLTableRowElement_SetVAlign(This->nsrow, &val); nsAString_Finish(&val); if (NS_FAILED(nsres)){ ERR("Set VAlign(%s) failed!\n", debugstr_w(v)); return E_FAIL; } return S_OK; }
static HRESULT WINAPI HTMLScriptElement_get_type(IHTMLScriptElement *iface, BSTR *p) { HTMLScriptElement *This = impl_from_IHTMLScriptElement(iface); const PRUnichar *nstype; nsAString nstype_str; nsresult nsres; TRACE("(%p)->(%p)\n", This, p); nsAString_Init(&nstype_str, NULL); nsres = nsIDOMHTMLScriptElement_GetType(This->nsscript, &nstype_str); if(NS_FAILED(nsres)) ERR("GetType failed: %08x\n", nsres); nsAString_GetData(&nstype_str, &nstype); *p = *nstype ? SysAllocString(nstype) : NULL; nsAString_Finish(&nstype_str); return S_OK; }
static HRESULT WINAPI HTMLXMLHttpRequest_send(IHTMLXMLHttpRequest *iface, VARIANT varBody) { HTMLXMLHttpRequest *This = impl_from_IHTMLXMLHttpRequest(iface); nsIWritableVariant *nsbody = NULL; nsresult nsres = NS_OK; TRACE("(%p)->(%s)\n", This, debugstr_variant(&varBody)); switch(V_VT(&varBody)) { case VT_NULL: case VT_EMPTY: case VT_ERROR: break; case VT_BSTR: { nsAString nsstr; nsbody = create_nsvariant(); if(!nsbody) return E_OUTOFMEMORY; nsAString_InitDepend(&nsstr, V_BSTR(&varBody)); nsres = nsIWritableVariant_SetAsAString(nsbody, &nsstr); nsAString_Finish(&nsstr); break; } default: FIXME("unsupported body type %s\n", debugstr_variant(&varBody)); return E_NOTIMPL; } if(NS_SUCCEEDED(nsres)) nsres = nsIXMLHttpRequest_Send(This->nsxhr, (nsIVariant*)nsbody); if(nsbody) nsIWritableVariant_Release(nsbody); if(NS_FAILED(nsres)) { ERR("nsIXMLHttpRequest_Send failed: %08x\n", nsres); return E_FAIL; } return S_OK; }
static HRESULT WINAPI HTMLFrameBase_put_marginHeight(IHTMLFrameBase *iface, VARIANT v) { HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); nsAString nsstr; nsresult nsres; TRACE("(%p)->(%s)\n", This, debugstr_variant(&v)); if(V_VT(&v) != VT_BSTR) { FIXME("unsupported %s\n", debugstr_variant(&v)); return E_NOTIMPL; } nsAString_InitDepend(&nsstr, V_BSTR(&v)); if(This->nsframe) nsres = nsIDOMHTMLFrameElement_SetMarginHeight(This->nsframe, &nsstr); else nsres = nsIDOMHTMLIFrameElement_SetMarginHeight(This->nsiframe, &nsstr); nsAString_Finish(&nsstr); return NS_SUCCEEDED(nsres) ? S_OK : E_FAIL; }
static void detach_xhr_event_listener(XMLHttpReqEventListener *event_listener) { nsIDOMEventTarget *event_target; nsAString str; nsresult nsres; static const WCHAR readystatechangeW[] = {'o','n','r','e','a','d','y','s','t','a','t','e','c','h','a','n','g','e',0}; nsres = nsIXMLHttpRequest_QueryInterface(event_listener->xhr->nsxhr, &IID_nsIDOMEventTarget, (void**)&event_target); assert(nsres == NS_OK); nsAString_InitDepend(&str, readystatechangeW); nsres = nsIDOMEventTarget_RemoveEventListener(event_target, &str, &event_listener->nsIDOMEventListener_iface, FALSE); nsAString_Finish(&str); nsIDOMEventTarget_Release(event_target); event_listener->xhr->event_listener = NULL; event_listener->xhr = NULL; nsIDOMEventListener_Release(&event_listener->nsIDOMEventListener_iface); }
static HRESULT WINAPI HTMLDocument5_get_compatMode(IHTMLDocument5 *iface, BSTR *p) { HTMLDocument *This = impl_from_IHTMLDocument5(iface); nsAString mode_str; const PRUnichar *mode; TRACE("(%p)->(%p)\n", This, p); if(!This->doc_node->nsdoc) { WARN("NULL nsdoc\n"); return E_UNEXPECTED; } nsAString_Init(&mode_str, NULL); nsIDOMHTMLDocument_GetCompatMode(This->doc_node->nsdoc, &mode_str); nsAString_GetData(&mode_str, &mode); *p = SysAllocString(mode); nsAString_Finish(&mode_str); return S_OK; }
static HRESULT WINAPI HTMLImgElement_get_alt(IHTMLImgElement *iface, BSTR *p) { HTMLImgElement *This = HTMLIMG_THIS(iface); nsAString alt_str; nsresult nsres; TRACE("(%p)->(%p)\n", This, p); nsAString_Init(&alt_str, NULL); nsres = nsIDOMHTMLImageElement_GetAlt(This->nsimg, &alt_str); if(NS_SUCCEEDED(nsres)) { const PRUnichar *alt; nsAString_GetData(&alt_str, &alt); *p = *alt ? SysAllocString(alt) : NULL; } else { ERR("GetAlt failed: %08x\n", nsres); } nsAString_Finish(&alt_str); return NS_SUCCEEDED(nsres) ? S_OK : E_FAIL; }
static HRESULT WINAPI HTMLElement2_getElementsByTagName(IHTMLElement2 *iface, BSTR v, IHTMLElementCollection **pelColl) { HTMLElement *This = impl_from_IHTMLElement2(iface); nsIDOMNodeList *nslist; nsAString tag_str; nsresult nsres; TRACE("(%p)->(%s %p)\n", This, debugstr_w(v), pelColl); nsAString_InitDepend(&tag_str, v); nsres = nsIDOMHTMLElement_GetElementsByTagName(This->nselem, &tag_str, &nslist); nsAString_Finish(&tag_str); if(NS_FAILED(nsres)) { ERR("GetElementByTagName failed: %08x\n", nsres); return E_FAIL; } *pelColl = create_collection_from_nodelist(This->node.doc, nslist); nsIDOMNodeList_Release(nslist); return S_OK; }
static HRESULT WINAPI HTMLImgElement_get_name(IHTMLImgElement *iface, BSTR *p) { HTMLImgElement *This = impl_from_IHTMLImgElement(iface); nsAString strName; nsresult nsres; TRACE("(%p)->(%p)\n", This, p); nsAString_Init(&strName, NULL); nsres = nsIDOMHTMLImageElement_GetName(This->nsimg, &strName); if(NS_SUCCEEDED(nsres)) { const PRUnichar *str; nsAString_GetData(&strName, &str); *p = *str ? SysAllocString(str) : NULL; }else { ERR("GetName failed: %08x\n", nsres); } nsAString_Finish(&strName); return NS_SUCCEEDED(nsres) ? S_OK : E_FAIL; }
static HRESULT WINAPI HTMLInputElement_put_type(IHTMLInputElement *iface, BSTR v) { HTMLInputElement *This = impl_from_IHTMLInputElement(iface); nsAString type_str; nsresult nsres; TRACE("(%p)->(%s)\n", This, debugstr_w(v)); /* * FIXME: * On IE setting type works only on dynamically created elements before adding them to DOM tree. */ nsAString_InitDepend(&type_str, v); nsres = nsIDOMHTMLInputElement_SetType(This->nsinput, &type_str); nsAString_Finish(&type_str); if(NS_FAILED(nsres)) { ERR("SetType failed: %08x\n", nsres); return E_FAIL; } return S_OK; }
static HRESULT WINAPI HTMLOptionElement_get_value(IHTMLOptionElement *iface, BSTR *p) { HTMLOptionElement *This = HTMLOPTION_THIS(iface); nsAString value_str; const PRUnichar *value; nsresult nsres; TRACE("(%p)->(%p)\n", This, p); nsAString_Init(&value_str, NULL); nsres = nsIDOMHTMLOptionElement_GetValue(This->nsoption, &value_str); if(NS_SUCCEEDED(nsres)) { nsAString_GetData(&value_str, &value); *p = SysAllocString(value); } else { ERR("GetValue failed: %08x\n", nsres); *p = NULL; } nsAString_Finish(&value_str); return S_OK; }
static HRESULT WINAPI HTMLOptionElement_get_text(IHTMLOptionElement *iface, BSTR *p) { HTMLOptionElement *This = impl_from_IHTMLOptionElement(iface); nsAString text_str; const PRUnichar *text; nsresult nsres; TRACE("(%p)->(%p)\n", This, p); nsAString_Init(&text_str, NULL); nsres = nsIDOMHTMLOptionElement_GetText(This->nsoption, &text_str); if(NS_SUCCEEDED(nsres)) { nsAString_GetData(&text_str, &text); *p = SysAllocString(text); }else { ERR("GetText failed: %08x\n", nsres); *p = NULL; } nsAString_Finish(&text_str); return S_OK; }
static HRESULT WINAPI HTMLInputElement_get_src(IHTMLInputElement *iface, BSTR *p) { HTMLInputElement *This = impl_from_IHTMLInputElement(iface); const PRUnichar *src; nsAString src_str; nsresult nsres; HRESULT hres; TRACE("(%p)->(%p)\n", This, p); nsAString_Init(&src_str, NULL); nsres = nsIDOMHTMLInputElement_GetSrc(This->nsinput, &src_str); if(NS_FAILED(nsres)) { ERR("GetSrc failed: %08x\n", nsres); return E_FAIL; } nsAString_GetData(&src_str, &src); hres = nsuri_to_url(src, FALSE, p); nsAString_Finish(&src_str); return hres; }
static void detach_nslistener(HTMLDocumentNode *doc, const WCHAR *type, nsEventListener *listener, cpp_bool is_capture) { nsIDOMEventTarget *target; nsAString type_str; nsresult nsres; if(!doc->basedoc.window) return; nsres = nsIDOMWindow_QueryInterface(doc->basedoc.window->nswindow, &IID_nsIDOMEventTarget, (void**)&target); if(NS_FAILED(nsres)) { ERR("Could not get nsIDOMEventTarget interface: %08x\n", nsres); return; } nsAString_InitDepend(&type_str, type); nsres = nsIDOMEventTarget_RemoveEventListener(target, &type_str, &listener->nsIDOMEventListener_iface, is_capture); nsAString_Finish(&type_str); nsIDOMEventTarget_Release(target); if(NS_FAILED(nsres)) ERR("RemoveEventTarget failed: %08x\n", nsres); }
static HRESULT WINAPI HTMLFormElement_get_action(IHTMLFormElement *iface, BSTR *p) { HTMLFormElement *This = impl_from_IHTMLFormElement(iface); nsAString action_str; nsresult nsres; HRESULT hres; TRACE("(%p)->(%p)\n", This, p); nsAString_Init(&action_str, NULL); nsres = nsIDOMHTMLFormElement_GetAction(This->nsform, &action_str); if(NS_SUCCEEDED(nsres)) { const PRUnichar *action; nsAString_GetData(&action_str, &action); hres = nsuri_to_url(action, FALSE, p); }else { ERR("GetAction failed: %08x\n", nsres); hres = E_FAIL; } nsAString_Finish(&action_str); return hres; }
static HRESULT WINAPI HTMLDOMNode_put_nodeValue(IHTMLDOMNode *iface, VARIANT v) { HTMLDOMNode *This = impl_from_IHTMLDOMNode(iface); TRACE("(%p)->(%s)\n", This, debugstr_variant(&v)); switch(V_VT(&v)) { case VT_BSTR: { nsAString val_str; nsAString_InitDepend(&val_str, V_BSTR(&v)); nsIDOMNode_SetNodeValue(This->nsnode, &val_str); nsAString_Finish(&val_str); return S_OK; } default: FIXME("unsupported value %s\n", debugstr_variant(&v)); } return E_NOTIMPL; }
static HRESULT WINAPI HTMLDOMNode_get_nodeValue(IHTMLDOMNode *iface, VARIANT *p) { HTMLDOMNode *This = impl_from_IHTMLDOMNode(iface); const PRUnichar *val; nsAString val_str; TRACE("(%p)->(%p)\n", This, p); nsAString_Init(&val_str, NULL); nsIDOMNode_GetNodeValue(This->nsnode, &val_str); nsAString_GetData(&val_str, &val); if(*val) { V_VT(p) = VT_BSTR; V_BSTR(p) = SysAllocString(val); }else { V_VT(p) = VT_NULL; } nsAString_Finish(&val_str); return S_OK; }