Jacek Caban : mshtml: Move child window list to inner window and detach children when detaching parent.

Alexandre Julliard julliard at winehq.org
Mon Mar 11 16:29:53 CDT 2019


Module: wine
Branch: master
Commit: 521888958ca141129d116f5c8a97dbe7b9ede360
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=521888958ca141129d116f5c8a97dbe7b9ede360

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Mon Mar 11 14:23:13 2019 +0100

mshtml: Move child window list to inner window and detach children when detaching parent.

Signed-off-by: Jacek Caban <jacek at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/mshtml/htmlwindow.c     | 32 +++++++++++++++-----------------
 dlls/mshtml/mshtml_private.h |  2 +-
 2 files changed, 16 insertions(+), 18 deletions(-)

diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c
index ffd4424..0ab81f1 100644
--- a/dlls/mshtml/htmlwindow.c
+++ b/dlls/mshtml/htmlwindow.c
@@ -66,19 +66,6 @@ static inline BOOL is_outer_window(HTMLWindow *window)
     return &window->outer_window->base == window;
 }
 
-static void release_children(HTMLOuterWindow *This)
-{
-    HTMLOuterWindow *child;
-
-    while(!list_empty(&This->children)) {
-        child = LIST_ENTRY(list_tail(&This->children), HTMLOuterWindow, sibling_entry);
-
-        list_remove(&child->sibling_entry);
-        child->parent = NULL;
-        IHTMLWindow2_Release(&child->base.IHTMLWindow2_iface);
-    }
-}
-
 static HRESULT get_location(HTMLInnerWindow *This, HTMLLocation **ret)
 {
     if(This->location) {
@@ -99,7 +86,7 @@ void get_top_window(HTMLOuterWindow *window, HTMLOuterWindow **ret)
 {
     HTMLOuterWindow *iter;
 
-    for(iter = window; iter->parent; iter = iter->parent);
+    for(iter = window; iter->parent && iter->parent; iter = iter->parent);
     *ret = iter;
 }
 
@@ -128,6 +115,18 @@ static void detach_inner_window(HTMLInnerWindow *window)
     HTMLOuterWindow *outer_window = window->base.outer_window;
     HTMLDocumentNode *doc = window->doc;
 
+    while(!list_empty(&window->children)) {
+        HTMLOuterWindow *child = LIST_ENTRY(list_tail(&window->children), HTMLOuterWindow, sibling_entry);
+
+        list_remove(&child->sibling_entry);
+        child->parent = NULL;
+
+        if(child->base.inner_window)
+            detach_inner_window(child->base.inner_window);
+
+        IHTMLWindow2_Release(&child->base.IHTMLWindow2_iface);
+    }
+
     if(outer_window && outer_window->doc_obj && outer_window == outer_window->doc_obj->basedoc.window)
         window->doc->basedoc.cp_container.forward_container = NULL;
 
@@ -228,7 +227,6 @@ static void release_outer_window(HTMLOuterWindow *This)
     set_current_uri(This, NULL);
     if(This->base.inner_window)
         detach_inner_window(This->base.inner_window);
-    release_children(This);
 
     if(This->secmgr)
         IInternetSecurityManager_Release(This->secmgr);
@@ -3515,6 +3513,7 @@ static HRESULT create_inner_window(HTMLOuterWindow *outer_window, IMoniker *mon,
     if(!window)
         return E_OUTOFMEMORY;
 
+    list_init(&window->children);
     list_init(&window->script_hosts);
     list_init(&window->bindings);
     list_init(&window->script_queue);
@@ -3565,7 +3564,6 @@ HRESULT HTMLOuterWindow_Create(HTMLDocumentObj *doc_obj, nsIDOMWindow *nswindow,
     window->readystate = READYSTATE_UNINITIALIZED;
     window->task_magic = get_task_target_magic();
 
-    list_init(&window->children);
     wine_rb_put(&window_map, window->window_proxy, &window->entry);
 
     hres = create_pending_window(window, NULL);
@@ -3586,7 +3584,7 @@ HRESULT HTMLOuterWindow_Create(HTMLDocumentObj *doc_obj, nsIDOMWindow *nswindow,
         IHTMLWindow2_AddRef(&window->base.IHTMLWindow2_iface);
 
         window->parent = parent;
-        list_add_tail(&parent->children, &window->sibling_entry);
+        list_add_tail(&parent->base.inner_window->children, &window->sibling_entry);
     }
 
     TRACE("%p inner_window %p\n", window, window->base.inner_window);
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index cef745e..03a3f3d 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -501,7 +501,6 @@ struct HTMLOuterWindow {
 
     IInternetSecurityManager *secmgr;
 
-    struct list children;
     struct list sibling_entry;
     struct wine_rb_entry entry;
 };
@@ -512,6 +511,7 @@ struct HTMLInnerWindow {
 
     HTMLDocumentNode *doc;
 
+    struct list children;
     struct list script_hosts;
 
     IHTMLEventObj *event;




More information about the wine-cvs mailing list