mshtml: Store document node in window.

This commit is contained in:
Jacek Caban 2009-09-16 22:08:20 +02:00 committed by Alexandre Julliard
parent 1d2020795a
commit 62ccef389f
11 changed files with 38 additions and 35 deletions

View File

@ -1949,7 +1949,7 @@ HRESULT HTMLDocument_Create(IUnknown *pUnkOuter, REFIID riid, void** ppvObject)
ERR("GetContentDOMWindow failed: %08x\n", nsres); ERR("GetContentDOMWindow failed: %08x\n", nsres);
} }
hres = HTMLWindow_Create(nswindow, &doc->basedoc.window); hres = HTMLWindow_Create(doc, nswindow, &doc->basedoc.window);
if(nswindow) if(nswindow)
nsIDOMWindow_Release(nswindow); nsIDOMWindow_Release(nswindow);
if(FAILED(hres)) { if(FAILED(hres)) {
@ -1958,7 +1958,6 @@ HRESULT HTMLDocument_Create(IUnknown *pUnkOuter, REFIID riid, void** ppvObject)
} }
update_nsdocument(doc); update_nsdocument(doc);
doc->basedoc.window->doc = &doc->basedoc;
get_thread_hwnd(); get_thread_hwnd();
return S_OK; return S_OK;

View File

