mshtml: Store weak GeckoBrowser reference in HTMLDocumentNode.
Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
0ebbceddaa
commit
5e581621ab
|
@ -4911,6 +4911,11 @@ void detach_document_node(HTMLDocumentNode *doc)
|
||||||
IHTMLWindow2_Release(&doc->window->base.IHTMLWindow2_iface);
|
IHTMLWindow2_Release(&doc->window->base.IHTMLWindow2_iface);
|
||||||
doc->window = NULL;
|
doc->window = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(doc->browser) {
|
||||||
|
list_remove(&doc->browser_entry);
|
||||||
|
doc->browser = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void HTMLDocumentNode_destructor(HTMLDOMNode *iface)
|
static void HTMLDocumentNode_destructor(HTMLDOMNode *iface)
|
||||||
|
@ -5194,6 +5199,9 @@ HRESULT create_document_node(nsIDOMHTMLDocument *nsdoc, GeckoBrowser *browser, H
|
||||||
|
|
||||||
doc->node.vtbl = &HTMLDocumentNodeImplVtbl;
|
doc->node.vtbl = &HTMLDocumentNodeImplVtbl;
|
||||||
|
|
||||||
|
list_add_head(&browser->document_nodes, &doc->browser_entry);
|
||||||
|
doc->browser = browser;
|
||||||
|
|
||||||
*ret = doc;
|
*ret = doc;
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -722,6 +722,8 @@ struct GeckoBrowser {
|
||||||
nsIURIContentListener *content_listener;
|
nsIURIContentListener *content_listener;
|
||||||
|
|
||||||
HWND hwnd;
|
HWND hwnd;
|
||||||
|
|
||||||
|
struct list document_nodes;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -830,6 +832,9 @@ struct HTMLDocumentNode {
|
||||||
|
|
||||||
HTMLInnerWindow *window;
|
HTMLInnerWindow *window;
|
||||||
|
|
||||||
|
GeckoBrowser *browser;
|
||||||
|
struct list browser_entry;
|
||||||
|
|
||||||
compat_mode_t document_mode;
|
compat_mode_t document_mode;
|
||||||
BOOL document_mode_locked;
|
BOOL document_mode_locked;
|
||||||
|
|
||||||
|
|
|
@ -1359,6 +1359,8 @@ static nsrefcnt NSAPI nsWebBrowserChrome_Release(nsIWebBrowserChrome *iface)
|
||||||
TRACE("(%p) ref=%d\n", This, ref);
|
TRACE("(%p) ref=%d\n", This, ref);
|
||||||
|
|
||||||
if(!ref) {
|
if(!ref) {
|
||||||
|
if(This->doc)
|
||||||
|
detach_gecko_browser(This);
|
||||||
if(This->weak_reference) {
|
if(This->weak_reference) {
|
||||||
This->weak_reference->browser = NULL;
|
This->weak_reference->browser = NULL;
|
||||||
nsIWeakReference_Release(&This->weak_reference->nsIWeakReference_iface);
|
nsIWeakReference_Release(&This->weak_reference->nsIWeakReference_iface);
|
||||||
|
@ -2155,6 +2157,7 @@ HRESULT create_gecko_browser(HTMLDocumentObj *doc, GeckoBrowser **_ret)
|
||||||
|
|
||||||
ret->doc = doc;
|
ret->doc = doc;
|
||||||
ret->ref = 1;
|
ret->ref = 1;
|
||||||
|
list_init(&ret->document_nodes);
|
||||||
|
|
||||||
hres = init_browser(ret);
|
hres = init_browser(ret);
|
||||||
if(SUCCEEDED(hres))
|
if(SUCCEEDED(hres))
|
||||||
|
@ -2170,6 +2173,12 @@ void detach_gecko_browser(GeckoBrowser *This)
|
||||||
|
|
||||||
This->doc = NULL;
|
This->doc = NULL;
|
||||||
|
|
||||||
|
while(!list_empty(&This->document_nodes)) {
|
||||||
|
HTMLDocumentNode *doc = LIST_ENTRY(list_head(&This->document_nodes), HTMLDocumentNode, browser_entry);
|
||||||
|
list_remove(&doc->browser_entry);
|
||||||
|
doc->browser = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
ShowWindow(This->hwnd, SW_HIDE);
|
ShowWindow(This->hwnd, SW_HIDE);
|
||||||
SetParent(This->hwnd, NULL);
|
SetParent(This->hwnd, NULL);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue