static HRESULT WINAPI HTMLDocument3_createTextNode(IHTMLDocument3 *iface, BSTR text, IHTMLDOMNode **newTextNode) { HTMLDocument *This = HTMLDOC3_THIS(iface); nsIDOMText *nstext; HTMLDOMNode *node; nsAString text_str; nsresult nsres; TRACE("(%p)->(%s %p)\n", This, debugstr_w(text), newTextNode); if(!This->doc_node->nsdoc) { WARN("NULL nsdoc\n"); return E_UNEXPECTED; } nsAString_InitDepend(&text_str, text); nsres = nsIDOMHTMLDocument_CreateTextNode(This->doc_node->nsdoc, &text_str, &nstext); nsAString_Finish(&text_str); if(NS_FAILED(nsres)) { ERR("CreateTextNode failed: %08x\n", nsres); return E_FAIL; } node = HTMLDOMTextNode_Create(This->doc_node, (nsIDOMNode*)nstext); nsIDOMElement_Release(nstext); *newTextNode = HTMLDOMNODE(node); IHTMLDOMNode_AddRef(HTMLDOMNODE(node)); return S_OK; }
static HRESULT WINAPI HTMLDocument3_get_documentElement(IHTMLDocument3 *iface, IHTMLElement **p) { HTMLDocument *This = HTMLDOC3_THIS(iface); nsIDOMElement *nselem = NULL; HTMLDOMNode *node; nsresult nsres; TRACE("(%p)->(%p)\n", This, p); if(This->window->readystate == READYSTATE_UNINITIALIZED) { *p = NULL; return S_OK; } if(!This->doc_node->nsdoc) { WARN("NULL nsdoc\n"); return E_UNEXPECTED; } nsres = nsIDOMHTMLDocument_GetDocumentElement(This->doc_node->nsdoc, &nselem); if(NS_FAILED(nsres)) { ERR("GetDocumentElement failed: %08x\n", nsres); return E_FAIL; } if(nselem) { node = get_node(This->doc_node, (nsIDOMNode *)nselem, TRUE); nsIDOMElement_Release(nselem); IHTMLDOMNode_QueryInterface(HTMLDOMNODE(node), &IID_IHTMLElement, (void**)p); }else { *p = NULL; } return S_OK; }
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 set_font_size(HTMLDocument *This, LPCWSTR size) { nsISelection *nsselection; PRBool collapsed; nsIDOMHTMLElement *elem; nsIDOMRange *range; PRInt32 range_cnt = 0; nsAString size_str; nsAString val_str; if(!This->doc_node->nsdoc) { WARN("NULL nsdoc\n"); return; } nsselection = get_ns_selection(This); if(!nsselection) return; nsISelection_GetRangeCount(nsselection, &range_cnt); if(range_cnt != 1) { FIXME("range_cnt %d not supprted\n", range_cnt); if(!range_cnt) { nsISelection_Release(nsselection); return; } } create_nselem(This->doc_node, fontW, &elem); nsAString_InitDepend(&size_str, sizeW); nsAString_InitDepend(&val_str, size); nsIDOMElement_SetAttribute(elem, &size_str, &val_str); nsAString_Finish(&val_str); nsISelection_GetRangeAt(nsselection, 0, &range); nsISelection_GetIsCollapsed(nsselection, &collapsed); nsISelection_RemoveAllRanges(nsselection); nsIDOMRange_SurroundContents(range, (nsIDOMNode*)elem); if(collapsed) { nsISelection_Collapse(nsselection, (nsIDOMNode*)elem, 0); }else { /* Remove all size attributes from the range */ remove_child_attr((nsIDOMElement*)elem, fontW, &size_str); nsISelection_SelectAllChildren(nsselection, (nsIDOMNode*)elem); } nsISelection_Release(nsselection); nsIDOMRange_Release(range); nsIDOMElement_Release(elem); nsAString_Finish(&size_str); set_dirty(This, VARIANT_TRUE); }
static HRESULT WINAPI HTMLOptionElementFactory_create(IHTMLOptionElementFactory *iface, VARIANT text, VARIANT value, VARIANT defaultselected, VARIANT selected, IHTMLOptionElement **optelem) { HTMLOptionElementFactory *This = HTMLOPTFACTORY_THIS(iface); nsIDOMElement *nselem; nsAString option_str; nsresult nsres; HRESULT hres; static const PRUnichar optionW[] = {'O','P','T','I','O','N',0}; TRACE("(%p)->(%s %s %s %s %p)\n", This, debugstr_variant(&text), debugstr_variant(&value), debugstr_variant(&defaultselected), debugstr_variant(&selected), optelem); if(!This->doc->nsdoc) { WARN("NULL nsdoc\n"); return E_UNEXPECTED; } *optelem = NULL; nsAString_Init(&option_str, optionW); nsres = nsIDOMHTMLDocument_CreateElement(This->doc->nsdoc, &option_str, &nselem); nsAString_Finish(&option_str); if(NS_FAILED(nsres)) { ERR("CreateElement failed: %08x\n", nsres); return E_FAIL; } hres = IHTMLDOMNode_QueryInterface(HTMLDOMNODE(get_node(This->doc, (nsIDOMNode*)nselem, TRUE)), &IID_IHTMLOptionElement, (void**)optelem); nsIDOMElement_Release(nselem); if(V_VT(&text) == VT_BSTR) IHTMLOptionElement_put_text(*optelem, V_BSTR(&text)); else if(V_VT(&text) != VT_EMPTY) FIXME("Unsupported text vt=%d\n", V_VT(&text)); if(V_VT(&value) == VT_BSTR) IHTMLOptionElement_put_value(*optelem, V_BSTR(&value)); else if(V_VT(&value) != VT_EMPTY) FIXME("Unsupported value vt=%d\n", V_VT(&value)); if(V_VT(&defaultselected) != VT_EMPTY) FIXME("Unsupported defaultselected vt=%d\n", V_VT(&defaultselected)); if(V_VT(&selected) != VT_EMPTY) FIXME("Unsupported selected vt=%d\n", V_VT(&selected)); return S_OK; }
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); }
HRESULT get_doc_elem_by_id(HTMLDocumentNode *doc, const WCHAR *id, HTMLElement **ret) { nsIDOMNodeList *nsnode_list; nsIDOMElement *nselem; nsIDOMNode *nsnode; nsAString id_str; nsresult nsres; HRESULT hres; if(!doc->nsdoc) { WARN("NULL nsdoc\n"); return E_UNEXPECTED; } nsAString_InitDepend(&id_str, id); /* get element by id attribute */ nsres = nsIDOMHTMLDocument_GetElementById(doc->nsdoc, &id_str, &nselem); if(FAILED(nsres)) { ERR("GetElementById failed: %08x\n", nsres); nsAString_Finish(&id_str); return E_FAIL; } /* get first element by name attribute */ nsres = nsIDOMHTMLDocument_GetElementsByName(doc->nsdoc, &id_str, &nsnode_list); nsAString_Finish(&id_str); if(FAILED(nsres)) { ERR("getElementsByName failed: %08x\n", nsres); if(nselem) nsIDOMElement_Release(nselem); return E_FAIL; } nsres = nsIDOMNodeList_Item(nsnode_list, 0, &nsnode); nsIDOMNodeList_Release(nsnode_list); assert(nsres == NS_OK); if(nsnode && nselem) { UINT16 pos; nsres = nsIDOMNode_CompareDocumentPosition(nsnode, (nsIDOMNode*)nselem, &pos); if(NS_FAILED(nsres)) { FIXME("CompareDocumentPosition failed: 0x%08x\n", nsres); nsIDOMNode_Release(nsnode); nsIDOMElement_Release(nselem); return E_FAIL; } TRACE("CompareDocumentPosition gave: 0x%x\n", pos); if(!(pos & (DOCUMENT_POSITION_PRECEDING | DOCUMENT_POSITION_CONTAINS))) { nsIDOMElement_Release(nselem); nselem = NULL; } } if(nsnode) { if(!nselem) { nsres = nsIDOMNode_QueryInterface(nsnode, &IID_nsIDOMElement, (void**)&nselem); assert(nsres == NS_OK); } nsIDOMNode_Release(nsnode); } if(!nselem) { *ret = NULL; return S_OK; } hres = get_elem(doc, nselem, ret); nsIDOMElement_Release(nselem); return hres; }
static void NSAPI nsDocumentObserver_BindToDocument(nsIDocumentObserver *iface, nsIDocument *aDocument, nsIContent *aContent) { HTMLDocumentNode *This = impl_from_nsIDocumentObserver(iface); nsIDOMHTMLIFrameElement *nsiframe; nsIDOMHTMLFrameElement *nsframe; nsIDOMHTMLScriptElement *nsscript; nsIDOMComment *nscomment; nsIDOMElement *nselem; nsresult nsres; TRACE("(%p)\n", This); nsres = nsIContent_QueryInterface(aContent, &IID_nsIDOMElement, (void**)&nselem); if(NS_SUCCEEDED(nsres)) { check_event_attr(This, nselem); nsIDOMElement_Release(nselem); } nsres = nsIContent_QueryInterface(aContent, &IID_nsIDOMComment, (void**)&nscomment); if(NS_SUCCEEDED(nsres)) { TRACE("comment node\n"); add_script_runner(This, run_insert_comment, (nsISupports*)nscomment, NULL); nsIDOMComment_Release(nscomment); return; } nsres = nsIContent_QueryInterface(aContent, &IID_nsIDOMHTMLIFrameElement, (void**)&nsiframe); if(NS_SUCCEEDED(nsres)) { TRACE("iframe node\n"); add_script_runner(This, run_bind_to_tree, (nsISupports*)nsiframe, NULL); nsIDOMHTMLIFrameElement_Release(nsiframe); return; } nsres = nsIContent_QueryInterface(aContent, &IID_nsIDOMHTMLFrameElement, (void**)&nsframe); if(NS_SUCCEEDED(nsres)) { TRACE("frame node\n"); add_script_runner(This, run_bind_to_tree, (nsISupports*)nsframe, NULL); nsIDOMHTMLFrameElement_Release(nsframe); return; } nsres = nsIContent_QueryInterface(aContent, &IID_nsIDOMHTMLScriptElement, (void**)&nsscript); if(NS_SUCCEEDED(nsres)) { HTMLScriptElement *script_elem; HRESULT hres; TRACE("script element\n"); hres = script_elem_from_nsscript(This, nsscript, &script_elem); nsIDOMHTMLScriptElement_Release(nsscript); if(FAILED(hres)) return; if(script_elem->parse_on_bind) add_script_runner(This, run_insert_script, (nsISupports*)nsscript, NULL); IHTMLScriptElement_Release(&script_elem->IHTMLScriptElement_iface); } }
static void NSAPI nsDocumentObserver_BindToDocument(nsIDocumentObserver *iface, nsIDocument *aDocument, nsIContent *aContent) { HTMLDocumentNode *This = impl_from_nsIDocumentObserver(iface); nsIDOMHTMLIFrameElement *nsiframe; nsIDOMHTMLFrameElement *nsframe; nsIDOMHTMLScriptElement *nsscript; nsIDOMHTMLMetaElement *nsmeta; nsIDOMElement *nselem; nsIDOMComment *nscomment; nsresult nsres; TRACE("(%p)->(%p %p)\n", This, aDocument, aContent); if(This->document_mode < COMPAT_MODE_IE10) { nsres = nsIContent_QueryInterface(aContent, &IID_nsIDOMComment, (void**)&nscomment); if(NS_SUCCEEDED(nsres)) { TRACE("comment node\n"); add_script_runner(This, run_insert_comment, (nsISupports*)nscomment, NULL); nsIDOMComment_Release(nscomment); return; } } if(This->document_mode == COMPAT_MODE_QUIRKS) { nsIDOMDocumentType *nsdoctype; nsres = nsIContent_QueryInterface(aContent, &IID_nsIDOMDocumentType, (void**)&nsdoctype); if(NS_SUCCEEDED(nsres)) { compat_mode_t mode = COMPAT_MODE_IE7; TRACE("doctype node\n"); if(This->window && This->window->base.outer_window) { HTMLOuterWindow *window = This->window->base.outer_window; DWORD zone; HRESULT hres; /* * Internet URL zone is treated differently. Native defaults to latest supported * mode. We default to IE8. Ideally, we'd sync that with version used for IE=edge * X-UA-Compatible version, allow configuration and default to higher version * (once it's well supported). */ hres = IInternetSecurityManager_MapUrlToZone(get_security_manager(), window->url, &zone, 0); if(SUCCEEDED(hres) && zone == URLZONE_INTERNET) mode = COMPAT_MODE_IE8; } set_document_mode(This, mode, FALSE); nsIDOMDocumentType_Release(nsdoctype); } } nsres = nsIContent_QueryInterface(aContent, &IID_nsIDOMElement, (void**)&nselem); if(NS_FAILED(nsres)) return; check_event_attr(This, nselem); nsIDOMElement_Release(nselem); nsres = nsIContent_QueryInterface(aContent, &IID_nsIDOMHTMLIFrameElement, (void**)&nsiframe); if(NS_SUCCEEDED(nsres)) { TRACE("iframe node\n"); add_script_runner(This, run_bind_to_tree, (nsISupports*)nsiframe, NULL); nsIDOMHTMLIFrameElement_Release(nsiframe); return; } nsres = nsIContent_QueryInterface(aContent, &IID_nsIDOMHTMLFrameElement, (void**)&nsframe); if(NS_SUCCEEDED(nsres)) { TRACE("frame node\n"); add_script_runner(This, run_bind_to_tree, (nsISupports*)nsframe, NULL); nsIDOMHTMLFrameElement_Release(nsframe); return; } nsres = nsIContent_QueryInterface(aContent, &IID_nsIDOMHTMLScriptElement, (void**)&nsscript); if(NS_SUCCEEDED(nsres)) { TRACE("script element\n"); add_script_runner(This, run_bind_to_tree, (nsISupports*)nsscript, NULL); nsIDOMHTMLScriptElement_Release(nsscript); return; } nsres = nsIContent_QueryInterface(aContent, &IID_nsIDOMHTMLMetaElement, (void**)&nsmeta); if(NS_SUCCEEDED(nsres)) { process_meta_element(This, nsmeta); nsIDOMHTMLMetaElement_Release(nsmeta); } }