Commit 27f799d8 authored by Jacek Caban's avatar Jacek Caban Committed by Alexandre Julliard

mshtml: Store inner window directly in HTMLDocumentNode.

parent 348e5d85
...@@ -2091,8 +2091,13 @@ static void HTMLDocumentNode_destructor(HTMLDOMNode *iface) ...@@ -2091,8 +2091,13 @@ static void HTMLDocumentNode_destructor(HTMLDOMNode *iface)
detach_plugin_host(LIST_ENTRY(list_head(&This->plugin_hosts), PluginHost, entry)); detach_plugin_host(LIST_ENTRY(list_head(&This->plugin_hosts), PluginHost, entry));
if(This->nsdoc) { if(This->nsdoc) {
assert(!This->window);
release_document_mutation(This); release_document_mutation(This);
nsIDOMHTMLDocument_Release(This->nsdoc); nsIDOMHTMLDocument_Release(This->nsdoc);
}else if(This->window) {
/* document fragments own reference to inner window */
IHTMLWindow2_Release(&This->window->base.IHTMLWindow2_iface);
This->window = NULL;
} }
heap_free(This->event_vector); heap_free(This->event_vector);
...@@ -2124,6 +2129,7 @@ static void HTMLDocumentNode_unlink(HTMLDOMNode *iface) ...@@ -2124,6 +2129,7 @@ static void HTMLDocumentNode_unlink(HTMLDOMNode *iface)
release_document_mutation(This); release_document_mutation(This);
This->nsdoc = NULL; This->nsdoc = NULL;
nsIDOMHTMLDocument_Release(nsdoc); nsIDOMHTMLDocument_Release(nsdoc);
This->window = NULL;
} }
} }
...@@ -2238,7 +2244,7 @@ static dispex_static_data_t HTMLDocumentNode_dispex = { ...@@ -2238,7 +2244,7 @@ static dispex_static_data_t HTMLDocumentNode_dispex = {
HTMLDocumentNode_iface_tids HTMLDocumentNode_iface_tids
}; };
static HTMLDocumentNode *alloc_doc_node(HTMLDocumentObj *doc_obj, HTMLOuterWindow *window) static HTMLDocumentNode *alloc_doc_node(HTMLDocumentObj *doc_obj, HTMLInnerWindow *window)
{ {
HTMLDocumentNode *doc; HTMLDocumentNode *doc;
...@@ -2249,7 +2255,8 @@ static HTMLDocumentNode *alloc_doc_node(HTMLDocumentObj *doc_obj, HTMLOuterWindo ...@@ -2249,7 +2255,8 @@ static HTMLDocumentNode *alloc_doc_node(HTMLDocumentObj *doc_obj, HTMLOuterWindo
doc->ref = 1; doc->ref = 1;
doc->basedoc.doc_node = doc; doc->basedoc.doc_node = doc;
doc->basedoc.doc_obj = doc_obj; doc->basedoc.doc_obj = doc_obj;
doc->basedoc.window = window; doc->basedoc.window = window->base.outer_window;
doc->window = window;
init_dispex(&doc->node.dispex, (IUnknown*)&doc->node.IHTMLDOMNode_iface, init_dispex(&doc->node.dispex, (IUnknown*)&doc->node.IHTMLDOMNode_iface,
&HTMLDocumentNode_dispex); &HTMLDocumentNode_dispex);
...@@ -2264,7 +2271,7 @@ static HTMLDocumentNode *alloc_doc_node(HTMLDocumentObj *doc_obj, HTMLOuterWindo ...@@ -2264,7 +2271,7 @@ static HTMLDocumentNode *alloc_doc_node(HTMLDocumentObj *doc_obj, HTMLOuterWindo
return doc; return doc;
} }
HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument *nsdoc, HTMLDocumentObj *doc_obj, HTMLOuterWindow *window, HTMLDocumentNode **ret) HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument *nsdoc, HTMLDocumentObj *doc_obj, HTMLInnerWindow *window, HTMLDocumentNode **ret)
{ {
HTMLDocumentNode *doc; HTMLDocumentNode *doc;
...@@ -2272,7 +2279,7 @@ HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument *nsdoc, HTMLDocumentObj *doc_ob ...@@ -2272,7 +2279,7 @@ HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument *nsdoc, HTMLDocumentObj *doc_ob
if(!doc) if(!doc)
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
if(!doc_obj->basedoc.window || window == doc_obj->basedoc.window) if(!doc_obj->basedoc.window || window->base.outer_window == doc_obj->basedoc.window)
doc->basedoc.cp_container.forward_container = &doc_obj->basedoc.cp_container; doc->basedoc.cp_container.forward_container = &doc_obj->basedoc.cp_container;
HTMLDOMNode_Init(doc, &doc->node, (nsIDOMNode*)nsdoc); HTMLDOMNode_Init(doc, &doc->node, (nsIDOMNode*)nsdoc);
...@@ -2294,10 +2301,12 @@ HRESULT create_document_fragment(nsIDOMNode *nsnode, HTMLDocumentNode *doc_node, ...@@ -2294,10 +2301,12 @@ HRESULT create_document_fragment(nsIDOMNode *nsnode, HTMLDocumentNode *doc_node,
{ {
HTMLDocumentNode *doc_frag; HTMLDocumentNode *doc_frag;
doc_frag = alloc_doc_node(doc_node->basedoc.doc_obj, doc_node->basedoc.window); doc_frag = alloc_doc_node(doc_node->basedoc.doc_obj, doc_node->window);
if(!doc_frag) if(!doc_frag)
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
IHTMLWindow2_AddRef(&doc_frag->window->base.IHTMLWindow2_iface);
HTMLDOMNode_Init(doc_node, &doc_frag->node, nsnode); HTMLDOMNode_Init(doc_node, &doc_frag->node, nsnode);
doc_frag->node.vtbl = &HTMLDocumentFragmentImplVtbl; doc_frag->node.vtbl = &HTMLDocumentFragmentImplVtbl;
doc_frag->node.cp_container = &doc_frag->basedoc.cp_container; doc_frag->node.cp_container = &doc_frag->basedoc.cp_container;
......
...@@ -239,8 +239,10 @@ static void release_inner_window(HTMLInnerWindow *This) ...@@ -239,8 +239,10 @@ static void release_inner_window(HTMLInnerWindow *This)
abort_window_bindings(This); abort_window_bindings(This);
release_script_hosts(This); release_script_hosts(This);
if(This->doc) if(This->doc) {
This->doc->window = NULL;
htmldoc_release(&This->doc->basedoc); htmldoc_release(&This->doc->basedoc);
}
release_dispex(&This->dispex); release_dispex(&This->dispex);
...@@ -2745,7 +2747,7 @@ HRESULT update_window_doc(HTMLInnerWindow *window) ...@@ -2745,7 +2747,7 @@ HRESULT update_window_doc(HTMLInnerWindow *window)
return E_FAIL; return E_FAIL;
} }
hres = create_doc_from_nsdoc(nshtmldoc, outer_window->doc_obj, outer_window, &window->doc); hres = create_doc_from_nsdoc(nshtmldoc, outer_window->doc_obj, window, &window->doc);
nsIDOMHTMLDocument_Release(nshtmldoc); nsIDOMHTMLDocument_Release(nshtmldoc);
if(FAILED(hres)) if(FAILED(hres))
return hres; return hres;
......
...@@ -679,6 +679,8 @@ struct HTMLDocumentNode { ...@@ -679,6 +679,8 @@ struct HTMLDocumentNode {
LONG ref; LONG ref;
HTMLInnerWindow *window;
nsIDOMHTMLDocument *nsdoc; nsIDOMHTMLDocument *nsdoc;
BOOL content_ready; BOOL content_ready;
event_target_t *body_event_target; event_target_t *body_event_target;
...@@ -700,7 +702,7 @@ struct HTMLDocumentNode { ...@@ -700,7 +702,7 @@ struct HTMLDocumentNode {
HRESULT HTMLDocument_Create(IUnknown*,REFIID,void**) DECLSPEC_HIDDEN; HRESULT HTMLDocument_Create(IUnknown*,REFIID,void**) DECLSPEC_HIDDEN;
HRESULT HTMLLoadOptions_Create(IUnknown*,REFIID,void**) DECLSPEC_HIDDEN; HRESULT HTMLLoadOptions_Create(IUnknown*,REFIID,void**) DECLSPEC_HIDDEN;
HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument*,HTMLDocumentObj*,HTMLOuterWindow*,HTMLDocumentNode**) DECLSPEC_HIDDEN; HRESULT create_doc_from_nsdoc(nsIDOMHTMLDocument*,HTMLDocumentObj*,HTMLInnerWindow*,HTMLDocumentNode**) DECLSPEC_HIDDEN;
HRESULT create_document_fragment(nsIDOMNode*,HTMLDocumentNode*,HTMLDocumentNode**) DECLSPEC_HIDDEN; HRESULT create_document_fragment(nsIDOMNode*,HTMLDocumentNode*,HTMLDocumentNode**) DECLSPEC_HIDDEN;
HRESULT HTMLOuterWindow_Create(HTMLDocumentObj*,nsIDOMWindow*,HTMLOuterWindow*,HTMLOuterWindow**) DECLSPEC_HIDDEN; HRESULT HTMLOuterWindow_Create(HTMLDocumentObj*,nsIDOMWindow*,HTMLOuterWindow*,HTMLOuterWindow**) DECLSPEC_HIDDEN;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment