static HRESULT WINAPI HTMLDocument5_createComment(IHTMLDocument5 *iface, BSTR bstrdata, IHTMLDOMNode **ppRetNode) { HTMLDocument *This = impl_from_IHTMLDocument5(iface); nsIDOMComment *nscomment; HTMLElement *elem; nsAString str; nsresult nsres; HRESULT hres; TRACE("(%p)->(%s %p)\n", This, debugstr_w(bstrdata), ppRetNode); if(!This->doc_node->nsdoc) { WARN("NULL nsdoc\n"); return E_UNEXPECTED; } nsAString_InitDepend(&str, bstrdata); nsres = nsIDOMHTMLDocument_CreateComment(This->doc_node->nsdoc, &str, &nscomment); nsAString_Finish(&str); if(NS_FAILED(nsres)) { ERR("CreateTextNode failed: %08x\n", nsres); return E_FAIL; } hres = HTMLCommentElement_Create(This->doc_node, (nsIDOMNode*)nscomment, &elem); nsIDOMComment_Release(nscomment); if(FAILED(hres)) return hres; *ppRetNode = &elem->node.IHTMLDOMNode_iface; return S_OK; }
static nsresult run_insert_comment(HTMLDocumentNode *doc, nsISupports *comment_iface, nsISupports *arg2) { const PRUnichar *comment; nsIDOMComment *nscomment; PRUnichar *replace_html; nsAString comment_str; nsresult nsres; nsres = nsISupports_QueryInterface(comment_iface, &IID_nsIDOMComment, (void**)&nscomment); if(NS_FAILED(nsres)) { ERR("Could not get nsIDOMComment iface:%08x\n", nsres); return nsres; } nsAString_Init(&comment_str, NULL); nsres = nsIDOMComment_GetData(nscomment, &comment_str); if(NS_FAILED(nsres)) return nsres; nsAString_GetData(&comment_str, &comment); replace_html = handle_insert_comment(doc, comment); nsAString_Finish(&comment_str); if(replace_html) { HRESULT hres; hres = replace_node_by_html(doc->nsdoc, (nsIDOMNode*)nscomment, replace_html); heap_free(replace_html); if(FAILED(hres)) nsres = NS_ERROR_FAILURE; } nsIDOMComment_Release(nscomment); return nsres; }
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); } }