static HRESULT navigate_href(HTMLElement *element, nsAString *href_str, nsAString *target_str) { HTMLOuterWindow *window; BOOL use_new_window; const PRUnichar *href; HRESULT hres; window = get_target_window(element->node.doc->basedoc.window, target_str, &use_new_window); if(!window) { if(use_new_window) { const PRUnichar *target; nsAString_GetData(target_str, &target); return navigate_href_new_window(element, href_str, target); }else { return S_OK; } } nsAString_GetData(href_str, &href); if(*href) { hres = navigate_url(window, href, window->uri_nofrag, BINDING_NAVIGATED); }else { TRACE("empty href\n"); hres = S_OK; } IHTMLWindow2_Release(&window->base.IHTMLWindow2_iface); return hres; }
static BOOL is_elem_name(HTMLElement *elem, LPCWSTR name) { const PRUnichar *str; nsAString nsstr, nsname; BOOL ret = FALSE; nsresult nsres; static const PRUnichar nameW[] = {'n','a','m','e',0}; if(!elem->nselem) return FALSE; nsAString_Init(&nsstr, NULL); nsIDOMHTMLElement_GetId(elem->nselem, &nsstr); nsAString_GetData(&nsstr, &str); if(!strcmpiW(str, name)) { nsAString_Finish(&nsstr); return TRUE; } nsAString_InitDepend(&nsname, nameW); nsres = nsIDOMHTMLElement_GetAttribute(elem->nselem, &nsname, &nsstr); nsAString_Finish(&nsname); if(NS_SUCCEEDED(nsres)) { nsAString_GetData(&nsstr, &str); ret = !strcmpiW(str, name); } nsAString_Finish(&nsstr); return ret; }
static void process_meta_element(HTMLDocumentNode *doc, nsIDOMHTMLMetaElement *meta_element) { nsAString http_equiv_str, content_str; nsresult nsres; static const WCHAR x_ua_compatibleW[] = {'x','-','u','a','-','c','o','m','p','a','t','i','b','l','e',0}; nsAString_Init(&http_equiv_str, NULL); nsAString_Init(&content_str, NULL); nsres = nsIDOMHTMLMetaElement_GetHttpEquiv(meta_element, &http_equiv_str); if(NS_SUCCEEDED(nsres)) nsres = nsIDOMHTMLMetaElement_GetContent(meta_element, &content_str); if(NS_SUCCEEDED(nsres)) { const PRUnichar *http_equiv, *content; nsAString_GetData(&http_equiv_str, &http_equiv); nsAString_GetData(&content_str, &content); TRACE("%s: %s\n", debugstr_w(http_equiv), debugstr_w(content)); if(!strcmpiW(http_equiv, x_ua_compatibleW)) { compat_mode_t document_mode; if(parse_ua_compatible(content, &document_mode)) set_document_mode(doc, document_mode, TRUE); else FIXME("Unsupported document mode %s\n", debugstr_w(content)); } } nsAString_Finish(&http_equiv_str); nsAString_Finish(&content_str); }
static HRESULT navigate_anchor(HTMLAnchorElement *This) { nsAString href_str, target_str; HTMLOuterWindow *window = NULL; nsresult nsres; HRESULT hres = E_FAIL; static const WCHAR _parentW[] = {'p','a','r','e','n','t',0}; static const WCHAR _selfW[] = {'_','s','e','l','f',0}; static const WCHAR _topW[] = {'_','t','o','p',0}; nsAString_Init(&target_str, NULL); nsres = nsIDOMHTMLAnchorElement_GetTarget(This->nsanchor, &target_str); if(NS_SUCCEEDED(nsres)) { const PRUnichar *target; nsAString_GetData(&target_str, &target); TRACE("target %s\n", debugstr_w(target)); if(*target && strcmpiW(target, _selfW)) { if(!strcmpiW(target, _topW)) { TRACE("target _top\n"); get_top_window(This->element.node.doc->basedoc.window, &window); }else if(!strcmpiW(target, _parentW)) { FIXME("Navigating to target _parent is not implemented\n"); nsAString_Finish(&target_str); return S_OK; }else { HTMLOuterWindow *top_window; get_top_window(This->element.node.doc->basedoc.window, &top_window); hres = get_frame_by_name(top_window, target, TRUE, &window); if(FAILED(hres) || !window) { hres = navigate_anchor_window(This, target); nsAString_Finish(&target_str); return hres; } } } } nsAString_Finish(&target_str); nsAString_Init(&href_str, NULL); nsres = nsIDOMHTMLAnchorElement_GetHref(This->nsanchor, &href_str); if(NS_SUCCEEDED(nsres)) { const PRUnichar *href; nsAString_GetData(&href_str, &href); if(*href) { if(!window) window = This->element.node.doc->basedoc.window; hres = navigate_url(window, href, window->uri_nofrag, BINDING_NAVIGATED); }else { TRACE("empty href\n"); hres = S_OK; } } nsAString_Finish(&href_str); return hres; }
static HRESULT get_doc_string(HTMLDocumentNode *This, char **str) { nsIDOMNode *nsnode; LPCWSTR strw; nsAString nsstr; nsresult nsres; if(!This->nsdoc) { WARN("NULL nsdoc\n"); return E_UNEXPECTED; } nsres = nsIDOMHTMLDocument_QueryInterface(This->nsdoc, &IID_nsIDOMNode, (void**)&nsnode); if(NS_FAILED(nsres)) { ERR("Could not get nsIDOMNode failed: %08x\n", nsres); return E_FAIL; } nsAString_Init(&nsstr, NULL); nsnode_to_nsstring(nsnode, &nsstr); nsIDOMNode_Release(nsnode); nsAString_GetData(&nsstr, &strw); TRACE("%s\n", debugstr_w(strw)); *str = heap_strdupWtoA(strw); nsAString_Finish(&nsstr); return S_OK; }
static HRESULT WINAPI HTMLElement2_get_dir(IHTMLElement2 *iface, BSTR *p) { HTMLElement *This = HTMLELEM2_THIS(iface); TRACE("(%p)->(%p)\n", This, p); *p = NULL; if(This->nselem) { nsAString dir_str; nsresult nsres; nsAString_Init(&dir_str, NULL); nsres = nsIDOMHTMLElement_GetDir(This->nselem, &dir_str); if(NS_SUCCEEDED(nsres)) { const PRUnichar *dir; nsAString_GetData(&dir_str, &dir); if(*dir) *p = SysAllocString(dir); }else { ERR("GetDir failed: %08x\n", nsres); } nsAString_Finish(&dir_str); } TRACE("ret %s\n", debugstr_w(*p)); return S_OK; }
static HRESULT return_nscolor(nsresult nsres, nsAString *nsstr, VARIANT *p) { const PRUnichar *color; if(NS_FAILED(nsres)) { ERR("failed: %08x\n", nsres); nsAString_Finish(nsstr); return E_FAIL; } nsAString_GetData(nsstr, &color); if(*color == '#') { V_VT(p) = VT_I4; V_I4(p) = strtolW(color+1, NULL, 16); }else { V_VT(p) = VT_BSTR; V_BSTR(p) = SysAllocString(color); if(!V_BSTR(p)) { nsAString_Finish(nsstr); return E_OUTOFMEMORY; } } nsAString_Finish(nsstr); TRACE("ret %s\n", debugstr_variant(p)); return S_OK; }
static nsresult NSAPI handle_htmlevent(nsIDOMEventListener *iface, nsIDOMEvent *event) { NSContainer *This = NSEVENTLIST_THIS(iface)->This; const PRUnichar *type; nsIDOMEventTarget *event_target; nsIDOMNode *nsnode; nsAString type_str; eventid_t eid; nsresult nsres; 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(This->doc, eid, nsnode); nsIDOMNode_Release(nsnode); return NS_OK; }
static HRESULT WINAPI HTMLImgElement_get_src(IHTMLImgElement *iface, BSTR *p) { HTMLImgElement *This = impl_from_IHTMLImgElement(iface); const PRUnichar *src; nsAString src_str; nsresult nsres; HRESULT hres = S_OK; static const WCHAR blockedW[] = {'B','L','O','C','K','E','D',':',':',0}; TRACE("(%p)->(%p)\n", This, p); nsAString_Init(&src_str, NULL); nsres = nsIDOMHTMLImageElement_GetSrc(This->nsimg, &src_str); if(NS_SUCCEEDED(nsres)) { nsAString_GetData(&src_str, &src); if(!strncmpiW(src, blockedW, sizeof(blockedW)/sizeof(WCHAR)-1)) { TRACE("returning BLOCKED::\n"); *p = SysAllocString(blockedW); if(!*p) hres = E_OUTOFMEMORY; }else { hres = nsuri_to_url(src, TRUE, p); } }else { ERR("GetSrc failed: %08x\n", nsres); hres = E_FAIL; } nsAString_Finish(&src_str); return hres; }
static HRESULT WINAPI HTMLSelectElement_get_name(IHTMLSelectElement *iface, BSTR *p) { HTMLSelectElement *This = impl_from_IHTMLSelectElement(iface); nsAString name_str; const PRUnichar *name = NULL; nsresult nsres; TRACE("(%p)->(%p)\n", This, p); nsAString_Init(&name_str, NULL); nsres = nsIDOMHTMLSelectElement_GetName(This->nsselect, &name_str); if(NS_SUCCEEDED(nsres)) { static const WCHAR wszGarbage[] = {'g','a','r','b','a','g','e',0}; nsAString_GetData(&name_str, &name); /* * Native never returns empty string here. If an element has no name, * name of previous element or ramdom data is returned. */ *p = SysAllocString(*name ? name : wszGarbage); }else { ERR("GetName failed: %08x\n", nsres); } nsAString_Finish(&name_str); TRACE("name=%s\n", debugstr_w(*p)); return S_OK; }
static HRESULT WINAPI HTMLInputElement_get_name(IHTMLInputElement *iface, BSTR *p) { HTMLInputElement *This = HTMLINPUT_THIS(iface); nsAString name_str; const PRUnichar *name; nsresult nsres; TRACE("(%p)->(%p)\n", This, p); nsAString_Init(&name_str, NULL); nsres = nsIDOMHTMLInputElement_GetName(This->nsinput, &name_str); if(NS_SUCCEEDED(nsres)) { nsAString_GetData(&name_str, &name); *p = SysAllocString(name); }else { ERR("GetName failed: %08x\n", nsres); return E_FAIL; } nsAString_Finish(&name_str); TRACE("name=%s\n", debugstr_w(*p)); return S_OK; }
static HRESULT WINAPI HTMLBodyElement_get_text(IHTMLBodyElement *iface, VARIANT *p) { HTMLBodyElement *This = impl_from_IHTMLBodyElement(iface); nsAString text; nsresult nsres; HRESULT hres; TRACE("(%p)->(%p)\n", This, p); nsAString_Init(&text, NULL); nsres = nsIDOMHTMLBodyElement_GetText(This->nsbody, &text); if(NS_SUCCEEDED(nsres)) { const PRUnichar *color; nsAString_GetData(&text, &color); V_VT(p) = VT_BSTR; hres = nscolor_to_str(color, &V_BSTR(p)); }else { ERR("GetText failed: %08x\n", nsres); hres = E_FAIL; } nsAString_Finish(&text); return hres; }
static HRESULT WINAPI HTMLObjectElement_get_height(IHTMLObjectElement *iface, VARIANT *p) { HTMLObjectElement *This = impl_from_IHTMLObjectElement(iface); nsAString height_str; nsresult nsres; HRESULT hres; TRACE("(%p)->(%p)\n", This, p); nsAString_Init(&height_str, NULL); nsres = nsIDOMHTMLObjectElement_GetHeight(This->nsobject, &height_str); if(NS_SUCCEEDED(nsres)) { const PRUnichar *height; nsAString_GetData(&height_str, &height); V_VT(p) = VT_BSTR; V_BSTR(p) = SysAllocString(height); hres = V_BSTR(p) ? S_OK : E_OUTOFMEMORY; }else { ERR("GetHeight failed: %08x\n", nsres); hres = E_FAIL; } nsAString_Finish(&height_str); return hres; }
static HRESULT WINAPI HTMLDOMNode_get_nodeName(IHTMLDOMNode *iface, BSTR *p) { HTMLDOMNode *This = impl_from_IHTMLDOMNode(iface); TRACE("(%p)->(%p)\n", This, p); *p = NULL; if(This->nsnode) { nsAString name_str; const PRUnichar *name; nsresult nsres; nsAString_Init(&name_str, NULL); nsres = nsIDOMNode_GetNodeName(This->nsnode, &name_str); if(NS_SUCCEEDED(nsres)) { nsAString_GetData(&name_str, &name); *p = SysAllocString(name); }else { ERR("GetNodeName failed: %08x\n", nsres); } nsAString_Finish(&name_str); } return S_OK; }
static HRESULT navigate_anchor_window(HTMLAnchorElement *This, const WCHAR *target) { nsAString href_str; IUri *uri; nsresult nsres; HRESULT hres; nsAString_Init(&href_str, NULL); nsres = nsIDOMHTMLAnchorElement_GetHref(This->nsanchor, &href_str); if(NS_SUCCEEDED(nsres)) { const PRUnichar *href; nsAString_GetData(&href_str, &href); hres = create_relative_uri(This->element.node.doc->basedoc.window, href, &uri); }else { ERR("Could not get anchor href: %08x\n", nsres); hres = E_FAIL; } nsAString_Finish(&href_str); if(FAILED(hres)) return hres; hres = navigate_new_window(This->element.node.doc->basedoc.window, uri, target, NULL); IUri_Release(uri); return hres; }
static void get_font_size(HTMLDocument *This, WCHAR *ret) { nsISelection *nsselection = get_ns_selection(This); nsIDOMHTMLElement *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_nsIDOMHTMLElement, (void**)&elem); nsAString_Init(&tag_str, NULL); nsIDOMHTMLElement_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); nsIDOMHTMLElement_Release(elem); } if(*ret) break; tmp_node = node; nsIDOMNode_GetParentNode(node, &node); nsIDOMNode_Release(tmp_node); } if(node) nsIDOMNode_Release(node); }
static HRESULT WINAPI HTMLTableRow_get_bgColor(IHTMLTableRow *iface, VARIANT *p) { HTMLTableRow *This = impl_from_IHTMLTableRow(iface); nsAString strColor; nsresult nsres; HRESULT hres; const PRUnichar *color; TRACE("(%p)->(%p)\n", This, p); nsAString_Init(&strColor, NULL); nsres = nsIDOMHTMLTableRowElement_GetBgColor(This->nsrow, &strColor); if(NS_SUCCEEDED(nsres)) { nsAString_GetData(&strColor, &color); V_VT(p) = VT_BSTR; hres = nscolor_to_str(color, &V_BSTR(p)); }else { ERR("SetBgColor failed: %08x\n", nsres); hres = E_FAIL; } nsAString_Finish(&strColor); return hres; }
static HRESULT WINAPI HTMLBodyElement_get_background(IHTMLBodyElement *iface, BSTR *p) { HTMLBodyElement *This = impl_from_IHTMLBodyElement(iface); nsAString background_str; nsresult nsres; TRACE("(%p)->(%p)\n", This, p); nsAString_Init(&background_str, NULL); nsres = nsIDOMHTMLBodyElement_GetBackground(This->nsbody, &background_str); if(NS_SUCCEEDED(nsres)) { const PRUnichar *background; nsAString_GetData(&background_str, &background); *p = *background ? SysAllocString(background) : NULL; }else { ERR("GetBackground failed: %08x\n", nsres); *p = NULL; } nsAString_Finish(&background_str); TRACE("*p = %s\n", debugstr_w(*p)); return S_OK; }
static HRESULT navigate_anchor(HTMLAnchorElement *This) { nsAString href_str, target_str; HTMLOuterWindow *window; BOOL use_new_window; nsresult nsres; HRESULT hres = E_FAIL; nsAString_Init(&target_str, NULL); nsres = nsIDOMHTMLAnchorElement_GetTarget(This->nsanchor, &target_str); if(NS_FAILED(nsres)) return E_FAIL; window = get_target_window(This->element.node.doc->basedoc.window, &target_str, &use_new_window); if(!window && use_new_window) { const PRUnichar *target; nsAString_GetData(&target_str, &target); hres = navigate_anchor_window(This, target); nsAString_Finish(&target_str); return hres; } nsAString_Finish(&target_str); if(!window) return S_OK; nsAString_Init(&href_str, NULL); nsres = nsIDOMHTMLAnchorElement_GetHref(This->nsanchor, &href_str); if(NS_SUCCEEDED(nsres)) { const PRUnichar *href; nsAString_GetData(&href_str, &href); if(*href) { hres = navigate_url(window, href, window->uri_nofrag, BINDING_NAVIGATED); }else { TRACE("empty href\n"); hres = S_OK; } } nsAString_Finish(&href_str); IHTMLWindow2_Release(&window->base.IHTMLWindow2_iface); return hres; }
static nsresult NSAPI nsTooltipTextProvider_GetNodeText(nsITooltipTextProvider *iface, nsIDOMNode *aNode, PRUnichar **aText, PRBool *_retval) { nsIDOMHTMLElement *nselem; nsIDOMNode *node = aNode, *parent; nsAString title_str; const PRUnichar *title = NULL; nsresult nsres; TRACE("(%p %p %p)\n", aNode, aText, _retval); *aText = NULL; nsAString_Init(&title_str, NULL); do { nsres = nsIDOMNode_QueryInterface(node, &IID_nsIDOMHTMLElement, (void**)&nselem); if(NS_SUCCEEDED(nsres)) { title = NULL; nsIDOMHTMLElement_GetTitle(nselem, &title_str); nsIDOMHTMLElement_Release(nselem); nsAString_GetData(&title_str, &title); if(title && *title) { if(node != aNode) nsIDOMNode_Release(node); break; } } nsres = nsIDOMNode_GetParentNode(node, &parent); if(NS_FAILED(nsres)) parent = NULL; if(node != aNode) nsIDOMNode_Release(node); node = parent; } while(node); if(title && *title) { int size = (strlenW(title)+1)*sizeof(PRUnichar); *aText = nsalloc(size); memcpy(*aText, title, size); TRACE("aText = %s\n", debugstr_w(*aText)); *_retval = TRUE; }else { *_retval = FALSE; } nsAString_Finish(&title_str); return NS_OK; }
static void nscolor_to_variant(const nsAString *nsstr, VARIANT *p) { const PRUnichar *color; nsAString_GetData(nsstr, &color); if(*color == '#') { V_VT(p) = VT_I4; V_I4(p) = strtolW(color+1, NULL, 16); }else { V_VT(p) = VT_BSTR; V_BSTR(p) = SysAllocString(color); } }
static HRESULT navigate_anchor(HTMLAnchorElement *This) { nsAString href_str, target_str; nsresult nsres; HRESULT hres; nsAString_Init(&target_str, NULL); nsres = nsIDOMHTMLAnchorElement_GetTarget(This->nsanchor, &target_str); if(NS_SUCCEEDED(nsres)) { const PRUnichar *target; nsAString_GetData(&target_str, &target); if(*target) { FIXME("Navigating to target %s is not implemented\n", debugstr_w(target)); nsAString_Finish(&target_str); return S_OK; } } nsAString_Finish(&target_str); nsAString_Init(&href_str, NULL); nsres = nsIDOMHTMLAnchorElement_GetHref(This->nsanchor, &href_str); if(NS_SUCCEEDED(nsres)) { const PRUnichar *href; nsAString_GetData(&href_str, &href); if(*href) { HTMLWindow *window = This->element.node.doc->basedoc.window; hres = navigate_url(window, href, window->url); }else { TRACE("empty href\n"); hres = S_OK; } } nsAString_Finish(&href_str); return hres; }
static HRESULT navigate_href_new_window(HTMLElement *element, nsAString *href_str, const WCHAR *target) { const PRUnichar *href; IUri *uri; HRESULT hres; nsAString_GetData(href_str, &href); hres = create_relative_uri(element->node.doc->basedoc.window, href, &uri); if(FAILED(hres)) return hres; hres = navigate_new_window(element->node.doc->basedoc.window, uri, target, NULL, NULL); IUri_Release(uri); return hres; }
HTMLOuterWindow *get_target_window(HTMLOuterWindow *window, nsAString *target_str, BOOL *use_new_window) { HTMLOuterWindow *top_window, *ret_window; const PRUnichar *target; HRESULT hres; static const WCHAR _parentW[] = {'_','p','a','r','e','n','t',0}; static const WCHAR _selfW[] = {'_','s','e','l','f',0}; static const WCHAR _topW[] = {'_','t','o','p',0}; *use_new_window = FALSE; nsAString_GetData(target_str, &target); TRACE("%s\n", debugstr_w(target)); if(!*target || !strcmpiW(target, _selfW)) { IHTMLWindow2_AddRef(&window->base.IHTMLWindow2_iface); return window; } if(!strcmpiW(target, _topW)) { get_top_window(window, &top_window); IHTMLWindow2_AddRef(&top_window->base.IHTMLWindow2_iface); return top_window; } if(!strcmpiW(target, _parentW)) { if(!window->parent) { WARN("Window has no parent, treat as self\n"); IHTMLWindow2_AddRef(&window->base.IHTMLWindow2_iface); return window; } IHTMLWindow2_AddRef(&window->parent->base.IHTMLWindow2_iface); return window->parent; } get_top_window(window, &top_window); hres = get_frame_by_name(top_window, target, TRUE, &ret_window); if(FAILED(hres) || !ret_window) { *use_new_window = TRUE; return NULL; } IHTMLWindow2_AddRef(&ret_window->base.IHTMLWindow2_iface); return ret_window; }
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 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 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 nsstr_to_truncated_bstr(const nsAString *nsstr, BSTR *ret_ptr) { const PRUnichar *str, *ptr, *end = NULL; BSTR ret; nsAString_GetData(nsstr, &str); for(ptr = str; isdigitW(*ptr); ptr++); if(*ptr == '.') { for(end = ptr++; isdigitW(*ptr); ptr++); if(*ptr) end = NULL; } ret = end ? SysAllocStringLen(str, end-str) : SysAllocString(str); *ret_ptr = ret; return ret ? S_OK : E_OUTOFMEMORY; }
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 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; }