HTMLOuterWindow *get_target_window(HTMLOuterWindow *window, nsAString *target_str, BOOL *use_new_window) { HTMLOuterWindow *top_window, *ret_window; const PRUnichar *target; HRESULT hres; static const WCHAR _parentW[] = {'_','p','a','r','e','n','t',0}; static const WCHAR _selfW[] = {'_','s','e','l','f',0}; static const WCHAR _topW[] = {'_','t','o','p',0}; *use_new_window = FALSE; nsAString_GetData(target_str, &target); TRACE("%s\n", debugstr_w(target)); if(!*target || !strcmpiW(target, _selfW)) { IHTMLWindow2_AddRef(&window->base.IHTMLWindow2_iface); return window; } if(!strcmpiW(target, _topW)) { get_top_window(window, &top_window); IHTMLWindow2_AddRef(&top_window->base.IHTMLWindow2_iface); return top_window; } if(!strcmpiW(target, _parentW)) { if(!window->parent) { WARN("Window has no parent, treat as self\n"); IHTMLWindow2_AddRef(&window->base.IHTMLWindow2_iface); return window; } IHTMLWindow2_AddRef(&window->parent->base.IHTMLWindow2_iface); return window->parent; } get_top_window(window, &top_window); hres = get_frame_by_name(top_window, target, TRUE, &ret_window); if(FAILED(hres) || !ret_window) { *use_new_window = TRUE; return NULL; } IHTMLWindow2_AddRef(&ret_window->base.IHTMLWindow2_iface); return ret_window; }
void set_ready_state(HTMLOuterWindow *window, READYSTATE readystate) { READYSTATE prev_state = window->readystate; window->readystate = readystate; if(window->readystate_locked) { readystate_task_t *task; HRESULT hres; if(window->readystate_pending || prev_state == readystate) return; task = heap_alloc(sizeof(*task)); if(!task) return; IHTMLWindow2_AddRef(&window->base.IHTMLWindow2_iface); task->window = window; hres = push_task(&task->header, notif_readystate_proc, notif_readystate_destr, window->task_magic); if(SUCCEEDED(hres)) window->readystate_pending = TRUE; return; } notif_readystate(window); }
static HRESULT WINAPI HTMLFrameBase2_get_contentWindow(IHTMLFrameBase2 *iface, IHTMLWindow2 **p) { HTMLFrameBase *This = impl_from_IHTMLFrameBase2(iface); TRACE("(%p)->(%p)\n", This, p); if(This->content_window) { IHTMLWindow2_AddRef(&This->content_window->base.IHTMLWindow2_iface); *p = &This->content_window->base.IHTMLWindow2_iface; }else { WARN("NULL content window\n"); *p = NULL; } return S_OK; }
static nsresult run_insert_script(HTMLDocumentNode *doc, nsISupports *script_iface, nsISupports *parser_iface) { nsIDOMHTMLScriptElement *nsscript; HTMLScriptElement *script_elem; nsIParser *nsparser = NULL; script_queue_entry_t *iter; HTMLInnerWindow *window; nsresult nsres; HRESULT hres; TRACE("(%p)->(%p)\n", doc, script_iface); window = doc->window; if(!window) return NS_OK; nsres = nsISupports_QueryInterface(script_iface, &IID_nsIDOMHTMLScriptElement, (void**)&nsscript); if(NS_FAILED(nsres)) { ERR("Could not get nsIDOMHTMLScriptElement: %08x\n", nsres); return nsres; } if(parser_iface) { nsres = nsISupports_QueryInterface(parser_iface, &IID_nsIParser, (void**)&nsparser); if(NS_FAILED(nsres)) { ERR("Could not get nsIParser iface: %08x\n", nsres); nsparser = NULL; } } hres = script_elem_from_nsscript(doc, nsscript, &script_elem); nsIDOMHTMLScriptElement_Release(nsscript); if(FAILED(hres)) return NS_ERROR_FAILURE; if(nsparser) { nsIParser_BeginEvaluatingParserInsertedScript(nsparser); window->parser_callback_cnt++; } IHTMLWindow2_AddRef(&window->base.IHTMLWindow2_iface); doc_insert_script(window, script_elem); while(!list_empty(&window->script_queue)) { iter = LIST_ENTRY(list_head(&window->script_queue), script_queue_entry_t, entry); list_remove(&iter->entry); if(!iter->script->parsed) doc_insert_script(window, iter->script); IHTMLScriptElement_Release(&iter->script->IHTMLScriptElement_iface); heap_free(iter); } IHTMLWindow2_Release(&window->base.IHTMLWindow2_iface); if(nsparser) { window->parser_callback_cnt--; nsIParser_EndEvaluatingParserInsertedScript(nsparser); nsIParser_Release(nsparser); } IHTMLScriptElement_Release(&script_elem->IHTMLScriptElement_iface); return NS_OK; }