Jacek Caban (@jacek) commented about dlls/mshtml/htmltextnode.c:
return E_OUTOFMEMORY; ret->node.vtbl = &HTMLDOMTextNodeImplVtbl; ret->IHTMLDOMTextNode_iface.lpVtbl = &HTMLDOMTextNodeVtbl; ret->IHTMLDOMTextNode2_iface.lpVtbl = &HTMLDOMTextNode2Vtbl; HTMLDOMNode_Init(doc, &ret->node, nsnode, &Text_dispex);
init_char_data(&ret->node, &ret->character_data);
nsres = nsIDOMNode_QueryInterface(nsnode, &IID_nsIDOMText, (void**)&ret->nstext); assert(nsres == NS_OK && (nsIDOMNode*)ret->nstext == ret->node.nsnode);
`nsIDOMText` inherits from `nsIDOMCharacterData` and you QI for it anyway. You could just pass that as ``nsIDOMCharacterData` to `init_char_data` and avoid additional QI there. This way, doctype special-case would be handled in comment's constructor instead of shared code.