@ -961,7 +961,7 @@ void check_event_attr(HTMLDocument *doc, nsIDOMElement *nselem)
TRACE("%p.%s = %s\n", nselem, debugstr_w(event_info[i].attr_name), debugstr_w(attr_value)); TRACE("%p.%s = %s\n", nselem, debugstr_w(event_info[i].attr_name), debugstr_w(attr_value));
disp = script_parse_event(doc, attr_value); disp = script_parse_event(doc->window, attr_value);
if(disp) { if(disp) {
node = get_node(doc, (nsIDOMNode*)nselem, TRUE); node = get_node(doc, (nsIDOMNode*)nselem, TRUE);
set_event_handler_disp(get_node_event_target(node), node->doc, i, disp); set_event_handler_disp(get_node_event_target(node), node->doc, i, disp);

View File

@ -73,7 +73,7 @@ static inline HRESULT get_doc_event(HTMLDocument *doc, eventid_t eid, VARIANT *v
static inline HRESULT set_window_event(HTMLWindow *window, eventid_t eid, VARIANT *var) static inline HRESULT set_window_event(HTMLWindow *window, eventid_t eid, VARIANT *var)
{ {
return set_event_handler(&window->event_target, window->doc, eid, var); return set_event_handler(&window->event_target, &window->doc_obj->basedoc, eid, var);
} }
static inline HRESULT get_window_event(HTMLWindow *window, eventid_t eid, VARIANT *var) static inline HRESULT get_window_event(HTMLWindow *window, eventid_t eid, VARIANT *var)

View File

@ -129,7 +129,7 @@ static HRESULT WINAPI HTMLIFrameBase2_get_contentWindow(IHTMLFrameBase2 *iface,
return E_FAIL; return E_FAIL;
} }
hres = HTMLWindow_Create(NULL, &window); hres = HTMLWindow_Create(This->element.node.doc->doc_obj, NULL, &window);
if(FAILED(hres)) { if(FAILED(hres)) {
nsIDOMDocument_Release(nsdoc); nsIDOMDocument_Release(nsdoc);
return hres; return hres;
@ -137,7 +137,7 @@ static HRESULT WINAPI HTMLIFrameBase2_get_contentWindow(IHTMLFrameBase2 *iface,
hres = create_doc_from_nsdoc(nshtmldoc, This->element.node.doc->doc_obj, window, &This->content_doc); hres = create_doc_from_nsdoc(nshtmldoc, This->element.node.doc->doc_obj, window, &This->content_doc);
if(SUCCEEDED(hres)) if(SUCCEEDED(hres))
window->doc = &This->content_doc->basedoc; window->doc = This->content_doc;
IHTMLWindow2_Release(HTMLWINDOW2(window)); IHTMLWindow2_Release(HTMLWINDOW2(window));
nsIDOMHTMLDocument_Release(nshtmldoc); nsIDOMHTMLDocument_Release(nshtmldoc);
if(FAILED(hres)) if(FAILED(hres))

View File

@ -37,12 +37,12 @@ WINE_DEFAULT_DEBUG_CHANNEL(mshtml);
static HRESULT get_url(HTMLLocation *This, const WCHAR **ret) static HRESULT get_url(HTMLLocation *This, const WCHAR **ret)
{ {
if(!This->window || !This->window->doc || !This->window->doc->url) { if(!This->window || !This->window->doc_obj || !This->window->doc_obj->basedoc.url) {
FIXME("No current URL\n"); FIXME("No current URL\n");
return E_NOTIMPL; return E_NOTIMPL;
} }
*ret = This->window->doc->url; *ret = This->window->doc_obj->basedoc.url;
return S_OK; return S_OK;
} }

View File

@ -459,7 +459,7 @@ static HRESULT WINAPI HTMLOptionElementFactory_create(IHTMLOptionElementFactory
TRACE("(%p)->(%s %s %s %s %p)\n", This, debugstr_variant(&text), debugstr_variant(&value), TRACE("(%p)->(%s %s %s %s %p)\n", This, debugstr_variant(&text), debugstr_variant(&value),
debugstr_variant(&defaultselected), debugstr_variant(&selected), optelem); debugstr_variant(&defaultselected), debugstr_variant(&selected), optelem);
if(!This->window || !This->window->doc || !This->window->doc->nsdoc) { if(!This->window || !This->window->doc || !This->window->doc->basedoc.nsdoc) {
WARN("NULL nsdoc\n"); WARN("NULL nsdoc\n");
return E_UNEXPECTED; return E_UNEXPECTED;
} }
@ -467,14 +467,14 @@ static HRESULT WINAPI HTMLOptionElementFactory_create(IHTMLOptionElementFactory
*optelem = NULL; *optelem = NULL;
nsAString_Init(&option_str, optionW); nsAString_Init(&option_str, optionW);
nsres = nsIDOMHTMLDocument_CreateElement(This->window->doc->nsdoc, &option_str, &nselem); nsres = nsIDOMHTMLDocument_CreateElement(This->window->doc->basedoc.nsdoc, &option_str, &nselem);
nsAString_Finish(&option_str); nsAString_Finish(&option_str);
if(NS_FAILED(nsres)) { if(NS_FAILED(nsres)) {
ERR("CreateElement failed: %08x\n", nsres); ERR("CreateElement failed: %08x\n", nsres);
return E_FAIL; return E_FAIL;
} }
hres = IHTMLDOMNode_QueryInterface(HTMLDOMNODE(get_node(This->window->doc, (nsIDOMNode*)nselem, TRUE)), hres = IHTMLDOMNode_QueryInterface(HTMLDOMNODE(get_node(&This->window->doc_obj->basedoc, (nsIDOMNode*)nselem, TRUE)),
&IID_IHTMLOptionElement, (void**)optelem); &IID_IHTMLOptionElement, (void**)optelem);
nsIDOMElement_Release(nselem); nsIDOMElement_Release(nselem);

View File

@ -223,7 +223,7 @@ static HRESULT WINAPI HTMLWindow2_clearTimeout(IHTMLWindow2 *iface, LONG timerID
TRACE("(%p)->(%d)\n", This, timerID); TRACE("(%p)->(%d)\n", This, timerID);
return clear_task_timer(This->doc, FALSE, timerID); return clear_task_timer(&This->doc->basedoc, FALSE, timerID);
} }
static HRESULT WINAPI HTMLWindow2_alert(IHTMLWindow2 *iface, BSTR message) static HRESULT WINAPI HTMLWindow2_alert(IHTMLWindow2 *iface, BSTR message)
@ -239,7 +239,7 @@ static HRESULT WINAPI HTMLWindow2_alert(IHTMLWindow2 *iface, BSTR message)
return S_OK; return S_OK;
} }
MessageBoxW(This->doc->hwnd, message, wszTitle, MB_ICONWARNING); MessageBoxW(This->doc_obj->basedoc.hwnd, message, wszTitle, MB_ICONWARNING);
return S_OK; return S_OK;
} }
@ -260,7 +260,7 @@ static HRESULT WINAPI HTMLWindow2_confirm(IHTMLWindow2 *iface, BSTR message,
return S_OK; return S_OK;
} }
if(MessageBoxW(This->doc->hwnd, message, wszTitle, if(MessageBoxW(This->doc_obj->basedoc.hwnd, message, wszTitle,
MB_OKCANCEL|MB_ICONQUESTION)==IDOK) MB_OKCANCEL|MB_ICONQUESTION)==IDOK)
*confirmed = VARIANT_TRUE; *confirmed = VARIANT_TRUE;
else *confirmed = VARIANT_FALSE; else *confirmed = VARIANT_FALSE;
@ -353,7 +353,7 @@ static HRESULT WINAPI HTMLWindow2_prompt(IHTMLWindow2 *iface, BSTR message,
arg.textdata = textdata; arg.textdata = textdata;
DialogBoxParamW(hInst, MAKEINTRESOURCEW(ID_PROMPT_DIALOG), DialogBoxParamW(hInst, MAKEINTRESOURCEW(ID_PROMPT_DIALOG),
This->doc->hwnd, prompt_dlgproc, (LPARAM)&arg); This->doc_obj->basedoc.hwnd, prompt_dlgproc, (LPARAM)&arg);
return S_OK; return S_OK;
} }
@ -632,7 +632,7 @@ static HRESULT WINAPI HTMLWindow2_get_document(IHTMLWindow2 *iface, IHTMLDocumen
if(This->doc) { if(This->doc) {
/* FIXME: We should return a wrapper object here */ /* FIXME: We should return a wrapper object here */
*p = HTMLDOC(This->doc); *p = HTMLDOC(&This->doc->basedoc);
IHTMLDocument2_AddRef(*p); IHTMLDocument2_AddRef(*p);
}else { }else {
*p = NULL; *p = NULL;
@ -752,7 +752,7 @@ static HRESULT WINAPI HTMLWindow2_clearInterval(IHTMLWindow2 *iface, LONG timerI
TRACE("(%p)->(%d)\n", This, timerID); TRACE("(%p)->(%d)\n", This, timerID);
return clear_task_timer(This->doc, TRUE, timerID); return clear_task_timer(&This->doc->basedoc, TRUE, timerID);
} }
static HRESULT WINAPI HTMLWindow2_put_offscreenBuffering(IHTMLWindow2 *iface, VARIANT v) static HRESULT WINAPI HTMLWindow2_put_offscreenBuffering(IHTMLWindow2 *iface, VARIANT v)
@ -856,10 +856,10 @@ static HRESULT WINAPI HTMLWindow2_get_external(IHTMLWindow2 *iface, IDispatch **
*p = NULL; *p = NULL;
if(!This->doc->hostui) if(!This->doc_obj->basedoc.hostui)
return S_OK; return S_OK;
return IDocHostUIHandler_GetExternal(This->doc->hostui, p); return IDocHostUIHandler_GetExternal(This->doc_obj->basedoc.hostui, p);
} }
static HRESULT HTMLWindow_invoke(IUnknown *iface, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params, static HRESULT HTMLWindow_invoke(IUnknown *iface, DISPID id, LCID lcid, WORD flags, DISPPARAMS *params,
@ -1055,7 +1055,7 @@ static HRESULT WINAPI HTMLWindow3_attachEvent(IHTMLWindow3 *iface, BSTR event, I
TRACE("(%p)->(%s %p %p)\n", This, debugstr_w(event), pDisp, pfResult); TRACE("(%p)->(%s %p %p)\n", This, debugstr_w(event), pDisp, pfResult);
return attach_event(&This->event_target, This->doc, event, pDisp, pfResult); return attach_event(&This->event_target, &This->doc_obj->basedoc, event, pDisp, pfResult);
} }
static HRESULT WINAPI HTMLWindow3_detachEvent(IHTMLWindow3 *iface, BSTR event, IDispatch *pDisp) static HRESULT WINAPI HTMLWindow3_detachEvent(IHTMLWindow3 *iface, BSTR event, IDispatch *pDisp)
@ -1077,7 +1077,7 @@ static HRESULT window_set_timer(HTMLWindow *This, VARIANT *expr, LONG msec, VARI
break; break;
case VT_BSTR: case VT_BSTR:
disp = script_parse_event(This->doc, V_BSTR(expr)); disp = script_parse_event(This, V_BSTR(expr));
break; break;
default: default:
@ -1088,7 +1088,7 @@ static HRESULT window_set_timer(HTMLWindow *This, VARIANT *expr, LONG msec, VARI
if(!disp) if(!disp)
return E_FAIL; return E_FAIL;
*timer_id = set_task_timer(This->doc, msec, interval, disp); *timer_id = set_task_timer(&This->doc->basedoc, msec, interval, disp);
IDispatch_Release(disp); IDispatch_Release(disp);
return S_OK; return S_OK;
@ -1413,7 +1413,7 @@ static dispex_static_data_t HTMLWindow_dispex = {
HTMLWindow_iface_tids HTMLWindow_iface_tids
}; };
HRESULT HTMLWindow_Create(nsIDOMWindow *nswindow, HTMLWindow **ret) HRESULT HTMLWindow_Create(HTMLDocumentObj *doc_obj, nsIDOMWindow *nswindow, HTMLWindow **ret)
{ {
HTMLWindow *window; HTMLWindow *window;
@ -1425,6 +1425,7 @@ HRESULT HTMLWindow_Create(nsIDOMWindow *nswindow, HTMLWindow **ret)
window->lpHTMLWindow3Vtbl = &HTMLWindow3Vtbl; window->lpHTMLWindow3Vtbl = &HTMLWindow3Vtbl;
window->lpIDispatchExVtbl = &WindowDispExVtbl; window->lpIDispatchExVtbl = &WindowDispExVtbl;
window->ref = 1; window->ref = 1;
window->doc_obj = doc_obj;
init_dispex(&window->dispex, (IUnknown*)HTMLWINDOW2(window), &HTMLWindow_dispex); init_dispex(&window->dispex, (IUnknown*)HTMLWINDOW2(window), &HTMLWindow_dispex);

View File

@ -154,6 +154,8 @@ BOOL dispex_query_interface(DispatchEx*,REFIID,void**);
HRESULT dispex_get_dprop_ref(DispatchEx*,const WCHAR*,BOOL,VARIANT**); HRESULT dispex_get_dprop_ref(DispatchEx*,const WCHAR*,BOOL,VARIANT**);
typedef struct HTMLWindow HTMLWindow; typedef struct HTMLWindow HTMLWindow;
typedef struct HTMLDocumentNode HTMLDocumentNode;
typedef struct HTMLDocumentObj HTMLDocumentObj;
typedef enum { typedef enum {
SCRIPTMODE_GECKO, SCRIPTMODE_GECKO,
@ -193,7 +195,8 @@ struct HTMLWindow {
LONG ref; LONG ref;
HTMLDocument *doc; HTMLDocumentNode *doc;
HTMLDocumentObj *doc_obj;
nsIDOMWindow *nswindow; nsIDOMWindow *nswindow;
event_target_t *event_target; event_target_t *event_target;
@ -249,9 +252,6 @@ typedef struct {
ULONG (*release)(HTMLDocument*); ULONG (*release)(HTMLDocument*);
} htmldoc_vtbl_t; } htmldoc_vtbl_t;
typedef struct HTMLDocumentNode HTMLDocumentNode;
typedef struct HTMLDocumentObj HTMLDocumentObj;
struct HTMLDocument { struct HTMLDocument {
DispatchEx dispex; DispatchEx dispex;
const htmldoc_vtbl_t *vtbl; const htmldoc_vtbl_t *vtbl;
@ -548,7 +548,7 @@ HRESULT HTMLDocument_Create(IUnknown*,REFIID,void**);
HRESULT HTMLLoadOptions_Create(IUnknown*,REFIID,void**); HRESULT HTMLLoadOptions_Create(IUnknown*,REFIID,void**);
HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument*,HTMLDocumentObj*,HTMLWindow*,HTMLDocumentNode**); HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument*,HTMLDocumentObj*,HTMLWindow*,HTMLDocumentNode**);
HRESULT HTMLWindow_Create(nsIDOMWindow*,HTMLWindow**); HRESULT HTMLWindow_Create(HTMLDocumentObj*,nsIDOMWindow*,HTMLWindow**);
HTMLWindow *nswindow_to_window(const nsIDOMWindow*); HTMLWindow *nswindow_to_window(const nsIDOMWindow*);
HTMLOptionElementFactory *HTMLOptionElementFactory_Create(HTMLWindow*); HTMLOptionElementFactory *HTMLOptionElementFactory_Create(HTMLWindow*);
HRESULT HTMLLocation_Create(HTMLWindow*,HTMLLocation**); HRESULT HTMLLocation_Create(HTMLWindow*,HTMLLocation**);
@ -678,7 +678,7 @@ void release_nodes(HTMLDocument*);
void release_script_hosts(HTMLWindow*); void release_script_hosts(HTMLWindow*);
void connect_scripts(HTMLWindow*); void connect_scripts(HTMLWindow*);
void doc_insert_script(HTMLDocument*,nsIDOMHTMLScriptElement*); void doc_insert_script(HTMLDocument*,nsIDOMHTMLScriptElement*);
IDispatch *script_parse_event(HTMLDocument*,LPCWSTR); IDispatch *script_parse_event(HTMLWindow*,LPCWSTR);
void set_script_mode(HTMLWindow*,SCRIPTMODE); void set_script_mode(HTMLWindow*,SCRIPTMODE);
BOOL find_global_prop(HTMLWindow*,BSTR,DWORD,ScriptHost**,DISPID*); BOOL find_global_prop(HTMLWindow*,BSTR,DWORD,ScriptHost**,DISPID*);
IDispatch *get_script_disp(ScriptHost*); IDispatch *get_script_disp(ScriptHost*);

View File

@ -844,6 +844,8 @@ void update_nsdocument(HTMLDocumentObj *doc)
doc_node->basedoc.doc_obj = NULL; doc_node->basedoc.doc_obj = NULL;
IHTMLDocument2_Release(HTMLDOC(&doc_node->basedoc)); IHTMLDocument2_Release(HTMLDOC(&doc_node->basedoc));
doc->basedoc.doc_node = NULL; doc->basedoc.doc_node = NULL;
doc->basedoc.window->doc = NULL;
} }
doc->basedoc.nsdoc = nsdoc; doc->basedoc.nsdoc = nsdoc;
@ -859,6 +861,7 @@ void update_nsdocument(HTMLDocumentObj *doc)
} }
doc->basedoc.doc_node = doc_node; doc->basedoc.doc_node = doc_node;
doc->basedoc.window->doc = doc_node;
} }
void close_gecko(void) void close_gecko(void)

View File

@ -246,7 +246,7 @@ void add_nsevent_listener(HTMLWindow *window, LPCWSTR type)
return; return;
} }
init_event(target, type, NSEVENTLIST(&window->doc->nscontainer->htmlevent_listener), TRUE); init_event(target, type, NSEVENTLIST(&window->doc_obj->basedoc.nscontainer->htmlevent_listener), TRUE);
nsIDOMEventTarget_Release(target); nsIDOMEventTarget_Release(target);
} }

