static void NSAPI nsDocumentObserver_EndLoad(nsIDocumentObserver *iface, nsIDocument *aDocument) { HTMLDocumentNode *This = impl_from_nsIDocumentObserver(iface); TRACE("(%p)\n", This); if(This->skip_mutation_notif) return; This->content_ready = TRUE; add_script_runner(This, run_end_load, NULL, NULL); }
static void NSAPI nsDocumentObserver_AttemptToExecuteScript(nsIDocumentObserver *iface, nsIContent *aContent, nsIParser *aParser, cpp_bool *aBlock) { HTMLDocumentNode *This = impl_from_nsIDocumentObserver(iface); nsIDOMHTMLScriptElement *nsscript; nsresult nsres; TRACE("(%p)->(%p %p %p)\n", This, aContent, aParser, aBlock); nsres = nsIContent_QueryInterface(aContent, &IID_nsIDOMHTMLScriptElement, (void**)&nsscript); if(NS_SUCCEEDED(nsres)) { TRACE("script node\n"); add_script_runner(This, run_insert_script, (nsISupports*)nsscript, (nsISupports*)aParser); nsIDOMHTMLScriptElement_Release(nsscript); } }
static nsresult NSAPI nsDocumentObserver_QueryInterface(nsIDocumentObserver *iface, nsIIDRef riid, void **result) { HTMLDocumentNode *This = impl_from_nsIDocumentObserver(iface); if(IsEqualGUID(&IID_nsISupports, riid)) { TRACE("(%p)->(IID_nsISupports, %p)\n", This, result); *result = &This->nsIDocumentObserver_iface; } else if(IsEqualGUID(&IID_nsIMutationObserver, riid)) { TRACE("(%p)->(IID_nsIMutationObserver %p)\n", This, result); *result = &This->nsIDocumentObserver_iface; } else if(IsEqualGUID(&IID_nsIDocumentObserver, riid)) { TRACE("(%p)->(IID_nsIDocumentObserver %p)\n", This, result); *result = &This->nsIDocumentObserver_iface; } else { *result = NULL; TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), result); return NS_NOINTERFACE; } htmldoc_addref(&This->basedoc); return NS_OK; }
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 nsrefcnt NSAPI nsDocumentObserver_Release(nsIDocumentObserver *iface) { HTMLDocumentNode *This = impl_from_nsIDocumentObserver(iface); return htmldoc_release(&This->basedoc); }
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); } }