static HRESULT WINAPI HTMLSelectElement_add(IHTMLSelectElement *iface, IHTMLElement *element, VARIANT before) { HTMLSelectElement *This = impl_from_IHTMLSelectElement(iface); IHTMLDOMNode *node, *tmp; HRESULT hres; FIXME("(%p)->(%p %s): semi-stub\n", This, element, debugstr_variant(&before)); if(V_VT(&before) != VT_EMPTY) { FIXME("unhandled before %s\n", debugstr_variant(&before)); return E_NOTIMPL; } hres = IHTMLElement_QueryInterface(element, &IID_IHTMLDOMNode, (void**)&node); if(FAILED(hres)) return hres; hres = IHTMLDOMNode_appendChild(&This->element.node.IHTMLDOMNode_iface, node, &tmp); IHTMLDOMNode_Release(node); if(SUCCEEDED(hres) && tmp) IHTMLDOMNode_Release(tmp); return hres; }
static HRESULT WINAPI HTMLTextAreaElement_get_form(IHTMLTextAreaElement *iface, IHTMLFormElement **p) { HTMLTextAreaElement *This = impl_from_IHTMLTextAreaElement(iface); nsIDOMHTMLFormElement *nsform; nsIDOMNode *nsnode; HTMLDOMNode *node; nsresult nsres; HRESULT hres; TRACE("(%p)->(%p)\n", This, p); nsres = nsIDOMHTMLTextAreaElement_GetForm(This->nstextarea, &nsform); assert(nsres == NS_OK); if(!nsform) { *p = NULL; return S_OK; } nsres = nsIDOMHTMLFormElement_QueryInterface(nsform, &IID_nsIDOMNode, (void**)&nsnode); nsIDOMHTMLFormElement_Release(nsform); assert(nsres == NS_OK); hres = get_node(This->element.node.doc, nsnode, TRUE, &node); nsIDOMNode_Release(nsnode); if(FAILED(hres)) return hres; hres = IHTMLDOMNode_QueryInterface(&node->IHTMLDOMNode_iface, &IID_IHTMLFormElement, (void**)p); IHTMLDOMNode_Release(&node->IHTMLDOMNode_iface); return hres; }
void release_nodes(HTMLDocumentNode *This) { HTMLDOMNode *iter, *next; if(!This->nodes) return; for(iter = This->nodes; iter; iter = next) { next = iter->next; iter->doc = NULL; if(&This->node != iter) IHTMLDOMNode_Release(&iter->IHTMLDOMNode_iface); } }
/* * FIXME * We should use better way for getting node object (like private interface) * or avoid it at all. */ static HTMLDOMNode *get_node_obj(HTMLDocumentNode *This, IUnknown *iface) { HTMLDOMNode *iter = This->nodes; IHTMLDOMNode *node; IUnknown_QueryInterface(iface, &IID_IHTMLDOMNode, (void**)&node); IHTMLDOMNode_Release(node); while(iter) { if(&iter->IHTMLDOMNode_iface == node) return iter; iter = iter->next; } FIXME("Not found %p\n", iface); return NULL; }
static ULONG WINAPI HTMLEventObj_Release(IHTMLEventObj *iface) { HTMLEventObj *This = impl_from_IHTMLEventObj(iface); LONG ref = InterlockedDecrement(&This->ref); TRACE("(%p) ref=%d\n", This, ref); if(!ref) { if(This->target) IHTMLDOMNode_Release(&This->target->IHTMLDOMNode_iface); if(This->nsevent) nsIDOMEvent_Release(This->nsevent); release_dispex(&This->dispex); heap_free(This); } return ref; }
static HRESULT WINAPI HTMLElement2_insertAdjacentElement(IHTMLElement2 *iface, BSTR where, IHTMLElement *insertedElement, IHTMLElement **inserted) { HTMLElement *This = impl_from_IHTMLElement2(iface); HTMLDOMNode *ret_node; HTMLElement *elem; HRESULT hres; TRACE("(%p)->(%s %p %p)\n", This, debugstr_w(where), insertedElement, inserted); elem = unsafe_impl_from_IHTMLElement(insertedElement); if(!elem) return E_INVALIDARG; hres = insert_adjacent_node(This, where, elem->node.nsnode, &ret_node); if(FAILED(hres)) return hres; hres = IHTMLDOMNode_QueryInterface(&ret_node->IHTMLDOMNode_iface, &IID_IHTMLElement, (void**)inserted); IHTMLDOMNode_Release(&ret_node->IHTMLDOMNode_iface); return hres; }
static ULONG WINAPI HTMLDOMNode2_Release(IHTMLDOMNode2 *iface) { HTMLDOMNode *This = impl_from_IHTMLDOMNode2(iface); return IHTMLDOMNode_Release(&This->IHTMLDOMNode_iface); }
static ULONG WINAPI HTMLInputTextElement_Release(IHTMLInputTextElement *iface) { HTMLInputElement *This = HTMLINPUTTEXT_THIS(iface); return IHTMLDOMNode_Release(HTMLDOMNODE(&This->element.node)); }
static ULONG WINAPI HTMLTableRow_Release(IHTMLTableRow *iface) { HTMLTableRow *This = HTMLTABLEROW_THIS(iface); return IHTMLDOMNode_Release(HTMLDOMNODE(&This->element.node)); }
static ULONG WINAPI HTMLBodyElement_Release(IHTMLBodyElement *iface) { HTMLBodyElement *This = impl_from_IHTMLBodyElement(iface); return IHTMLDOMNode_Release(&This->textcont.element.node.IHTMLDOMNode_iface); }
static ULONG WINAPI HTMLObjectElement_Release(IHTMLObjectElement *iface) { HTMLObjectElement *This = HTMLOBJECT_THIS(iface); return IHTMLDOMNode_Release(HTMLDOMNODE(&This->element.node)); }
static ULONG WINAPI HTMLFrameBase_Release(IHTMLFrameBase *iface) { HTMLFrameBase *This = impl_from_IHTMLFrameBase(iface); return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface); }
static ULONG WINAPI HTMLTableRow_Release(IHTMLTableRow *iface) { HTMLTableRow *This = impl_from_IHTMLTableRow(iface); return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface); }
static ULONG WINAPI HTMLFormElement_Release(IHTMLFormElement *iface) { HTMLFormElement *This = HTMLFORM_THIS(iface); return IHTMLDOMNode_Release(HTMLDOMNODE(&This->element.node)); }
static ULONG WINAPI InternetHostSecurityManager_Release(IInternetHostSecurityManager *iface) { HTMLDocumentNode *This = impl_from_IInternetHostSecurityManager(iface); return IHTMLDOMNode_Release(&This->node.IHTMLDOMNode_iface); }
static ULONG WINAPI HTMLIFrameElement_Release(IHTMLIFrameElement *iface) { HTMLIFrame *This = impl_from_IHTMLIFrameElement(iface); return IHTMLDOMNode_Release(&This->framebase.element.node.IHTMLDOMNode_iface); }
static ULONG WINAPI HTMLCommentElement_Release(IHTMLCommentElement *iface) { HTMLCommentElement *This = HTMLCOMMENT_THIS(iface); return IHTMLDOMNode_Release(HTMLDOMNODE(&This->element.node)); }
static ULONG WINAPI HTMLScriptElement_Release(IHTMLScriptElement *iface) { HTMLScriptElement *This = HTMLSCRIPT_THIS(iface); return IHTMLDOMNode_Release(HTMLDOMNODE(&This->element.node)); }
static ULONG WINAPI HTMLObjectElement_Release(IHTMLObjectElement *iface) { HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); return IHTMLDOMNode_Release(&This->plugin_container.element.node.IHTMLDOMNode_iface); }
static ULONG WINAPI HTMLDOMTextNode_Release(IHTMLDOMTextNode *iface) { HTMLDOMTextNode *This = HTMLTEXT_THIS(iface); return IHTMLDOMNode_Release(HTMLDOMNODE(&This->node)); }
static ULONG WINAPI HTMLOptionElement_Release(IHTMLOptionElement *iface) { HTMLOptionElement *This = impl_from_IHTMLOptionElement(iface); return IHTMLDOMNode_Release(&This->element.node.IHTMLDOMNode_iface); }
HRESULT get_elem_source_index(HTMLElement *elem, LONG *ret) { elem_vector_t buf = {NULL, 0, 8}; nsIDOMNode *parent_node, *iter; UINT16 parent_type; HTMLDOMNode *node; int i; nsresult nsres; HRESULT hres; iter = elem->node.nsnode; nsIDOMNode_AddRef(iter); /* Find document or document fragment parent. */ while(1) { nsres = nsIDOMNode_GetParentNode(iter, &parent_node); nsIDOMNode_Release(iter); assert(nsres == NS_OK); if(!parent_node) break; nsres = nsIDOMNode_GetNodeType(parent_node, &parent_type); assert(nsres == NS_OK); if(parent_type != ELEMENT_NODE) { if(parent_type != DOCUMENT_NODE && parent_type != DOCUMENT_FRAGMENT_NODE) FIXME("Unexpected parent_type %d\n", parent_type); break; } iter = parent_node; } if(!parent_node) { *ret = -1; return S_OK; } hres = get_node(elem->node.doc, parent_node, TRUE, &node); nsIDOMNode_Release(parent_node); if(FAILED(hres)) return hres; /* Create all children collection and find the element in it. * This could be optimized if we ever find the reason. */ buf.buf = heap_alloc(buf.size*sizeof(*buf.buf)); if(!buf.buf) { IHTMLDOMNode_Release(&node->IHTMLDOMNode_iface); return E_OUTOFMEMORY; } create_all_list(elem->node.doc, node, &buf); for(i=0; i < buf.len; i++) { if(buf.buf[i] == elem) break; } IHTMLDOMNode_Release(&node->IHTMLDOMNode_iface); heap_free(buf.buf); if(i == buf.len) { FIXME("The element is not in parent's child list?\n"); return E_UNEXPECTED; } *ret = i; return S_OK; }
static ULONG WINAPI HTMLDOMTextNode_Release(IHTMLDOMTextNode *iface) { HTMLDOMTextNode *This = impl_from_IHTMLDOMTextNode(iface); return IHTMLDOMNode_Release(&This->node.IHTMLDOMNode_iface); }
static ULONG WINAPI SVGTextContentElement_Release(ISVGTextContentElement *iface) { SVGTextContentElement *This = impl_from_ISVGTextContentElement(iface); return IHTMLDOMNode_Release(&This->svg_element->element.node.IHTMLDOMNode_iface); }
static ULONG WINAPI HTMLOptionElement_Release(IHTMLOptionElement *iface) { HTMLOptionElement *This = HTMLOPTION_THIS(iface); return IHTMLDOMNode_Release(HTMLDOMNODE(&This->element.node)); }
static HRESULT WINAPI HTMLDOMNode_insertBefore(IHTMLDOMNode *iface, IHTMLDOMNode *newChild, VARIANT refChild, IHTMLDOMNode **node) { HTMLDOMNode *This = impl_from_IHTMLDOMNode(iface); HTMLDOMNode *new_child, *node_obj, *ref_node = NULL; nsIDOMNode *nsnode; nsresult nsres; HRESULT hres = S_OK; TRACE("(%p)->(%p %s %p)\n", This, newChild, debugstr_variant(&refChild), node); new_child = get_node_obj(newChild); if(!new_child) { ERR("invalid newChild\n"); return E_INVALIDARG; } switch(V_VT(&refChild)) { case VT_NULL: break; case VT_DISPATCH: { IHTMLDOMNode *ref_iface; if(!V_DISPATCH(&refChild)) break; hres = IDispatch_QueryInterface(V_DISPATCH(&refChild), &IID_IHTMLDOMNode, (void**)&ref_iface); if(FAILED(hres)) break; ref_node = get_node_obj(ref_iface); IHTMLDOMNode_Release(ref_iface); if(!ref_node) { ERR("unvalid node\n"); hres = E_FAIL; break; } break; } default: FIXME("unimplemented refChild %s\n", debugstr_variant(&refChild)); hres = E_NOTIMPL; } if(SUCCEEDED(hres)) { nsres = nsIDOMNode_InsertBefore(This->nsnode, new_child->nsnode, ref_node ? ref_node->nsnode : NULL, &nsnode); if(NS_FAILED(nsres)) { ERR("InsertBefore failed: %08x\n", nsres); hres = E_FAIL; } } node_release(new_child); if(ref_node) node_release(ref_node); if(FAILED(hres)) return hres; hres = get_node(This->doc, nsnode, TRUE, &node_obj); nsIDOMNode_Release(nsnode); if(FAILED(hres)) return hres; *node = &node_obj->IHTMLDOMNode_iface; return S_OK; }