HRESULT HTMLDOMTextNode_Create(HTMLDocumentNode *doc, nsIDOMNode *nsnode, HTMLDOMNode **node) { HTMLDOMTextNode *ret; nsresult nsres; ret = heap_alloc_zero(sizeof(*ret)); if(!ret) return E_OUTOFMEMORY; ret->node.vtbl = &HTMLDOMTextNodeImplVtbl; ret->IHTMLDOMTextNode_iface.lpVtbl = &HTMLDOMTextNodeVtbl; init_dispex(&ret->node.dispex, (IUnknown*)&ret->IHTMLDOMTextNode_iface, &HTMLDOMTextNode_dispex); HTMLDOMNode_Init(doc, &ret->node, nsnode); nsres = nsIDOMNode_QueryInterface(nsnode, &IID_nsIDOMText, (void**)&ret->nstext); assert(nsres == NS_OK && (nsIDOMNode*)ret->nstext == ret->node.nsnode); /* Share reference with nsnode */ nsIDOMNode_Release(ret->node.nsnode); *node = &ret->node; return S_OK; }
HTMLElement *HTMLCommentElement_Create(HTMLDocument *doc, nsIDOMNode *nsnode) { HTMLCommentElement *ret = heap_alloc_zero(sizeof(*ret)); ret->element.node.vtbl = &HTMLCommentElementImplVtbl; ret->lpIHTMLCommentElementVtbl = &HTMLCommentElementVtbl; init_dispex(&ret->element.node.dispex, (IUnknown*)HTMLCOMMENT(ret), &HTMLCommentElement_dispex); HTMLElement_Init(&ret->element); HTMLDOMNode_Init(doc, &ret->element.node, nsnode); return &ret->element; }
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; }
HRESULT HTMLCommentElement_Create(HTMLDocumentNode *doc, nsIDOMNode *nsnode, HTMLElement **elem) { HTMLCommentElement *ret; ret = heap_alloc_zero(sizeof(*ret)); if(!ret) return E_OUTOFMEMORY; ret->element.node.vtbl = &HTMLCommentElementImplVtbl; ret->IHTMLCommentElement_iface.lpVtbl = &HTMLCommentElementVtbl; HTMLElement_Init(&ret->element, doc, NULL, &HTMLCommentElement_dispex); HTMLDOMNode_Init(doc, &ret->element.node, nsnode); *elem = &ret->element; 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; }