static void get_font_size(HTMLDocumentNode *doc, WCHAR *ret) { nsISelection *nsselection = get_ns_selection(doc); nsIDOMElement *elem = NULL; nsIDOMNode *node = NULL, *tmp_node; nsAString tag_str; LPCWSTR tag; UINT16 node_type; nsresult nsres; *ret = 0; if(!nsselection) return; nsISelection_GetFocusNode(nsselection, &node); nsISelection_Release(nsselection); while(node) { nsres = nsIDOMNode_GetNodeType(node, &node_type); if(NS_FAILED(nsres) || node_type == DOCUMENT_NODE) break; if(node_type == ELEMENT_NODE) { nsIDOMNode_QueryInterface(node, &IID_nsIDOMElement, (void**)&elem); nsAString_Init(&tag_str, NULL); nsIDOMElement_GetTagName(elem, &tag_str); nsAString_GetData(&tag_str, &tag); if(!strcmpiW(tag, fontW)) { nsAString val_str; const PRUnichar *val; TRACE("found font tag %p\n", elem); get_elem_attr_value(elem, sizeW, &val_str, &val); if(*val) { TRACE("found size %s\n", debugstr_w(val)); strcpyW(ret, val); } nsAString_Finish(&val_str); } nsAString_Finish(&tag_str); nsIDOMElement_Release(elem); } if(*ret) break; tmp_node = node; nsIDOMNode_GetParentNode(node, &node); nsIDOMNode_Release(tmp_node); } if(node) nsIDOMNode_Release(node); }
static void remove_child_attr(nsIDOMElement *elem, LPCWSTR tag, nsAString *attr_str) { cpp_bool has_children; UINT32 child_cnt, i; nsIDOMNode *child_node; nsIDOMNodeList *node_list; UINT16 node_type; nsIDOMElement_HasChildNodes(elem, &has_children); if(!has_children) return; nsIDOMElement_GetChildNodes(elem, &node_list); nsIDOMNodeList_GetLength(node_list, &child_cnt); for(i=0; i<child_cnt; i++) { nsIDOMNodeList_Item(node_list, i, &child_node); nsIDOMNode_GetNodeType(child_node, &node_type); if(node_type == ELEMENT_NODE) { nsIDOMElement *child_elem; nsAString tag_str; const PRUnichar *ctag; nsIDOMNode_QueryInterface(child_node, &IID_nsIDOMElement, (void**)&child_elem); nsAString_Init(&tag_str, NULL); nsIDOMElement_GetTagName(child_elem, &tag_str); nsAString_GetData(&tag_str, &ctag); if(!strcmpiW(ctag, tag)) /* FIXME: remove node if there are no more attributes */ nsIDOMElement_RemoveAttribute(child_elem, attr_str); nsAString_Finish(&tag_str); remove_child_attr(child_elem, tag, attr_str); nsIDOMElement_Release(child_elem); } nsIDOMNode_Release(child_node); } nsIDOMNodeList_Release(node_list); }
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; nsIDOMElement_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; }