Module: wine Branch: master Commit: a007de5242fc4a8cb12e258e9d37af2663879f08 URL: https://source.winehq.org/git/wine.git/?a=commit;h=a007de5242fc4a8cb12e258e9...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Mar 11 14:25:21 2019 +0100
mshtml: Store GeckoBrowser weak reference in HTMLOuterWindow.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/mshtml/htmlwindow.c | 11 +++++++++-- dlls/mshtml/mshtml_private.h | 4 ++++ dlls/mshtml/nsembed.c | 7 +++++++ 3 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index d980645..e5d08c9 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -216,6 +216,11 @@ static ULONG WINAPI HTMLWindow2_AddRef(IHTMLWindow2 *iface)
static void release_outer_window(HTMLOuterWindow *This) { + if(This->browser) { + list_remove(&This->browser_entry); + This->browser = NULL; + } + if(This->pending_window) { abort_window_bindings(This->pending_window); This->pending_window->base.outer_window = NULL; @@ -970,7 +975,7 @@ static HRESULT WINAPI HTMLWindow2_open(IHTMLWindow2 *iface, BSTR url, BSTR name, if(replace) FIXME("unsupported relace argument\n");
- if(!window->doc_obj || !window->uri_nofrag) + if(!window->browser || !window->uri_nofrag) return E_UNEXPECTED;
if(name && *name == '_') { @@ -3547,6 +3552,8 @@ HRESULT create_outer_window(GeckoBrowser *browser, mozIDOMWindowProxy *mozwindow window->base.inner_window = NULL;
window->doc_obj = browser->doc; + window->browser = browser; + list_add_head(&browser->outer_windows, &window->browser_entry);
mozIDOMWindowProxy_AddRef(mozwindow); window->window_proxy = mozwindow; @@ -3630,7 +3637,7 @@ HRESULT update_window_doc(HTMLInnerWindow *window) return E_FAIL; }
- hres = create_document_node(nshtmldoc, outer_window->doc_obj->nscontainer, window, &window->doc); + hres = create_document_node(nshtmldoc, outer_window->browser, window, &window->doc); nsIDOMHTMLDocument_Release(nshtmldoc); if(FAILED(hres)) return hres; diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h index aa0cac8..922ac02 100644 --- a/dlls/mshtml/mshtml_private.h +++ b/dlls/mshtml/mshtml_private.h @@ -486,6 +486,9 @@ struct HTMLOuterWindow { HTMLOuterWindow *parent; HTMLFrameBase *frame_element;
+ GeckoBrowser *browser; + struct list browser_entry; + READYSTATE readystate; BOOL readystate_locked; unsigned readystate_pending; @@ -724,6 +727,7 @@ struct GeckoBrowser { HWND hwnd;
struct list document_nodes; + struct list outer_windows; };
typedef struct { diff --git a/dlls/mshtml/nsembed.c b/dlls/mshtml/nsembed.c index 49bbbfd..cab41c3 100644 --- a/dlls/mshtml/nsembed.c +++ b/dlls/mshtml/nsembed.c @@ -2158,6 +2158,7 @@ HRESULT create_gecko_browser(HTMLDocumentObj *doc, GeckoBrowser **_ret) ret->doc = doc; ret->ref = 1; list_init(&ret->document_nodes); + list_init(&ret->outer_windows);
hres = init_browser(ret); if(SUCCEEDED(hres)) @@ -2179,6 +2180,12 @@ void detach_gecko_browser(GeckoBrowser *This) doc->browser = NULL; }
+ while(!list_empty(&This->outer_windows)) { + HTMLOuterWindow *window = LIST_ENTRY(list_head(&This->outer_windows), HTMLOuterWindow, browser_entry); + list_remove(&window->browser_entry); + window->browser = NULL; + } + ShowWindow(This->hwnd, SW_HIDE); SetParent(This->hwnd, NULL);