View File

@ -593,7 +593,7 @@ static void parse_extern_script(ScriptHost *script_host, LPCWSTR src)
if(FAILED(hres)) if(FAILED(hres))
return; return;
hres = bind_mon_to_buffer(script_host->window->doc, mon, (void**)&buf, &size); hres = bind_mon_to_buffer(&script_host->window->doc_obj->basedoc, mon, (void**)&buf, &size);
IMoniker_Release(mon); IMoniker_Release(mon);
if(FAILED(hres)) if(FAILED(hres))
return; return;
@ -762,7 +762,7 @@ void doc_insert_script(HTMLDocument *doc, nsIDOMHTMLScriptElement *nsscript)
parse_script_elem(script_host, nsscript); parse_script_elem(script_host, nsscript);
} }
IDispatch *script_parse_event(HTMLDocument *doc, LPCWSTR text) IDispatch *script_parse_event(HTMLWindow *window, LPCWSTR text)
{ {
ScriptHost *script_host; ScriptHost *script_host;
GUID guid = CLSID_JScript; GUID guid = CLSID_JScript;
@ -795,7 +795,7 @@ IDispatch *script_parse_event(HTMLDocument *doc, LPCWSTR text)
ptr = text; ptr = text;
} }
script_host = get_script_host(doc->window, &guid); script_host = get_script_host(window, &guid);
if(!script_host || !script_host->parse_proc) if(!script_host || !script_host->parse_proc)
return NULL; return NULL;
@ -890,10 +890,10 @@ void set_script_mode(HTMLWindow *window, SCRIPTMODE mode)
window->scriptmode = mode; window->scriptmode = mode;
if(!window->doc->nscontainer || !window->doc->nscontainer->webbrowser) if(!window->doc_obj->basedoc.nscontainer || !window->doc_obj->basedoc.nscontainer->webbrowser)
return; return;
nsres = nsIWebBrowser_QueryInterface(window->doc->nscontainer->webbrowser, nsres = nsIWebBrowser_QueryInterface(window->doc_obj->basedoc.nscontainer->webbrowser,
&IID_nsIWebBrowserSetup, (void**)&setup); &IID_nsIWebBrowserSetup, (void**)&setup);
if(NS_SUCCEEDED(nsres)) { if(NS_SUCCEEDED(nsres)) {
nsres = nsIWebBrowserSetup_SetProperty(setup, SETUP_ALLOW_JAVASCRIPT, nsres = nsIWebBrowserSetup_SetProperty(setup, SETUP_ALLOW_JAVASCRIPT,