HTMLDOMNode *get_node(HTMLDocument *This, nsIDOMNode *nsnode) { HTMLDOMNode *iter = This->nodes, *ret; PRUint16 node_type; while(iter) { if(iter->nsnode == nsnode) break; iter = iter->next; } if(iter) return iter; ret = mshtml_alloc(sizeof(HTMLDOMNode)); ret->lpHTMLDOMNodeVtbl = &HTMLDOMNodeVtbl; ret->node_type = NT_UNKNOWN; ret->impl.unk = NULL; ret->destructor = NULL; ret->doc = This; nsIDOMNode_AddRef(nsnode); ret->nsnode = nsnode; ret->next = This->nodes; This->nodes = ret; nsIDOMNode_GetNodeType(nsnode, &node_type); if(node_type == NS_ELEMENT_NODE || node_type == NS_DOCUMENT_NODE) HTMLElement_Create(ret); return ret; }
static HRESULT WINAPI HTMLImageElementFactory_create(IHTMLImageElementFactory *iface, VARIANT width, VARIANT height, IHTMLImgElement **img_elem) { HTMLImageElementFactory *This = impl_from_IHTMLImageElementFactory(iface); HTMLDocumentNode *doc; IHTMLImgElement *img; HTMLElement *elem; nsIDOMHTMLElement *nselem; LONG l; HRESULT hres; static const PRUnichar imgW[] = {'I','M','G',0}; TRACE("(%p)->(%s %s %p)\n", This, debugstr_variant(&width), debugstr_variant(&height), img_elem); if(!This->window || !This->window->doc) { WARN("NULL doc\n"); return E_UNEXPECTED; } doc = This->window->doc; *img_elem = NULL; hres = create_nselem(doc, imgW, &nselem); if(FAILED(hres)) return hres; hres = HTMLElement_Create(doc, (nsIDOMNode*)nselem, FALSE, &elem); nsIDOMHTMLElement_Release(nselem); if(FAILED(hres)) { ERR("HTMLElement_Create failed\n"); return hres; } hres = IHTMLElement_QueryInterface(&elem->IHTMLElement_iface, &IID_IHTMLImgElement, (void**)&img); IHTMLElement_Release(&elem->IHTMLElement_iface); if(FAILED(hres)) { ERR("IHTMLElement_QueryInterface failed: 0x%08x\n", hres); return hres; } l = var_to_size(&width); if(l) IHTMLImgElement_put_width(img, l); l = var_to_size(&height); if(l) IHTMLImgElement_put_height(img, l); *img_elem = img; return S_OK; }
static HRESULT create_node(HTMLDocumentNode *doc, nsIDOMNode *nsnode, HTMLDOMNode **ret) { UINT16 node_type; HRESULT hres; nsIDOMNode_GetNodeType(nsnode, &node_type); switch(node_type) { case ELEMENT_NODE: { HTMLElement *elem; hres = HTMLElement_Create(doc, nsnode, FALSE, &elem); if(FAILED(hres)) return hres; *ret = &elem->node; break; } case TEXT_NODE: hres = HTMLDOMTextNode_Create(doc, nsnode, ret); if(FAILED(hres)) return hres; break; /* doctype nodes are represented as comment nodes (at least in quirks mode) */ case DOCUMENT_TYPE_NODE: case COMMENT_NODE: { HTMLElement *comment; hres = HTMLCommentElement_Create(doc, nsnode, &comment); if(FAILED(hres)) return hres; *ret = &comment->node; break; } case ATTRIBUTE_NODE: ERR("Called on attribute node\n"); return E_UNEXPECTED; default: { HTMLDOMNode *node; node = heap_alloc_zero(sizeof(HTMLDOMNode)); if(!node) return E_OUTOFMEMORY; node->vtbl = &HTMLDOMNodeImplVtbl; HTMLDOMNode_Init(doc, node, nsnode); *ret = node; } } TRACE("type %d ret %p\n", node_type, *ret); return S_OK; }
static HRESULT create_node(HTMLDocumentNode *doc, nsIDOMNode *nsnode, HTMLDOMNode **ret) { PRUint16 node_type; HRESULT hres; nsIDOMNode_GetNodeType(nsnode, &node_type); switch(node_type) { case ELEMENT_NODE: { HTMLElement *elem; hres = HTMLElement_Create(doc, nsnode, FALSE, &elem); if(FAILED(hres)) return hres; *ret = &elem->node; break; } case TEXT_NODE: hres = HTMLDOMTextNode_Create(doc, nsnode, ret); if(FAILED(hres)) return hres; break; case COMMENT_NODE: { HTMLElement *comment; hres = HTMLCommentElement_Create(doc, nsnode, &comment); if(FAILED(hres)) return hres; *ret = &comment->node; break; } default: { HTMLDOMNode *node; node = heap_alloc_zero(sizeof(HTMLDOMNode)); if(!node) return E_OUTOFMEMORY; node->vtbl = &HTMLDOMNodeImplVtbl; HTMLDOMNode_Init(doc, node, nsnode); *ret = node; } } TRACE("type %d ret %p\n", node_type, *ret); return S_OK; }